[FFmpeg-cvslog] h264: pass a H2645NAL to slice header decoding

Anton Khirnov git at videolan.org
Thu Jul 14 19:43:36 CEST 2016


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Mon May 16 09:34:44 2016 +0200| [b25cd7540e7cba9868edc13817c0ce1ddef90ffc] | committer: Anton Khirnov

h264: pass a H2645NAL to slice header decoding

Replace the decoder-global nal_unit_type/nal_ref_idc variables with the
per-NAL ones. The decoder-global ones still cannot be removed because
they are used by hwaccels.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b25cd7540e7cba9868edc13817c0ce1ddef90ffc
---

 libavcodec/h264.c       |    2 +-
 libavcodec/h264.h       |    3 ++-
 libavcodec/h264_slice.c |   29 ++++++++++++++++-------------
 3 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 2dba261..b96b95a 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -851,7 +851,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size)
         case NAL_SLICE:
             sl->gb = nal->gb;
 
-            if ((err = ff_h264_decode_slice_header(h, sl)))
+            if ((err = ff_h264_decode_slice_header(h, sl, nal)))
                 break;
 
             if (h->sei.recovery_point.recovery_frame_cnt >= 0 && h->recovery_frame < 0) {
diff --git a/libavcodec/h264.h b/libavcodec/h264.h
index 3fdd3bc..6cd2506 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -929,7 +929,8 @@ int ff_h264_slice_context_init(H264Context *h, H264SliceContext *sl);
 
 void ff_h264_draw_horiz_band(const H264Context *h, H264SliceContext *sl, int y, int height);
 
-int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl);
+int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl,
+                                const H2645NAL *nal);
 int ff_h264_execute_decode_slices(H264Context *h, unsigned context_count);
 int ff_h264_update_thread_context(AVCodecContext *dst,
                                   const AVCodecContext *src);
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index f55c2f6..17608b4 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -988,7 +988,8 @@ static int h264_init_ps(H264Context *h, const H264SliceContext *sl)
  * slice in a field (or a frame). It decides whether we are decoding a new frame
  * or a second field in a pair and does the necessary setup.
  */
-static int h264_field_start(H264Context *h, const H264SliceContext *sl)
+static int h264_field_start(H264Context *h, const H264SliceContext *sl,
+                            const H2645NAL *nal)
 {
     const SPS *sps;
 
@@ -1002,7 +1003,7 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl)
 
     last_pic_droppable   = h->droppable;
     last_pic_structure   = h->picture_structure;
-    h->droppable         = (h->nal_ref_idc == 0);
+    h->droppable         = (nal->ref_idc == 0);
     h->picture_structure = sl->picture_structure;
 
     /* Shorten frame num gaps so we don't have to allocate reference
@@ -1163,7 +1164,8 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl)
     return 0;
 }
 
-static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
+static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl,
+                                   const H2645NAL *nal)
 {
     const SPS *sps;
     const PPS *pps;
@@ -1207,7 +1209,7 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
     sl->slice_type     = slice_type;
     sl->slice_type_nos = slice_type & 3;
 
-    if (h->nal_unit_type  == NAL_IDR_SLICE &&
+    if (nal->type  == NAL_IDR_SLICE &&
         sl->slice_type_nos != AV_PICTURE_TYPE_I) {
         av_log(h->avctx, AV_LOG_ERROR, "A non-intra slice in an IDR NAL unit.\n");
         return AVERROR_INVALIDDATA;
@@ -1244,7 +1246,7 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
 
     sl->mb_mbaff       = 0;
 
-    droppable = h->nal_ref_idc == 0;
+    droppable = nal->ref_idc == 0;
     if (sps->frame_mbs_only_flag) {
         picture_structure = PICT_FRAME;
     } else {
@@ -1286,7 +1288,7 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
         h->max_pic_num  = 1 << (sps->log2_max_frame_num + 1);
     }
 
-    if (h->nal_unit_type == NAL_IDR_SLICE)
+    if (nal->type == NAL_IDR_SLICE)
         get_ue_golomb(&sl->gb); /* idr_pic_id */
 
     if (sps->poc_type == 0) {
@@ -1348,7 +1350,7 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
                                   sl->slice_type_nos, &sl->pwt);
 
     sl->explicit_ref_marking = 0;
-    if (h->nal_ref_idc) {
+    if (nal->ref_idc) {
         ret = ff_h264_decode_ref_pic_marking(h, sl, &sl->gb);
         if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
             return AVERROR_INVALIDDATA;
@@ -1419,16 +1421,17 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
  *
  * @return 0 if okay, <0 if an error occurred
  */
-int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl)
+int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl,
+                                const H2645NAL *nal)
 {
     int i, j, ret = 0;
 
-    ret = h264_slice_header_parse(h, sl);
+    ret = h264_slice_header_parse(h, sl, nal);
     if (ret < 0)
         return ret;
 
     if (h->current_slice == 0) {
-        ret = h264_field_start(h, sl);
+        ret = h264_field_start(h, sl, nal);
         if (ret < 0)
             return ret;
     }
@@ -1448,7 +1451,7 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl)
 
     if (!h->setup_finished) {
         ff_h264_init_poc(h->cur_pic_ptr->field_poc, &h->cur_pic_ptr->poc,
-                         h->ps.sps, &h->poc, h->picture_structure, h->nal_ref_idc);
+                         h->ps.sps, &h->poc, h->picture_structure, nal->ref_idc);
 
         memcpy(h->mmco, sl->mmco, sl->nb_mmco * sizeof(*h->mmco));
         h->nb_mmco = sl->nb_mmco;
@@ -1478,7 +1481,7 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl)
         (h->avctx->skip_loop_filter >= AVDISCARD_BIDIR  &&
          sl->slice_type_nos == AV_PICTURE_TYPE_B) ||
         (h->avctx->skip_loop_filter >= AVDISCARD_NONREF &&
-         h->nal_ref_idc == 0))
+         nal->ref_idc == 0))
         sl->deblocking_filter = 0;
 
     if (sl->deblocking_filter == 1 && h->nb_slice_ctx > 1) {
@@ -1544,7 +1547,7 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl)
                sl->mb_y * h->mb_width + sl->mb_x,
                av_get_picture_type_char(sl->slice_type),
                sl->slice_type_fixed ? " fix" : "",
-               h->nal_unit_type == NAL_IDR_SLICE ? " IDR" : "",
+               nal->type == NAL_IDR_SLICE ? " IDR" : "",
                h->poc.frame_num,
                h->cur_pic_ptr->field_poc[0],
                h->cur_pic_ptr->field_poc[1],



More information about the ffmpeg-cvslog mailing list