codecparsers: h264: compute pixel aspect ratio.

Signed-off-by: Simon Farnsworth <simon.farnsworth@onelan.co.uk>
Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
This commit is contained in:
Gwenole Beauchesne 2012-09-12 11:21:41 +02:00 committed by Tim-Philipp Müller
parent 585bd3ee21
commit a08273be72
2 changed files with 37 additions and 0 deletions

View file

@ -136,6 +136,32 @@ static const guint8 zigzag_4x4[16] = {
7, 11, 14, 15, 7, 11, 14, 15,
}; };
typedef struct
{
guint par_n, par_d;
} PAR;
/* Table E-1 - Meaning of sample aspect ratio indicator (1..16) */
static PAR aspect_ratios[17] = {
{0, 0},
{1, 1},
{12, 11},
{10, 11},
{16, 11},
{40, 33},
{24, 11},
{20, 11},
{32, 11},
{80, 33},
{18, 11},
{15, 11},
{64, 33},
{160, 99},
{4, 3},
{3, 2},
{2, 1}
};
/* Compute Ceil(Log2(v)) */ /* Compute Ceil(Log2(v)) */
/* Derived from branchless code for integer log2(v) from: /* Derived from branchless code for integer log2(v) from:
<http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog> */ <http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog> */
@ -552,6 +578,8 @@ gst_h264_parse_vui_parameters (GstH264SPS * sps, NalReader * nr)
vui->chroma_sample_loc_type_top_field = 0; vui->chroma_sample_loc_type_top_field = 0;
vui->chroma_sample_loc_type_bottom_field = 0; vui->chroma_sample_loc_type_bottom_field = 0;
vui->low_delay_hrd_flag = 0; vui->low_delay_hrd_flag = 0;
vui->par_n = 0;
vui->par_d = 0;
READ_UINT8 (nr, vui->aspect_ratio_info_present_flag, 1); READ_UINT8 (nr, vui->aspect_ratio_info_present_flag, 1);
if (vui->aspect_ratio_info_present_flag) { if (vui->aspect_ratio_info_present_flag) {
@ -559,6 +587,11 @@ gst_h264_parse_vui_parameters (GstH264SPS * sps, NalReader * nr)
if (vui->aspect_ratio_idc == EXTENDED_SAR) { if (vui->aspect_ratio_idc == EXTENDED_SAR) {
READ_UINT16 (nr, vui->sar_width, 16); READ_UINT16 (nr, vui->sar_width, 16);
READ_UINT16 (nr, vui->sar_height, 16); READ_UINT16 (nr, vui->sar_height, 16);
vui->par_n = vui->sar_width;
vui->par_d = vui->sar_height;
} else if (vui->aspect_ratio_idc <= 16) {
vui->par_n = aspect_ratios[vui->aspect_ratio_idc].par_n;
vui->par_d = aspect_ratios[vui->aspect_ratio_idc].par_d;
} }
} }

View file

@ -362,6 +362,10 @@ struct _GstH264VUIParams
guint32 log2_max_mv_length_vertical; guint32 log2_max_mv_length_vertical;
guint32 num_reorder_frames; guint32 num_reorder_frames;
guint32 max_dec_frame_buffering; guint32 max_dec_frame_buffering;
/* calculated values */
guint par_n;
guint par_d;
}; };
/** /**