diff options
author | Ho-Eun Ryu <ho-eun.ryu@windriver.com> | 2010-02-25 20:03:55 +0900 |
---|---|---|
committer | Patrick Tjin <pattjin@google.com> | 2014-07-21 22:03:36 -0700 |
commit | b814d1307374f9654abab7c7f8ada4271070bfe0 (patch) | |
tree | 6b082dc1adec1f5b24f2637a91e879473d1e7fde /utils | |
parent | e6812e86855019c47f68b7a3fb1b074a689403db (diff) | |
download | wrs_omxil_core-b814d1307374f9654abab7c7f8ada4271070bfe0.tar.gz |
utils:h264_parser: remove this codes due to license issue
h264_parser uses some codes of mixvbp and it causes license issue.
recent OpenCore sets port parameters properly during port negotiation, so
we don't need to parse the sps/pps to get width and height for reconfiguring
ports and it (not parsing codec data) wouldn't cause any problem for now.
Diffstat (limited to 'utils')
-rw-r--r-- | utils/inc/h264_parser.h | 182 | ||||
-rw-r--r-- | utils/src/Android.mk | 3 | ||||
-rw-r--r-- | utils/src/h264_parser.c | 665 |
3 files changed, 1 insertions, 849 deletions
diff --git a/utils/inc/h264_parser.h b/utils/inc/h264_parser.h deleted file mode 100644 index db87b4d..0000000 --- a/utils/inc/h264_parser.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (c) 2009 Wind River Systems, Inc. - * - * The right to copy, distribute, modify, or otherwise make use - * of this software may be licensed only pursuant to the terms - * of an applicable Wind River license agreement. - */ - -#ifndef __WRS_OMXIL_H264_PARSER -#define ___WRS_OMXIL_H264_PARSER - -#ifdef __cplusplus -extern "C" { -#endif - -#define USE_PV_BITOPS 1 -#define USE_MIXVBP_DEF 1 -#define USE_VUI_PARSER 0 - -#if USE_PV_BITOPS -/* Port from PV OpenCORE 2.02 */ -typedef struct _nal_stream_t { - unsigned char *data; - unsigned int numbytes; - unsigned int bytepos; - unsigned int bitbuf; - unsigned int databitpos; - unsigned int bitpos; -} nal_stream; -#endif - -#if USE_MIXVBP_DEF -/* Import from MI-X VBP header */ -#define MAX_NUM_SPS 32 -/* status codes */ -typedef enum _h264_Status -{ - H264_STATUS_EOF = 1, // end of file - H264_STATUS_OK = 0, // no error - H264_STATUS_NO_MEM = 2, // out of memory - H264_STATUS_FILE_ERROR = 3, // file error - H264_STATUS_NOTSUPPORT = 4, // not supported mode - H264_STATUS_PARSE_ERROR = 5, // fail in parse MPEG-4 stream - H264_STATUS_ERROR = 6, // unknown/unspecified error - H264_NAL_ERROR, - H264_SPS_INVALID_PROFILE, - H264_SPS_INVALID_LEVEL, - H264_SPS_INVALID_SEQ_PARAM_ID, - H264_SPS_ERROR, - H264_PPS_INVALID_PIC_ID, - H264_PPS_INVALID_SEQ_ID, - H264_PPS_ERROR, - H264_SliceHeader_INVALID_MB, - H264_SliceHeader_ERROR, - H264_FRAME_DONE, - H264_SLICE_DONE, - H264_STATUS_POLL_ONCE_ERROR, - H264_STATUS_DEC_MEMINIT_ERROR, - H264_STATUS_NAL_UNIT_TYPE_ERROR, - H264_STATUS_SEI_ERROR, - H264_STATUS_SEI_DONE, -} h264_Status; - -typedef enum _h264_Profile -{ - h264_ProfileBaseline = 66, /** Baseline profile */ - h264_ProfileMain = 77, /** Main profile */ - h264_ProfileExtended = 88, /** Extended profile */ - h264_ProfileHigh = 100 , /** High profile */ - h264_ProfileHigh10 = 110, /** High 10 profile */ - h264_ProfileHigh422 = 122, /** High profile 4:2:2 */ - h264_ProfileHigh444 = 144, /** High profile 4:4:4 */ -} h264_Profile; - -typedef enum _h264_Level -{ - h264_Level1b = 9, /** Level 1b */ - h264_Level1 = 10, /** Level 1 */ - h264_Level11 = 11, /** Level 1.1 */ - h264_Level12 = 12, /** Level 1.2 */ - h264_Level13 = 13, /** Level 1.3 */ - h264_Level2 = 20, /** Level 2 */ - h264_Level21 = 21, /** Level 2.1 */ - h264_Level22 = 22, /** Level 2.2 */ - h264_Level3 = 30, /** Level 3 */ - h264_Level31 = 31, /** Level 3.1 */ - h264_Level32 = 32, /** Level 3.2 */ - h264_Level4 = 40, /** Level 4 */ - h264_Level41 = 41, /** Level 4.1 */ - h264_Level42 = 42, /** Level 4.2 */ - h264_Level5 = 50, /** Level 5 */ - h264_Level51 = 51, /** Level 5.1 */ - h264_LevelReserved = 255 /** Unknown profile */ -} h264_Level; - -#endif - -/* - * VUI - */ - -#define Extended_SAR 255 - -typedef struct _VUI_t { - unsigned char aspect_ratio_info_present_flag; - unsigned char aspect_ratio_idc; - unsigned short sar_width; - unsigned short sar_height; - unsigned char overscan_info_present_flag; - unsigned char overscan_appropriate_flag; - unsigned char video_signal_type_present_flag; - unsigned char video_format; - unsigned char video_full_range_flag; - unsigned char colour_description_present_flag; - unsigned char colour_primaries; - unsigned char transfer_characteristics; - unsigned char matrix_coefficients; - unsigned char chroma_loc_info_present_flag; - unsigned int chroma_sample_loc_type_top_field; - unsigned int chroma_sample_loc_type_bottom_field; - unsigned int timing_info_present_flag; - unsigned int num_units_in_tick; - unsigned int time_scale; - unsigned int fixed_frame_rate_flag; - /* TBD */ -} VUI; - -int nal_sps_vui_parse(const unsigned char *buffer, int *framerate); - -/* - * SPS - */ - -typedef struct _SPS_t { - unsigned char profile_idc; - unsigned char constraint_flags; - unsigned short level_idc; - unsigned int seq_parameter_set_id; - unsigned int chroma_format_idc; - unsigned int separate_colour_plane_flag; - unsigned int bit_depth_luma_minus8; - unsigned int bit_depth_chroma_minus8; - unsigned short qpprime_y_zero_transform_bypass_flag; - unsigned short seq_scaling_matrix_present_flag; - unsigned char *seq_scaling_list_present_flag; - unsigned char scaling_list_4x4[6][16]; - unsigned char scaling_list_8x8[2][64]; - unsigned char use_default_scaling_matrix_4x4_flag[6]; - unsigned char use_default_scaling_matrix_8x8_flag[6]; - unsigned int log2_max_frame_num_minus4; - unsigned int pic_order_cnt_type; - unsigned int log2_max_pic_order_cnt_lsb_minus4; - unsigned int delta_pic_order_always_zero_flag; - int offset_for_non_ref_pic; - int offset_for_top_to_bottom_field; - unsigned int num_ref_frames_in_pic_order_cnt_cycle; - int *offset_for_ref_frame; - unsigned int max_num_ref_frames; - unsigned int gaps_in_frame_num_value_allowed_flag; - unsigned int pic_width_in_mbs_minus1; - unsigned int pic_height_in_map_units_minus1; - unsigned char frame_mbs_only_flag; - unsigned char mb_adaptive_frame_field_flag; - unsigned char direct_8x8_inference_flag; - unsigned char frame_cropping_flag; - unsigned int frame_crop_left_offset; - unsigned int frame_crop_right_offset; - unsigned int frame_crop_top_offset; - unsigned int frame_crop_bottom_offset; - unsigned int vui_parameters_present_flag; - VUI *vui; -} SPS; - -int nal_sps_parse(unsigned char *buffer, unsigned int len, - unsigned int *width, unsigned int *height, - unsigned int *stride, unsigned int *sliceheight); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ___WRS_OMXIL_H264_PARSER */ diff --git a/utils/src/Android.mk b/utils/src/Android.mk index 799c2c6..1f3fec2 100644 --- a/utils/src/Android.mk +++ b/utils/src/Android.mk @@ -15,8 +15,7 @@ LOCAL_SRC_FILES := \ module.c \ thread.cpp \ workqueue.cpp \ - audio_parser.c \ - h264_parser.c + audio_parser.c LOCAL_MODULE := libwrs_omxil_utils diff --git a/utils/src/h264_parser.c b/utils/src/h264_parser.c deleted file mode 100644 index 749bf81..0000000 --- a/utils/src/h264_parser.c +++ /dev/null @@ -1,665 +0,0 @@ -/* - * Copyright (c) 2009 Wind River Systems, Inc. - * - * The right to copy, distribute, modify, or otherwise make use - * of this software may be licensed only pursuant to the terms - * of an applicable Wind River license agreement. - */ - -#include <h264_parser.h> - -//#define LOG_NDEBUG 0 - -#define LOG_TAG "h264_parser" -#include <log.h> - -#if USE_PV_BITOPS -/* - * NOTE: The original idea of this code for bit operation is from PV's OpenCORE 2.02 - * Wind River Systems modified PV source for se(v) operation. - * - */ - -#define PV_CLZ(A,B) while (((B) & 0x8000) == 0) {(B) <<=1; A++;} - -static const unsigned int mask[33] = -{ - 0x00000000, 0x00000001, 0x00000003, 0x00000007, - 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, - 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, - 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, - 0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff, - 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff, - 0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff, - 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, - 0xffffffff -}; - -static int read_bits(nal_stream *pstream, unsigned char nbits, unsigned int *outdata) -{ - unsigned char *bits; - unsigned int databitpos = pstream->databitpos; - unsigned int bitpos = pstream->bitpos; - unsigned int databytepos; - - if ((databitpos + nbits) > (pstream->numbytes << 3)) - { - *outdata = 0; - // buffer over run - LOGE("%s: buffer over run",__func__); - return -1; - } - - // databitpos += nbits; - - if (nbits > (32 - bitpos)) /* not enough bits */ - { - databytepos = databitpos >> 3; /* byte aligned position */ - bitpos = databitpos & 7; /* update bit position */ - bits = &pstream->data[databytepos]; - pstream->bitbuf = (bits[0] << 24) | (bits[1] << 16) | (bits[2] << 8) | bits[3]; - } - - pstream->databitpos += nbits; - pstream->bitpos = (unsigned char)(bitpos + nbits); - - *outdata = (pstream->bitbuf >> (32 - pstream->bitpos)) & mask[(unsigned short)nbits]; - return 0; -} - -static void show_bits(nal_stream *pstream, unsigned char nbits, unsigned int *outdata) -{ - unsigned char *bits; - unsigned int databitpos = pstream->databitpos; - unsigned int bitpos = pstream->bitpos; - unsigned int databytepos; - - uint i; - - if (nbits > (32 - bitpos)) /* not enough bits */ - { - databytepos = databitpos >> 3; /* byte aligned position */ - bitpos = databitpos & 7; /* update bit position */ - if (databytepos > pstream->numbytes - 4) - { - pstream->bitbuf = 0; - for (i = 0; i < pstream->numbytes - databytepos; i++) - { - pstream->bitbuf |= pstream->data[databytepos+i]; - pstream->bitbuf <<= 8; - } - pstream->bitbuf <<= 8 * (3 - i); - } - else - { - bits = &pstream->data[databytepos]; - pstream->bitbuf = (bits[0] << 24) | (bits[1] << 16) | (bits[2] << 8) | bits[3]; - } - pstream->bitpos = bitpos; - } - - bitpos += nbits; - - *outdata = (pstream->bitbuf >> (32 - bitpos)) & mask[(unsigned short)nbits]; -} - -static void flush_bits(nal_stream *pstream, unsigned char nbits) -{ - unsigned char *bits; - unsigned int databitpos = pstream->databitpos; - unsigned int bitpos = pstream->bitpos; - unsigned int databytepos; - - if ((databitpos + nbits) > (unsigned int)(pstream->numbytes << 3)) { - // buffer over run - LOGE("%s: buffer over run",__func__); - } - - databitpos += nbits; - bitpos += nbits; - - if (bitpos > 32) - { - databytepos = databitpos >> 3; /* byte aligned position */ - bitpos = databitpos & 7; /* update bit position */ - bits = &pstream->data[databytepos]; - pstream->bitbuf = (bits[0] << 24) | (bits[1] << 16) | (bits[2] << 8) | bits[3]; - } - - pstream->databitpos = databitpos; - pstream->bitpos = bitpos; -} - -static void read_ue_bits(nal_stream *pstream, unsigned int *coded_val) -{ - unsigned int temp; - unsigned int tmp_cnt; - int leading_zeros = 0; - - show_bits(pstream, 16, &temp); - tmp_cnt = temp | 0x1; - - PV_CLZ(leading_zeros, tmp_cnt) - - if (leading_zeros < 8) - { - *coded_val = (temp >> (15 - (leading_zeros << 1))) - 1; - flush_bits(pstream, (leading_zeros << 1) + 1); - } - else - { - read_bits(pstream, (leading_zeros << 1) + 1, &temp); - *coded_val = temp - 1; - } -} - -static void read_se_bits(nal_stream *pstream, int *coded_val) -{ - int leading_zeros = 0; - unsigned int temp; - - read_bits(pstream, 1, &temp); - while (!temp) - { - leading_zeros++; - if (read_bits(pstream, 1, &temp)) - { - break; - } - } - read_bits(pstream, leading_zeros, &temp); -} -#endif /* USE_PV_BITOPS */ - -#if USE_MIXVBP_DEF -static h264_Status h264_scaling_list(nal_stream *pstream, - unsigned char *scaling_list, - int sizeof_scaling_list, - unsigned char *use_default_scaling_matrix) -{ - int j, scanj; - int delta_scale, last_scale, next_scale; - - last_scale = 8; - next_scale = 8; - scanj = 0; - - for(j=0; j<sizeof_scaling_list; j++) { - if(next_scale!=0) { - read_se_bits(pstream, &delta_scale); - next_scale = (last_scale + delta_scale + 256) % 256; - *use_default_scaling_matrix = (unsigned char) (scanj==0 && next_scale==0); - } - - scaling_list[scanj] = (next_scale==0) ? last_scale:next_scale; - last_scale = scaling_list[scanj]; - scanj ++; - } - - return H264_STATUS_OK; -} -#endif - -static int _sps_parse(nal_stream *pstream, SPS *sps) -{ - h264_Status status = H264_SPS_ERROR; - unsigned int val; - int sval; - - read_bits(pstream, 8, &val); - sps->profile_idc = (unsigned char)val; - LOGV("%s: sps->profile_idc = %d", __func__, val); - - switch(sps->profile_idc) { - case h264_ProfileBaseline: - case h264_ProfileMain: - case h264_ProfileExtended: - case h264_ProfileHigh10: - case h264_ProfileHigh422: - case h264_ProfileHigh444: - case h264_ProfileHigh: - break; - default: - return H264_SPS_INVALID_PROFILE; - } - - read_bits(pstream, 8, &val); - sps->constraint_flags = (unsigned char)val; - LOGV("%s: sps->constraint_flags = %d", __func__, val); - - read_bits(pstream, 8, &val); - sps->level_idc = (unsigned short)val; - LOGV("%s: sps->level_idc = %d", __func__, val); - - switch(sps->level_idc) - { - case h264_Level1b: - case h264_Level1: - case h264_Level11: - case h264_Level12: - case h264_Level13: - case h264_Level2: - case h264_Level21: - case h264_Level22: - case h264_Level3: - case h264_Level31: - case h264_Level32: - case h264_Level4: - case h264_Level41: - case h264_Level42: - case h264_Level5: - case h264_Level51: - break; - default: - return H264_SPS_INVALID_LEVEL; - } - - do { - read_ue_bits(pstream, &val); - sps->seq_parameter_set_id = val; - LOGV("%s: sps->seq_parameter_set_id = %d", __func__, val); - if (val > MAX_NUM_SPS - 1) break; - - if((sps->profile_idc == h264_ProfileHigh) || - (sps->profile_idc == h264_ProfileHigh10) || - (sps->profile_idc == h264_ProfileHigh422) || - (sps->profile_idc == h264_ProfileHigh444)) - { - - read_ue_bits(pstream, &val); - sps->chroma_format_idc = val; - LOGV("%s: sps->chroma_format_idc = %d", __func__, val); - - if (val == 3) { - read_bits(pstream, 1, &val); - sps->separate_colour_plane_flag = val; - LOGV("%s: sps->separate_colour_plane_flag = %d", __func__, val); - } - - read_ue_bits(pstream, &val); - sps->bit_depth_luma_minus8 = val; - LOGV("%s: sps->bit_depth_luma_minus8 = %d", __func__, val); - - read_ue_bits(pstream, &val); - sps->bit_depth_chroma_minus8 = val; - LOGV("%s: sps->bit_depth_chroma_minus8 = %d", __func__, val); - - read_bits(pstream, 1, &val); - sps->qpprime_y_zero_transform_bypass_flag = (unsigned short)val; - LOGV("%s: sps->qpprime_y_zero_transform_bypass_flag = %d", __func__, val); - - read_bits(pstream, 1, &val); - sps->seq_scaling_matrix_present_flag = (unsigned short)val; - LOGV("%s: sps->seq_scaling_matrix_present_flag = %d", __func__, val); - - if (val) { - unsigned int i; - unsigned int _count_i = (sps->chroma_format_idc != 3)?8:12; - sps->seq_scaling_list_present_flag = malloc(sizeof(unsigned char)*_count_i); - for(i=0; i<_count_i; i++) { - read_bits(pstream, 1, &val); - sps->seq_scaling_list_present_flag[i] = (unsigned char)val; - if (val) { - if (i<6) { - h264_scaling_list(pstream, - sps->scaling_list_4x4[i], 16, - &sps->use_default_scaling_matrix_4x4_flag[i]); - } else { - h264_scaling_list(pstream, - sps->scaling_list_8x8[i-6], 64, - &sps->use_default_scaling_matrix_8x8_flag[i-6]); - } - } - } - } - } else { - sps->chroma_format_idc = 1; - sps->seq_scaling_matrix_present_flag = 0; - - sps->bit_depth_luma_minus8 = 0; - sps->bit_depth_chroma_minus8 = 0; - } - - read_ue_bits(pstream, &val); - sps->log2_max_frame_num_minus4 = val; - LOGV("%s: sps->log2_max_frame_num_minus4 = %d", __func__, val); - - read_ue_bits(pstream, &val); - sps->pic_order_cnt_type = val; - LOGV("%s: sps->pic_order_cnt_type = %d", __func__, val); - - if (val == 0) { - read_ue_bits(pstream, &val); - sps->log2_max_pic_order_cnt_lsb_minus4 = val; - LOGV("%s: sps->log2_max_pic_order_cnt_lsb_minus4 = %d", __func__, val); - } else if (val == 1) { - unsigned int i; - - read_bits(pstream, 1, &val); - sps->delta_pic_order_always_zero_flag = val; - LOGV("%s: sps->delta_pic_order_always_zero_flag = %d", __func__, val); - - read_se_bits(pstream, &sval); - sps->offset_for_non_ref_pic = sval; - LOGV("%s: sps->offset_for_non_ref_pic = %d", __func__, val); - - read_se_bits(pstream, &sval); - sps->offset_for_top_to_bottom_field = sval; - LOGV("%s: sps->offset_for_top_to_bottom_field = %d", __func__, val); - - read_ue_bits(pstream, &val); - sps->num_ref_frames_in_pic_order_cnt_cycle = val; - LOGV("%s: sps->num_ref_frames_in_pic_order_cnt_cycle = %d", __func__, val); - - sps->offset_for_ref_frame = malloc(sizeof(int)*val); - for (i=0; i<sps->num_ref_frames_in_pic_order_cnt_cycle; i++) { - read_se_bits(pstream, &sval); - sps->offset_for_ref_frame[i] = sval; - } - - } - - read_ue_bits(pstream, &val); - sps->max_num_ref_frames = val; - LOGV("%s: sps->max_num_ref_frames = %d", __func__, val); - - read_bits(pstream, 1, &val); - sps->gaps_in_frame_num_value_allowed_flag = val; - LOGV("%s: sps->gaps_in_frame_num_value_allowed_flag = %d", __func__, val); - - read_ue_bits(pstream, &val); - sps->pic_width_in_mbs_minus1 = val; - LOGV("%s: sps->pic_width_in_mbs_minus1 = %d", __func__, val); - - read_ue_bits(pstream, &val); - sps->pic_height_in_map_units_minus1 = val; - LOGV("%s: sps->pic_height_in_map_units_minus1 = %d", __func__, val); - - read_bits(pstream, 1, &val); - sps->frame_mbs_only_flag = (unsigned char)val; - LOGV("%s: sps->frame_mbs_only_flag = %d", __func__, val); - - if (!val) { - read_bits(pstream, 1, &val); - sps->mb_adaptive_frame_field_flag = (unsigned char)val; - LOGV("%s: sps->mb_adaptive_frame_field_flag = %d", __func__, val); - } - - read_bits(pstream, 1, &val); - sps->direct_8x8_inference_flag = (unsigned char)val; - LOGV("%s: sps->direct_8x8_inference_flag = %d", __func__, val); - - read_bits(pstream, 1, &val); - sps->frame_cropping_flag = (unsigned char)val; - LOGV("%s: sps->frame_cropping_flag = %d", __func__, val); - - if (val) { - read_ue_bits(pstream, &val); - sps->frame_crop_left_offset = val; - LOGV("%s: sps->frame_crop_left_offset = %d", __func__, val); - - read_ue_bits(pstream, &val); - sps->frame_crop_right_offset = val; - LOGV("%s: sps->frame_crop_right_offset = %d", __func__, val); - - read_ue_bits(pstream, &val); - sps->frame_crop_top_offset = val; - LOGV("%s: sps->frame_crop_top_offset = %d", __func__, val); - - read_ue_bits(pstream, &val); - sps->frame_crop_bottom_offset = val; - LOGV("%s: sps->frame_crop_bottom_offset = %d", __func__, val); - } - - read_bits(pstream, 1, &val); - sps->vui_parameters_present_flag = val; - LOGV("%s: sps->vui_parameters_present_flag = %d", __func__, val); - - status = H264_STATUS_OK; - } while(0); - - return status; -} - -static int _vui_parse(nal_stream *pstream, SPS *sps) -{ - unsigned int val; - int sval; - h264_Status status = H264_SPS_ERROR; - VUI* vui = sps->vui; - - if (!vui) { - LOGE("%s: Invalid VUI", __func__); - return status; - } - - read_bits(pstream, 1, &val); - vui->aspect_ratio_info_present_flag = (unsigned char)val; - LOGV("%s: vui->aspect_ratio_info_present_flag = %d", __func__, val); - - if (val) { - read_bits(pstream, 8, &val); - vui->aspect_ratio_idc = (unsigned char)val; - LOGV("%s: vui->aspect_ratio_idc = %d", __func__, val); - - if (val == Extended_SAR) { - read_bits(pstream, 16, &val); - vui->sar_width = (unsigned short)val; - LOGV("%s: vui->sar_width = %d", __func__, val); - - read_bits(pstream, 16, &val); - vui->sar_height = (unsigned short)val; - LOGV("%s: vui->sar_height = %d", __func__, val); - } - } - - read_bits(pstream, 1, &val); - vui->overscan_info_present_flag = (unsigned char)val; - LOGV("%s: vui->overscan_info_present_flag = %d", __func__, val); - - if (val) { - read_bits(pstream, 1, &val); - vui->overscan_appropriate_flag = (unsigned char)val; - LOGV("%s: vui->overscan_appropriate_flag = %d", __func__, val); - } - - read_bits(pstream, 1, &val); - vui->video_signal_type_present_flag = (unsigned char)val; - LOGV("%s: vui->video_signal_type_present_flag = %d", __func__, val); - - if (val) { - read_bits(pstream, 3, &val); - vui->video_format = (unsigned char)val; - LOGV("%s: vui->video_format = %d", __func__, val); - - read_bits(pstream, 1, &val); - vui->video_full_range_flag = (unsigned char)val; - LOGV("%s: vui->video_full_range_flag = %d", __func__, val); - - read_bits(pstream, 1, &val); - vui->colour_description_present_flag = (unsigned char)val; - LOGV("%s: vui->colour_description_present_flag = %d", __func__, val); - - if (val) { - read_bits(pstream, 8, &val); - vui->colour_primaries = (unsigned char)val; - LOGV("%s: vui->colour_primaries = %d", __func__, val); - - read_bits(pstream, 8, &val); - vui->transfer_characteristics = (unsigned char)val; - LOGV("%s: vui->transfer_characteristics = %d", __func__, val); - - read_bits(pstream, 8, &val); - vui->matrix_coefficients = (unsigned char)val; - LOGV("%s: vui->matrix_coefficients = %d", __func__, val); - } - } - - read_bits(pstream, 1, &val); - vui->chroma_loc_info_present_flag = (unsigned char)val; - LOGV("%s: vui->chroma_loc_info_present_flag = %d", __func__, val); - - if (val) { - read_ue_bits(pstream, &val); - vui->chroma_sample_loc_type_top_field = val; - LOGV("%s: vui->chroma_sample_loc_type_top_field = %d", __func__, val); - - read_ue_bits(pstream, &val); - vui->chroma_sample_loc_type_bottom_field = val; - LOGV("%s: vui->chroma_sample_loc_type_bottom_field = %d", __func__, val); - } - - read_bits(pstream, 1, &val); - vui->timing_info_present_flag = val; - LOGV("%s: vui->timing_info_present_flag = %d", __func__, vui->timing_info_present_flag); - - if (val) { - read_bits(pstream, 32, &val); - vui->num_units_in_tick = val; - LOGV("%s: vui->num_units_in_tick = %d", __func__, vui->num_units_in_tick); - - read_bits(pstream, 32, &val); - vui->time_scale = val; - LOGV("%s: vui->time_scale = %d", __func__, vui->time_scale); - - read_bits(pstream, 1, &val); - vui->fixed_frame_rate_flag = val; - LOGV("%s: vui->fixed_frame_rate_flag = %d", __func__, vui->fixed_frame_rate_flag); - } - - /* TBD */ - - return H264_STATUS_OK; -} - -static int calculate_stride(unsigned int width, - unsigned int height, - unsigned int *stride) -{ - if ((width <= 0) || (width > 4096) || (height <= 0) || (height > 4096)) - { - return -1; - } - - if (512 >= width) - { - *stride = 512; - } - else if (1024 >= width) - { - *stride = 1024; - } - else if (1280 >= width) - { - *stride = 1280; - } - else if (2048 >= width) - { - *stride = 2048; - } - else if (4096 >= width) - { - *stride = 4096; - } - else - { - return -1; - } - return 0; -} - -int nal_sps_parse(unsigned char *buffer, unsigned int len, - unsigned int *width, unsigned int *height, - unsigned int *stride, unsigned int *sliceheight) -{ - SPS sps; - VUI vui; - nal_stream nalst; - unsigned int crop_left, crop_right, crop_top, crop_bottom; - unsigned int val; - int status = H264_SPS_ERROR; - - nalst.data = buffer; - nalst.numbytes = len; - nalst.bitbuf = 0; - nalst.bitpos = 32; - nalst.bytepos = 0; - nalst.databitpos = 0; - - memset(&sps, 0, sizeof(sps)); - memset(&vui, 0, sizeof(vui)); - sps.vui = &vui; - - read_bits(&nalst, 8, &val); - if ((val & 0x1F) != 7) { - LOGE("%s: NAL type is not SPS. ERROR", __func__); - goto init_error; - } - - /* parse SPS */ - status = _sps_parse(&nalst, &sps); - if (status) goto sps_error; - -#if USE_VUI_PARSER - if (sps.vui_parameters_present_flag) { - /* parse VUI */ - status = _vui_parse(&nalst, &sps); - if (status) goto vui_error; - } else { - LOGE("%s: VUI parameters present flag is OFF from SPS", __func__); - goto vui_error; - } -#endif - - /* calculate width, height, stride, sliceheight */ - *width = (sps.pic_width_in_mbs_minus1 + 1) * 16; - *height = (sps.pic_height_in_map_units_minus1 + 1) * 16; - LOGV("%s: width = %d", __func__, *width); - LOGV("%s: height = %d", __func__, *height); - - if (sps.frame_cropping_flag) { - crop_left = 2 * sps.frame_crop_left_offset; - crop_right = *width - (2 * sps.frame_crop_right_offset + 1); - - if (sps.frame_mbs_only_flag) { - crop_top = 2 * sps.frame_crop_top_offset; - crop_bottom = *height - (2 * sps.frame_crop_bottom_offset + 1); - } else { - crop_top = 4 * sps.frame_crop_top_offset; - crop_bottom = *height - (4 * sps.frame_crop_bottom_offset + 1); - } - } else { - crop_bottom = *height - 1; - crop_right = *width - 1; - crop_top = crop_left = 0; - } - *width = crop_right - crop_left + 1; - *height = crop_bottom - crop_top + 1; - -#if 0 - /* NOTE: calculating method from psb_video library */ - calculate_stride(*width, *height, stride); - *sliceheight = (*height + 0x1F) & ~0x1F; -#else - *stride = *width; - *sliceheight = *height; -#endif - - LOGV("%s: frame width = %d", __func__, *width); - LOGV("%s: frame height = %d", __func__, *height); - LOGV("%s: stride = %d", __func__, *stride); - LOGV("%s: sliceheight = %d", __func__, *sliceheight); - - return H264_STATUS_OK; - - sps_error: - *width = 0; - *height = 0; - vui_error: - if (sps.seq_scaling_list_present_flag) - free(sps.seq_scaling_list_present_flag); - if (sps.offset_for_ref_frame) - free(sps.offset_for_ref_frame); - init_error: - return status; -} |