blob: 1e888a9e7241623d04291f1fb272acdde850dc44 [file] [log] [blame]
/* INTEL CONFIDENTIAL
* Copyright (c) 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>
#ifdef USE_HW_VP8
#include <va/va_dec_vp8.h>
#endif
#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 */
uint8 nal_unit_type;
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;
#ifdef USE_HW_VP8
typedef struct _vbp_codec_data_vp8
{
uint8 frame_type;
uint8 version_num;
int show_frame;
uint32 frame_width;
uint32 frame_height;
int refresh_alt_frame;
int refresh_golden_frame;
int refresh_last_frame;
/* cropping information */
int crop_top;
int crop_bottom;
int crop_left;
int crop_right;
int golden_copied;
int altref_copied;
} vbp_codec_data_vp8;
typedef struct _vbp_slice_data_vp8
{
uint8 *buffer_addr;
uint32 slice_offset;
uint32 slice_size;
VASliceParameterBufferBase slc_parms; /* pointer to slice parms */
} vbp_slice_data_vp8;
typedef struct _vbp_picture_data_vp8
{
VAPictureParameterBufferVP8* pic_parms; /* current parsed picture header */
uint32 num_slices; /* number of slices. always one for VP8 */
vbp_slice_data_vp8 *slc_data; /* pointer to array of slice data */
} vbp_picture_data_vp8;
typedef struct _vbp_data_vp8
{
uint32 buf_number; /* rolling counter of buffers sent by vbp_parse */
vbp_codec_data_vp8 *codec_data;
uint32 num_pictures;
vbp_picture_data_vp8* pic_data;
VAProbabilityDataBufferVP8* prob_data;
VAIQMatrixBufferVP8* IQ_matrix_buf;
} vbp_data_vp8;
#endif
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,
VBP_MULTI
};
enum _vbp_parser_type
{
VBP_VC1,
VBP_MPEG2,
VBP_MPEG4,
VBP_H264,
#ifdef USE_HW_VP8
VBP_VP8
#endif
};
/*
* 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 */