/* * Copyright (c) 2011 Intel Corporation. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sub license, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial portions * of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Waldo Bastian * */ #ifndef _PSB_DRV_VIDEO_H_ #define _PSB_DRV_VIDEO_H_ #include /* POSIX threads headers */ #include #include #include #include #include "object_heap.h" #include "psb_def.h" //#include "psb_drv_debug.h" #include "xf86drm.h" #ifdef ANDROID #ifdef BAYTRAIL #include #else #include #endif #endif #include "psb_overlay.h" #include "psb_texture.h" #include #ifndef ANDROID #include #include #include #include #include #include #else #define XID unsigned int #define INT16 unsigned int #include #undef LOG_TAG #define LOG_TAG "pvr_drv_video" #endif #include "hwdefs/dxva_fw_flags.h" #include #ifdef __GNUC__ # define __maybe_unused __attribute__((__unused__)) #else # define __maybe_unused #endif #ifndef min #define min(a, b) ((a) < (b)) ? (a) : (b) #endif #ifndef max #define max(a, b) ((a) > (b)) ? (a) : (b) #endif //#define _TOPAZHP_PDUMP_ #define TOPAZHP_PIPE_NUM 2 #define _TNG_RELOC_ //#define _TNG_FRAMES_ #define FORCED_REFERENCE 1 #define LTREFHEADER 1 //#define _TP_DEBUG_MMU_ //#define _TOPAZHP_REC_ /* * WORKAROUND_DMA_OFF_BY_ONE: LLDMA requests may access one additional byte which can cause * a MMU fault if the next byte after the buffer end is on a different page that isn't mapped. */ #define WORKAROUND_DMA_OFF_BY_ONE #define FOURCC_XVVA (('A' << 24) + ('V' << 16) + ('V' << 8) + 'X') #define PSB_MAX_PROFILES 32 #define PSB_MAX_ENTRYPOINTS 32 #define PSB_MAX_CONFIG_ATTRIBUTES VAConfigAttribTypeMax /* VABufferTypeMax is large(1000+) because there is big blank space between common libva buffer * type and Intel specific buffer types(for GEN usage only). If use VABufferTypeMax as * PSB_MAX_BUFFERTYPES to define the size of buffer type related arrays in context object, * we will waste about 16K memory. Currently, the max value of buffer type used in psb_video is * VAParseSliceHeaderGroupBufferType(44). */ #define PSB_MAX_BUFFERTYPES 64 /* Max # of command submission buffers */ #define PSB_MAX_CMDBUFS 10 #define LNC_MAX_CMDBUFS_ENCODE 4 #define PNW_MAX_CMDBUFS_ENCODE 4 #define TNG_MAX_CMDBUFS_ENCODE 4 #define VSP_MAX_CMDBUFS 10 #define PSB_SURFACE_DISPLAYING_F (0x1U<<0) #define PSB_SURFACE_IS_FLAG_SET(flags, mask) (((flags)& PSB_SURFACE_DISPLAYING_F) != 0) #define PSB_CTX_TILING_MASK 0x00FF0000 /*xrandr dirty flag*/ #define PSB_NEW_ROTATION 1 #define PSB_NEW_EXTVIDEO 2 #define PSB_NEW_VA_ROTATION 1 << 0 #define PSB_NEW_WM_ROTATION 1 << 1 #define MAX_SLICES_PER_PICTURE 72 #define MAX_MB_ERRORS 72 /* Some funtions aren't used but we'd like to keep them as reference code in future */ #define PSB_MFLD_DUMMY_CODE 0 /* * ITU-R BT.601 and BT.709 transfer matrices from VA 2.0 * Video Color Field definitions Design Spec(Version 0.03). * [R', G', B'] values are in the range [0, 1], Y' is in the range [0,1] * and [Pb, Pr] components are in the range [-0.5, 0.5]. */ static float s601[9] = { 1, -0.000001, 1.402, 1, -0.344136, -0.714136, 1, 1.772, 0 }; static float s709[9] = { 1, 0, 1.5748, 1, -0.187324, -0.468124, 1, 1.8556, 0 }; typedef struct object_config_s *object_config_p; typedef struct object_context_s *object_context_p; typedef struct object_surface_s *object_surface_p; typedef struct object_buffer_s *object_buffer_p; typedef struct object_image_s *object_image_p; typedef struct object_subpic_s *object_subpic_p; typedef struct format_vtable_s *format_vtable_p; typedef struct psb_driver_data_s *psb_driver_data_p; typedef struct psb_surface_share_info_s psb_surface_share_info_t, *psb_surface_share_info_p; /* post-processing data structure */ enum psb_output_method_t { PSB_PUTSURFACE_NONE = 0, PSB_PUTSURFACE_X11,/* use x11 method */ PSB_PUTSURFACE_TEXTURE,/* texture xvideo */ PSB_PUTSURFACE_OVERLAY,/* overlay xvideo */ PSB_PUTSURFACE_COVERLAY,/* client overlay */ PSB_PUTSURFACE_CTEXTURE,/* client textureblit */ PSB_PUTSURFACE_TEXSTREAMING,/* texsteaming */ PSB_PUTSURFACE_FORCE_TEXTURE,/* force texture xvideo */ PSB_PUTSURFACE_FORCE_OVERLAY,/* force overlay xvideo */ PSB_PUTSURFACE_FORCE_CTEXTURE,/* force client textureblit */ PSB_PUTSURFACE_FORCE_COVERLAY,/* force client overlay */ PSB_PUTSURFACE_FORCE_TEXSTREAMING,/* force texstreaming */ }; typedef struct psb_decode_info { uint32_t num_surface; uint32_t surface_id; } psb_decode_info_t; typedef struct msvdx_decode_info *psb_decode_info_p; #define CSC_MATRIX_X (3) #define CSC_MATRIX_Y (3) struct psb_driver_data_s { struct object_heap_s config_heap; struct object_heap_s context_heap; struct object_heap_s surface_heap; struct object_heap_s buffer_heap; struct object_heap_s image_heap; struct object_heap_s subpic_heap; char * bus_id; uint32_t dev_id; int drm_fd; int dup_drm_fd; /* PM_QoS */ int pm_qos_fd; int dri2; int dri_dummy; XID context_id; drm_context_t drm_context; drmLock *drm_lock; int contended_lock; pthread_mutex_t drm_mutex; format_vtable_p profile2Format[PSB_MAX_PROFILES][PSB_MAX_ENTRYPOINTS]; #ifdef PSBVIDEO_MRFL_VPP format_vtable_p vpp_profile; #endif #ifdef PSBVIDEO_MFLD format_vtable_p vpp_profile; #endif uint32_t msvdx_context_base; int video_sd_disabled; int video_hd_disabled; unsigned char * camera_bo; uint32_t camera_phyaddr; uint32_t camera_size; unsigned char * rar_bo; uint32_t rar_phyaddr; uint32_t rar_size; int encode_supported; int decode_supported; int hd_encode_supported; int hd_decode_supported; int execIoctlOffset; int getParamIoctlOffset; struct _WsbmBufferPool *main_pool; struct _WsbmFenceMgr *fence_mgr; enum psb_output_method_t output_method; /* whether the post-processing use client overlay or not */ int coverlay; int coverlay_init; PsbPortPrivRec coverlay_priv; /* whether the post-processing use client textureblit or not */ int ctexture; struct psb_texture_s ctexture_priv; /* //whether the post-processing use texstreaing or not int ctexstreaing; struct psb_texstreaing ctexstreaing_priv; */ unsigned char *ws_priv; /* window system related data structure */ VASurfaceID cur_displaying_surface; VASurfaceID last_displaying_surface; VADisplayAttribute ble_black_mode; VADisplayAttribute ble_white_mode; VADisplayAttribute blueStretch_gain; VADisplayAttribute skinColorCorrection_gain; VADisplayAttribute brightness; VADisplayAttribute hue; VADisplayAttribute contrast; VADisplayAttribute saturation; /*Save RenderMode and RenderRect attribute * for medfield android extend video mode.*/ uint32_t render_device; uint32_t render_mode; VARectangle render_rect; unsigned int clear_color; int is_oold; unsigned int load_csc_matrix; float csc_matrix[CSC_MATRIX_X][CSC_MATRIX_Y]; int is_BT601; unsigned int set_video_range; unsigned int video_range; /* subpic number current buffers support */ unsigned int max_subpic; /* for multi-thread safe */ int use_xrandr_thread; pthread_mutex_t output_mutex; pthread_t xrandr_thread_id; int extend_fullscreen; int drawable_info; int dummy_putsurface; int fixed_fps; unsigned int frame_count; uint32_t blend_mode; uint32_t blend_color; uint32_t overlay_auto_paint_color_key; uint32_t color_key; /*output rotation info*/ int disable_msvdx_rotate; int disable_msvdx_rotate_backup; int msvdx_rotate_want; /* msvdx rotate info programed to msvdx */ int va_rotate; /* VA rotate passed from APP */ int mipi0_rotation; /* window manager rotation */ int mipi1_rotation; /* window manager rotation */ int hdmi_rotation; /* window manager rotation */ int local_rotation; /* final device rotate: VA rotate+wm rotate */ int extend_rotation; /* final device rotate: VA rotate+wm rotate */ int rotation_dirty; /*flag for recaculate final rotation*/ unsigned int outputmethod_checkinterval; uint32_t xrandr_dirty; uint32_t xrandr_update; /*only VAProfileH264ConstrainedBaseline profile enable error concealment*/ uint32_t ec_enabled; uint32_t ved_vpp; /* vpp is on or off */ int vpp_on; uint32_t pre_surfaceid; psb_decode_info_t decode_info; drm_psb_msvdx_decode_status_t *msvdx_decode_status; VASurfaceDecodeMBErrors *surface_mb_error; unsigned char *hPVR2DContext; VAGenericID wrapped_surface_id[VIDEO_BUFFER_NUM]; VAGenericID wrapped_subpic_id[VIDEO_BUFFER_NUM]; PVR2DMEMINFO *videoBuf[VIDEO_BUFFER_NUM]; PVR2DMEMINFO *subpicBuf[VIDEO_BUFFER_NUM]; void *native_window; int is_android; /* VA_RT_FORMAT_PROTECTED is set to protected for Widevine case */ int protected; }; #ifdef _FOR_FPGA_ #define IS_CTP(driver_data) 0 #define IS_MFLD(driver_data) 0 #define IS_MRFL(driver_data) 1 #define IS_MRST(driver_data) 0 #else #define IS_CTP(driver_data) (((driver_data->dev_id & 0xffff) == 0x08c0) || \ ((driver_data->dev_id & 0xffff) == 0x08c7) || \ ((driver_data->dev_id & 0xffff) == 0x08c8)) #define IS_MRST(driver_data) ((driver_data->dev_id & 0xFFFC) == 0x4100) #define IS_MFLD(driver_data) (((driver_data->dev_id & 0xFFFC) == 0x0130) || ((driver_data->dev_id & 0xFFFF) == 0x08C0) || ((driver_data->dev_id & 0xFFFF) == 0x08C7) || ((driver_data->dev_id & 0xFFFF) == 0x01FF) || ((driver_data->dev_id & 0xFFFF) == 0x08C8)) #define IS_MRFL(driver_data) (((driver_data->dev_id & 0xFFFC) == 0x1180) || ((driver_data->dev_id & 0xFFFC) == 0x1480)) #define IS_MOFD(driver_data) ((driver_data->dev_id & 0xFFFC) == 0x1480) #define IS_LEXINGTON(driver_data) ((driver_data->dev_id & 0xFFFF) == 0x01FF) #define IS_BAYTRAIL(driver_data) ((driver_data->dev_id & 0xFFFF) == 0x0F31) #endif struct object_config_s { struct object_base_s base; VAProfile profile; VAEntrypoint entrypoint; VAConfigAttrib attrib_list[PSB_MAX_CONFIG_ATTRIBUTES]; int attrib_count; format_vtable_p format_vtable; }; struct object_context_s { struct object_base_s base; VAContextID context_id; VAConfigID config_id; VAProfile profile; VAEntrypoint entry_point; int picture_width; int picture_height; int num_render_targets; VASurfaceID *render_targets; int va_flags; object_surface_p current_render_target; object_surface_p ec_target; object_surface_p ec_candidate; VASurfaceID current_render_surface_id; psb_driver_data_p driver_data; format_vtable_p format_vtable; unsigned char *format_data; struct psb_cmdbuf_s *cmdbuf_list[PSB_MAX_CMDBUFS]; struct lnc_cmdbuf_s *lnc_cmdbuf_list[LNC_MAX_CMDBUFS_ENCODE]; struct pnw_cmdbuf_s *pnw_cmdbuf_list[PNW_MAX_CMDBUFS_ENCODE]; struct tng_cmdbuf_s *tng_cmdbuf_list[TNG_MAX_CMDBUFS_ENCODE]; struct vsp_cmdbuf_s *vsp_cmdbuf_list[VSP_MAX_CMDBUFS]; struct psb_cmdbuf_s *cmdbuf; /* Current cmd buffer */ struct lnc_cmdbuf_s *lnc_cmdbuf; struct pnw_cmdbuf_s *pnw_cmdbuf; struct tng_cmdbuf_s *tng_cmdbuf; struct vsp_cmdbuf_s *vsp_cmdbuf; int cmdbuf_current; /* Buffers */ object_buffer_p buffers_unused[PSB_MAX_BUFFERTYPES]; /* Linked lists (HEAD) of unused buffers for each buffer type */ int buffers_unused_count[PSB_MAX_BUFFERTYPES]; /* Linked lists (HEAD) of unused buffers for each buffer type */ object_buffer_p buffers_unused_tail[PSB_MAX_BUFFERTYPES]; /* Linked lists (TAIL) of unused buffers for each buffer type */ object_buffer_p buffers_active[PSB_MAX_BUFFERTYPES]; /* Linked lists of active buffers for each buffer type */ object_buffer_p *buffer_list; /* for vaRenderPicture */ int num_buffers; enum { psb_video_none = 0, psb_video_mc, psb_video_vld, psb_video_deblock } video_op; uint32_t operating_mode; uint32_t flags; /* See render flags below */ uint32_t first_mb; uint32_t last_mb; int is_oold; int msvdx_rotate; int msvdx_scaling; int interlaced_stream; /* value is 64bits value, consist of 8 bytes * bytes[0]: entrypoint * bytes[1]: profile * bytes[2]: tile stride | rotated tile stride * bytes[3]: driver_data->protected * bytes[4]: width_in_mb; pass width kernel for VC1/H.264 workaround * bytes[5]: height_in_mb; pass width kernel for VC1/H.264 workaround */ uint64_t ctp_type; unsigned long msvdx_tile; /* normal tile | (rotate tile << 4) */ #ifdef SLICE_HEADER_PARSING int msvdx_frame_end; int modular_drm; #endif uint32_t msvdx_context; int scaling_width; int scaling_height; int scaling_buffer_width; int scaling_buffer_height; int scaling_offset_x; int scaling_offset_y; int scaling_update; /* Debug */ uint32_t frame_count; uint32_t slice_count; }; #define ROTATE_VA2MSVDX(va_rotate) (va_rotate) #define CONTEXT_ROTATE(obj_context) (obj_context->msvdx_rotate != ROTATE_VA2MSVDX(VA_ROTATION_NONE)) #define CONTEXT_SCALING(obj_context) (obj_context->msvdx_scaling) #define CONTEXT_ALTERNATIVE_OUTPUT(obj_context) (CONTEXT_ROTATE(obj_context) || CONTEXT_SCALING(obj_context)) enum force_output_method_t { OUTPUT_FORCE_NULL = 0, OUTPUT_FORCE_GPU, OUTPUT_FORCE_OVERLAY, OUTPUT_FORCE_OVERLAY_FOR_SW_DECODE, }; #define MAX_SHARE_INFO_KHANDLES 32 struct psb_surface_share_info_s { //int rotation_sf; /*rotaion degree from surface flinger.*/ int surface_rotate; /*rotation degree of current rotation surface*/ int metadata_rotate; /*rotation degree of meta data*/ int width_r; int height_r; int surface_protected; /*whether this surface need be protected*/ /*Force render path. 0 : no fore. 1 : force gpu render; 2 : force overlay render.*/ int force_output_method; unsigned int out_loop_khandle; unsigned int renderStatus; unsigned int used_by_widi; int bob_deinterlace; int tiling; unsigned int width; unsigned int height; unsigned int luma_stride; unsigned int chroma_u_stride; unsigned int chroma_v_stride; unsigned int format; unsigned int khandle; long long timestamp; unsigned int out_loop_luma_stride; unsigned int out_loop_chroma_u_stride; unsigned int out_loop_chroma_v_stride; long long hwc_timestamp; unsigned int layer_transform; void *native_window; unsigned int scaling_khandle; unsigned int width_s; unsigned int height_s; unsigned int scaling_luma_stride; unsigned int scaling_chroma_u_stride; unsigned int scaling_chroma_v_stride; unsigned int crop_width; unsigned int crop_height; unsigned int coded_width; unsigned int coded_height; unsigned int initialized; unsigned int csc_mode; unsigned int video_range; }; struct object_surface_s { struct object_base_s base; VASurfaceID surface_id; VAContextID context_id; int width; int height; int height_origin; int width_r; int height_r; int width_s; int height_s; int buffer_width_s; int buffer_height_s; int offset_x_s; int offset_y_s; struct psb_surface_s *psb_surface; struct psb_surface_s *out_loop_surface; /* Alternative output surface for rotation */ struct psb_surface_s *scaling_surface; /* Alternative output surface for scaling */ void *subpictures;/* if not NULL, have subpicture information */ unsigned int subpic_count; /* to ensure output have enough space for PDS & RAST */ unsigned int derived_imgcnt; /* is the surface derived by a VAImage? */ unsigned long display_timestamp; /* record the time point of put surface*/ void *rotate_vaddr; struct psb_surface_share_info_s *share_info; int is_ref_surface; /* If true, vaDeriveImage returns error */ }; #define PSB_CODEDBUF_SLICE_NUM_MASK (0xff) #define PSB_CODEDBUF_SLICE_NUM_SHIFT (0) #define PSB_CODEDBUF_NONE_VCL_NUM_MASK (0xff) #define PSB_CODEDBUF_NONE_VCL_NUM_SHIFT (8) #define SET_CODEDBUF_INFO(flag, aux_info, slice_num) \ do {\ (aux_info) &= ~(PSB_CODEDBUF_##flag##_MASK<>PSB_CODEDBUF_##flag##_SHIFT) & PSB_CODEDBUF_##flag##_MASK) #define PSB_CODEDBUF_SEGMENT_MAX (9) struct object_buffer_s { struct object_base_s base; object_buffer_p ptr_next; /* Generic ptr for linked list */ object_buffer_p *pptr_prev_next; /* Generic ptr for linked list */ struct psb_buffer_s *psb_buffer; unsigned char *buffer_data; unsigned int size; unsigned int alloc_size; unsigned int max_num_elements; unsigned int num_elements; object_context_p context; VABufferType type; uint32_t last_used; /* for VAEncCodedBufferType */ VACodedBufferSegment codedbuf_mapinfo[PSB_CODEDBUF_SEGMENT_MAX]; uint32_t codedbuf_aux_info; }; struct object_image_s { struct object_base_s base; VAImage image; unsigned int palette[16]; int subpic_ref; VASurfaceID derived_surface; }; struct object_subpic_s { struct object_base_s base; VASubpictureID subpic_id; VAImageID image_id; /* chromakey range */ unsigned int chromakey_min; unsigned int chromakey_max; unsigned int chromakey_mask; /* global alpha */ unsigned int global_alpha; /* flags */ unsigned int flags; /* see below */ unsigned char *surfaces; /* surfaces, associated with this subpicture */ }; typedef struct _PsbSurfaceAttributeTPI { VASurfaceMemoryType type; unsigned int width; unsigned int height; unsigned int size; unsigned int pixel_format; /* buffer format */ unsigned int tiling; /* the memory is tiling or not */ unsigned int luma_stride; /* luma stride, could be width aligned with a special value */ unsigned int chroma_u_stride; /* chroma stride */ unsigned int chroma_v_stride; unsigned int luma_offset; /* could be 0 */ unsigned int chroma_u_offset; /* U offset from the beginning of the memory */ unsigned int chroma_v_offset; /* V offset from the beginning of the memory */ unsigned int count; /* buffer count for surface creation */ unsigned long *buffers; /* buffer handles or user pointers */ unsigned long reserved[4]; /* used to pass additional information, like 362 * Android native window pointer 363 */ } PsbSurfaceAttributeTPI; #define MEMSET_OBJECT(ptr, data_struct) \ memset((unsigned char *)ptr + sizeof(struct object_base_s),\ 0, \ sizeof(data_struct) - sizeof(struct object_base_s)) struct format_vtable_s { void (*queryConfigAttributes)( VAProfile profile, VAEntrypoint entrypoint, VAConfigAttrib *attrib_list, int num_attribs ); VAStatus(*validateConfig)( object_config_p obj_config ); VAStatus(*createContext)( object_context_p obj_context, object_config_p obj_config ); void (*destroyContext)( object_context_p obj_context ); VAStatus(*beginPicture)( object_context_p obj_context ); VAStatus(*renderPicture)( object_context_p obj_context, object_buffer_p *buffers, int num_buffers ); VAStatus(*endPicture)( object_context_p obj_context ); }; #define psb__bounds_check(x, max) \ do { ASSERT(x < max); if (x >= max) x = max - 1; } while(0); static inline unsigned long GetTickCount() { struct timeval tv; if (gettimeofday(&tv, NULL)) return 0; return tv.tv_usec / 1000 + tv.tv_sec * 1000; } inline static char * buffer_type_to_string(int type) { switch (type) { case VAPictureParameterBufferType: return "VAPictureParameterBufferType"; case VAIQMatrixBufferType: return "VAIQMatrixBufferType"; case VABitPlaneBufferType: return "VABitPlaneBufferType"; case VASliceGroupMapBufferType: return "VASliceGroupMapBufferType"; case VASliceParameterBufferType: return "VASliceParameterBufferType"; case VASliceDataBufferType: return "VASliceDataBufferType"; case VAProtectedSliceDataBufferType: return "VAProtectedSliceDataBufferType"; case VAMacroblockParameterBufferType: return "VAMacroblockParameterBufferType"; case VAResidualDataBufferType: return "VAResidualDataBufferType"; case VADeblockingParameterBufferType: return "VADeblockingParameterBufferType"; case VAImageBufferType: return "VAImageBufferType"; case VAEncCodedBufferType: return "VAEncCodedBufferType"; case VAEncSequenceParameterBufferType: return "VAEncSequenceParameterBufferType"; case VAEncPictureParameterBufferType: return "VAEncPictureParameterBufferType"; case VAEncSliceParameterBufferType: return "VAEncSliceParameterBufferType"; case VAEncMiscParameterBufferType: return "VAEncMiscParameterBufferType"; case VAProbabilityBufferType: return "VAProbabilityBufferType"; case VAHuffmanTableBufferType: return "VAHuffmanTableBufferType"; case VAQMatrixBufferType: return "VAQMatrixBufferType"; default: return "UnknowBuffer"; } } inline static int Angle2Rotation(int angle) { angle %= 360; switch (angle) { case 0: return VA_ROTATION_NONE; case 90: return VA_ROTATION_90; case 180: return VA_ROTATION_180; case 270: return VA_ROTATION_270; default: return -1; } } inline static int Rotation2Angle(int rotation) { switch (rotation) { case VA_ROTATION_NONE: return 0; case VA_ROTATION_90: return 90; case VA_ROTATION_180: return 180; case VA_ROTATION_270: return 270; default: return -1; } } int psb_parse_config(char *env, char *env_value); void psb__destroy_surface(psb_driver_data_p driver_data, object_surface_p obj_surface); unsigned long psb_tile_stride_mode(int w); VAStatus psb__checkSurfaceDimensions(psb_driver_data_p driver_data, int width, int height); int LOCK_HARDWARE(psb_driver_data_p driver_data); int UNLOCK_HARDWARE(psb_driver_data_p driver_data); unsigned long psb__tile_stride_log2_256(int w); int psb_update_context(psb_driver_data_p driver_data, unsigned long ctx_type); #define CHECK_SURFACE(obj_surface) \ do { \ if (NULL == obj_surface) { \ vaStatus = VA_STATUS_ERROR_INVALID_SURFACE; \ DEBUG_FAILURE; \ return vaStatus; \ } \ } while (0) #define CHECK_CONFIG(obj_config) \ do { \ if (NULL == obj_config) { \ vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; \ DEBUG_FAILURE; \ return vaStatus; \ } \ } while (0) #define CHECK_CONTEXT(obj_context) \ do { \ if (NULL == obj_context) { \ vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; \ DEBUG_FAILURE; \ return vaStatus; \ } \ } while (0) #define CHECK_BUFFER(obj_buffer) \ do { \ if (NULL == obj_buffer) { \ vaStatus = VA_STATUS_ERROR_INVALID_BUFFER; \ DEBUG_FAILURE; \ return vaStatus; \ } \ } while (0) #define CHECK_IMAGE(obj_image) \ do { \ if (NULL == obj_image) { \ vaStatus = VA_STATUS_ERROR_INVALID_IMAGE; \ DEBUG_FAILURE; \ return vaStatus; \ } \ } while (0) #define CHECK_SUBPICTURE(obj_subpic) \ do { \ if (NULL == obj_subpic) { \ vaStatus = VA_STATUS_ERROR_INVALID_SUBPICTURE; \ DEBUG_FAILURE; \ return vaStatus; \ } \ } while (0) #define CHECK_ALLOCATION(buf) \ do { \ if (buf == NULL) { \ vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; \ DEBUG_FAILURE; \ return vaStatus; \ } \ } while (0) #define CHECK_VASTATUS() \ do { \ if (VA_STATUS_SUCCESS != vaStatus) { \ DEBUG_FAILURE; \ return vaStatus; \ } \ } while (0) #define CHECK_INVALID_PARAM(param) \ do { \ if (param) { \ vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; \ DEBUG_FAILURE; \ return vaStatus; \ } \ } while (0) #endif /* _PSB_DRV_VIDEO_H_ */