Home | History | Annotate | Download | only in include
      1 /*
      2  * Copyright (C) 2014 Intel Corporation. All rights reserved.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef VBP_LOADER_H
     18 #define VBP_LOADER_H
     19 
     20 #include <va/va.h>
     21 
     22 #ifdef USE_HW_VP8
     23 #include <va/va_dec_vp8.h>
     24 #endif
     25 
     26 #ifndef TRUE
     27 #define TRUE 1
     28 #endif
     29 
     30 #ifndef FALSE
     31 #define FALSE 0
     32 #endif
     33 
     34 
     35 #ifndef uint8
     36 typedef unsigned char uint8;
     37 #endif
     38 #ifndef uint16
     39 typedef unsigned short uint16;
     40 #endif
     41 #ifndef uint32
     42 typedef unsigned int uint32;
     43 #endif
     44 #ifndef int16
     45 typedef short int16;
     46 #endif
     47 
     48 typedef void *Handle;
     49 
     50 /*
     51  * MPEG-4 Part 2 data structure
     52  */
     53 
     54 typedef struct _vbp_codec_data_mp42
     55 {
     56     uint8  profile_and_level_indication;
     57     uint32 video_object_layer_width;
     58     uint32 video_object_layer_height;
     59 
     60     // 0 for unspecified, PAL/NTSC/SECAM
     61     uint8  video_format;
     62 
     63     // 0 short range, 1 full range
     64     uint8  video_range;
     65 
     66     // default 2 (unspecified), 1 for BT709.
     67     uint8  matrix_coefficients;
     68 
     69     uint8  short_video_header;
     70 
     71     // always exist for mpeg-4,
     72     uint8   aspect_ratio_info;
     73     uint8   par_width;
     74     uint8   par_height;
     75 
     76     // bit rate
     77     int bit_rate;
     78 } vbp_codec_data_mp42;
     79 
     80 typedef struct _vbp_slice_data_mp42
     81 {
     82     uint8* buffer_addr;
     83     uint32 slice_offset;
     84     uint32 slice_size;
     85     VASliceParameterBufferMPEG4 slice_param;
     86 } vbp_slice_data_mp42;
     87 
     88 typedef struct _vbp_picture_data_mp42 vbp_picture_data_mp42;
     89 
     90 struct _vbp_picture_data_mp42
     91 {
     92     uint8 vop_coded;
     93     uint16 vop_time_increment;
     94     /* indicates if current buffer contains parameter for the first slice of the picture */
     95     uint8 new_picture_flag;
     96     VAPictureParameterBufferMPEG4 picture_param;
     97     vbp_slice_data_mp42 slice_data;
     98 
     99     vbp_picture_data_mp42* next_picture_data;
    100 };
    101 
    102 typedef struct _vbp_data_mp42
    103 {
    104     vbp_codec_data_mp42 codec_data;
    105     VAIQMatrixBufferMPEG4 iq_matrix_buffer;
    106 
    107     uint32 number_picture_data;
    108     uint32 number_pictures;
    109 
    110     vbp_picture_data_mp42 *picture_data;
    111 
    112 } vbp_data_mp42;
    113 
    114 /*
    115  * H.264 data structure
    116  */
    117 
    118 typedef struct _vbp_codec_data_h264
    119 {
    120     uint8 pic_parameter_set_id;
    121     uint8 seq_parameter_set_id;
    122 
    123     uint8 profile_idc;
    124     uint8 level_idc;
    125     /*constraint flag sets (h.264 Spec v2009)*/
    126     uint8 constraint_set0_flag;
    127     uint8 constraint_set1_flag;
    128     uint8 constraint_set2_flag;
    129     uint8 constraint_set3_flag;
    130     uint8 constraint_set4_flag;
    131 
    132     uint8 num_ref_frames;
    133     uint8 gaps_in_frame_num_value_allowed_flag;
    134 
    135     uint8 frame_mbs_only_flag;
    136     uint8 mb_adaptive_frame_field_flag;
    137 
    138     int frame_width;
    139     int frame_height;
    140 
    141     uint8 vui_parameters_present_flag;
    142 
    143     /* aspect ratio */
    144     uint8 aspect_ratio_idc;
    145     uint16 sar_width;
    146     uint16 sar_height;
    147 
    148     /* cropping information */
    149     int crop_top;
    150     int crop_bottom;
    151     int crop_left;
    152     int crop_right;
    153 
    154     /* video fromat */
    155 
    156     // default 5 unspecified
    157     uint8 video_format;
    158     uint8 video_full_range_flag;
    159 
    160     // default 2 unspecified
    161     uint8 matrix_coefficients;
    162 
    163     uint8 pic_order_cnt_type;
    164     int log2_max_pic_order_cnt_lsb_minus4;
    165 
    166     int bit_rate;
    167 
    168     int has_slice;
    169 } vbp_codec_data_h264;
    170 
    171 typedef struct _vbp_slice_data_h264
    172 {
    173     uint8* buffer_addr;
    174 
    175     uint32 slice_offset; /* slice data offset */
    176 
    177     uint32 slice_size; /* slice data size */
    178 
    179     uint8 nal_unit_type;
    180 
    181     VASliceParameterBufferH264 slc_parms;
    182 
    183 } vbp_slice_data_h264;
    184 
    185 
    186 typedef struct _vbp_picture_data_h264
    187 {
    188     VAPictureParameterBufferH264* pic_parms;
    189 
    190     uint32 num_slices;
    191 
    192     vbp_slice_data_h264* slc_data;
    193 
    194 } vbp_picture_data_h264;
    195 
    196 
    197 typedef struct _vbp_data_h264
    198 {
    199     /* rolling counter of buffers sent by vbp_parse */
    200     uint32 buf_number;
    201 
    202     uint32 num_pictures;
    203 
    204     /* if SPS has been received */
    205     uint8  has_sps;
    206 
    207     /* if PPS has been received */
    208     uint8  has_pps;
    209 
    210     uint8  new_sps;
    211 
    212     uint8  new_pps;
    213 
    214     vbp_picture_data_h264* pic_data;
    215 
    216     /**
    217         * do we need to send matrix to VA for each picture? If not, we need
    218         * a flag indicating whether it is updated.
    219         */
    220     VAIQMatrixBufferH264* IQ_matrix_buf;
    221 
    222     vbp_codec_data_h264* codec_data;
    223 
    224 #ifdef USE_SLICE_HEADER_PARSING
    225     VAParsePictureParameterBuffer* pic_parse_buffer;
    226 #endif
    227 
    228 } vbp_data_h264;
    229 
    230 /*
    231  * vc1 data structure
    232  */
    233 typedef struct _vbp_codec_data_vc1
    234 {
    235     /* Sequence layer. */
    236     uint8  PROFILE;
    237     uint8  LEVEL;
    238     uint8  POSTPROCFLAG;
    239     uint8  PULLDOWN;
    240     uint8  INTERLACE;
    241     uint8  TFCNTRFLAG;
    242     uint8  FINTERPFLAG;
    243     uint8  PSF;
    244 
    245     // default 2: unspecified
    246     uint8  MATRIX_COEF;
    247 
    248     /* Entry point layer. */
    249     uint8  BROKEN_LINK;
    250     uint8  CLOSED_ENTRY;
    251     uint8  PANSCAN_FLAG;
    252     uint8  REFDIST_FLAG;
    253     uint8  LOOPFILTER;
    254     uint8  FASTUVMC;
    255     uint8  EXTENDED_MV;
    256     uint8  DQUANT;
    257     uint8  VSTRANSFORM;
    258     uint8  OVERLAP;
    259     uint8  QUANTIZER;
    260     uint16 CODED_WIDTH;
    261     uint16 CODED_HEIGHT;
    262     uint8  EXTENDED_DMV;
    263     uint8  RANGE_MAPY_FLAG;
    264     uint8  RANGE_MAPY;
    265     uint8  RANGE_MAPUV_FLAG;
    266     uint8  RANGE_MAPUV;
    267 
    268     /* Others. */
    269     uint8  RANGERED;
    270     uint8  MAXBFRAMES;
    271     uint8  MULTIRES;
    272     uint8  SYNCMARKER;
    273     uint8  RNDCTRL;
    274     uint8  REFDIST;
    275     uint16 widthMB;
    276     uint16 heightMB;
    277 
    278     uint8  INTCOMPFIELD;
    279     uint8  LUMSCALE2;
    280     uint8  LUMSHIFT2;
    281 
    282     // aspect ratio
    283 
    284     // default unspecified
    285     uint8 ASPECT_RATIO;
    286 
    287     uint8 ASPECT_HORIZ_SIZE;
    288     uint8 ASPECT_VERT_SIZE;
    289     // bit rate
    290     int bit_rate;
    291 } vbp_codec_data_vc1;
    292 
    293 typedef struct _vbp_slice_data_vc1
    294 {
    295     uint8 *buffer_addr;
    296     uint32 slice_offset;
    297     uint32 slice_size;
    298     VASliceParameterBufferVC1 slc_parms;     /* pointer to slice parms */
    299 } vbp_slice_data_vc1;
    300 
    301 
    302 typedef struct _vbp_picture_data_vc1
    303 {
    304     uint32 picture_is_skipped;                /* VC1_PTYPE_SKIPPED is PTYPE is skipped. */
    305     VAPictureParameterBufferVC1 *pic_parms;   /* current parsed picture header */
    306     uint32 size_bitplanes;                    /* based on number of MBs */
    307     uint8 *packed_bitplanes;                  /* contains up to three bitplanes packed for libVA */
    308     uint32 num_slices;                        /* number of slices.  always at least one */
    309     vbp_slice_data_vc1 *slc_data;             /* pointer to array of slice data */
    310 } vbp_picture_data_vc1;
    311 
    312 typedef struct _vbp_data_vc1
    313 {
    314     uint32 buf_number;                        /* rolling counter of buffers sent by vbp_parse */
    315     vbp_codec_data_vc1 *se_data;              /* parsed SH/EPs */
    316 
    317     uint32 num_pictures;
    318 
    319     vbp_picture_data_vc1* pic_data;
    320 } vbp_data_vc1;
    321 
    322 #ifdef USE_HW_VP8
    323 typedef struct _vbp_codec_data_vp8
    324 {
    325     uint8 frame_type;
    326     uint8 version_num;
    327     int show_frame;
    328 
    329     uint32 frame_width;
    330     uint32 frame_height;
    331 
    332     int refresh_alt_frame;
    333     int refresh_golden_frame;
    334     int refresh_last_frame;
    335 
    336     /* cropping information */
    337     int crop_top;
    338     int crop_bottom;
    339     int crop_left;
    340     int crop_right;
    341 
    342     int golden_copied;
    343     int altref_copied;
    344 } vbp_codec_data_vp8;
    345 
    346 typedef struct _vbp_slice_data_vp8
    347 {
    348     uint8 *buffer_addr;
    349     uint32 slice_offset;
    350     uint32 slice_size;
    351     VASliceParameterBufferVP8 slc_parms;     /* pointer to slice parms */
    352 } vbp_slice_data_vp8;
    353 
    354 typedef struct _vbp_picture_data_vp8
    355 {
    356     VAPictureParameterBufferVP8* pic_parms;   /* current parsed picture header */
    357 
    358     uint32 num_slices;                        /* number of slices.  always one for VP8 */
    359     vbp_slice_data_vp8 *slc_data;             /* pointer to array of slice data */
    360 } vbp_picture_data_vp8;
    361 
    362 typedef struct _vbp_data_vp8
    363 {
    364     uint32 buf_number;                        /* rolling counter of buffers sent by vbp_parse */
    365     vbp_codec_data_vp8 *codec_data;
    366 
    367     uint32 num_pictures;
    368 
    369     vbp_picture_data_vp8* pic_data;
    370 
    371     VAProbabilityDataBufferVP8* prob_data;
    372     VAIQMatrixBufferVP8* IQ_matrix_buf;
    373 } vbp_data_vp8;
    374 #endif
    375 
    376 enum _picture_type
    377 {
    378     VC1_PTYPE_I,
    379     VC1_PTYPE_P,
    380     VC1_PTYPE_B,
    381     VC1_PTYPE_BI,
    382     VC1_PTYPE_SKIPPED
    383 };
    384 
    385 enum _vbp_parser_error
    386 {
    387     VBP_OK,
    388     VBP_TYPE,
    389     VBP_LOAD,
    390     VBP_INIT,
    391     VBP_DATA,
    392     VBP_DONE,
    393     VBP_MEM,
    394     VBP_PARM,
    395     VBP_PARTIAL,
    396     VBP_MULTI,
    397     VBP_ERROR
    398 };
    399 
    400 enum _vbp_parser_type
    401 {
    402     VBP_VC1,
    403     VBP_MPEG2,
    404     VBP_MPEG4,
    405     VBP_H264,
    406 #ifdef USE_HW_VP8
    407     VBP_VP8,
    408 #endif
    409 #if (defined USE_AVC_SHORT_FORMAT || defined USE_SLICE_HEADER_PARSING)
    410     VBP_H264SECURE,
    411 #endif
    412 };
    413 
    414 
    415 /*
    416  * open video bitstream parser to parse a specific media type.
    417  * @param  parser_type: one of the types defined in #vbp_parser_type
    418  * @param  hcontext: pointer to hold returned VBP context handle.
    419  * @return VBP_OK on success, anything else on failure.
    420  *
    421  */
    422 uint32 vbp_open(uint32 parser_type, Handle *hcontext);
    423 
    424 /*
    425  * close video bitstream parser.
    426  * @param hcontext: VBP context handle.
    427  * @returns VBP_OK on success, anything else on failure.
    428  *
    429  */
    430 uint32 vbp_close(Handle hcontext);
    431 
    432 /*
    433  * parse bitstream.
    434  * @param hcontext: handle to VBP context.
    435  * @param data: pointer to bitstream buffer.
    436  * @param size: size of bitstream buffer.
    437  * @param init_flag: 1 if buffer contains bitstream configuration data, 0 otherwise.
    438  * @return VBP_OK on success, anything else on failure.
    439  *
    440  */
    441 uint32 vbp_parse(Handle hcontext, uint8 *data, uint32 size, uint8 init_data_flag);
    442 
    443 /*
    444  * query parsing result.
    445  * @param hcontext: handle to VBP context.
    446  * @param data: pointer to hold a data blob that contains parsing result.
    447  * Structure of data blob is determined by the media type.
    448  * @return VBP_OK on success, anything else on failure.
    449  *
    450  */
    451 uint32 vbp_query(Handle hcontext, void **data);
    452 
    453 
    454 /*
    455  * flush any un-parsed bitstream.
    456  * @param hcontext: handle to VBP context.
    457  * @returns VBP_OK on success, anything else on failure.
    458  *
    459  */
    460 uint32 vbp_flush(Handle hcontent);
    461 
    462 #if (defined USE_AVC_SHORT_FORMAT || defined USE_SLICE_HEADER_PARSING)
    463 /*
    464  * update the the vbp context using the new data
    465  * @param hcontext: handle to VBP context.
    466  * @param data: pointer to the new data buffer.
    467  * @param size: size of new data buffer.
    468  * @param data: pointer to hold a data blob that contains parsing result.
    469  * @returns VBP_OK on success, anything else on failure.
    470  *
    471 */
    472 uint32 vbp_update(Handle hcontext, void *newdata, uint32 size, void **data);
    473 #endif
    474 
    475 #endif /* VBP_LOADER_H */
    476