blob: ccf8e0036a2792f49a322cbc7980f8338ae64a48 [file] [log] [blame]
/*
INTEL CONFIDENTIAL
Copyright 2009 Intel Corporation All Rights Reserved.
The source code contained or described herein and all documents related to the source code ("Material") are owned by Intel Corporation or its suppliers or licensors. Title to the Material remains with Intel Corporation or its suppliers and licensors. The Material contains trade secrets and proprietary and confidential information of Intel or its suppliers and licensors. The Material is protected by worldwide copyright and trade secret laws and treaty provisions. No part of the Material may be used, copied, reproduced, modified, published, uploaded, posted, transmitted, distributed, or disclosed in any way without Intel’s prior express written permission.
No license under any patent, copyright, trade secret or other intellectual property right is granted to or conferred upon you by disclosure or delivery of the Materials, either expressly, by implication, inducement, estoppel or otherwise. Any license under such intellectual property rights must be express and approved by Intel in writing.
*/
#ifndef VBP_LOADER_H
#define VBP_LOADER_H
#include <va/va.h>
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef uint8
typedef unsigned char uint8;
#endif
#ifndef uint16
typedef unsigned short uint16;
#endif
#ifndef uint32
typedef unsigned int uint32;
#endif
typedef void *Handle;
/*
* MPEG-4 Part 2 data structure
*/
typedef struct _vbp_codec_data_mp42
{
uint8 profile_and_level_indication;
uint32 video_object_layer_width;
uint32 video_object_layer_height;
// 0 for unspecified, PAL/NTSC/SECAM
uint8 video_format;
// 0 short range, 1 full range
uint8 video_range;
// default 2 (unspecified), 1 for BT709.
uint8 matrix_coefficients;
uint8 short_video_header;
// always exist for mpeg-4,
uint8 aspect_ratio_info;
uint8 par_width;
uint8 par_height;
// bit rate
int bit_rate;
} vbp_codec_data_mp42;
typedef struct _vbp_slice_data_mp42
{
uint8* buffer_addr;
uint32 slice_offset;
uint32 slice_size;
VASliceParameterBufferMPEG4 slice_param;
} vbp_slice_data_mp42;
typedef struct _vbp_picture_data_mp42 vbp_picture_data_mp42;
struct _vbp_picture_data_mp42
{
uint8 vop_coded;
uint16 vop_time_increment;
/* indicates if current buffer contains parameter for the first slice of the picture */
uint8 new_picture_flag;
VAPictureParameterBufferMPEG4 picture_param;
vbp_slice_data_mp42 slice_data;
vbp_picture_data_mp42* next_picture_data;
};
typedef struct _vbp_data_mp42
{
vbp_codec_data_mp42 codec_data;
VAIQMatrixBufferMPEG4 iq_matrix_buffer;
uint32 number_picture_data;
uint32 number_pictures;
vbp_picture_data_mp42 *picture_data;
} vbp_data_mp42;
/*
* H.264 data structure
*/
typedef struct _vbp_codec_data_h264
{
uint8 pic_parameter_set_id;
uint8 seq_parameter_set_id;
uint8 profile_idc;
uint8 level_idc;
/*constraint flag sets (h.264 Spec v2009)*/
uint8 constraint_set0_flag;
uint8 constraint_set1_flag;
uint8 constraint_set2_flag;
uint8 constraint_set3_flag;
uint8 constraint_set4_flag;
uint8 num_ref_frames;
uint8 gaps_in_frame_num_value_allowed_flag;
uint8 frame_mbs_only_flag;
uint8 mb_adaptive_frame_field_flag;
int frame_width;
int frame_height;
uint8 vui_parameters_present_flag;
/* aspect ratio */
uint8 aspect_ratio_idc;
uint16 sar_width;
uint16 sar_height;
/* cropping information */
int crop_top;
int crop_bottom;
int crop_left;
int crop_right;
/* video fromat */
// default 5 unspecified
uint8 video_format;
uint8 video_full_range_flag;
// default 2 unspecified
uint8 matrix_coefficients;
uint8 pic_order_cnt_type;
int log2_max_pic_order_cnt_lsb_minus4;
int bit_rate;
} vbp_codec_data_h264;
typedef struct _vbp_slice_data_h264
{
uint8* buffer_addr;
uint32 slice_offset; /* slice data offset */
uint32 slice_size; /* slice data size */
VASliceParameterBufferH264 slc_parms;
} vbp_slice_data_h264;
typedef struct _vbp_picture_data_h264
{
VAPictureParameterBufferH264* pic_parms;
uint32 num_slices;
vbp_slice_data_h264* slc_data;
} vbp_picture_data_h264;
typedef struct _vbp_data_h264
{
/* rolling counter of buffers sent by vbp_parse */
uint32 buf_number;
uint32 num_pictures;
/* if SPS has been received */
uint8 has_sps;
/* if PPS has been received */
uint8 has_pps;
uint8 new_sps;
uint8 new_pps;
vbp_picture_data_h264* pic_data;
/**
* do we need to send matrix to VA for each picture? If not, we need
* a flag indicating whether it is updated.
*/
VAIQMatrixBufferH264* IQ_matrix_buf;
vbp_codec_data_h264* codec_data;
} vbp_data_h264;
/*
* vc1 data structure
*/
typedef struct _vbp_codec_data_vc1
{
/* Sequence layer. */
uint8 PROFILE;
uint8 LEVEL;
uint8 POSTPROCFLAG;
uint8 PULLDOWN;
uint8 INTERLACE;
uint8 TFCNTRFLAG;
uint8 FINTERPFLAG;
uint8 PSF;
// default 2: unspecified
uint8 MATRIX_COEF;
/* Entry point layer. */
uint8 BROKEN_LINK;
uint8 CLOSED_ENTRY;
uint8 PANSCAN_FLAG;
uint8 REFDIST_FLAG;
uint8 LOOPFILTER;
uint8 FASTUVMC;
uint8 EXTENDED_MV;
uint8 DQUANT;
uint8 VSTRANSFORM;
uint8 OVERLAP;
uint8 QUANTIZER;
uint16 CODED_WIDTH;
uint16 CODED_HEIGHT;
uint8 EXTENDED_DMV;
uint8 RANGE_MAPY_FLAG;
uint8 RANGE_MAPY;
uint8 RANGE_MAPUV_FLAG;
uint8 RANGE_MAPUV;
/* Others. */
uint8 RANGERED;
uint8 MAXBFRAMES;
uint8 MULTIRES;
uint8 SYNCMARKER;
uint8 RNDCTRL;
uint8 REFDIST;
uint16 widthMB;
uint16 heightMB;
uint8 INTCOMPFIELD;
uint8 LUMSCALE2;
uint8 LUMSHIFT2;
// aspect ratio
// default unspecified
uint8 ASPECT_RATIO;
uint8 ASPECT_HORIZ_SIZE;
uint8 ASPECT_VERT_SIZE;
// bit rate
int bit_rate;
} vbp_codec_data_vc1;
typedef struct _vbp_slice_data_vc1
{
uint8 *buffer_addr;
uint32 slice_offset;
uint32 slice_size;
VASliceParameterBufferVC1 slc_parms; /* pointer to slice parms */
} vbp_slice_data_vc1;
typedef struct _vbp_picture_data_vc1
{
uint32 picture_is_skipped; /* VC1_PTYPE_SKIPPED is PTYPE is skipped. */
VAPictureParameterBufferVC1 *pic_parms; /* current parsed picture header */
uint32 size_bitplanes; /* based on number of MBs */
uint8 *packed_bitplanes; /* contains up to three bitplanes packed for libVA */
uint32 num_slices; /* number of slices. always at least one */
vbp_slice_data_vc1 *slc_data; /* pointer to array of slice data */
} vbp_picture_data_vc1;
typedef struct _vbp_data_vc1
{
uint32 buf_number; /* rolling counter of buffers sent by vbp_parse */
vbp_codec_data_vc1 *se_data; /* parsed SH/EPs */
uint32 num_pictures;
vbp_picture_data_vc1* pic_data;
} vbp_data_vc1;
enum _picture_type
{
VC1_PTYPE_I,
VC1_PTYPE_P,
VC1_PTYPE_B,
VC1_PTYPE_BI,
VC1_PTYPE_SKIPPED
};
enum _vbp_parser_error
{
VBP_OK,
VBP_TYPE,
VBP_LOAD,
VBP_INIT,
VBP_DATA,
VBP_DONE,
VBP_MEM,
VBP_PARM,
VBP_PARTIAL
};
enum _vbp_parser_type
{
VBP_VC1,
VBP_MPEG2,
VBP_MPEG4,
VBP_H264
};
/*
* open video bitstream parser to parse a specific media type.
* @param parser_type: one of the types defined in #vbp_parser_type
* @param hcontext: pointer to hold returned VBP context handle.
* @return VBP_OK on success, anything else on failure.
*
*/
uint32 vbp_open(uint32 parser_type, Handle *hcontext);
/*
* close video bitstream parser.
* @param hcontext: VBP context handle.
* @returns VBP_OK on success, anything else on failure.
*
*/
uint32 vbp_close(Handle hcontext);
/*
* parse bitstream.
* @param hcontext: handle to VBP context.
* @param data: pointer to bitstream buffer.
* @param size: size of bitstream buffer.
* @param init_flag: 1 if buffer contains bitstream configuration data, 0 otherwise.
* @return VBP_OK on success, anything else on failure.
*
*/
uint32 vbp_parse(Handle hcontext, uint8 *data, uint32 size, uint8 init_data_flag);
/*
* query parsing result.
* @param hcontext: handle to VBP context.
* @param data: pointer to hold a data blob that contains parsing result.
* Structure of data blob is determined by the media type.
* @return VBP_OK on success, anything else on failure.
*
*/
uint32 vbp_query(Handle hcontext, void **data);
/*
* flush any un-parsed bitstream.
* @param hcontext: handle to VBP context.
* @returns VBP_OK on success, anything else on failure.
*
*/
uint32 vbp_flush(Handle hcontent);
#endif /* VBP_LOADER_H */