mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 03:35:21 +00:00
codecparsers: h264: add gst_h264_parse_sps_data() helper.
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>
This commit is contained in:
parent
bd4dceeff4
commit
e61ae7ffa2
1 changed files with 69 additions and 54 deletions
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue