• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
140 typedef struct object_config_s *object_config_p;
141 typedef struct object_context_s *object_context_p;
142 typedef struct object_surface_s *object_surface_p;
143 typedef struct object_buffer_s *object_buffer_p;
144 typedef struct object_image_s *object_image_p;
145 typedef struct object_subpic_s *object_subpic_p;
146 typedef struct format_vtable_s *format_vtable_p;
147 typedef struct psb_driver_data_s *psb_driver_data_p;
148 
149 typedef struct psb_surface_share_info_s psb_surface_share_info_t, *psb_surface_share_info_p;
150 /* post-processing data structure */
151 enum 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 
166 typedef struct psb_decode_info {
167     uint32_t num_surface;
168     uint32_t surface_id;
169 } psb_decode_info_t;
170 typedef struct msvdx_decode_info *psb_decode_info_p;
171 
172 #define CSC_MATRIX_X  (3)
173 #define CSC_MATRIX_Y  (3)
174 
175 struct 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 
348 struct 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 
357 struct 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 
455 enum 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
463 struct 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 
512 struct 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 
564 struct 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 
583 struct 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 
591 struct 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 
611 typedef 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 
636 struct 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 
GetTickCount()669 static 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 
buffer_type_to_string(int type)677 inline 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 
Angle2Rotation(int angle)723 inline 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 
Rotation2Angle(int rotation)740 inline 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 
756 int psb_parse_config(char *env, char *env_value);
757 void psb__destroy_surface(psb_driver_data_p driver_data, object_surface_p obj_surface);
758 unsigned long psb_tile_stride_mode(int w);
759 VAStatus psb__checkSurfaceDimensions(psb_driver_data_p driver_data, int width, int height);
760 
761 int LOCK_HARDWARE(psb_driver_data_p driver_data);
762 int UNLOCK_HARDWARE(psb_driver_data_p driver_data);
763 unsigned long psb__tile_stride_log2_256(int w);
764 int 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