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