1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_mp4_shortheader.h" 2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct 4bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint16_t vop_width; 6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint16_t vop_height; 7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint16_t num_macroblocks_in_gob; 8bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint16_t num_gobs_in_vop; 9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t num_rows_in_gob; 10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} svh_src_fmt_params_t; 11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 12bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeconst svh_src_fmt_params_t svh_src_fmt_defaults[5] = 13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee {128, 96, 8, 6, 1}, 15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee {176, 144, 11, 9, 1}, 16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee {352, 288, 22, 18, 1}, 17bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee {704, 576, 88, 18, 2}, 18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee {1408, 1152, 352, 18, 4}, 19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}; 20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 21bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemp4_Status_t mp4_Parse_VideoObjectPlane_svh(void *parent, viddec_mp4_parser_t *parser) 22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mp4_Status_t ret = MP4_STATUS_OK; 24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee unsigned int data; 25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mp4_VideoObjectPlaneH263 *svh = &(parser->info.VisualObject.VideoObject.VideoObjectPlaneH263); 26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t getbits = 0; 27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee do 29bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 30bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee getbits = viddec_pm_get_bits(parent, &data, 27); 31bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee BREAK_GETBITS_REQD_MISSING(getbits, ret); 32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 33bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee data = data >> 1; // zero_bit 34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee svh->vop_quant = (data & 0x1F); 35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee data = data >> 9; // vop_quant + four_reserved_zero_bits 36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee svh->picture_coding_type = (data & 0x1); 37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee data = data >> 1; // vop_quant + four_reserved_zero_bits 38bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee svh->source_format = (data & 0x7); 39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee data = data >> 8; // source_format + full_picture_freeze_release + document_camera_indicator + split_screen_indicator + zero_bit + marker_bit 40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee svh->temporal_reference = data; 41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (svh->source_format == 0 || svh->source_format > 5) 43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee DEB("Error: Bad value for VideoPlaneWithShortHeader.source_format\n"); 45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MP4_STATUS_NOTSUPPORT; 46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (;;) 50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee getbits = viddec_pm_get_bits(parent, &data, 1); // pei 52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee BREAK_GETBITS_FAIL(getbits, ret); 53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!data) 54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee getbits = viddec_pm_get_bits(parent, &data, 8); // psupp 56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee BREAK_GETBITS_FAIL(getbits, ret); 57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Anything after this needs to be fed to the decoder as PIXEL_ES 60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } while(0); 61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 65bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemp4_Status_t mp4_Parse_VideoObject_svh(void *parent, viddec_mp4_parser_t *parser) 66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mp4_Status_t ret=MP4_STATUS_OK; 68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mp4_Info_t *pInfo = &(parser->info); 69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mp4_VideoSignalType_t *vst = &(pInfo->VisualObject.VideoSignalType); 70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mp4_VideoObjectLayer_t *vol = &(pInfo->VisualObject.VideoObject); 71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mp4_VideoObjectPlane_t *vop = &(pInfo->VisualObject.VideoObject.VideoObjectPlane); 72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mp4_VideoObjectPlaneH263 *svh = &(pInfo->VisualObject.VideoObject.VideoObjectPlaneH263); 73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t index = 0; 74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mp4_Parse_VideoObjectPlane_svh(parent, parser); 76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(ret == MP4_STATUS_OK) 77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Populate defaults for the svh 79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->short_video_header = 1; 80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->video_object_layer_shape = MP4_SHAPE_TYPE_RECTANGULAR; 81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->obmc_disable = 1; 82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->quant_type = 0; 83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->resync_marker_disable = 1; 84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->data_partitioned = 0; 85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->reversible_vlc = 0; 86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->interlaced = 0; 87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->complexity_estimation_disable = 1; 88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->scalability = 0; 89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->not_8_bit = 0; 90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->bits_per_pixel = 8; 91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->quant_precision = 5; 92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->vop_time_increment_resolution = 30000; 93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->fixed_vop_time_increment = 1001; 94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->aspect_ratio_info = MP4_ASPECT_RATIO_12_11; 95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vop->vop_rounding_type = 0; 97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vop->vop_fcode_forward = 1; 98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vop->vop_coded = 1; 99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vop->vop_coding_type = svh->picture_coding_type ? MP4_VOP_TYPE_P: MP4_VOP_TYPE_I; 100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vop->vop_quant = svh->vop_quant; 101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vst->colour_primaries = 1; 103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vst->transfer_characteristics = 1; 104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vst->matrix_coefficients = 6; 105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee index = svh->source_format - 1; 107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->video_object_layer_width = svh_src_fmt_defaults[index].vop_width; 108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vol->video_object_layer_height = svh_src_fmt_defaults[index].vop_height; 109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee svh->num_macroblocks_in_gob = svh_src_fmt_defaults[index].num_macroblocks_in_gob; 110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee svh->num_gobs_in_vop = svh_src_fmt_defaults[index].num_gobs_in_vop; 111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee svh->num_rows_in_gob = svh_src_fmt_defaults[index].num_rows_in_gob; 112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mp4_set_hdr_bitstream_error(parser, false, ret); 115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // POPULATE WORKLOAD ITEM 117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_workload_item_t wi; 119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee wi.vwi_type = VIDDEC_WORKLOAD_MPEG4_VIDEO_PLANE_SHORT; 121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee wi.mp4_vpsh.info = 0; 123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee wi.mp4_vpsh.pad1 = 0; 124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee wi.mp4_vpsh.pad2 = 0; 125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_fw_mp4_vpsh_set_source_format(&wi.mp4_vpsh, svh->source_format); 127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = viddec_pm_append_workitem(parent, &wi); 129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(ret == 1) 130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MP4_STATUS_OK; 131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 135