OSDN Git Service

Merge commit '9a026c72982faf20e1c8dfbe48f0b312cdea69c8'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 6 Jan 2014 15:15:03 +0000 (16:15 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 6 Jan 2014 15:17:38 +0000 (16:17 +0100)
* commit '9a026c72982faf20e1c8dfbe48f0b312cdea69c8':
  h264: rebuild the default ref list if the reference count changes

Conflicts:
libavcodec/h264.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/h264.c

@@@ -3382,42 -3275,53 +3382,52 @@@ static int h264_slice_header_init(H264C
  
  int ff_set_ref_count(H264Context *h)
  {
 -    int num_ref_idx_active_override_flag, max_refs;
+     int ref_count[2], list_count;
 +    int num_ref_idx_active_override_flag;
  
      // set defaults, might be overridden a few lines later
-     h->ref_count[0] = h->pps.ref_count[0];
-     h->ref_count[1] = h->pps.ref_count[1];
+     ref_count[0] = h->pps.ref_count[0];
+     ref_count[1] = h->pps.ref_count[1];
  
      if (h->slice_type_nos != AV_PICTURE_TYPE_I) {
 +        unsigned max[2];
 +        max[0] = max[1] = h->picture_structure == PICT_FRAME ? 15 : 31;
 +
          if (h->slice_type_nos == AV_PICTURE_TYPE_B)
              h->direct_spatial_mv_pred = get_bits1(&h->gb);
          num_ref_idx_active_override_flag = get_bits1(&h->gb);
  
          if (num_ref_idx_active_override_flag) {
-             h->ref_count[0] = get_ue_golomb(&h->gb) + 1;
+             ref_count[0] = get_ue_golomb(&h->gb) + 1;
 -            if (ref_count[0] < 1)
 -                return AVERROR_INVALIDDATA;
              if (h->slice_type_nos == AV_PICTURE_TYPE_B) {
-                 h->ref_count[1] = get_ue_golomb(&h->gb) + 1;
+                 ref_count[1] = get_ue_golomb(&h->gb) + 1;
 -                if (ref_count[1] < 1)
 -                    return AVERROR_INVALIDDATA;
 -            }
 +            } else
 +                // full range is spec-ok in this case, even for frames
-                 h->ref_count[1] = 1;
++                ref_count[1] = 1;
 +        }
 +
-         if (h->ref_count[0]-1 > max[0] || h->ref_count[1]-1 > max[1]){
-             av_log(h->avctx, AV_LOG_ERROR, "reference overflow %u > %u or %u > %u\n", h->ref_count[0]-1, max[0], h->ref_count[1]-1, max[1]);
++        if (ref_count[0]-1 > max[0] || ref_count[1]-1 > max[1]){
++            av_log(h->avctx, AV_LOG_ERROR, "reference overflow %u > %u or %u > %u\n", ref_count[0]-1, max[0], ref_count[1]-1, max[1]);
 +            h->ref_count[0] = h->ref_count[1] = 0;
 +            return AVERROR_INVALIDDATA;
          }
  
          if (h->slice_type_nos == AV_PICTURE_TYPE_B)
-             h->list_count = 2;
+             list_count = 2;
          else
-             h->list_count = 1;
+             list_count = 1;
      } else {
-         h->list_count   = 0;
-         h->ref_count[0] = h->ref_count[1] = 0;
+         list_count   = 0;
+         ref_count[0] = ref_count[1] = 0;
+     }
 -    max_refs = h->picture_structure == PICT_FRAME ? 16 : 32;
 -
 -    if (ref_count[0] > max_refs || ref_count[1] > max_refs) {
 -        av_log(h->avctx, AV_LOG_ERROR, "reference overflow\n");
 -        h->ref_count[0] = h->ref_count[1] = 0;
 -        return AVERROR_INVALIDDATA;
 -    }
 -
+     if (list_count != h->list_count ||
+         ref_count[0] != h->ref_count[0] ||
+         ref_count[1] != h->ref_count[1]) {
+         h->ref_count[0] = ref_count[0];
+         h->ref_count[1] = ref_count[1];
+         h->list_count   = list_count;
+         return 1;
      }
  
      return 0;