Created
January 24, 2014 08:04
-
-
Save dpolishuk/8593732 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Determine video dimensions from the sequence parameterset. | |
void FindAVCDimensions( | |
const sp<ABuffer> &seqParamSet, int32_t *width, int32_t *height) { | |
ABitReader br(seqParamSet->data() + 1, seqParamSet->size() - 1); | |
unsigned profile_idc = br.getBits(8); | |
br.skipBits(16); | |
parseUE(&br); // seq_parameter_set_id | |
unsigned chroma_format_idc = 1; // 4:2:0 chroma format | |
if (profile_idc == 100 || profile_idc == 110 | |
|| profile_idc == 122 || profile_idc == 244 | |
|| profile_idc == 44 || profile_idc == 83 || profile_idc == 86) { | |
chroma_format_idc = parseUE(&br); | |
if (chroma_format_idc == 3) { | |
br.skipBits(1); // residual_colour_transform_flag | |
} | |
parseUE(&br); // bit_depth_luma_minus8 | |
parseUE(&br); // bit_depth_chroma_minus8 | |
br.skipBits(1); // qpprime_y_zero_transform_bypass_flag | |
CHECK_EQ(br.getBits(1), 0u); // seq_scaling_matrix_present_flag | |
} | |
parseUE(&br); // log2_max_frame_num_minus4 | |
unsigned pic_order_cnt_type = parseUE(&br); | |
if (pic_order_cnt_type == 0) { | |
parseUE(&br); // log2_max_pic_order_cnt_lsb_minus4 | |
} else if (pic_order_cnt_type == 1) { | |
// offset_for_non_ref_pic, offset_for_top_to_bottom_field and | |
// offset_for_ref_frame are technically se(v), but since we are | |
// just skipping over them the midpoint does not matter. | |
br.getBits(1); // delta_pic_order_always_zero_flag | |
parseUE(&br); // offset_for_non_ref_pic | |
parseUE(&br); // offset_for_top_to_bottom_field | |
unsigned num_ref_frames_in_pic_order_cnt_cycle = parseUE(&br); | |
for (unsigned i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; ++i) { | |
parseUE(&br); // offset_for_ref_frame | |
} | |
} | |
parseUE(&br); // num_ref_frames | |
br.getBits(1); // gaps_in_frame_num_value_allowed_flag | |
unsigned pic_width_in_mbs_minus1 = parseUE(&br); | |
unsigned pic_height_in_map_units_minus1 = parseUE(&br); | |
unsigned frame_mbs_only_flag = br.getBits(1); | |
*width = pic_width_in_mbs_minus1 * 16 + 16; | |
*height = (2 - frame_mbs_only_flag) | |
* (pic_height_in_map_units_minus1 * 16 + 16); | |
if (!frame_mbs_only_flag) { | |
br.getBits(1); // mb_adaptive_frame_field_flag | |
} | |
br.getBits(1); // direct_8x8_inference_flag | |
if (br.getBits(1)) { // frame_cropping_flag | |
unsigned frame_crop_left_offset = parseUE(&br); | |
unsigned frame_crop_right_offset = parseUE(&br); | |
unsigned frame_crop_top_offset = parseUE(&br); | |
unsigned frame_crop_bottom_offset = parseUE(&br); | |
unsigned cropUnitX, cropUnitY; | |
if (chroma_format_idc == 0 /* monochrome */) { | |
cropUnitX = 1; | |
cropUnitY = 2 - frame_mbs_only_flag; | |
} else { | |
unsigned subWidthC = (chroma_format_idc == 3) ? 1 : 2; | |
unsigned subHeightC = (chroma_format_idc == 1) ? 2 : 1; | |
cropUnitX = subWidthC; | |
cropUnitY = subHeightC * (2 - frame_mbs_only_flag); | |
} | |
SLOGV("frame_crop = (%u, %u, %u, %u), cropUnitX = %u, cropUnitY = %u", | |
frame_crop_left_offset, frame_crop_right_offset, | |
frame_crop_top_offset, frame_crop_bottom_offset, | |
cropUnitX, cropUnitY); | |
*width -= | |
(frame_crop_left_offset + frame_crop_right_offset) * cropUnitX; | |
*height -= | |
(frame_crop_top_offset + frame_crop_bottom_offset) * cropUnitY; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment