1/*
2 * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sub license, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
14 * of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 *
24 * Authors:
25 *    Waldo Bastian <waldo.bastian@intel.com>
26 *
27 */
28
29#ifndef _PSB_DRV_VIDEO_H_
30#define _PSB_DRV_VIDEO_H_
31
32#include <pthread.h> /* POSIX threads headers */
33
34#include <va/va_backend.h>
35#include <va/va.h>
36#include <va/va_tpi.h>
37
38#include <va/va_vpp.h>
39
40#include "object_heap.h"
41#include "psb_def.h"
42//#include "psb_drv_debug.h"
43#include "xf86drm.h"
44#ifdef ANDROID
45#ifdef BAYTRAIL
46#include <linux/vxd_drm.h>
47#else
48#include <linux/psb_drm.h>
49#endif
50#endif
51#include "psb_overlay.h"
52#include "psb_texture.h"
53#include <stdint.h>
54#ifndef ANDROID
55#include <psb_drm.h>
56#include <X11/Xlibint.h>
57#include <X11/X.h>
58#include <X11/extensions/Xv.h>
59#include <X11/extensions/Xvlib.h>
60#include <X11/Xlib.h>
61#else
62#define XID unsigned int
63#define INT16 unsigned int
64#include <cutils/log.h>
65#include <system/window.h>
66#undef  LOG_TAG
67#define LOG_TAG "pvr_drv_video"
68#endif
69#include "hwdefs/dxva_fw_flags.h"
70#include <wsbm/wsbm_pool.h>
71
72#ifdef __GNUC__
73# define __maybe_unused __attribute__((__unused__))
74#else
75# define __maybe_unused
76#endif
77
78#ifndef min
79#define min(a, b) ((a) < (b)) ? (a) : (b)
80#endif
81
82#ifndef max
83#define max(a, b) ((a) > (b)) ? (a) : (b)
84#endif
85
86//#define _TOPAZHP_PDUMP_
87#define TOPAZHP_PIPE_NUM 2
88
89#define _TNG_RELOC_
90//#define _TNG_FRAMES_
91#define FORCED_REFERENCE 1
92#define LTREFHEADER 1
93//#define _TP_DEBUG_MMU_
94//#define _TOPAZHP_REC_
95
96/*
97 * WORKAROUND_DMA_OFF_BY_ONE: LLDMA requests may access one additional byte which can cause
98 * a MMU fault if the next byte after the buffer end is on a different page that isn't mapped.
99 */
100#define WORKAROUND_DMA_OFF_BY_ONE
101#define FOURCC_XVVA     (('A' << 24) + ('V' << 16) + ('V' << 8) + 'X')
102
103#define PSB_MAX_PROFILES			32
104#define PSB_MAX_ENTRYPOINTS			32
105#define PSB_MAX_CONFIG_ATTRIBUTES		VAConfigAttribTypeMax
106
107/* VABufferTypeMax is large(1000+) because there is big blank space between common libva buffer
108 * type and Intel specific buffer types(for GEN usage only). If use VABufferTypeMax as
109 * PSB_MAX_BUFFERTYPES to define the size of buffer type related arrays in context object,
110 * we will waste about 16K memory. Currently, the max value of buffer type used in psb_video is
111 * VAParseSliceHeaderGroupBufferType(44).
112 */
113#define PSB_MAX_BUFFERTYPES			64
114
115/* Max # of command submission buffers */
116#define PSB_MAX_CMDBUFS                         10
117#define LNC_MAX_CMDBUFS_ENCODE                  4
118#define PNW_MAX_CMDBUFS_ENCODE                  4
119#define TNG_MAX_CMDBUFS_ENCODE                  4
120#define VSP_MAX_CMDBUFS				10
121
122#define PSB_SURFACE_DISPLAYING_F (0x1U<<0)
123#define PSB_SURFACE_IS_FLAG_SET(flags, mask) (((flags)& PSB_SURFACE_DISPLAYING_F) != 0)
124
125#define PSB_CTX_TILING_MASK	0x00FF0000
126
127/*xrandr dirty flag*/
128#define PSB_NEW_ROTATION        1
129#define PSB_NEW_EXTVIDEO        2
130
131#define PSB_NEW_VA_ROTATION     1 << 0
132#define PSB_NEW_WM_ROTATION     1 << 1
133
134#define MAX_SLICES_PER_PICTURE 72
135#define MAX_MB_ERRORS 72
136
137/* Some funtions aren't used but we'd like to keep them as reference code in future */
138#define PSB_MFLD_DUMMY_CODE     0
139
140typedef struct object_config_s *object_config_p;
141typedef struct object_context_s *object_context_p;
142typedef struct object_surface_s *object_surface_p;
143typedef struct object_buffer_s *object_buffer_p;
144typedef struct object_image_s *object_image_p;
145typedef struct object_subpic_s *object_subpic_p;
146typedef struct format_vtable_s *format_vtable_p;
147typedef struct psb_driver_data_s *psb_driver_data_p;
148
149typedef struct psb_surface_share_info_s psb_surface_share_info_t, *psb_surface_share_info_p;
150/* post-processing data structure */
151enum psb_output_method_t {
152    PSB_PUTSURFACE_NONE = 0,
153    PSB_PUTSURFACE_X11,/* use x11 method */
154    PSB_PUTSURFACE_TEXTURE,/* texture xvideo */
155    PSB_PUTSURFACE_OVERLAY,/* overlay xvideo */
156    PSB_PUTSURFACE_COVERLAY,/* client overlay */
157    PSB_PUTSURFACE_CTEXTURE,/* client textureblit */
158    PSB_PUTSURFACE_TEXSTREAMING,/* texsteaming */
159    PSB_PUTSURFACE_FORCE_TEXTURE,/* force texture xvideo */
160    PSB_PUTSURFACE_FORCE_OVERLAY,/* force overlay xvideo */
161    PSB_PUTSURFACE_FORCE_CTEXTURE,/* force client textureblit */
162    PSB_PUTSURFACE_FORCE_COVERLAY,/* force client overlay */
163    PSB_PUTSURFACE_FORCE_TEXSTREAMING,/* force texstreaming */
164};
165
166typedef struct psb_decode_info {
167    uint32_t num_surface;
168    uint32_t surface_id;
169} psb_decode_info_t;
170typedef struct msvdx_decode_info *psb_decode_info_p;
171
172#define CSC_MATRIX_X  (3)
173#define CSC_MATRIX_Y  (3)
174
175struct psb_driver_data_s {
176    struct object_heap_s        config_heap;
177    struct object_heap_s        context_heap;
178    struct object_heap_s        surface_heap;
179    struct object_heap_s        buffer_heap;
180    struct object_heap_s        image_heap;
181    struct object_heap_s        subpic_heap;
182    char *                      bus_id;
183    uint32_t                    dev_id;
184    int                         drm_fd;
185    int                         dup_drm_fd;
186
187    /*  PM_QoS */
188    int                         pm_qos_fd;
189    int                         dri2;
190    int                         dri_dummy;
191    XID                         context_id;
192    drm_context_t               drm_context;
193    drmLock                     *drm_lock;
194    int                         contended_lock;
195    pthread_mutex_t             drm_mutex;
196    format_vtable_p             profile2Format[PSB_MAX_PROFILES][PSB_MAX_ENTRYPOINTS];
197#ifdef PSBVIDEO_MRFL_VPP
198    format_vtable_p             vpp_profile;
199#endif
200#ifdef PSBVIDEO_MFLD
201    format_vtable_p             vpp_profile;
202#endif
203    uint32_t                    msvdx_context_base;
204    int                         video_sd_disabled;
205    int                         video_hd_disabled;
206    unsigned char *             camera_bo;
207    uint32_t                    camera_phyaddr;
208    uint32_t                    camera_size;
209    unsigned char *             rar_bo;
210    uint32_t                    rar_phyaddr;
211    uint32_t                    rar_size;
212
213    int encode_supported;
214    int decode_supported;
215    int hd_encode_supported;
216    int hd_decode_supported;
217
218    int execIoctlOffset;
219    int getParamIoctlOffset;
220
221    struct _WsbmBufferPool *main_pool;
222    struct _WsbmFenceMgr *fence_mgr;
223
224    enum psb_output_method_t output_method;
225
226    /* whether the post-processing use client overlay or not */
227    int coverlay;
228    int coverlay_init;
229    PsbPortPrivRec coverlay_priv;
230
231
232    /* whether the post-processing use client textureblit or not */
233    int ctexture;
234    struct psb_texture_s ctexture_priv;
235
236    /*
237    //whether the post-processing use texstreaing or not
238    int ctexstreaing;
239    struct psb_texstreaing ctexstreaing_priv;
240    */
241
242    unsigned char *ws_priv; /* window system related data structure */
243
244
245    VASurfaceID cur_displaying_surface;
246    VASurfaceID last_displaying_surface;
247
248    VADisplayAttribute ble_black_mode;
249    VADisplayAttribute ble_white_mode;
250
251    VADisplayAttribute blueStretch_gain;
252    VADisplayAttribute skinColorCorrection_gain;
253
254    VADisplayAttribute brightness;
255    VADisplayAttribute hue;
256    VADisplayAttribute contrast;
257    VADisplayAttribute saturation;
258    /*Save RenderMode and RenderRect attribute
259     * for medfield android extend video mode.*/
260    uint32_t render_device;
261    uint32_t render_mode;
262    VARectangle  render_rect;
263
264    unsigned int clear_color;
265
266    int  is_oold;
267
268    unsigned int load_csc_matrix;
269    signed int   csc_matrix[CSC_MATRIX_X][CSC_MATRIX_Y];
270
271    /* subpic number current buffers support */
272    unsigned int max_subpic;
273
274    /* for multi-thread safe */
275    int use_xrandr_thread;
276    pthread_mutex_t output_mutex;
277    pthread_t xrandr_thread_id;
278    int extend_fullscreen;
279
280    int drawable_info;
281    int dummy_putsurface;
282    int fixed_fps;
283    unsigned int frame_count;
284
285    uint32_t blend_mode;
286    uint32_t blend_color;
287    uint32_t overlay_auto_paint_color_key;
288    uint32_t color_key;
289
290    /*output rotation info*/
291    int disable_msvdx_rotate;
292    int disable_msvdx_rotate_backup;
293    int msvdx_rotate_want; /* msvdx rotate info programed to msvdx */
294    int va_rotate; /* VA rotate passed from APP */
295    int mipi0_rotation; /* window manager rotation */
296    int mipi1_rotation; /* window manager rotation */
297    int hdmi_rotation; /* window manager rotation */
298    int local_rotation; /* final device rotate: VA rotate+wm rotate */
299    int extend_rotation; /* final device rotate: VA rotate+wm rotate */
300    int rotation_dirty;  /*flag for recaculate final rotation*/
301
302    unsigned int outputmethod_checkinterval;
303
304    uint32_t xrandr_dirty;
305    uint32_t xrandr_update;
306    /*only VAProfileH264ConstrainedBaseline profile enable error concealment*/
307    uint32_t ec_enabled;
308    uint32_t ved_vpp;
309
310    /* vpp is on or off */
311    int vpp_on;
312
313    uint32_t pre_surfaceid;
314    psb_decode_info_t decode_info;
315    drm_psb_msvdx_decode_status_t *msvdx_decode_status;
316    VASurfaceDecodeMBErrors *surface_mb_error;
317
318    unsigned char *hPVR2DContext;
319
320    VAGenericID wrapped_surface_id[VIDEO_BUFFER_NUM];
321    VAGenericID wrapped_subpic_id[VIDEO_BUFFER_NUM];
322    PVR2DMEMINFO *videoBuf[VIDEO_BUFFER_NUM];
323    PVR2DMEMINFO *subpicBuf[VIDEO_BUFFER_NUM];
324    void *native_window;
325    int is_android;
326    /* VA_RT_FORMAT_PROTECTED is set to protected for Widevine case */
327    int protected;
328};
329
330
331#ifdef _FOR_FPGA_
332#define IS_CTP(driver_data)  0
333#define IS_MFLD(driver_data) 0
334#define IS_MRFL(driver_data) 1
335#define IS_MRST(driver_data) 0
336#else
337#define IS_CTP(driver_data) (((driver_data->dev_id & 0xffff) == 0x08c0) ||  \
338                     ((driver_data->dev_id & 0xffff) == 0x08c7) ||  \
339                     ((driver_data->dev_id & 0xffff) == 0x08c8))
340#define IS_MRST(driver_data) ((driver_data->dev_id & 0xFFFC) == 0x4100)
341#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))
342#define IS_MRFL(driver_data) (((driver_data->dev_id & 0xFFFC) == 0x1180) || ((driver_data->dev_id & 0xFFFC) == 0x1480))
343#define IS_MOFD(driver_data) ((driver_data->dev_id & 0xFFFC) == 0x1480)
344#define IS_LEXINGTON(driver_data) ((driver_data->dev_id & 0xFFFF) == 0x01FF)
345#define IS_BAYTRAIL(driver_data) ((driver_data->dev_id & 0xFFFF) == 0x0F31)
346#endif
347
348struct object_config_s {
349    struct object_base_s base;
350    VAProfile profile;
351    VAEntrypoint entrypoint;
352    VAConfigAttrib attrib_list[PSB_MAX_CONFIG_ATTRIBUTES];
353    int attrib_count;
354    format_vtable_p format_vtable;
355};
356
357struct object_context_s {
358    struct object_base_s base;
359    VAContextID context_id;
360    VAConfigID config_id;
361    VAProfile profile;
362    VAEntrypoint entry_point;
363    int picture_width;
364    int picture_height;
365    int num_render_targets;
366    VASurfaceID *render_targets;
367    int va_flags;
368
369    object_surface_p current_render_target;
370    object_surface_p ec_target;
371    object_surface_p ec_candidate;
372    VASurfaceID current_render_surface_id;
373    psb_driver_data_p driver_data;
374    format_vtable_p format_vtable;
375    unsigned char *format_data;
376    struct psb_cmdbuf_s *cmdbuf_list[PSB_MAX_CMDBUFS];
377    struct lnc_cmdbuf_s *lnc_cmdbuf_list[LNC_MAX_CMDBUFS_ENCODE];
378    struct pnw_cmdbuf_s *pnw_cmdbuf_list[PNW_MAX_CMDBUFS_ENCODE];
379    struct tng_cmdbuf_s	*tng_cmdbuf_list[TNG_MAX_CMDBUFS_ENCODE];
380#ifdef PSBVIDEO_MRFL_VPP
381    struct vsp_cmdbuf_s *vsp_cmdbuf_list[VSP_MAX_CMDBUFS];
382#endif
383
384    struct psb_cmdbuf_s *cmdbuf; /* Current cmd buffer */
385    struct lnc_cmdbuf_s *lnc_cmdbuf;
386    struct pnw_cmdbuf_s *pnw_cmdbuf;
387    struct tng_cmdbuf_s *tng_cmdbuf;
388#ifdef PSBVIDEO_MRFL_VPP
389    struct vsp_cmdbuf_s *vsp_cmdbuf;
390#endif
391
392    int cmdbuf_current;
393
394    /* Buffers */
395    object_buffer_p buffers_unused[PSB_MAX_BUFFERTYPES]; /* Linked lists (HEAD) of unused buffers for each buffer type */
396    int buffers_unused_count[PSB_MAX_BUFFERTYPES]; /* Linked lists (HEAD) of unused buffers for each buffer type */
397    object_buffer_p buffers_unused_tail[PSB_MAX_BUFFERTYPES]; /* Linked lists (TAIL) of unused buffers for each buffer type */
398    object_buffer_p buffers_active[PSB_MAX_BUFFERTYPES]; /* Linked lists of active buffers for each buffer type */
399
400    object_buffer_p *buffer_list; /* for vaRenderPicture */
401    int num_buffers;
402
403    enum {
404        psb_video_none = 0,
405        psb_video_mc,
406        psb_video_vld,
407        psb_video_deblock
408    } video_op;
409
410    uint32_t operating_mode;
411    uint32_t flags; /* See render flags below */
412    uint32_t first_mb;
413    uint32_t last_mb;
414
415    int is_oold;
416    int msvdx_rotate;
417    int msvdx_scaling;
418    int interlaced_stream;
419
420    /* value is 64bits value, consist of 8 bytes
421     * bytes[0]: entrypoint
422     * bytes[1]: profile
423     * bytes[2]: tile stride | rotated tile stride
424     * bytes[3]: driver_data->protected
425     * bytes[4]: width_in_mb; pass width kernel for VC1 workaround
426     */
427    uint64_t ctp_type;
428
429    unsigned long msvdx_tile; /* normal tile | (rotate tile << 4) */
430#ifdef SLICE_HEADER_PARSING
431    int msvdx_frame_end;
432    int modular_drm;
433#endif
434
435    uint32_t msvdx_context;
436
437    int scaling_width;
438    int scaling_height;
439    int scaling_buffer_width;
440    int scaling_buffer_height;
441    int scaling_offset_x;
442    int scaling_offset_y;
443    int scaling_update;
444
445    /* Debug */
446    uint32_t frame_count;
447    uint32_t slice_count;
448};
449
450#define ROTATE_VA2MSVDX(va_rotate)  (va_rotate)
451#define CONTEXT_ROTATE(obj_context) (obj_context->msvdx_rotate != ROTATE_VA2MSVDX(VA_ROTATION_NONE))
452#define CONTEXT_SCALING(obj_context) (obj_context->msvdx_scaling)
453#define CONTEXT_ALTERNATIVE_OUTPUT(obj_context) (CONTEXT_ROTATE(obj_context) || CONTEXT_SCALING(obj_context))
454
455enum force_output_method_t {
456    OUTPUT_FORCE_NULL = 0,
457    OUTPUT_FORCE_GPU,
458    OUTPUT_FORCE_OVERLAY,
459    OUTPUT_FORCE_OVERLAY_FOR_SW_DECODE,
460};
461
462#define MAX_SHARE_INFO_KHANDLES 32
463struct psb_surface_share_info_s {
464    //int rotation_sf;                    /*rotaion degree from surface flinger.*/
465    int surface_rotate;                 /*rotation degree of current rotation surface*/
466    int metadata_rotate;                /*rotation degree of meta data*/
467    int width_r;
468    int height_r;
469    int surface_protected;              /*whether this surface need be protected*/
470    /*Force render path.
471    0 : no fore.
472    1 : force gpu render;
473    2 : force overlay render.*/
474    int force_output_method;
475    unsigned int out_loop_khandle;
476    unsigned int renderStatus;
477    unsigned int used_by_widi;
478    int bob_deinterlace;
479    int tiling;
480    unsigned int width;
481    unsigned int height;
482    unsigned int luma_stride;
483    unsigned int chroma_u_stride;
484    unsigned int chroma_v_stride;
485    unsigned int format;
486    unsigned int khandle;
487    long long timestamp;
488
489    unsigned int out_loop_luma_stride;
490    unsigned int out_loop_chroma_u_stride;
491    unsigned int out_loop_chroma_v_stride;
492
493    long long hwc_timestamp;
494    unsigned int layer_transform;
495
496    void *native_window;
497    unsigned int scaling_khandle;
498    unsigned int width_s;
499    unsigned int height_s;
500
501    unsigned int scaling_luma_stride;
502    unsigned int scaling_chroma_u_stride;
503    unsigned int scaling_chroma_v_stride;
504
505    unsigned int crop_width;
506    unsigned int crop_height;
507
508    unsigned int coded_width;
509    unsigned int coded_height;
510};
511
512struct object_surface_s {
513    struct object_base_s base;
514    VASurfaceID surface_id;
515    VAContextID context_id;
516    int width;
517    int height;
518    int height_origin;
519    int width_r;
520    int height_r;
521    int width_s;
522    int height_s;
523    int buffer_width_s;
524    int buffer_height_s;
525    int offset_x_s;
526    int offset_y_s;
527
528    struct psb_surface_s *psb_surface;
529    struct psb_surface_s *out_loop_surface; /* Alternative output surface for rotation */
530    struct psb_surface_s *scaling_surface; /* Alternative output surface for scaling */
531    void *subpictures;/* if not NULL, have subpicture information */
532    unsigned int subpic_count; /* to ensure output have enough space for PDS & RAST */
533    unsigned int derived_imgcnt; /* is the surface derived by a VAImage? */
534    unsigned long display_timestamp; /* record the time point of put surface*/
535    void *rotate_vaddr;
536    struct psb_surface_share_info_s *share_info;
537    int is_ref_surface; /* If true, vaDeriveImage returns error */
538};
539
540#define PSB_CODEDBUF_SLICE_NUM_MASK (0xff)
541#define PSB_CODEDBUF_SLICE_NUM_SHIFT (0)
542
543#define PSB_CODEDBUF_NONE_VCL_NUM_MASK (0xff)
544#define PSB_CODEDBUF_NONE_VCL_NUM_SHIFT (8)
545
546#define SET_CODEDBUF_INFO(flag, aux_info, slice_num) \
547    do {\
548	(aux_info) &= ~(PSB_CODEDBUF_##flag##_MASK<<PSB_CODEDBUF_##flag##_SHIFT);\
549	(aux_info) |= ((slice_num) & PSB_CODEDBUF_##flag##_MASK)\
550	<<PSB_CODEDBUF_##flag##_SHIFT;\
551    } while (0)
552
553#define CLEAR_CODEDBUF_INFO(flag, aux_info) \
554    do {\
555	(aux_info) &= ~(PSB_CODEDBUF_##flag##_MASK<<PSB_CODEDBUF_##flag##_SHIFT);\
556    } while (0)
557
558#define GET_CODEDBUF_INFO(flag, aux_info) \
559	(((aux_info)>>PSB_CODEDBUF_##flag##_SHIFT) & PSB_CODEDBUF_##flag##_MASK)
560
561
562#define PSB_CODEDBUF_SEGMENT_MAX  (9)
563
564struct object_buffer_s {
565    struct object_base_s base;
566    object_buffer_p ptr_next; /* Generic ptr for linked list */
567    object_buffer_p *pptr_prev_next; /* Generic ptr for linked list */
568    struct psb_buffer_s *psb_buffer;
569    unsigned char *buffer_data;
570    unsigned int size;
571    unsigned int alloc_size;
572    unsigned int max_num_elements;
573    unsigned int num_elements;
574    object_context_p context;
575    VABufferType type;
576    uint32_t last_used;
577
578    /* for VAEncCodedBufferType */
579    VACodedBufferSegment codedbuf_mapinfo[PSB_CODEDBUF_SEGMENT_MAX];
580    uint32_t codedbuf_aux_info;
581};
582
583struct object_image_s {
584    struct object_base_s base;
585    VAImage image;
586    unsigned int palette[16];
587    int subpic_ref;
588    VASurfaceID derived_surface;
589};
590
591struct object_subpic_s {
592    struct object_base_s base;
593    VASubpictureID subpic_id;
594
595    VAImageID image_id;
596
597    /* chromakey range */
598    unsigned int chromakey_min;
599    unsigned int chromakey_max;
600    unsigned int chromakey_mask;
601
602    /* global alpha */
603    unsigned int global_alpha;
604
605    /* flags */
606    unsigned int flags; /* see below */
607
608    unsigned char *surfaces; /* surfaces, associated with this subpicture */
609};
610
611typedef struct _PsbSurfaceAttributeTPI {
612    VASurfaceMemoryType type;
613    unsigned int width;
614    unsigned int height;
615    unsigned int size;
616    unsigned int pixel_format; /* buffer format */
617    unsigned int tiling; /* the memory is tiling or not */
618    unsigned int luma_stride; /* luma stride, could be width aligned with a special value */
619    unsigned int chroma_u_stride; /* chroma stride */
620    unsigned int chroma_v_stride;
621    unsigned int luma_offset; /* could be 0 */
622    unsigned int chroma_u_offset; /* U offset from the beginning of the memory */
623    unsigned int chroma_v_offset; /* V offset from the beginning of the memory */
624    unsigned int count; /* buffer count for surface creation */
625    unsigned long *buffers; /* buffer handles or user pointers */
626    unsigned long reserved[4]; /* used to pass additional information, like	362
627			* Android native window pointer	363
628			*/
629} PsbSurfaceAttributeTPI;
630
631#define MEMSET_OBJECT(ptr, data_struct) \
632        memset((unsigned char *)ptr + sizeof(struct object_base_s),\
633                0,                          \
634               sizeof(data_struct) - sizeof(struct object_base_s))
635
636struct format_vtable_s {
637    void (*queryConfigAttributes)(
638        VAProfile profile,
639        VAEntrypoint entrypoint,
640        VAConfigAttrib *attrib_list,
641        int num_attribs
642    );
643    VAStatus(*validateConfig)(
644        object_config_p obj_config
645    );
646    VAStatus(*createContext)(
647        object_context_p obj_context,
648        object_config_p obj_config
649    );
650    void (*destroyContext)(
651        object_context_p obj_context
652    );
653    VAStatus(*beginPicture)(
654        object_context_p obj_context
655    );
656    VAStatus(*renderPicture)(
657        object_context_p obj_context,
658        object_buffer_p *buffers,
659        int num_buffers
660    );
661    VAStatus(*endPicture)(
662        object_context_p obj_context
663    );
664};
665
666#define psb__bounds_check(x, max)                                       \
667    do { ASSERT(x < max); if (x >= max) x = max - 1; } while(0);
668
669static inline unsigned long GetTickCount()
670{
671    struct timeval tv;
672    if (gettimeofday(&tv, NULL))
673        return 0;
674    return tv.tv_usec / 1000 + tv.tv_sec * 1000;
675}
676
677inline static char * buffer_type_to_string(int type)
678{
679    switch (type) {
680    case VAPictureParameterBufferType:
681        return "VAPictureParameterBufferType";
682    case VAIQMatrixBufferType:
683        return "VAIQMatrixBufferType";
684    case VABitPlaneBufferType:
685        return "VABitPlaneBufferType";
686    case VASliceGroupMapBufferType:
687        return "VASliceGroupMapBufferType";
688    case VASliceParameterBufferType:
689        return "VASliceParameterBufferType";
690    case VASliceDataBufferType:
691        return "VASliceDataBufferType";
692    case VAProtectedSliceDataBufferType:
693        return "VAProtectedSliceDataBufferType";
694    case VAMacroblockParameterBufferType:
695        return "VAMacroblockParameterBufferType";
696    case VAResidualDataBufferType:
697        return "VAResidualDataBufferType";
698    case VADeblockingParameterBufferType:
699        return "VADeblockingParameterBufferType";
700    case VAImageBufferType:
701        return "VAImageBufferType";
702    case VAEncCodedBufferType:
703        return "VAEncCodedBufferType";
704    case VAEncSequenceParameterBufferType:
705        return "VAEncSequenceParameterBufferType";
706    case VAEncPictureParameterBufferType:
707        return "VAEncPictureParameterBufferType";
708    case VAEncSliceParameterBufferType:
709        return "VAEncSliceParameterBufferType";
710    case VAEncMiscParameterBufferType:
711        return "VAEncMiscParameterBufferType";
712    case VAProbabilityBufferType:
713	return "VAProbabilityBufferType";
714    case VAHuffmanTableBufferType:
715        return "VAHuffmanTableBufferType";
716    case VAQMatrixBufferType:
717        return "VAQMatrixBufferType";
718    default:
719        return "UnknowBuffer";
720    }
721}
722
723inline static int Angle2Rotation(int angle)
724{
725    angle %= 360;
726    switch (angle) {
727    case 0:
728        return VA_ROTATION_NONE;
729    case 90:
730        return VA_ROTATION_90;
731    case 180:
732        return VA_ROTATION_180;
733    case 270:
734        return VA_ROTATION_270;
735    default:
736        return -1;
737    }
738}
739
740inline static int Rotation2Angle(int rotation)
741{
742    switch (rotation) {
743    case VA_ROTATION_NONE:
744        return 0;
745    case VA_ROTATION_90:
746        return 90;
747    case VA_ROTATION_180:
748        return 180;
749    case VA_ROTATION_270:
750        return 270;
751    default:
752        return -1;
753    }
754}
755
756int psb_parse_config(char *env, char *env_value);
757void psb__destroy_surface(psb_driver_data_p driver_data, object_surface_p obj_surface);
758unsigned long psb_tile_stride_mode(int w);
759VAStatus psb__checkSurfaceDimensions(psb_driver_data_p driver_data, int width, int height);
760
761int LOCK_HARDWARE(psb_driver_data_p driver_data);
762int UNLOCK_HARDWARE(psb_driver_data_p driver_data);
763unsigned long psb__tile_stride_log2_256(int w);
764int psb_update_context(psb_driver_data_p driver_data, unsigned long ctx_type);
765
766#define CHECK_SURFACE(obj_surface) \
767    do { \
768        if (NULL == obj_surface) { \
769            vaStatus = VA_STATUS_ERROR_INVALID_SURFACE; \
770            DEBUG_FAILURE; \
771            return vaStatus; \
772        } \
773    } while (0)
774
775#define CHECK_CONFIG(obj_config) \
776    do { \
777        if (NULL == obj_config) { \
778            vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; \
779            DEBUG_FAILURE; \
780            return vaStatus; \
781        } \
782    } while (0)
783
784#define CHECK_CONTEXT(obj_context) \
785    do { \
786        if (NULL == obj_context) { \
787            vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; \
788            DEBUG_FAILURE; \
789            return vaStatus; \
790        } \
791    } while (0)
792
793#define CHECK_BUFFER(obj_buffer) \
794    do { \
795        if (NULL == obj_buffer) { \
796            vaStatus = VA_STATUS_ERROR_INVALID_BUFFER; \
797            DEBUG_FAILURE; \
798            return vaStatus; \
799        } \
800    } while (0)
801
802#define CHECK_IMAGE(obj_image) \
803    do { \
804        if (NULL == obj_image) { \
805            vaStatus = VA_STATUS_ERROR_INVALID_IMAGE; \
806            DEBUG_FAILURE; \
807            return vaStatus; \
808        } \
809    } while (0)
810
811#define CHECK_SUBPICTURE(obj_subpic) \
812    do { \
813        if (NULL == obj_subpic) { \
814            vaStatus = VA_STATUS_ERROR_INVALID_SUBPICTURE; \
815            DEBUG_FAILURE; \
816            return vaStatus; \
817        } \
818    } while (0)
819
820#define CHECK_ALLOCATION(buf) \
821    do { \
822        if (buf == NULL) { \
823            vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; \
824            DEBUG_FAILURE; \
825            return vaStatus; \
826        } \
827    } while (0)
828
829#define CHECK_VASTATUS() \
830    do { \
831        if (VA_STATUS_SUCCESS != vaStatus) { \
832            DEBUG_FAILURE; \
833            return vaStatus; \
834        } \
835    } while (0)
836
837#define CHECK_INVALID_PARAM(param) \
838    do { \
839        if (param) { \
840            vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; \
841            DEBUG_FAILURE; \
842            return vaStatus; \
843        } \
844    } while (0)
845
846#endif /* _PSB_DRV_VIDEO_H_ */
847