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
mp4_Parse_VideoObjectPlane_svh(void * parent,viddec_mp4_parser_t * parser)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
mp4_Parse_VideoObject_svh(void * parent,viddec_mp4_parser_t * parser)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