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