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  *    Shengquan Yuan  <shengquan.yuan@intel.com>
26  *    Zhaohan Ren  <zhaohan.ren@intel.com>
27  *    Jason Hu <jason.hu@intel.com>
28  *
29  */
30 
31 #ifndef _PSB_OUTPUT_H_
32 #define _PSB_OUTPUT_H_
33 #include <inttypes.h>
34 #include "psb_drv_video.h"
35 #include "psb_surface.h"
36 #include "hwdefs/img_types.h"
37 #include <va/va.h>
38 #include <linux/fb.h>
39 #include <fcntl.h>
40 
41 #define IMG_VIDEO_IED_STATE 0
42 #ifndef ANDROID
43 #include <va/va_x11.h>
44 #else
45 #define Drawable unsigned int
46 #define Bool int
47 #define LOG_TAG "pvr_drv_video"
48 #endif
49 
50 #define PSB_MAX_IMAGE_FORMATS      4 /* sizeof(psb__CreateImageFormat)/sizeof(VAImageFormat) */
51 #define PSB_MAX_SUBPIC_FORMATS     3 /* sizeof(psb__SubpicFormat)/sizeof(VAImageFormat) */
52 #define PSB_MAX_DISPLAY_ATTRIBUTES 14     /* sizeof(psb__DisplayAttribute)/sizeof(VADisplayAttribute) */
53 
54 #define VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD       0x0004
55 #define PSB_SUPPORTED_SUBPIC_FLAGS      VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD /* No alpha or chroma key support */
56 
57 
58 #define CLAMP(_X) ( (_X)= ((_X)<0?0:((_X)>255?255:(_X)) ) )
59 
60 #define HUE_DEFAULT_VALUE    0
61 #define HUE_MIN    -180
62 #define HUE_MAX    180
63 #define HUE_STEPSIZE 0.1
64 
65 #define BRIGHTNESS_DEFAULT_VALUE   0
66 #define BRIGHTNESS_MIN -100
67 #define BRIGHTNESS_MAX 100
68 #define BRIGHTNESS_STEPSIZE 0.1
69 
70 #define CONTRAST_DEFAULT_VALUE 1
71 #define CONTRAST_MIN 0
72 #define CONTRAST_MAX 2
73 #define CONTRAST_STEPSIZE 0.0001
74 
75 #define SATURATION_DEFAULT_VALUE 1
76 #define SATURATION_MIN 0
77 #define SATURATION_MAX 3
78 #define SATURATION_STEPSIZE 0.0001
79 
80 #define VA_RENDER_MODE_MASK 0x0f
81 #define VA_RENDER_DEVICE_MASK 0x03
82 
83 #define PSB_DRIDDX_VERSION_MAJOR 0
84 #define PSB_DRIDDX_VERSION_MINOR 1
85 #define PSB_DRIDDX_VERSION_PATCH 0
86 
87 #define psb__ImageNV12                          \
88 {                                               \
89     VA_FOURCC_NV12,                             \
90     VA_LSB_FIRST,                               \
91     16,                                         \
92     0,                                          \
93     0,                                          \
94     0,                                          \
95     0,                                          \
96     0                                           \
97 }
98 
99 #define psb__ImageAYUV                          \
100 {                                               \
101     VA_FOURCC_AYUV,                             \
102     VA_LSB_FIRST,                               \
103     32,                                         \
104     0,                                          \
105     0,                                          \
106     0,                                          \
107     0,                                          \
108     0                                           \
109 }
110 
111 #define psb__ImageAI44                          \
112 {                                               \
113     VA_FOURCC_AI44,                             \
114     VA_LSB_FIRST,                               \
115     16,                                         \
116     0,                                          \
117     0,                                          \
118     0,                                          \
119     0,                                          \
120     0,                                          \
121 }
122 
123 #define psb__ImageRGBA                          \
124 {                                               \
125     VA_FOURCC_RGBA,                             \
126     VA_LSB_FIRST,                               \
127     32,                                         \
128     32,                                         \
129     0xff,                                       \
130     0xff00,                                     \
131     0xff0000,                                   \
132     0xff000000                                  \
133 }
134 
135 #define psb__ImageYV16                          \
136 {                                               \
137     VA_FOURCC_YV16,                             \
138     VA_LSB_FIRST,                               \
139     16,                                         \
140     0,                                          \
141     0,                                          \
142     0,                                          \
143     0,                                          \
144     0,                                          \
145 }
146 
147 #define psb__ImageYV32                          \
148 {                                               \
149     VA_FOURCC_YV32,                             \
150     VA_LSB_FIRST,                               \
151     32,                                         \
152     0,                                          \
153     0,                                          \
154     0,                                          \
155     0,                                          \
156     0,                                          \
157 }
158 
159 VAStatus psb__destroy_subpicture(psb_driver_data_p driver_data, object_subpic_p obj_subpic);
160 VAStatus psb__destroy_image(psb_driver_data_p driver_data, object_image_p obj_image);
161 
162 /*
163  * VAImage call these buffer routines
164  */
165 VAStatus psb__CreateBuffer(
166     psb_driver_data_p driver_data,
167     object_context_p obj_context,   /* in */
168     VABufferType type,      /* in */
169     unsigned int size,      /* in */
170     unsigned int num_elements, /* in */
171     unsigned char *data,             /* in */
172     VABufferID *buf_desc    /* out */
173 );
174 
175 VAStatus psb_DestroyBuffer(
176     VADriverContextP ctx,
177     VABufferID buffer_id
178 );
179 
180 VAStatus psb_initOutput(
181     VADriverContextP ctx
182 );
183 
184 
185 VAStatus psb_deinitOutput(
186     VADriverContextP ctx
187 );
188 
189 VAStatus psb_PutSurfaceBuf(
190     VADriverContextP ctx,
191     VASurfaceID surface,
192     unsigned char* data,
193     int* data_len,
194     short srcx,
195     short srcy,
196     unsigned short srcw,
197     unsigned short srch,
198     short destx,
199     short desty,
200     unsigned short destw,
201     unsigned short desth,
202     VARectangle *cliprects, /* client supplied clip list */
203     unsigned int number_cliprects, /* number of clip rects in the clip list */
204     unsigned int flags /* de-interlacing flags */
205 );
206 
207 VAStatus psb_SetTimestampForSurface(
208     VADriverContextP ctx,
209     VASurfaceID surface,
210     long long timestamp
211 );
212 
213 VAStatus psb_PutSurface(
214     VADriverContextP ctx,
215     VASurfaceID surface,
216     void* draw, /* X Drawable */
217     short srcx,
218     short srcy,
219     unsigned short srcw,
220     unsigned short srch,
221     short destx,
222     short desty,
223     unsigned short destw,
224     unsigned short desth,
225     VARectangle *cliprects, /* client supplied clip list */
226     unsigned int number_cliprects, /* number of clip rects in the clip list */
227     unsigned int flags /* de-interlacing flags */
228 );
229 
230 VAStatus psb_QueryImageFormats(
231     VADriverContextP ctx,
232     VAImageFormat *format_list,        /* out */
233     int *num_formats           /* out */
234 );
235 
236 VAStatus psb_CreateImage(
237     VADriverContextP ctx,
238     VAImageFormat *format,
239     int width,
240     int height,
241     VAImage *image     /* out */
242 );
243 
244 VAStatus psb_DeriveImage(
245     VADriverContextP ctx,
246     VASurfaceID surface,
247     VAImage *image     /* out */
248 );
249 
250 VAStatus psb_DestroyImage(
251     VADriverContextP ctx,
252     VAImageID image
253 );
254 
255 VAStatus psb_SetImagePalette(
256     VADriverContextP ctx,
257     VAImageID image,
258     /*
259      * pointer to an array holding the palette data.  The size of the array is
260      * num_palette_entries * entry_bytes in size.  The order of the components
261      * in the palette is described by the component_order in VAImage struct
262      */
263     unsigned char *palette
264 );
265 
266 VAStatus psb_GetImage(
267     VADriverContextP ctx,
268     VASurfaceID surface,
269     int x,     /* coordinates of the upper left source pixel */
270     int y,
271     unsigned int width, /* width and height of the region */
272     unsigned int height,
273     VAImageID image
274 );
275 
276 VAStatus psb_PutImage(
277     VADriverContextP ctx,
278     VASurfaceID surface,
279     VAImageID image,
280     int src_x,
281     int src_y,
282     unsigned int src_width,
283     unsigned int src_height,
284     int dest_x,
285     int dest_y,
286     unsigned int dest_width,
287     unsigned int dest_height
288 );
289 
290 VAStatus psb_QuerySubpictureFormats(
291     VADriverContextP ctx,
292     VAImageFormat *format_list,        /* out */
293     unsigned int *flags,       /* out */
294     unsigned int *num_formats  /* out */
295 );
296 
297 VAStatus psb_CreateSubpicture(
298     VADriverContextP ctx,
299     VAImageID image,
300     VASubpictureID *subpicture   /* out */
301 );
302 
303 VAStatus psb_DestroySubpicture(
304     VADriverContextP ctx,
305     VASubpictureID subpicture
306 );
307 
308 VAStatus psb_SetSubpictureImage(
309     VADriverContextP ctx,
310     VASubpictureID subpicture,
311     VAImageID image
312 );
313 
314 
315 VAStatus psb_SetSubpictureChromakey(
316     VADriverContextP ctx,
317     VASubpictureID subpicture,
318     unsigned int chromakey_min,
319     unsigned int chromakey_max,
320     unsigned int chromakey_mask
321 );
322 
323 VAStatus psb_SetSubpictureGlobalAlpha(
324     VADriverContextP ctx,
325     VASubpictureID subpicture,
326     float global_alpha
327 );
328 
329 VAStatus psb_AssociateSubpicture(
330     VADriverContextP ctx,
331     VASubpictureID subpicture,
332     VASurfaceID *target_surfaces,
333     int num_surfaces,
334     short src_x, /* upper left offset in subpicture */
335     short src_y,
336     unsigned short src_width,
337     unsigned short src_height,
338     short dest_x, /* upper left offset in surface */
339     short dest_y,
340     unsigned short dest_width,
341     unsigned short dest_height,
342     /*
343      * whether to enable chroma-keying or global-alpha
344      * see VA_SUBPICTURE_XXX values
345      */
346     unsigned int flags
347 );
348 
349 VAStatus psb_DeassociateSubpicture(
350     VADriverContextP ctx,
351     VASubpictureID subpicture,
352     VASurfaceID *target_surfaces,
353     int num_surfaces
354 );
355 
356 void psb_SurfaceDeassociateSubpict(
357     psb_driver_data_p driver_data,
358     object_surface_p obj_surface
359 );
360 
361 /*
362  * Query display attributes
363  * The caller must provide a "attr_list" array that can hold at
364  * least vaMaxNumDisplayAttributes() entries. The actual number of attributes
365  * returned in "attr_list" is returned in "num_attributes".
366  */
367 VAStatus psb_QueryDisplayAttributes(
368     VADriverContextP ctx,
369     VADisplayAttribute *attr_list,      /* out */
370     int *num_attributes         /* out */
371 );
372 
373 /*
374  * Get display attributes
375  * This function returns the current attribute values in "attr_list".
376  * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field
377  * from vaQueryDisplayAttributes() can have their values retrieved.
378  */
379 VAStatus psb_GetDisplayAttributes(
380     VADriverContextP ctx,
381     VADisplayAttribute *attr_list,      /* in/out */
382     int num_attributes
383 );
384 
385 /*
386  * Set display attributes
387  * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field
388  * from vaQueryDisplayAttributes() can be set.  If the attribute is not settable or
389  * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED
390  */
391 VAStatus psb_SetDisplayAttributes(
392     VADriverContextP ctx,
393     VADisplayAttribute *attr_list,
394     int num_attributes
395 );
396 
397 #endif /* _PSB_OUTPUT_H_ */
398