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