codecparsers: h264: add gst_h264_parse_sps_data() helper.
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Mon, 1 Oct 2012 07:37:21 +0000 (09:37 +0200)
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>
Mon, 24 Mar 2014 18:38:13 +0000 (19:38 +0100)
Split seq_parameter_set_data() parsing off gst_h264_parse_sps() so
that it could be re-used later on.

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

Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
gst-libs/gst/codecparsers/gsth264parser.c

index 1952128..a89db0d 100644 (file)
@@ -1182,30 +1182,16 @@ gst_h264_parser_parse_sps (GstH264NalParser * nalparser, GstH264NalUnit * nalu,
   return res;
 }
 
-/**
- * gst_h264_parse_sps:
- * @nalu: The #GST_H264_NAL_SPS #GstH264NalUnit to parse
- * @sps: The #GstH264SPS to fill.
- * @parse_vui_params: Whether to parse the vui_params or not
- *
- * Parses @data, and fills the @sps structure.
- *
- * Returns: a #GstH264ParserResult
- */
-GstH264ParserResult
-gst_h264_parse_sps (GstH264NalUnit * nalu, GstH264SPS * sps,
+/* Parse seq_parameter_set_data() */
+static gboolean
+gst_h264_parse_sps_data (NalReader * nr, GstH264SPS * sps,
     gboolean parse_vui_params)
 {
-  NalReader nr;
   gint width, height;
   guint subwc[] = { 1, 2, 2, 1 };
   guint subhc[] = { 1, 2, 1, 1 };
   GstH264VUIParams *vui = NULL;
 
-  INITIALIZE_DEBUG_CATEGORY;
-  GST_DEBUG ("parsing SPS");
-  nal_reader_init (&nr, nalu->data + nalu->offset + 1, nalu->size - 1);
-
   /* set default values for fields that might not be present in the bitstream
      and have valid defaults */
   sps->chroma_format_idc = 1;
@@ -1222,38 +1208,38 @@ gst_h264_parse_sps (GstH264NalUnit * nalu, GstH264SPS * sps,
   sps->frame_crop_bottom_offset = 0;
   sps->delta_pic_order_always_zero_flag = 0;
 
-  READ_UINT8 (&nr, sps->profile_idc, 8);
-  READ_UINT8 (&nr, sps->constraint_set0_flag, 1);
-  READ_UINT8 (&nr, sps->constraint_set1_flag, 1);
-  READ_UINT8 (&nr, sps->constraint_set2_flag, 1);
-  READ_UINT8 (&nr, sps->constraint_set3_flag, 1);
+  READ_UINT8 (nr, sps->profile_idc, 8);
+  READ_UINT8 (nr, sps->constraint_set0_flag, 1);
+  READ_UINT8 (nr, sps->constraint_set1_flag, 1);
+  READ_UINT8 (nr, sps->constraint_set2_flag, 1);
+  READ_UINT8 (nr, sps->constraint_set3_flag, 1);
 
   /* skip reserved_zero_4bits */
-  if (!nal_reader_skip (&nr, 4))
+  if (!nal_reader_skip (nr, 4))
     goto error;
 
-  READ_UINT8 (&nr, sps->level_idc, 8);
+  READ_UINT8 (nr, sps->level_idc, 8);
 
-  READ_UE_ALLOWED (&nr, sps->id, 0, GST_H264_MAX_SPS_COUNT - 1);
+  READ_UE_ALLOWED (nr, sps->id, 0, GST_H264_MAX_SPS_COUNT - 1);
 
   if (sps->profile_idc == 100 || sps->profile_idc == 110 ||
       sps->profile_idc == 122 || sps->profile_idc == 244 ||
       sps->profile_idc == 44 || sps->profile_idc == 83 ||
       sps->profile_idc == 86) {
-    READ_UE_ALLOWED (&nr, sps->chroma_format_idc, 0, 3);
+    READ_UE_ALLOWED (nr, sps->chroma_format_idc, 0, 3);
     if (sps->chroma_format_idc == 3)
-      READ_UINT8 (&nr, sps->separate_colour_plane_flag, 1);
+      READ_UINT8 (nr, sps->separate_colour_plane_flag, 1);
 
-    READ_UE_ALLOWED (&nr, sps->bit_depth_luma_minus8, 0, 6);
-    READ_UE_ALLOWED (&nr, sps->bit_depth_chroma_minus8, 0, 6);
-    READ_UINT8 (&nr, sps->qpprime_y_zero_transform_bypass_flag, 1);
+    READ_UE_ALLOWED (nr, sps->bit_depth_luma_minus8, 0, 6);
+    READ_UE_ALLOWED (nr, sps->bit_depth_chroma_minus8, 0, 6);
+    READ_UINT8 (nr, sps->qpprime_y_zero_transform_bypass_flag, 1);
 
-    READ_UINT8 (&nr, sps->scaling_matrix_present_flag, 1);
+    READ_UINT8 (nr, sps->scaling_matrix_present_flag, 1);
     if (sps->scaling_matrix_present_flag) {
       guint8 n_lists;
 
       n_lists = (sps->chroma_format_idc != 3) ? 8 : 12;
-      if (!gst_h264_parser_parse_scaling_list (&nr,
+      if (!gst_h264_parser_parse_scaling_list (nr,
               sps->scaling_lists_4x4, sps->scaling_lists_8x8,
               default_4x4_inter, default_4x4_intra,
               default_8x8_inter, default_8x8_intra, n_lists))
@@ -1261,46 +1247,46 @@ gst_h264_parse_sps (GstH264NalUnit * nalu, GstH264SPS * sps,
     }
   }
 
-  READ_UE_ALLOWED (&nr, sps->log2_max_frame_num_minus4, 0, 12);
+  READ_UE_ALLOWED (nr, sps->log2_max_frame_num_minus4, 0, 12);
 
   sps->max_frame_num = 1 << (sps->log2_max_frame_num_minus4 + 4);
 
-  READ_UE_ALLOWED (&nr, sps->pic_order_cnt_type, 0, 2);
+  READ_UE_ALLOWED (nr, sps->pic_order_cnt_type, 0, 2);
   if (sps->pic_order_cnt_type == 0) {
-    READ_UE_ALLOWED (&nr, sps->log2_max_pic_order_cnt_lsb_minus4, 0, 12);
+    READ_UE_ALLOWED (nr, sps->log2_max_pic_order_cnt_lsb_minus4, 0, 12);
   } else if (sps->pic_order_cnt_type == 1) {
     guint i;
 
-    READ_UINT8 (&nr, sps->delta_pic_order_always_zero_flag, 1);
-    READ_SE (&nr, sps->offset_for_non_ref_pic);
-    READ_SE (&nr, sps->offset_for_top_to_bottom_field);
-    READ_UE_ALLOWED (&nr, sps->num_ref_frames_in_pic_order_cnt_cycle, 0, 255);
+    READ_UINT8 (nr, sps->delta_pic_order_always_zero_flag, 1);
+    READ_SE (nr, sps->offset_for_non_ref_pic);
+    READ_SE (nr, sps->offset_for_top_to_bottom_field);
+    READ_UE_ALLOWED (nr, sps->num_ref_frames_in_pic_order_cnt_cycle, 0, 255);
 
     for (i = 0; i < sps->num_ref_frames_in_pic_order_cnt_cycle; i++)
-      READ_SE (&nr, sps->offset_for_ref_frame[i]);
+      READ_SE (nr, sps->offset_for_ref_frame[i]);
   }
 
-  READ_UE (&nr, sps->num_ref_frames);
-  READ_UINT8 (&nr, sps->gaps_in_frame_num_value_allowed_flag, 1);
-  READ_UE (&nr, sps->pic_width_in_mbs_minus1);
-  READ_UE (&nr, sps->pic_height_in_map_units_minus1);
-  READ_UINT8 (&nr, sps->frame_mbs_only_flag, 1);
+  READ_UE (nr, sps->num_ref_frames);
+  READ_UINT8 (nr, sps->gaps_in_frame_num_value_allowed_flag, 1);
+  READ_UE (nr, sps->pic_width_in_mbs_minus1);
+  READ_UE (nr, sps->pic_height_in_map_units_minus1);
+  READ_UINT8 (nr, sps->frame_mbs_only_flag, 1);
 
   if (!sps->frame_mbs_only_flag)
-    READ_UINT8 (&nr, sps->mb_adaptive_frame_field_flag, 1);
+    READ_UINT8 (nr, sps->mb_adaptive_frame_field_flag, 1);
 
-  READ_UINT8 (&nr, sps->direct_8x8_inference_flag, 1);
-  READ_UINT8 (&nr, sps->frame_cropping_flag, 1);
+  READ_UINT8 (nr, sps->direct_8x8_inference_flag, 1);
+  READ_UINT8 (nr, sps->frame_cropping_flag, 1);
   if (sps->frame_cropping_flag) {
-    READ_UE (&nr, sps->frame_crop_left_offset);
-    READ_UE (&nr, sps->frame_crop_right_offset);
-    READ_UE (&nr, sps->frame_crop_top_offset);
-    READ_UE (&nr, sps->frame_crop_bottom_offset);
+    READ_UE (nr, sps->frame_crop_left_offset);
+    READ_UE (nr, sps->frame_crop_right_offset);
+    READ_UE (nr, sps->frame_crop_top_offset);
+    READ_UE (nr, sps->frame_crop_bottom_offset);
   }
 
-  READ_UINT8 (&nr, sps->vui_parameters_present_flag, 1);
+  READ_UINT8 (nr, sps->vui_parameters_present_flag, 1);
   if (sps->vui_parameters_present_flag && parse_vui_params) {
-    if (!gst_h264_parse_vui_parameters (sps, &nr))
+    if (!gst_h264_parse_vui_parameters (sps, nr))
       goto error;
     vui = &sps->vui_parameters;
   }
@@ -1364,6 +1350,35 @@ gst_h264_parse_sps (GstH264NalUnit * nalu, GstH264SPS * sps,
   } else {
     GST_LOG ("No VUI, unknown framerate");
   }
+  return TRUE;
+
+error:
+  return FALSE;
+}
+
+/**
+ * gst_h264_parse_sps:
+ * @nalu: The #GST_H264_NAL_SPS #GstH264NalUnit to parse
+ * @sps: The #GstH264SPS to fill.
+ * @parse_vui_params: Whether to parse the vui_params or not
+ *
+ * Parses @data, and fills the @sps structure.
+ *
+ * Returns: a #GstH264ParserResult
+ */
+GstH264ParserResult
+gst_h264_parse_sps (GstH264NalUnit * nalu, GstH264SPS * sps,
+    gboolean parse_vui_params)
+{
+  NalReader nr;
+
+  INITIALIZE_DEBUG_CATEGORY;
+  GST_DEBUG ("parsing SPS");
+
+  nal_reader_init (&nr, nalu->data + nalu->offset + 1, nalu->size - 1);
+
+  if (!gst_h264_parse_sps_data (&nr, sps, parse_vui_params))
+    goto error;
 
   sps->valid = TRUE;