codecparsers: h264: fix ref_pic_list_modification()
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Wed, 18 Jan 2012 15:35:16 +0000 (16:35 +0100)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Fri, 20 Jan 2012 18:40:29 +0000 (18:40 +0000)
The entries were not filled in linearly and the termination was not
recorded either. Now, the actual number of modifications is recorded
similarly to dec_ref_pic_marking(). i.e. an explicit counter instead
of storing the termination value in the array.

https://bugzilla.gnome.org/show_bug.cgi?id=668192

gst-libs/gst/codecparsers/gsth264parser.c
gst-libs/gst/codecparsers/gsth264parser.h

index 6a164ecb1f2233a734ab7fe5a3c4a0a28b094b5a..45039f780efc5eafa3f3c7ac422ca27390813282 100644 (file)
@@ -747,22 +747,26 @@ slice_parse_ref_pic_list_modification_1 (GstH264SliceHdr * slice,
     NalReader * nr, guint list)
 {
   GstH264RefPicListModification *entries;
-  guint8 *ref_pic_list_modification_flag;
+  guint8 *ref_pic_list_modification_flag, *n_ref_pic_list_modification;
   guint32 modification_of_pic_nums_idc;
   guint i = 0;
 
   if (list == 0) {
     entries = slice->ref_pic_list_modification_l0;
     ref_pic_list_modification_flag = &slice->ref_pic_list_modification_flag_l0;
+    n_ref_pic_list_modification = &slice->n_ref_pic_list_modification_l0;
   } else {
     entries = slice->ref_pic_list_modification_l1;
     ref_pic_list_modification_flag = &slice->ref_pic_list_modification_flag_l1;
+    n_ref_pic_list_modification = &slice->n_ref_pic_list_modification_l1;
   }
 
   READ_UINT8 (nr, *ref_pic_list_modification_flag, 1);
   if (*ref_pic_list_modification_flag) {
-    do {
+    while (1) {
       READ_UE (nr, modification_of_pic_nums_idc);
+      if (modification_of_pic_nums_idc == 3)
+        break;
       if (modification_of_pic_nums_idc == 0 ||
           modification_of_pic_nums_idc == 1) {
         READ_UE_ALLOWED (nr, entries[i].value.abs_diff_pic_num_minus1, 0,
@@ -770,9 +774,10 @@ slice_parse_ref_pic_list_modification_1 (GstH264SliceHdr * slice,
       } else if (modification_of_pic_nums_idc == 2) {
         READ_UE (nr, entries[i].value.long_term_pic_num);
       }
-    } while (modification_of_pic_nums_idc != 3);
+      entries[i++].modification_of_pic_nums_idc = modification_of_pic_nums_idc;
+    }
   }
-
+  *n_ref_pic_list_modification = i;
   return TRUE;
 
 error:
index d58f1b07dd0d2f920b6d8b6fab304d4d561438f5..3c221560e8ce3113e0fea0f07ab10d32f059563c 100644 (file)
@@ -573,8 +573,10 @@ struct _GstH264SliceHdr
   guint8 num_ref_idx_l1_active_minus1;
 
   guint8 ref_pic_list_modification_flag_l0;
+  guint8 n_ref_pic_list_modification_l0;
   GstH264RefPicListModification ref_pic_list_modification_l0[32];
   guint8 ref_pic_list_modification_flag_l1;
+  guint8 n_ref_pic_list_modification_l1;
   GstH264RefPicListModification ref_pic_list_modification_l1[32];
 
   GstH264PredWeightTable pred_weight_table;