Home | History | Annotate | Download | only in parser
      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