]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/hevc_parser.c
avcodec/hevc: add support for Frame Duplication (Doubling/Tripling)
[ffmpeg] / libavcodec / hevc_parser.c
index 01418b276d3727a49e90094b3e5bae0149a747ce..84f19b485c6c6e1164c1f64e980ffd6c578745ee 100644 (file)
@@ -194,7 +194,7 @@ static int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf,
     ff_hevc_reset_sei(sei);
 
     ret = ff_h2645_packet_split(&ctx->pkt, buf, buf_size, avctx, ctx->is_avc,
-                                ctx->nal_length_size, AV_CODEC_ID_HEVC, 1);
+                                ctx->nal_length_size, AV_CODEC_ID_HEVC, 1, 0);
     if (ret < 0)
         return ret;
 
@@ -202,6 +202,9 @@ static int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf,
         H2645NAL *nal = &ctx->pkt.nals[i];
         GetBitContext *gb = &nal->gb;
 
+        if (nal->nuh_layer_id > 0)
+            continue;
+
         switch (nal->type) {
         case HEVC_NAL_VPS:
             ff_hevc_decode_nal_vps(gb, avctx, ps);
@@ -232,6 +235,11 @@ static int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf,
         case HEVC_NAL_RADL_R:
         case HEVC_NAL_RASL_N:
         case HEVC_NAL_RASL_R:
+            if (ctx->sei.picture_timing.picture_struct == HEVC_SEI_PIC_STRUCT_FRAME_DOUBLING) {
+                s->repeat_pict = 1;
+            } else if (ctx->sei.picture_timing.picture_struct == HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING) {
+                s->repeat_pict = 2;
+            }
             ret = hevc_parse_slice_header(s, nal, avctx);
             if (ret)
                 return ret;
@@ -239,7 +247,7 @@ static int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf,
         }
     }
     /* didn't find a picture! */
-    av_log(avctx, AV_LOG_ERROR, "missing picture in access unit\n");
+    av_log(avctx, AV_LOG_ERROR, "missing picture in access unit with size %d\n", buf_size);
     return -1;
 }
 
@@ -315,7 +323,7 @@ static int hevc_parse(AVCodecParserContext *s, AVCodecContext *avctx,
         }
     }
 
-    is_dummy_buf = (is_dummy_buf && (dummy_buf == buf));
+    is_dummy_buf &= (dummy_buf == buf);
 
     if (!is_dummy_buf)
         parse_nal_units(s, buf, buf_size, avctx);