summaryrefslogtreecommitdiffstats
path: root/meta-emenlow/recipes-graphics/libva/libva-0.31.0/391_compat.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-emenlow/recipes-graphics/libva/libva-0.31.0/391_compat.patch')
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/391_compat.patch3273
1 files changed, 3273 insertions, 0 deletions
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/391_compat.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/391_compat.patch
new file mode 100644
index 00000000..5e09d22b
--- /dev/null
+++ b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/391_compat.patch
@@ -0,0 +1,3273 @@
1commit 2e7aa803a8547dfcde6e97ae2bb4a8bbdbb2634e
2Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Mon Nov 23 12:22:09 2009 +0000
4
5 Update compat code for VDPAU/MPEG-4 additions.
6
7commit 30808b39d82cbf0c185052a2d2d5ed8a5fc065d1
8Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
9Date: Thu Sep 10 14:01:57 2009 +0000
10
11 Update compatibility glue for VASliceParameterBufferMPEG2.slice_horizontal_position addition.
12
13commit 27faf49366602637da223f3dc5f30ce4d6d72070
14Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
15Date: Wed Sep 2 15:06:20 2009 +0000
16
17 Fix vaSyncSurface() compat code for VA API < 0.31 drivers.
18
19commit dc33a3e28b38b7d579ab768899963cf9b0d38677
20Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
21Date: Wed Sep 2 12:28:43 2009 +0000
22
23 Fix check for 0.30 modules.
24
25commit bd913971bd9e7460b454513b006e16c18136625e
26Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
27Date: Wed Sep 2 11:58:08 2009 +0000
28
29 Update for VA API 0.31.
30
31commit 9cc7f89d3cc0238ab5b3a47c316e261e06a16634
32Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
33Date: Thu Jul 2 15:55:48 2009 +0000
34
35 Fix VAEncSliceParameterBuffer thunk.
36
37commit 483bc9e67afa9bcd8f99f08a74a78e7dfad4651f
38Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
39Date: Thu Jul 2 09:24:04 2009 +0000
40
41 Fix make dist (va_compat_template.h).
42
43commit 7f41b22366142c4e476fbae929ad343dc33af3a4
44Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
45Date: Thu Jun 25 14:05:57 2009 +0000
46
47 Drop superfluous semi-colon.
48
49commit dcc75aae23fc8f653179b6a331f4021acd6775fd
50Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
51Date: Thu Jun 25 13:53:26 2009 +0000
52
53 Fix check for 0.30 modules.
54
55commit b34512e74ac4150a3f8ee4abe4fa5b17907f8869
56Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
57Date: Thu Jun 25 13:17:48 2009 +0000
58
59 Fix vaTerminate() thunk.
60
61commit 3b006d1ac66429f6b8ffff00ce60e1e47a32c02c
62Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
63Date: Thu Jun 25 12:48:22 2009 +0000
64
65 Cosmetics.
66
67commit 452295d5ac34643f8a316491888c3900f12c5bff
68Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
69Date: Thu Jun 25 12:18:48 2009 +0000
70
71 Fix compatibility with 0.29 modules.
72
73commit 0e0da9ea861f14e8129767dbf6f11be5c051d85f
74Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
75Date: Wed Jun 24 11:40:56 2009 +0000
76
77 Add compatibility layer with original libva 0.29.
78
79diff --git a/src/va_compat.c b/src/va_compat.c
80new file mode 100644
81index 0000000..0bd7385
82--- /dev/null
83+++ b/src/va_compat.c
84@@ -0,0 +1,1171 @@
85+/*
86+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
87+ *
88+ * Permission is hereby granted, free of charge, to any person obtaining a
89+ * copy of this software and associated documentation files (the
90+ * "Software"), to deal in the Software without restriction, including
91+ * without limitation the rights to use, copy, modify, merge, publish,
92+ * distribute, sub license, and/or sell copies of the Software, and to
93+ * permit persons to whom the Software is furnished to do so, subject to
94+ * the following conditions:
95+ *
96+ * The above copyright notice and this permission notice (including the
97+ * next paragraph) shall be included in all copies or substantial portions
98+ * of the Software.
99+ *
100+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
101+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
102+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
103+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
104+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
105+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
106+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
107+ */
108+
109+#include "config.h"
110+#include "va.h"
111+#include "va_compat.h"
112+#include "va_backend.h"
113+#include <string.h>
114+#include <alloca.h>
115+#include <assert.h>
116+
117+#define CTX(dpy) (((VADisplayContextP)dpy)->pDriverContext)
118+#define COMPAT_CTX(ctx) ((VACompatContextP)(ctx)->compat)
119+#define ASSERT assert
120+
121+/* Invoke the normal VA API entry-point. This one can be replaced with
122+ one of the va_compat_*() functions */
123+#define VA_INVOKE(FUNC, CTX, ...) \
124+ (CTX)->vtable.FUNC(CTX, __VA_ARGS__)
125+
126+/* Invoke the real VA API entry-point. That is, the driver's function */
127+#define VA_INVOKE_COMPAT_ARGS(CTX, ...) \
128+ (COMPAT_CTX(CTX)->compat_ctx, __VA_ARGS__)
129+#define VA_INVOKE_COMPAT(FUNC, CTX, ...) \
130+ COMPAT_CTX(CTX)->vtable.FUNC VA_INVOKE_COMPAT_ARGS(CTX, __VA_ARGS__)
131+
132+typedef struct VACompatContext *VACompatContextP;
133+
134+typedef VAStatus (*VABufferTranslateFunc)(VACompatContextP ctx, void *dest, const void *src);
135+
136+typedef enum {
137+ VA_DRIVER_ID_UNKNOWN,
138+ VA_DRIVER_ID_POULSBO,
139+ VA_DRIVER_ID_IEGD
140+} VADriverID;
141+
142+typedef struct {
143+ VABufferID id;
144+ VABufferType type;
145+ unsigned int size;
146+ unsigned int num_elements;
147+ unsigned char *data;
148+ VABufferTranslateFunc translate;
149+ VABufferID compat_id;
150+ unsigned int compat_size;
151+ unsigned char *compat_data;
152+ unsigned int map_count;
153+} VABufferCompat;
154+
155+typedef struct VAContextMap *VAContextMapP;
156+typedef struct VAContextMap {
157+ VASurfaceID surface;
158+ VAContextID context;
159+ VAContextMapP next;
160+} VAContextMap;
161+
162+typedef struct {
163+ VAStatus (*vaTerminate)(void *);
164+ VAStatus (*vaQueryConfigProfiles)(void *, VAProfile *, int *);
165+ VAStatus (*vaQueryConfigEntrypoints)(void *, VAProfile, VAEntrypoint *, int *);
166+ VAStatus (*vaGetConfigAttributes)(void *, VAProfile, VAEntrypoint, VAConfigAttrib *, int);
167+ VAStatus (*vaCreateConfig)(void *, VAProfile, VAEntrypoint, VAConfigAttrib *, int, VAConfigID *);
168+ VAStatus (*vaDestroyConfig)(void *, VAConfigID);
169+ VAStatus (*vaQueryConfigAttributes)(void *, VAConfigID, VAProfile *, VAEntrypoint *, VAConfigAttrib *, int *);
170+ VAStatus (*vaCreateSurfaces)(void *, int, int, int, int, VASurfaceID *);
171+ VAStatus (*vaDestroySurfaces)(void *, VASurfaceID *, int);
172+ VAStatus (*vaCreateContext)(void *, VAConfigID, int, int, int, VASurfaceID *, int, VAContextID *);
173+ VAStatus (*vaDestroyContext)(void *, VAContextID);
174+ VAStatus (*vaCreateBuffer)(void *, VAContextID, VABufferType, unsigned int, unsigned int, void *, VABufferID *);
175+ VAStatus (*vaBufferSetNumElements)(void *, VABufferID, unsigned int);
176+ VAStatus (*vaMapBuffer)(void *, VABufferID, void **);
177+ VAStatus (*vaUnmapBuffer)(void *, VABufferID);
178+ VAStatus (*vaDestroyBuffer)(void *, VABufferID);
179+ VAStatus (*vaBeginPicture)(void *, VAContextID, VASurfaceID);
180+ VAStatus (*vaRenderPicture)(void *, VAContextID, VABufferID *, int);
181+ VAStatus (*vaEndPicture)(void *, VAContextID);
182+ VAStatus (*vaSyncSurface_pre31)(void *, VAContextID, VASurfaceID);
183+ VAStatus (*vaQuerySurfaceStatus)(void *, VASurfaceID, VASurfaceStatus *);
184+ VAStatus (*vaPutSurface)(void *, VASurfaceID, unsigned long, short, short, unsigned short, unsigned short, short, short, unsigned short, unsigned short, VARectangle *, unsigned int, unsigned int);
185+ VAStatus (*vaQueryImageFormats)(void *, VAImageFormat *, int *);
186+ VAStatus (*vaCreateImage)(void *, VAImageFormat *, int, int, VAImage *);
187+ VAStatus (*vaDeriveImage)(void *, VASurfaceID, VAImage *);
188+ VAStatus (*vaDestroyImage)(void *, VAImageID);
189+ VAStatus (*vaSetImagePalette)(void *, VAImageID, unsigned char *);
190+ VAStatus (*vaGetImage)(void *, VASurfaceID, int, int, unsigned int, unsigned int, VAImageID);
191+ VAStatus (*vaPutImage_pre31)(void *, VASurfaceID, VAImageID, int, int, unsigned int, unsigned int, int, int);
192+ VAStatus (*vaPutImage2_pre31)(void *, VASurfaceID, VAImageID, int, int, unsigned int, unsigned int, int, int, unsigned int, unsigned int);
193+ VAStatus (*vaQuerySubpictureFormats)(void *, VAImageFormat *, unsigned int *, unsigned int *);
194+ VAStatus (*vaCreateSubpicture)(void *, VAImageID, VASubpictureID *);
195+ VAStatus (*vaDestroySubpicture)(void *, VASubpictureID);
196+ VAStatus (*vaSetSubpictureImage)(void *, VASubpictureID, VAImageID);
197+ VAStatus (*vaSetSubpictureChromakey)(void *, VASubpictureID, unsigned int, unsigned int, unsigned int);
198+ VAStatus (*vaSetSubpictureGlobalAlpha)(void *, VASubpictureID, float);
199+ VAStatus (*vaAssociateSubpicture_pre31)(void *, VASubpictureID, VASurfaceID *, int, short, short, short, short, unsigned short, unsigned short, unsigned int);
200+ VAStatus (*vaAssociateSubpicture2_pre31)(void *, VASubpictureID, VASurfaceID *, int, short, short, unsigned short, unsigned short, short, short, unsigned short, unsigned short, unsigned int);
201+ VAStatus (*vaDeassociateSubpicture)(void *, VASubpictureID, VASurfaceID *, int);
202+ VAStatus (*vaQueryDisplayAttributes)(void *, VADisplayAttribute *, int *);
203+ VAStatus (*vaGetDisplayAttributes)(void *, VADisplayAttribute *, int);
204+ VAStatus (*vaSetDisplayAttributes)(void *, VADisplayAttribute *, int);
205+
206+ /* 0.29 hooks */
207+ VAStatus (*vaSetSubpicturePalette)(void *, VASubpictureID, unsigned char *);
208+ VAStatus (*vaDbgCopySurfaceToBuffer)(void *, VASurfaceID, void **, unsigned int *);
209+
210+ /* 0.30 hooks */
211+ VAStatus (*vaCreateSurfaceFromCIFrame)(void *, unsigned long, VASurfaceID *);
212+ VAStatus (*vaCreateSurfaceFromV4L2Buf)(void *, int, struct v4l2_format *, struct v4l2_buffer *, VASurfaceID *);
213+ VAStatus (*vaCopySurfaceToBuffer)(void *, VASurfaceID, unsigned int *, unsigned int *, unsigned int *, unsigned int *, unsigned int *, unsigned int *, unsigned int *, void **);
214+
215+ /* 0.31 hooks */
216+ VAStatus (*vaPutImage)(void *, VASurfaceID, VAImageID, int, int, unsigned int, unsigned int, int, int, unsigned int, unsigned int);
217+ VAStatus (*vaAssociateSubpicture)(void *, VASubpictureID, VASurfaceID *, int, short, short, unsigned short, unsigned short, short, short, unsigned short, unsigned short, unsigned int);
218+ VAStatus (*vaSyncSurface)(void *, VASurfaceID);
219+} VACompatDriverVTable;
220+
221+typedef struct VACompatContext {
222+ VABufferCompat *buffers;
223+ unsigned int buffers_count_max;
224+ unsigned int compat_version;
225+ void *compat_ctx;
226+ VACompatDriverVTable vtable; /* original vtable */
227+ VADriverID driver_id;
228+ char *driver_name;
229+ VAContextMapP context_map;
230+ VAContextMapP last_context_map_match;
231+ unsigned int skip_frame : 1;
232+} VACompatContext;
233+
234+#define COMPAT_MAJOR 0
235+#define COMPAT_MINOR 29
236+#include "va_compat_template.h"
237+
238+#define COMPAT_MAJOR 0
239+#define COMPAT_MINOR 30
240+#include "va_compat_template.h"
241+
242+#define COMPAT_MAJOR 0
243+#define COMPAT_MINOR 31
244+#include "va_compat_template.h"
245+
246+static inline int va_IsIntelBuffer(VADriverContextP ctx, VABufferID id)
247+{
248+ VACompatContextP compat = ctx->compat;
249+
250+ if (compat->driver_id == VA_DRIVER_ID_POULSBO) {
251+ /* There were only Intel implementations for VA API. Besides, the
252+ returned buffer IDs had the following format [ 0 BASE ID ] where
253+ BASE is the 7-bit value 0x04 and ID an index into the heap of
254+ objects */
255+ return (id & 0x7f000000) == 0x04000000;
256+ }
257+
258+ if (compat->driver_id == VA_DRIVER_ID_IEGD) {
259+ /* XXX: there is no means to differentiate the buffers, they
260+ are linearly generated (IEGD 10.0 build 1335) */
261+ return 1;
262+ }
263+
264+ return 0;
265+}
266+
267+static VAContextMapP va_context_map_lookup_p(
268+ VACompatContextP ctx,
269+ VASurfaceID surface
270+)
271+{
272+ VAContextMapP m = ctx->context_map;
273+
274+ while (m) {
275+ if (m->surface == surface)
276+ return m;
277+ m = m->next;
278+ }
279+ return NULL;
280+}
281+
282+static VAContextID va_context_map_lookup(
283+ VACompatContextP ctx,
284+ VASurfaceID surface
285+)
286+{
287+ VAContextMapP m;
288+
289+ /* Lookup in cached */
290+ m = ctx->last_context_map_match;
291+ if (m && m->surface == surface)
292+ return m->context;
293+
294+ /* Full (slow) lookup */
295+ m = va_context_map_lookup_p(ctx, surface);
296+ if (m) {
297+ ctx->last_context_map_match = m;
298+ return m->context;
299+ }
300+ return VA_INVALID_ID;
301+}
302+
303+static void va_context_map_add(
304+ VACompatContextP ctx,
305+ VAContextID context,
306+ VASurfaceID surface
307+)
308+{
309+ VAContextMapP m;
310+
311+ /* Update existing entry */
312+ m = va_context_map_lookup_p(ctx, surface);
313+ if (m) {
314+ m->context = context;
315+ return;
316+ }
317+
318+ /* Create new mapping */
319+ m = malloc(sizeof(*m));
320+ ASSERT(m);
321+ if (m) {
322+ m->surface = surface;
323+ m->context = context;
324+ m->next = ctx->context_map;
325+ ctx->context_map = m;
326+ }
327+}
328+
329+static void va_context_map_remove(
330+ VACompatContextP ctx,
331+ VAContextID context
332+)
333+{
334+ VAContextMapP p = NULL;
335+ VAContextMapP m = ctx->context_map;
336+ VAContextMapP d;
337+
338+ while (m) {
339+ if (m->context == context) {
340+ d = m;
341+
342+ /* Unlink current node */
343+ if (p)
344+ p->next = m->next;
345+ else
346+ ctx->context_map = m->next;
347+ m = m->next;
348+
349+ /* Reset cache */
350+ if (ctx->last_context_map_match == d)
351+ ctx->last_context_map_match = NULL;
352+
353+ free(d);
354+ }
355+ else {
356+ p = m;
357+ m = m->next;
358+ }
359+ }
360+}
361+
362+static VABufferCompat *va_GetBufferCompat (
363+ VADriverContextP ctx,
364+ VABufferID id
365+)
366+{
367+ VACompatContextP compat = ctx->compat;
368+ int index;
369+
370+ if (!va_IsIntelBuffer(ctx, id))
371+ return NULL;
372+
373+ index = id & 0x00ffffff;
374+ if (index >= compat->buffers_count_max)
375+ return NULL;
376+
377+ if (compat->buffers[index].id != id)
378+ return NULL;
379+
380+ return &compat->buffers[index];
381+}
382+
383+static VAStatus va_TranslateBufferCompat (
384+ VADriverContextP ctx,
385+ VABufferCompat *compat_buffer
386+)
387+{
388+ VAStatus status;
389+ unsigned char *src, *dest;
390+ int i;
391+
392+ status = VA_INVOKE(vaMapBuffer, ctx, compat_buffer->id, (void **)&src);
393+ if (status != VA_STATUS_SUCCESS)
394+ return status;
395+
396+ ASSERT(compat_buffer->data);
397+ ASSERT(src == compat_buffer->data);
398+ ASSERT(compat_buffer->compat_data);
399+ dest = compat_buffer->compat_data;
400+ for (i = 0; i < compat_buffer->num_elements; i++)
401+ {
402+ /* XXX: check errors */
403+ status = compat_buffer->translate(ctx->compat, dest, src);
404+
405+ src += compat_buffer->size;
406+ dest += compat_buffer->compat_size;
407+ }
408+
409+ return VA_INVOKE(vaUnmapBuffer, ctx, compat_buffer->id);
410+}
411+
412+static VAStatus va_CreateBufferCompat (
413+ VADriverContextP ctx,
414+ VAContextID context,
415+ VABufferID id,
416+ VABufferType type,
417+ unsigned int size,
418+ unsigned int num_elements,
419+ unsigned int compat_size,
420+ VABufferTranslateFunc translate_func
421+)
422+{
423+ VACompatContextP compat = ctx->compat;
424+ VABufferCompat *compat_buffer;
425+ int index;
426+
427+ if (!va_IsIntelBuffer(ctx, id))
428+ return VA_STATUS_ERROR_INVALID_BUFFER;
429+ index = id & 0x00ffffff;
430+
431+ /* XXX: this allocation strategy is not really space efficient... */
432+ if (index >= compat->buffers_count_max)
433+ {
434+ compat->buffers_count_max = index + 1;
435+ compat->buffers = realloc(compat->buffers,
436+ (compat->buffers_count_max *
437+ sizeof(VABufferCompat)));
438+ if (compat->buffers == NULL)
439+ return VA_STATUS_ERROR_ALLOCATION_FAILED;
440+ }
441+
442+ compat_buffer = &compat->buffers[index];
443+ compat_buffer->id = id;
444+ compat_buffer->type = type;
445+ compat_buffer->size = size;
446+ compat_buffer->num_elements = num_elements;
447+ compat_buffer->data = NULL;
448+ compat_buffer->translate = translate_func;
449+ compat_buffer->compat_size = compat_size;
450+ compat_buffer->compat_data = NULL;
451+ compat_buffer->map_count = 0;
452+
453+ return VA_INVOKE_COMPAT(vaCreateBuffer,
454+ ctx,
455+ context,
456+ type,
457+ compat_size,
458+ num_elements,
459+ NULL,
460+ &compat_buffer->compat_id);
461+}
462+
463+static VAStatus va_DestroyBufferCompat (
464+ VADriverContextP ctx,
465+ VABufferID id
466+)
467+{
468+ VABufferCompat *compat_buffer;
469+ VAStatus status;
470+
471+ if ((compat_buffer = va_GetBufferCompat(ctx, id)) == NULL)
472+ return VA_STATUS_SUCCESS;
473+
474+ /* Force unmap if there were more maps than unmaps */
475+ if (compat_buffer->map_count > 1)
476+ compat_buffer->map_count = 1;
477+ if (compat_buffer->map_count > 1)
478+ {
479+ if ((status = VA_INVOKE(vaUnmapBuffer, ctx, id)) != VA_STATUS_SUCCESS)
480+ return status;
481+ }
482+
483+ compat_buffer->id = 0;
484+ return VA_INVOKE_COMPAT(vaDestroyBuffer, ctx, compat_buffer->compat_id);
485+}
486+
487+static VAStatus va_compat_CreateBuffer (
488+ VADriverContextP ctx,
489+ VAContextID context, /* in */
490+ VABufferType type, /* in */
491+ unsigned int size, /* in */
492+ unsigned int num_elements, /* in */
493+ void *data, /* in */
494+ VABufferID *buf_id /* out */
495+)
496+{
497+ VABufferTranslateFunc translate_func = NULL;
498+ unsigned int compat_size = 0;
499+ VAStatus status;
500+
501+ status = VA_INVOKE_COMPAT(vaCreateBuffer,
502+ ctx,
503+ context,
504+ type,
505+ size,
506+ num_elements,
507+ data,
508+ buf_id);
509+
510+ if (status != VA_STATUS_SUCCESS)
511+ return status;
512+
513+#define INIT_TRANSLATE_FUNC_(STRUCT, MAJOR, MINOR) do { \
514+ translate_func = va_compat_translate_VA##STRUCT##_##MAJOR##_##MINOR; \
515+ compat_size = sizeof(VA##STRUCT##_##MAJOR##_##MINOR); \
516+} while (0)
517+#define INIT_TRANSLATE_FUNC(BUFFER, CODEC, MAJOR, MINOR) \
518+ INIT_TRANSLATE_FUNC_(BUFFER##Buffer##CODEC, MAJOR, MINOR)
519+
520+ /* XXX: this assumes all structures have different sizes from each other */
521+ switch (size) {
522+ case sizeof(VAPictureParameterBufferH264):
523+ if (type == VAPictureParameterBufferType && ctx->version_major == 0)
524+ {
525+ switch (ctx->version_minor) {
526+ case 29: INIT_TRANSLATE_FUNC(PictureParameter,H264, 0,29); break;
527+ case 30: INIT_TRANSLATE_FUNC(PictureParameter,H264, 0,30); break;
528+ }
529+ }
530+ break;
531+ case sizeof(VASliceParameterBufferH264):
532+ if (type == VASliceParameterBufferType && ctx->version_major == 0)
533+ {
534+ switch (ctx->version_minor) {
535+ case 29: INIT_TRANSLATE_FUNC(SliceParameter,H264, 0,29); break;
536+ case 30: INIT_TRANSLATE_FUNC(SliceParameter,H264, 0,30); break;
537+ }
538+ }
539+ break;
540+ case sizeof(VAPictureParameterBufferVC1):
541+ if (type == VAPictureParameterBufferType && ctx->version_major == 0)
542+ {
543+ switch (ctx->version_minor) {
544+ case 29: INIT_TRANSLATE_FUNC(PictureParameter,VC1, 0,29); break;
545+ case 30: INIT_TRANSLATE_FUNC(PictureParameter,VC1, 0,30); break;
546+ }
547+ }
548+ break;
549+ case sizeof(VAPictureParameterBufferMPEG2):
550+ if (type == VAPictureParameterBufferType && ctx->version_major == 0)
551+ {
552+ switch (ctx->version_minor) {
553+ case 29: INIT_TRANSLATE_FUNC(PictureParameter,MPEG2, 0,29); break;
554+ case 30: INIT_TRANSLATE_FUNC(PictureParameter,MPEG2, 0,30); break;
555+ }
556+ }
557+ break;
558+ case sizeof(VASliceParameterBufferMPEG2):
559+ if (type == VASliceParameterBufferType && ctx->version_major == 0)
560+ {
561+ switch (ctx->version_minor) {
562+ case 29: INIT_TRANSLATE_FUNC(SliceParameter,MPEG2, 0,29); break;
563+ case 30: INIT_TRANSLATE_FUNC(SliceParameter,MPEG2, 0,30); break;
564+ }
565+ }
566+ break;
567+ case sizeof(VAPictureParameterBufferMPEG4):
568+ if (type == VAPictureParameterBufferType && ctx->version_major == 0)
569+ {
570+ switch (ctx->version_minor) {
571+ case 29: INIT_TRANSLATE_FUNC(PictureParameter,MPEG4, 0,29); break;
572+ case 30: INIT_TRANSLATE_FUNC(PictureParameter,MPEG4, 0,30); break;
573+ case 31: INIT_TRANSLATE_FUNC(PictureParameter,MPEG4, 0,31); break;
574+ }
575+ }
576+ break;
577+ case sizeof(VAEncSliceParameterBuffer):
578+ if (type == VAEncSliceParameterBufferType && ctx->version_major == 0)
579+ {
580+ switch (ctx->version_minor) {
581+ case 30: INIT_TRANSLATE_FUNC_(EncSliceParameterBuffer, 0,30); break;
582+ }
583+ }
584+ break;
585+ }
586+
587+#undef INIT_TRANSLATE_FUNC
588+
589+ /* Create thunk */
590+ if (buf_id && translate_func)
591+ {
592+ ASSERT(compat_size > 0);
593+
594+ status = va_CreateBufferCompat(ctx,
595+ context,
596+ *buf_id,
597+ type,
598+ size,
599+ num_elements,
600+ compat_size,
601+ translate_func);
602+ }
603+
604+ return status;
605+}
606+
607+static VAStatus va_compat_BufferSetNumElements (
608+ VADriverContextP ctx,
609+ VABufferID buf_id, /* in */
610+ unsigned int num_elements /* in */
611+)
612+{
613+ VABufferCompat *compat_buffer;
614+ VAStatus status;
615+
616+ status = VA_INVOKE_COMPAT(vaBufferSetNumElements, ctx, buf_id, num_elements);
617+ if (status != VA_STATUS_SUCCESS)
618+ return status;
619+
620+ if ((compat_buffer = va_GetBufferCompat(ctx, buf_id)) != NULL)
621+ {
622+ compat_buffer->num_elements = num_elements;
623+ status = VA_INVOKE_COMPAT(vaBufferSetNumElements,
624+ ctx,
625+ compat_buffer->compat_id,
626+ num_elements);
627+ }
628+
629+ return status;
630+}
631+
632+static VAStatus va_compat_DestroyBuffer (
633+ VADriverContextP ctx,
634+ VABufferID buffer_id
635+)
636+{
637+ VAStatus status;
638+ if ((status = va_DestroyBufferCompat(ctx, buffer_id)) != VA_STATUS_SUCCESS)
639+ return status;
640+
641+ return VA_INVOKE_COMPAT(vaDestroyBuffer, ctx, buffer_id);
642+}
643+
644+static VAStatus va_compat_MapBuffer (
645+ VADriverContextP ctx,
646+ VABufferID buf_id, /* in */
647+ void **pbuf /* out */
648+)
649+{
650+ VABufferCompat *compat_buffer;
651+ VAStatus status;
652+
653+ if ((compat_buffer = va_GetBufferCompat(ctx, buf_id)) == NULL)
654+ return VA_INVOKE_COMPAT(vaMapBuffer, ctx, buf_id, pbuf);
655+
656+ if (compat_buffer->map_count++ == 0)
657+ {
658+ status = VA_INVOKE_COMPAT(vaMapBuffer, ctx, buf_id, (void **)&compat_buffer->data);
659+ if (status != VA_STATUS_SUCCESS)
660+ return status;
661+
662+ status = VA_INVOKE_COMPAT(vaMapBuffer, ctx, compat_buffer->compat_id, (void **)&compat_buffer->compat_data);
663+ if (status != VA_STATUS_SUCCESS)
664+ return status;
665+ }
666+
667+ if (pbuf)
668+ *pbuf = compat_buffer->data;
669+
670+ return VA_STATUS_SUCCESS;
671+}
672+
673+static VAStatus va_compat_UnmapBuffer (
674+ VADriverContextP ctx,
675+ VABufferID buf_id /* in */
676+)
677+{
678+ VABufferCompat *compat_buffer;
679+ VAStatus status;
680+
681+ if ((compat_buffer = va_GetBufferCompat(ctx, buf_id)) == NULL)
682+ return VA_INVOKE_COMPAT(vaUnmapBuffer, ctx, buf_id);
683+
684+ if (--compat_buffer->map_count == 0)
685+ {
686+ status = VA_INVOKE_COMPAT(vaUnmapBuffer, ctx, compat_buffer->compat_id);
687+ if (status != VA_STATUS_SUCCESS)
688+ return status;
689+ compat_buffer->compat_data = NULL;
690+
691+ status = VA_INVOKE_COMPAT(vaUnmapBuffer, ctx, compat_buffer->id);
692+ if (status != VA_STATUS_SUCCESS)
693+ return status;
694+ compat_buffer->data = NULL;
695+ }
696+
697+ return VA_STATUS_SUCCESS;
698+}
699+
700+static VAStatus va_compat_BeginPicture (
701+ VADriverContextP ctx,
702+ VAContextID context,
703+ VASurfaceID render_target
704+)
705+{
706+ VACompatContextP compat = ctx->compat;
707+ compat->skip_frame = 0;
708+ return VA_INVOKE_COMPAT(vaBeginPicture, ctx, context, render_target);
709+}
710+
711+static VAStatus va_compat_EndPicture (
712+ VADriverContextP ctx,
713+ VAContextID context
714+)
715+{
716+ VACompatContextP compat = ctx->compat;
717+ VAStatus status = VA_INVOKE_COMPAT(vaEndPicture, ctx, context);
718+
719+ /* Ignore errors if the HW decoder did not handle VC-1 skipped P-frames */
720+ if (compat->skip_frame && status == VA_STATUS_ERROR_UNKNOWN)
721+ status = VA_STATUS_SUCCESS;
722+
723+ return status;
724+}
725+
726+static VAStatus va_compat_RenderPicture (
727+ VADriverContextP ctx,
728+ VAContextID context,
729+ VABufferID *buffers,
730+ int num_buffers
731+)
732+{
733+ VACompatContextP compat = ctx->compat;
734+ VABufferCompat *compat_buffer;
735+ VABufferID *compat_buffer_ids;
736+ VAStatus status;
737+ int i, n;
738+
739+ if ((n = num_buffers) < 1)
740+ n = 1;
741+ compat_buffer_ids = alloca(n * sizeof(compat_buffer_ids[0]));
742+
743+ for (i = 0; i < num_buffers; i++)
744+ {
745+ if ((compat_buffer = va_GetBufferCompat(ctx, buffers[i])) == NULL)
746+ compat_buffer_ids[i] = buffers[i];
747+ else
748+ {
749+ status = va_TranslateBufferCompat(ctx, compat_buffer);
750+ if (status != VA_STATUS_SUCCESS)
751+ return status;
752+ compat_buffer_ids[i] = compat_buffer->compat_id;
753+ }
754+ }
755+
756+ if (!compat->skip_frame)
757+ {
758+ status = VA_INVOKE_COMPAT(vaRenderPicture, ctx, context, compat_buffer_ids, num_buffers);
759+ if (status != VA_STATUS_SUCCESS)
760+ return status;
761+ }
762+
763+ /* Buffers are automatically destroyed afterwards */
764+ for (i = 0; i < num_buffers; i++)
765+ {
766+ if ((compat_buffer = va_GetBufferCompat(ctx, buffers[i])) != NULL)
767+ {
768+ status = VA_INVOKE_COMPAT(vaDestroyBuffer, ctx, compat_buffer->id);
769+ if (status != VA_STATUS_SUCCESS)
770+ return status;
771+ }
772+ }
773+
774+ return VA_STATUS_SUCCESS;
775+}
776+
777+#define DEFINE_VTABLE_ENTRY_(RETVAL, PROC, ARGS, COMPAT_PROC, COMPAT_ARGS, COMPAT_PRE, COMPAT_POST) \
778+static RETVAL va_compat_##PROC ARGS \
779+{ \
780+ if (COMPAT_CTX(ctx)->vtable.va##COMPAT_PROC == NULL) \
781+ return VA_STATUS_ERROR_OPERATION_FAILED; \
782+ COMPAT_PRE; \
783+ RETVAL ret = COMPAT_CTX(ctx)->vtable.va##COMPAT_PROC VA_INVOKE_COMPAT_ARGS COMPAT_ARGS; \
784+ COMPAT_POST; \
785+ return ret; \
786+}
787+
788+#define DEFINE_VTABLE_ENTRY(RETVAL, PROC, DECL_ARGS, CALL_ARGS) \
789+DEFINE_VTABLE_ENTRY_(RETVAL, PROC, DECL_ARGS, PROC, CALL_ARGS, {}, {})
790+
791+static VAStatus va_compat_Terminate(VADriverContextP ctx)
792+{
793+ if (COMPAT_CTX(ctx)->vtable.vaTerminate == NULL)
794+ return VA_STATUS_ERROR_OPERATION_FAILED;
795+ return COMPAT_CTX(ctx)->vtable.vaTerminate(COMPAT_CTX(ctx)->compat_ctx);
796+}
797+
798+DEFINE_VTABLE_ENTRY(
799+ VAStatus, QueryConfigProfiles,
800+ (VADriverContextP ctx, VAProfile *profile_list, int *num_profiles),
801+ (ctx, profile_list, num_profiles))
802+
803+DEFINE_VTABLE_ENTRY(
804+ VAStatus, QueryConfigEntrypoints,
805+ (VADriverContextP ctx, VAProfile profile,
806+ VAEntrypoint *entrypoint_list, int *num_entrypoints),
807+ (ctx, profile, entrypoint_list, num_entrypoints))
808+
809+DEFINE_VTABLE_ENTRY(
810+ VAStatus, GetConfigAttributes,
811+ (VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoint,
812+ VAConfigAttrib *attrib_list, int num_attribs),
813+ (ctx, profile, entrypoint, attrib_list, num_attribs))
814+
815+DEFINE_VTABLE_ENTRY(
816+ VAStatus, CreateConfig,
817+ (VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoint,
818+ VAConfigAttrib *attrib_list, int num_attribs, VAConfigID *config_id),
819+ (ctx, profile, entrypoint, attrib_list, num_attribs, config_id))
820+
821+DEFINE_VTABLE_ENTRY(
822+ VAStatus, DestroyConfig,
823+ (VADriverContextP ctx, VAConfigID config_id),
824+ (ctx, config_id))
825+
826+DEFINE_VTABLE_ENTRY(
827+ VAStatus, QueryConfigAttributes,
828+ (VADriverContextP ctx, VAConfigID config_id, VAProfile *profile,
829+ VAEntrypoint *entrypoint, VAConfigAttrib *attrib_list, int *num_attribs),
830+ (ctx, config_id, profile, entrypoint, attrib_list, num_attribs))
831+
832+DEFINE_VTABLE_ENTRY(
833+ VAStatus, CreateSurfaces,
834+ (VADriverContextP ctx, int width, int height, int format,
835+ int num_surfaces, VASurfaceID *surfaces),
836+ (ctx, width, height, format, num_surfaces, surfaces))
837+
838+DEFINE_VTABLE_ENTRY(
839+ VAStatus, DestroySurfaces,
840+ (VADriverContextP ctx, VASurfaceID *surface_list, int num_surfaces),
841+ (ctx, surface_list, num_surfaces))
842+
843+DEFINE_VTABLE_ENTRY(
844+ VAStatus, CreateContext,
845+ (VADriverContextP ctx, VAConfigID config_id,
846+ int picture_width, int picture_height, int flag,
847+ VASurfaceID *render_targets, int num_render_targets, VAContextID *context),
848+ (ctx, config_id, picture_width, picture_height, flag,
849+ render_targets, num_render_targets, context))
850+
851+DEFINE_VTABLE_ENTRY(
852+ VAStatus, DestroyContext,
853+ (VADriverContextP ctx, VAContextID context),
854+ (ctx, context))
855+
856+DEFINE_VTABLE_ENTRY(
857+ VAStatus, SyncSurface,
858+ (VADriverContextP ctx, VASurfaceID render_target),
859+ (ctx, render_target))
860+
861+DEFINE_VTABLE_ENTRY(
862+ VAStatus, QuerySurfaceStatus,
863+ (VADriverContextP ctx, VASurfaceID render_target, VASurfaceStatus *status),
864+ (ctx, render_target, status))
865+
866+DEFINE_VTABLE_ENTRY(
867+ VAStatus, PutSurface,
868+ (VADriverContextP ctx, VASurfaceID surface, Drawable draw,
869+ short srcx, short srcy, unsigned short srcw, unsigned short srch,
870+ short destx, short desty, unsigned short destw, unsigned short desth,
871+ VARectangle *cliprects, unsigned int number_cliprects, unsigned int flags),
872+ (ctx, surface, draw, srcx, srcy, srcw, srch, destx, desty, destw, desth,
873+ cliprects, number_cliprects, flags))
874+
875+DEFINE_VTABLE_ENTRY(
876+ VAStatus, QueryImageFormats,
877+ (VADriverContextP ctx, VAImageFormat *format_list, int *num_formats),
878+ (ctx, format_list, num_formats))
879+
880+DEFINE_VTABLE_ENTRY(
881+ VAStatus, CreateImage,
882+ (VADriverContextP ctx, VAImageFormat *format,
883+ int width, int height, VAImage *image),
884+ (ctx, format, width, height, image))
885+
886+DEFINE_VTABLE_ENTRY(
887+ VAStatus, DeriveImage,
888+ (VADriverContextP ctx, VASurfaceID surface, VAImage *image),
889+ (ctx, surface, image))
890+
891+DEFINE_VTABLE_ENTRY(
892+ VAStatus, DestroyImage,
893+ (VADriverContextP ctx, VAImageID image),
894+ (ctx, image))
895+
896+DEFINE_VTABLE_ENTRY(
897+ VAStatus, SetImagePalette,
898+ (VADriverContextP ctx, VAImageID image, unsigned char *palette),
899+ (ctx, image, palette))
900+
901+DEFINE_VTABLE_ENTRY(
902+ VAStatus, GetImage,
903+ (VADriverContextP ctx, VASurfaceID surface,
904+ int x, int y, unsigned int width, unsigned int height, VAImageID image),
905+ (ctx, surface, x, y, width, height, image))
906+
907+DEFINE_VTABLE_ENTRY(
908+ VAStatus, PutImage,
909+ (VADriverContextP ctx, VASurfaceID surface, VAImageID image,
910+ int srcx, int srcy, unsigned int srcw, unsigned int srch,
911+ int destx, int desty, unsigned int destw, unsigned int desth),
912+ (ctx, surface, image, srcx, srcy, srcw, srch, destx, desty, destw, desth))
913+
914+DEFINE_VTABLE_ENTRY(
915+ VAStatus, QuerySubpictureFormats,
916+ (VADriverContextP ctx, VAImageFormat *format_list,
917+ unsigned int *flags, unsigned int *num_formats),
918+ (ctx, format_list, flags, num_formats))
919+
920+DEFINE_VTABLE_ENTRY(
921+ VAStatus, CreateSubpicture,
922+ (VADriverContextP ctx, VAImageID image, VASubpictureID *subpicture),
923+ (ctx, image, subpicture))
924+
925+DEFINE_VTABLE_ENTRY(
926+ VAStatus, DestroySubpicture,
927+ (VADriverContextP ctx, VASubpictureID subpicture),
928+ (ctx, subpicture))
929+
930+DEFINE_VTABLE_ENTRY(
931+ VAStatus, SetSubpictureImage,
932+ (VADriverContextP ctx, VASubpictureID subpicture, VAImageID image),
933+ (ctx, subpicture, image))
934+
935+DEFINE_VTABLE_ENTRY(
936+ VAStatus, SetSubpictureChromakey,
937+ (VADriverContextP ctx, VASubpictureID subpicture,
938+ unsigned int chromakey_min,
939+ unsigned int chromakey_max,
940+ unsigned int chromakey_mask),
941+ (ctx, subpicture, chromakey_min, chromakey_max, chromakey_mask))
942+
943+DEFINE_VTABLE_ENTRY(
944+ VAStatus, SetSubpictureGlobalAlpha,
945+ (VADriverContextP ctx, VASubpictureID subpicture, float global_alpha),
946+ (ctx, subpicture, global_alpha))
947+
948+DEFINE_VTABLE_ENTRY(
949+ VAStatus, AssociateSubpicture,
950+ (VADriverContextP ctx, VASubpictureID subpicture,
951+ VASurfaceID *target_surfaces, int num_surfaces,
952+ short srcx, short srcy, unsigned short srcw, unsigned short srch,
953+ short destx, short desty, unsigned short destw, unsigned short desth,
954+ unsigned int flags),
955+ (ctx, subpicture, target_surfaces, num_surfaces,
956+ srcx, srcy, srcw, srch, destx, desty, destw, desth, flags))
957+
958+DEFINE_VTABLE_ENTRY(
959+ VAStatus, DeassociateSubpicture,
960+ (VADriverContextP ctx, VASubpictureID subpicture,
961+ VASurfaceID *target_surfaces, int num_surfaces),
962+ (ctx, subpicture, target_surfaces, num_surfaces))
963+
964+DEFINE_VTABLE_ENTRY(
965+ VAStatus, QueryDisplayAttributes,
966+ (VADriverContextP ctx, VADisplayAttribute *attr_list, int *num_attributes),
967+ (ctx, attr_list, num_attributes))
968+
969+DEFINE_VTABLE_ENTRY(
970+ VAStatus, GetDisplayAttributes,
971+ (VADriverContextP ctx, VADisplayAttribute *attr_list, int num_attributes),
972+ (ctx, attr_list, num_attributes))
973+
974+DEFINE_VTABLE_ENTRY(
975+ VAStatus, SetDisplayAttributes,
976+ (VADriverContextP ctx, VADisplayAttribute *attr_list, int num_attributes),
977+ (ctx, attr_list, num_attributes))
978+
979+DEFINE_VTABLE_ENTRY(
980+ VAStatus, CreateSurfaceFromCIFrame,
981+ (VADriverContextP ctx, unsigned long frame_id, VASurfaceID *surface),
982+ (ctx, frame_id, surface))
983+
984+DEFINE_VTABLE_ENTRY(
985+ VAStatus, CreateSurfaceFromV4L2Buf,
986+ (VADriverContextP ctx, int v4l2_fd,
987+ struct v4l2_format *v4l2_fmt, struct v4l2_buffer *v4l2_buf,
988+ VASurfaceID *surface),
989+ (ctx, v4l2_fd, v4l2_fmt, v4l2_buf, surface))
990+
991+DEFINE_VTABLE_ENTRY(
992+ VAStatus, CopySurfaceToBuffer,
993+ (VADriverContextP ctx, VASurfaceID surface, unsigned int *fourcc,
994+ unsigned int *luma_stride,
995+ unsigned int *chroma_u_stride, unsigned int *chroma_v_stride,
996+ unsigned int *luma_offset,
997+ unsigned int *chroma_u_offset, unsigned int *chroma_v_offset,
998+ void **buffer),
999+ (ctx, surface, fourcc,
1000+ luma_stride, chroma_u_stride, chroma_v_stride,
1001+ luma_offset, chroma_u_offset, chroma_v_offset,
1002+ buffer))
1003+
1004+DEFINE_VTABLE_ENTRY_(
1005+ VAStatus, SyncSurface_pre31,
1006+ (VADriverContextP ctx, VASurfaceID render_target),
1007+ SyncSurface_pre31,
1008+ (ctx, va_context_map_lookup(COMPAT_CTX(ctx), render_target), render_target),
1009+ {}, {})
1010+
1011+DEFINE_VTABLE_ENTRY_(
1012+ VAStatus, PutImage_pre31,
1013+ (VADriverContextP ctx, VASurfaceID surface, VAImageID image,
1014+ int srcx, int srcy, unsigned int srcw, unsigned int srch,
1015+ int destx, int desty, unsigned int destw, unsigned int desth),
1016+ PutImage2_pre31,
1017+ (ctx, surface, image, srcx, srcy, srcw, srch, destx, desty, destw, desth),
1018+ {}, {})
1019+
1020+DEFINE_VTABLE_ENTRY_(
1021+ VAStatus, AssociateSubpicture_pre31,
1022+ (VADriverContextP ctx, VASubpictureID subpicture,
1023+ VASurfaceID *target_surfaces, int num_surfaces,
1024+ short srcx, short srcy, unsigned short srcw, unsigned short srch,
1025+ short destx, short desty, unsigned short destw, unsigned short desth,
1026+ unsigned int flags),
1027+ AssociateSubpicture2_pre31,
1028+ (ctx, subpicture, target_surfaces, num_surfaces,
1029+ srcx, srcy, srcw, srch, destx, desty, destw, desth, flags),
1030+ {}, {})
1031+
1032+DEFINE_VTABLE_ENTRY_(
1033+ VAStatus, CreateContext_pre31,
1034+ (VADriverContextP ctx, VAConfigID config_id,
1035+ int picture_width, int picture_height, int flag,
1036+ VASurfaceID *render_targets, int num_render_targets, VAContextID *context),
1037+ CreateContext,
1038+ (ctx, config_id, picture_width, picture_height, flag,
1039+ render_targets, num_render_targets, context),
1040+ {}, {
1041+ VACompatContextP const compat_ctx = COMPAT_CTX(ctx);
1042+ int i;
1043+ for (i = 0; i < num_render_targets; i++)
1044+ va_context_map_add(compat_ctx, *context, render_targets[i]);
1045+ })
1046+
1047+DEFINE_VTABLE_ENTRY_(
1048+ VAStatus, DestroyContext_pre31,
1049+ (VADriverContextP ctx, VAContextID context),
1050+ DestroyContext,
1051+ (ctx, context),
1052+ {}, { va_context_map_remove(COMPAT_CTX(ctx), context); })
1053+
1054+#undef DEFINE_VTABLE_ENTRY
1055+#undef DEFINE_VTABLE_ENTRY_
1056+
1057+static void va_compat_init_VADriverVTable(VADriverContextP ctx, int compat_version)
1058+{
1059+#define INIT_VTABLE_(CTX, DST_PROC, SRC_PROC) \
1060+ (CTX)->vtable.va##DST_PROC = va_compat_##SRC_PROC
1061+#define INIT_VTABLE(CTX, PROC) \
1062+ INIT_VTABLE_(CTX, PROC, PROC)
1063+
1064+ INIT_VTABLE(ctx, Terminate);
1065+ INIT_VTABLE(ctx, QueryConfigProfiles);
1066+ INIT_VTABLE(ctx, QueryConfigEntrypoints);
1067+ INIT_VTABLE(ctx, GetConfigAttributes);
1068+ INIT_VTABLE(ctx, CreateConfig);
1069+ INIT_VTABLE(ctx, DestroyConfig);
1070+ INIT_VTABLE(ctx, QueryConfigAttributes);
1071+ INIT_VTABLE(ctx, CreateSurfaces);
1072+ INIT_VTABLE(ctx, DestroySurfaces);
1073+ INIT_VTABLE(ctx, CreateContext);
1074+ INIT_VTABLE(ctx, DestroyContext);
1075+ INIT_VTABLE(ctx, CreateBuffer);
1076+ INIT_VTABLE(ctx, BufferSetNumElements);
1077+ INIT_VTABLE(ctx, MapBuffer);
1078+ INIT_VTABLE(ctx, UnmapBuffer);
1079+ INIT_VTABLE(ctx, DestroyBuffer);
1080+ INIT_VTABLE(ctx, BeginPicture);
1081+ INIT_VTABLE(ctx, RenderPicture);
1082+ INIT_VTABLE(ctx, EndPicture);
1083+ INIT_VTABLE(ctx, SyncSurface);
1084+ INIT_VTABLE(ctx, QuerySurfaceStatus);
1085+ INIT_VTABLE(ctx, PutSurface);
1086+ INIT_VTABLE(ctx, QueryImageFormats);
1087+ INIT_VTABLE(ctx, CreateImage);
1088+ INIT_VTABLE(ctx, DeriveImage);
1089+ INIT_VTABLE(ctx, DestroyImage);
1090+ INIT_VTABLE(ctx, SetImagePalette);
1091+ INIT_VTABLE(ctx, GetImage);
1092+ INIT_VTABLE(ctx, PutImage);
1093+ INIT_VTABLE(ctx, QuerySubpictureFormats);
1094+ INIT_VTABLE(ctx, CreateSubpicture);
1095+ INIT_VTABLE(ctx, DestroySubpicture);
1096+ INIT_VTABLE(ctx, SetSubpictureImage);
1097+ INIT_VTABLE(ctx, SetSubpictureChromakey);
1098+ INIT_VTABLE(ctx, SetSubpictureGlobalAlpha);
1099+ INIT_VTABLE(ctx, AssociateSubpicture);
1100+ INIT_VTABLE(ctx, DeassociateSubpicture);
1101+ INIT_VTABLE(ctx, QueryDisplayAttributes);
1102+ INIT_VTABLE(ctx, GetDisplayAttributes);
1103+ INIT_VTABLE(ctx, SetDisplayAttributes);
1104+ INIT_VTABLE(ctx, CreateSurfaceFromCIFrame);
1105+ INIT_VTABLE(ctx, CreateSurfaceFromV4L2Buf);
1106+ INIT_VTABLE(ctx, CopySurfaceToBuffer);
1107+
1108+ if (compat_version && compat_version < 31) {
1109+ INIT_VTABLE_(ctx, CreateContext, CreateContext_pre31);
1110+ INIT_VTABLE_(ctx, DestroyContext, DestroyContext_pre31);
1111+ INIT_VTABLE_(ctx, SyncSurface, SyncSurface_pre31);
1112+ INIT_VTABLE_(ctx, PutImage, PutImage_pre31);
1113+ INIT_VTABLE_(ctx, AssociateSubpicture, AssociateSubpicture_pre31);
1114+ }
1115+
1116+#undef INIT_VTABLE
1117+#undef INIT_VTABLE__
1118+}
1119+
1120+VAStatus va_compat_init(VADisplay dpy, int compat_version, void *compat_ctx)
1121+{
1122+ VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
1123+ VADriverContextP ctx = CTX(dpy);
1124+ VADriverContextP_0_29 ctx_0_29;
1125+ VADriverContextP_0_30 ctx_0_30;
1126+ VACompatContextP compat;
1127+ VAStatus status;
1128+ char *driver_name;
1129+
1130+ ctx->compat = NULL;
1131+
1132+ if (compat_version == 0)
1133+ return VA_STATUS_SUCCESS;
1134+
1135+ ASSERT(compat_ctx);
1136+ if (compat_ctx == NULL)
1137+ return VA_STATUS_ERROR_UNKNOWN;
1138+
1139+ driver_name = NULL;
1140+ status = pDisplayContext->vaGetDriverName(pDisplayContext, &driver_name);
1141+ ASSERT(status == VA_STATUS_SUCCESS);
1142+ if (status != VA_STATUS_SUCCESS)
1143+ return status;
1144+
1145+ if ((compat = malloc(sizeof(*compat))) == NULL)
1146+ return VA_STATUS_ERROR_ALLOCATION_FAILED;
1147+ compat->buffers = NULL;
1148+ compat->buffers_count_max = 0;
1149+ compat->compat_version = compat_version;
1150+ compat->compat_ctx = NULL;
1151+ compat->driver_name = driver_name;
1152+ compat->context_map = NULL;
1153+ compat->last_context_map_match = NULL;
1154+ ctx->compat = compat;
1155+
1156+ if (strcmp(driver_name, "psb") == 0)
1157+ compat->driver_id = VA_DRIVER_ID_POULSBO;
1158+ else if (strcmp(driver_name, "iegd") == 0)
1159+ compat->driver_id = VA_DRIVER_ID_IEGD;
1160+ else
1161+ compat->driver_id = VA_DRIVER_ID_UNKNOWN;
1162+
1163+ switch (compat_version) {
1164+ case 29:
1165+ if ((ctx_0_29 = malloc(sizeof(*ctx_0_29))) == NULL)
1166+ return VA_STATUS_ERROR_ALLOCATION_FAILED;
1167+ memcpy(ctx_0_29, compat_ctx, sizeof(*ctx_0_29));
1168+ va_compat_translate_VADriverContext_0_29(compat, ctx_0_29);
1169+ compat->compat_ctx = ctx_0_29;
1170+ COPY_FIELD(ctx, ctx_0_29, version_major);
1171+ COPY_FIELD(ctx, ctx_0_29, version_minor);
1172+ COPY_FIELD(ctx, ctx_0_29, max_profiles);
1173+ COPY_FIELD(ctx, ctx_0_29, max_entrypoints);
1174+ COPY_FIELD(ctx, ctx_0_29, max_attributes);
1175+ COPY_FIELD(ctx, ctx_0_29, max_image_formats);
1176+ COPY_FIELD(ctx, ctx_0_29, max_subpic_formats);
1177+ COPY_FIELD(ctx, ctx_0_29, max_display_attributes);
1178+ COPY_FIELD(ctx, ctx_0_29, str_vendor);
1179+ break;
1180+ case 30:
1181+ if ((ctx_0_30 = malloc(sizeof(*ctx_0_30))) == NULL)
1182+ return VA_STATUS_ERROR_ALLOCATION_FAILED;
1183+ memcpy(ctx_0_30, compat_ctx, sizeof(*ctx_0_30));
1184+ va_compat_translate_VADriverContext_0_30(compat, ctx_0_30);
1185+ compat->compat_ctx = ctx_0_30;
1186+ COPY_FIELD(ctx, ctx_0_30, version_major);
1187+ COPY_FIELD(ctx, ctx_0_30, version_minor);
1188+ COPY_FIELD(ctx, ctx_0_30, max_profiles);
1189+ COPY_FIELD(ctx, ctx_0_30, max_entrypoints);
1190+ COPY_FIELD(ctx, ctx_0_30, max_attributes);
1191+ COPY_FIELD(ctx, ctx_0_30, max_image_formats);
1192+ COPY_FIELD(ctx, ctx_0_30, max_subpic_formats);
1193+ COPY_FIELD(ctx, ctx_0_30, max_display_attributes);
1194+ COPY_FIELD(ctx, ctx_0_30, str_vendor);
1195+ break;
1196+ case VA_MINOR_VERSION:
1197+ va_compat_translate_VADriverContext(compat, compat_ctx);
1198+ compat->compat_ctx = compat_ctx;
1199+ break;
1200+ default:
1201+ ASSERT(compat_version == 0);
1202+ return VA_STATUS_ERROR_UNKNOWN;
1203+ }
1204+
1205+ va_compat_init_VADriverVTable(ctx, compat_version);
1206+ return VA_STATUS_SUCCESS;
1207+}
1208+
1209+VAStatus va_compat_fini(VADisplay dpy)
1210+{
1211+ VADriverContextP ctx = CTX(dpy);
1212+ VACompatContextP compat = ctx->compat;
1213+ int i;
1214+
1215+ if (compat == NULL)
1216+ return VA_STATUS_SUCCESS;
1217+
1218+ if (compat->driver_name)
1219+ {
1220+ free(compat->driver_name);
1221+ compat->driver_name = NULL;
1222+ }
1223+
1224+ if (compat->buffers)
1225+ {
1226+ for (i = 0; i < compat->buffers_count_max; i++)
1227+ {
1228+ if (compat->buffers[i].id)
1229+ va_DestroyBufferCompat(ctx, compat->buffers[i].id);
1230+ }
1231+ free(compat->buffers);
1232+ compat->buffers = NULL;
1233+ }
1234+
1235+ if (compat->compat_ctx && compat->compat_version != VA_MINOR_VERSION)
1236+ {
1237+ free(compat->compat_ctx);
1238+ compat->compat_ctx = NULL;
1239+ }
1240+
1241+ if (compat->context_map)
1242+ {
1243+ VAContextMapP d, m = compat->context_map;
1244+ while (m) {
1245+ d = m;
1246+ m = m->next;
1247+ free(d);
1248+ }
1249+ }
1250+ compat->last_context_map_match = NULL;
1251+
1252+ free(compat);
1253+ ctx->compat = NULL;
1254+ return VA_STATUS_SUCCESS;
1255+}
1256diff --git a/src/va_compat.h b/src/va_compat.h
1257new file mode 100644
1258index 0000000..2c9d801
1259--- /dev/null
1260+++ b/src/va_compat.h
1261@@ -0,0 +1,1467 @@
1262+/*
1263+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
1264+ *
1265+ * Permission is hereby granted, free of charge, to any person obtaining a
1266+ * copy of this software and associated documentation files (the
1267+ * "Software"), to deal in the Software without restriction, including
1268+ * without limitation the rights to use, copy, modify, merge, publish,
1269+ * distribute, sub license, and/or sell copies of the Software, and to
1270+ * permit persons to whom the Software is furnished to do so, subject to
1271+ * the following conditions:
1272+ *
1273+ * The above copyright notice and this permission notice (including the
1274+ * next paragraph) shall be included in all copies or substantial portions
1275+ * of the Software.
1276+ *
1277+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1278+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1279+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
1280+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
1281+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
1282+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
1283+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1284+ */
1285+
1286+#ifndef VA_COMPAT_H
1287+#define VA_COMPAT_H
1288+
1289+VAStatus va_compat_init(VADisplay dpy, int compat_version, void *compat_ctx);
1290+VAStatus va_compat_fini(VADisplay dpy);
1291+
1292+/* H.264 Picture (0.29) */
1293+typedef struct _VAPictureH264_0_29
1294+{
1295+ VASurfaceID picture_id;
1296+ unsigned int flags;
1297+ unsigned int TopFieldOrderCnt;
1298+ unsigned int BottomFieldOrderCnt;
1299+} VAPictureH264_0_29;
1300+
1301+/* H.264 Picture Parameter Buffer (0.29) */
1302+typedef struct _VAPictureParameterBufferH264_0_29
1303+{
1304+ VAPictureH264_0_29 CurrPic;
1305+ VAPictureH264_0_29 ReferenceFrames[16]; /* in DPB */
1306+ unsigned short picture_width_in_mbs_minus1;
1307+ unsigned short picture_height_in_mbs_minus1;
1308+ unsigned char bit_depth_luma_minus8;
1309+ unsigned char bit_depth_chroma_minus8;
1310+ unsigned char num_ref_frames;
1311+ union {
1312+ struct {
1313+ unsigned char chroma_format_idc : 2;
1314+ unsigned char residual_colour_transform_flag : 1;
1315+ unsigned char frame_mbs_only_flag : 1;
1316+ unsigned char mb_adaptive_frame_field_flag : 1;
1317+ unsigned char direct_8x8_inference_flag : 1;
1318+ unsigned char MinLumaBiPredSize8x8 : 1; /* see A.3.3.2 */
1319+ };
1320+ unsigned char seq_fields;
1321+ };
1322+ unsigned char num_slice_groups_minus1;
1323+ unsigned char slice_group_map_type;
1324+ signed char pic_init_qp_minus26;
1325+ signed char chroma_qp_index_offset;
1326+ signed char second_chroma_qp_index_offset;
1327+ union {
1328+ struct {
1329+ unsigned char entropy_coding_mode_flag : 1;
1330+ unsigned char weighted_pred_flag : 1;
1331+ unsigned char weighted_bipred_idc : 2;
1332+ unsigned char transform_8x8_mode_flag : 1;
1333+ unsigned char field_pic_flag : 1;
1334+ unsigned char constrained_intra_pred_flag : 1;
1335+ };
1336+ unsigned char pic_fields;
1337+ };
1338+ unsigned short frame_num;
1339+} VAPictureParameterBufferH264_0_29;
1340+
1341+/* H.264 Slice Parameter Buffer (0.29) */
1342+typedef struct _VASliceParameterBufferH264_0_29
1343+{
1344+ unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
1345+ unsigned int slice_data_offset;/* the offset to the NAL start code for this slice */
1346+ unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
1347+ unsigned short slice_data_bit_offset; /* bit offset from NAL start code to the beginning of slice data */
1348+ unsigned short first_mb_in_slice;
1349+ unsigned char slice_type;
1350+ unsigned char direct_spatial_mv_pred_flag;
1351+ unsigned char num_ref_idx_l0_active_minus1;
1352+ unsigned char num_ref_idx_l1_active_minus1;
1353+ unsigned char cabac_init_idc;
1354+ char slice_qp_delta;
1355+ unsigned char disable_deblocking_filter_idc;
1356+ char slice_alpha_c0_offset_div2;
1357+ char slice_beta_offset_div2;
1358+ VAPictureH264_0_29 RefPicList0[32]; /* See 8.2.4.2 */
1359+ VAPictureH264_0_29 RefPicList1[32]; /* See 8.2.4.2 */
1360+ unsigned char luma_log2_weight_denom;
1361+ unsigned char chroma_log2_weight_denom;
1362+ unsigned char luma_weight_l0_flag;
1363+ short luma_weight_l0[32];
1364+ short luma_offset_l0[32];
1365+ unsigned char chroma_weight_l0_flag;
1366+ short chroma_weight_l0[32][2];
1367+ short chroma_offset_l0[32][2];
1368+ unsigned char luma_weight_l1_flag;
1369+ short luma_weight_l1[32];
1370+ short luma_offset_l1[32];
1371+ unsigned char chroma_weight_l1_flag;
1372+ short chroma_weight_l1[32][2];
1373+ short chroma_offset_l1[32][2];
1374+} VASliceParameterBufferH264_0_29;
1375+
1376+/* VC-1 Picture Parameter Buffer (0.29) */
1377+typedef struct _VAPictureParameterBufferVC1_0_29
1378+{
1379+ VASurfaceID forward_reference_picture;
1380+ VASurfaceID backward_reference_picture;
1381+ /* if out-of-loop post-processing is done on the render
1382+ target, then we need to keep the in-loop decoded
1383+ picture as a reference picture */
1384+ VASurfaceID inloop_decoded_picture;
1385+
1386+ /* sequence layer for AP or meta data for SP and MP */
1387+ union {
1388+ struct {
1389+ unsigned char interlace : 1; /* SEQUENCE_LAYER::INTERLACE */
1390+ unsigned char syncmarker : 1;/* METADATA::SYNCMARKER */
1391+ unsigned char overlap : 1;/* METADATA::OVERLAP */
1392+ };
1393+ unsigned char sequence_fields;
1394+ };
1395+
1396+ unsigned short coded_width; /* ENTRY_POINT_LAYER::CODED_WIDTH */
1397+ unsigned short coded_height; /* ENTRY_POINT_LAYER::CODED_HEIGHT */
1398+ unsigned char closed_entry; /* ENTRY_POINT_LAYER::CLOSED_ENTRY */
1399+ unsigned char broken_link; /* ENTRY_POINT_LAYER::BROKEN_LINK */
1400+ unsigned char loopfilter; /* ENTRY_POINT_LAYER::LOOPFILTER */
1401+ unsigned char conditional_overlap_flag; /* ENTRY_POINT_LAYER::CONDOVER */
1402+ unsigned char fast_uvmc_flag; /* ENTRY_POINT_LAYER::FASTUVMC */
1403+ union {
1404+ struct {
1405+ unsigned char range_mapping_luma_flag: 1; /* ENTRY_POINT_LAYER::RANGE_MAPY_FLAG */
1406+ unsigned char range_mapping_luma: 3; /* ENTRY_POINT_LAYER::RANGE_MAPY */
1407+ unsigned char range_mapping_chroma_flag: 1; /* ENTRY_POINT_LAYER::RANGE_MAPUV_FLAG */
1408+ unsigned char range_mapping_chroma: 3; /* ENTRY_POINT_LAYER::RANGE_MAPUV */
1409+ };
1410+ unsigned char range_mapping_fields;
1411+ };
1412+
1413+ unsigned char b_picture_fraction; /* PICTURE_LAYER::BFRACTION */
1414+ unsigned char cbp_table; /* PICTURE_LAYER::CBPTAB/ICBPTAB */
1415+ unsigned char mb_mode_table; /* PICTURE_LAYER::MBMODETAB */
1416+ unsigned char range_reduction_frame;/* PICTURE_LAYER::RANGEREDFRM */
1417+ unsigned char rounding_control; /* PICTURE_LAYER::RNDCTRL */
1418+ unsigned char post_processing; /* PICTURE_LAYER::POSTPROC */
1419+ unsigned char picture_resolution_index; /* PICTURE_LAYER::RESPIC */
1420+ unsigned char luma_scale; /* PICTURE_LAYER::LUMSCALE */
1421+ unsigned char luma_shift; /* PICTURE_LAYER::LUMSHIFT */
1422+ union {
1423+ struct {
1424+ unsigned char picture_type : 2; /* PICTURE_LAYER::PTYPE */
1425+ unsigned char frame_coding_mode : 3;/* PICTURE_LAYER::FCM */
1426+ unsigned char top_field_first : 1;/* PICTURE_LAYER::TFF */
1427+ unsigned char is_first_field : 1; /* set to 1 if it is the first field */
1428+ unsigned char intensity_compensation: 1;/* PICTURE_LAYER::INTCOMP */
1429+ };
1430+ unsigned char picture_fields;
1431+ };
1432+ union {
1433+ struct {
1434+ unsigned char mv_type_mb : 1; /* PICTURE::MVTYPEMB */
1435+ unsigned char direct_mb : 1; /* PICTURE::DIRECTMB */
1436+ unsigned char skip_mb : 1; /* PICTURE::SKIPMB */
1437+ unsigned char field_tx : 1; /* PICTURE::FIELDTX */
1438+ unsigned char forward_mb : 1; /* PICTURE::FORWARDMB */
1439+ unsigned char ac_pred : 1; /* PICTURE::ACPRED */
1440+ unsigned char overflags : 1; /* PICTURE::OVERFLAGS */
1441+ };
1442+ unsigned char raw_coding_flag;
1443+ };
1444+ union {
1445+ struct {
1446+ unsigned char bp_mv_type_mb : 1; /* PICTURE::MVTYPEMB */
1447+ unsigned char bp_direct_mb : 1; /* PICTURE::DIRECTMB */
1448+ unsigned char bp_skip_mb : 1; /* PICTURE::SKIPMB */
1449+ unsigned char bp_field_tx : 1; /* PICTURE::FIELDTX */
1450+ unsigned char bp_forward_mb : 1; /* PICTURE::FORWARDMB */
1451+ unsigned char bp_ac_pred : 1; /* PICTURE::ACPRED */
1452+ unsigned char bp_overflags : 1; /* PICTURE::OVERFLAGS */
1453+ };
1454+ unsigned char bitplane_present_flag; /* signal what bitplane is being passed via the bitplane buffer */
1455+ };
1456+ union {
1457+ struct {
1458+ unsigned char reference_distance_flag : 1;/* PICTURE_LAYER::REFDIST_FLAG */
1459+ unsigned char reference_distance : 5;/* PICTURE_LAYER::REFDIST */
1460+ unsigned char num_reference_pictures: 1;/* PICTURE_LAYER::NUMREF */
1461+ unsigned char reference_field_pic_indicator : 1;/* PICTURE_LAYER::REFFIELD */
1462+ };
1463+ unsigned short reference_fields;
1464+ };
1465+ union {
1466+ struct {
1467+ VAMvModeVC1 mv_mode : 3; /* PICTURE_LAYER::MVMODE */
1468+ VAMvModeVC1 mv_mode2 : 3; /* PICTURE_LAYER::MVMODE2 */
1469+ unsigned char mv_table : 3; /* PICTURE_LAYER::MVTAB/IMVTAB */
1470+ unsigned char two_mv_block_pattern_table: 2; /* PICTURE_LAYER::2MVBPTAB */
1471+ unsigned char four_mv_switch : 1; /* PICTURE_LAYER::4MVSWITCH */
1472+ unsigned char four_mv_block_pattern_table : 2; /* PICTURE_LAYER::4MVBPTAB */
1473+ unsigned char extended_mv_flag : 1; /* ENTRY_POINT_LAYER::EXTENDED_MV */
1474+ unsigned char extended_mv_range : 2; /* PICTURE_LAYER::MVRANGE */
1475+ unsigned char extended_dmv_flag : 1; /* ENTRY_POINT_LAYER::EXTENDED_DMV */
1476+ unsigned char extended_dmv_range : 2; /* PICTURE_LAYER::DMVRANGE */
1477+ };
1478+ unsigned int mv_fields;
1479+ };
1480+ union {
1481+ struct {
1482+ unsigned char dquant : 2; /* ENTRY_POINT_LAYER::DQUANT */
1483+ unsigned char quantizer : 2; /* ENTRY_POINT_LAYER::QUANTIZER */
1484+ unsigned char half_qp : 1; /* PICTURE_LAYER::HALFQP */
1485+ unsigned char pic_quantizer_scale : 5;/* PICTURE_LAYER::PQUANT */
1486+ unsigned char pic_quantizer_type : 1;/* PICTURE_LAYER::PQUANTIZER */
1487+ unsigned char dq_frame : 1; /* VOPDQUANT::DQUANTFRM */
1488+ unsigned char dq_profile : 2; /* VOPDQUANT::DQPROFILE */
1489+ unsigned char dq_sb_edge : 2; /* VOPDQUANT::DQSBEDGE */
1490+ unsigned char dq_db_edge : 2; /* VOPDQUANT::DQDBEDGE */
1491+ unsigned char dq_binary_level : 1; /* VOPDQUANT::DQBILEVEL */
1492+ unsigned char alt_pic_quantizer : 5;/* VOPDQUANT::ALTPQUANT */
1493+ };
1494+ unsigned long pic_quantizer_fields;
1495+ };
1496+ union {
1497+ struct {
1498+ unsigned char variable_sized_transform_flag : 1;/* ENTRY_POINT_LAYER::VSTRANSFORM */
1499+ unsigned char mb_level_transform_type_flag : 1;/* PICTURE_LAYER::TTMBF */
1500+ unsigned char frame_level_transform_type : 2;/* PICTURE_LAYER::TTFRM */
1501+ unsigned char transform_ac_codingset_idx1 : 2;/* PICTURE_LAYER::TRANSACFRM */
1502+ unsigned char transform_ac_codingset_idx2 : 2;/* PICTURE_LAYER::TRANSACFRM2 */
1503+ unsigned char intra_transform_dc_table : 1;/* PICTURE_LAYER::TRANSDCTAB */
1504+ };
1505+ unsigned short transform_fields;
1506+ };
1507+} VAPictureParameterBufferVC1_0_29;
1508+
1509+/* MPEG-2 Picture Parameter Buffer (0.29) */
1510+typedef struct _VAPictureParameterBufferMPEG2_0_29
1511+{
1512+ unsigned short horizontal_size;
1513+ unsigned short vertical_size;
1514+ VASurfaceID forward_reference_picture;
1515+ VASurfaceID backward_reference_picture;
1516+ /* meanings of the following fields are the same as in the standard */
1517+ int picture_coding_type;
1518+ int f_code; /* pack all four fcode into this */
1519+ union {
1520+ struct {
1521+ unsigned char intra_dc_precision : 2;
1522+ unsigned char picture_structure : 2;
1523+ unsigned char top_field_first : 1;
1524+ unsigned char frame_pred_frame_dct : 1;
1525+ unsigned char concealment_motion_vectors : 1;
1526+ unsigned char q_scale_type : 1;
1527+ unsigned char intra_vlc_format : 1;
1528+ unsigned char alternate_scan : 1;
1529+ unsigned char repeat_first_field : 1;
1530+ unsigned char progressive_frame : 1;
1531+ unsigned char is_first_field : 1; /* indicate whether the current field
1532+ * is the first field for field picture
1533+ */
1534+ };
1535+ unsigned int picture_coding_extension;
1536+ };
1537+} VAPictureParameterBufferMPEG2_0_29;
1538+
1539+/* MPEG-2 Slice Parameter Buffer (0.29) */
1540+typedef struct _VASliceParameterBufferMPEG2_0_29
1541+{
1542+ unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
1543+ unsigned int slice_data_offset;/* the offset to the first byte of slice data */
1544+ unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
1545+ unsigned int macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */
1546+ unsigned int slice_vertical_position;
1547+ int quantiser_scale_code;
1548+ int intra_slice_flag;
1549+} VASliceParameterBufferMPEG2_0_29;
1550+
1551+/* MPEG-4 Picture Parameter Buffer (0.29) */
1552+typedef struct _VAPictureParameterBufferMPEG4_0_29
1553+{
1554+ unsigned short vop_width;
1555+ unsigned short vop_height;
1556+ VASurfaceID forward_reference_picture;
1557+ VASurfaceID backward_reference_picture;
1558+ union {
1559+ struct {
1560+ unsigned char short_video_header : 1;
1561+ unsigned char chroma_format : 2;
1562+ unsigned char interlaced : 1;
1563+ unsigned char obmc_disable : 1;
1564+ unsigned char sprite_enable : 2;
1565+ unsigned char sprite_warping_accuracy : 2;
1566+ unsigned char quant_type : 1;
1567+ unsigned char quarter_sample : 1;
1568+ unsigned char data_partitioned : 1;
1569+ unsigned char reversible_vlc : 1;
1570+ };
1571+ unsigned short vol_fields;
1572+ };
1573+ unsigned char no_of_sprite_warping_points;
1574+ short sprite_trajectory_du[3];
1575+ short sprite_trajectory_dv[3];
1576+ unsigned char quant_precision;
1577+ union {
1578+ struct {
1579+ unsigned char vop_coding_type : 2;
1580+ unsigned char backward_reference_vop_coding_type : 2;
1581+ unsigned char vop_rounding_type : 1;
1582+ unsigned char intra_dc_vlc_thr : 3;
1583+ unsigned char top_field_first : 1;
1584+ unsigned char alternate_vertical_scan_flag : 1;
1585+ };
1586+ unsigned short vop_fields;
1587+ };
1588+ unsigned char vop_fcode_forward;
1589+ unsigned char vop_fcode_backward;
1590+ /* short header related */
1591+ unsigned char num_gobs_in_vop;
1592+ unsigned char num_macroblocks_in_gob;
1593+ /* for direct mode prediction */
1594+ short TRB;
1595+ short TRD;
1596+} VAPictureParameterBufferMPEG4_0_29;
1597+
1598+/* H.264 Picture (0.30) */
1599+typedef struct _VAPictureH264_0_30
1600+{
1601+ VASurfaceID picture_id;
1602+ unsigned int flags;
1603+ unsigned int TopFieldOrderCnt;
1604+ unsigned int BottomFieldOrderCnt;
1605+} VAPictureH264_0_30;
1606+
1607+/* H.264 Picture Parameter Buffer (0.30) */
1608+typedef struct _VAPictureParameterBufferH264_0_30
1609+{
1610+ VAPictureH264 CurrPic;
1611+ VAPictureH264 ReferenceFrames[16]; /* in DPB */
1612+ unsigned short picture_width_in_mbs_minus1;
1613+ unsigned short picture_height_in_mbs_minus1;
1614+ unsigned char bit_depth_luma_minus8;
1615+ unsigned char bit_depth_chroma_minus8;
1616+ unsigned char num_ref_frames;
1617+ union {
1618+ struct {
1619+ unsigned char chroma_format_idc : 2;
1620+ unsigned char residual_colour_transform_flag : 1;
1621+ unsigned char frame_mbs_only_flag : 1;
1622+ unsigned char mb_adaptive_frame_field_flag : 1;
1623+ unsigned char direct_8x8_inference_flag : 1;
1624+ unsigned char MinLumaBiPredSize8x8 : 1; /* see A.3.3.2 */
1625+ } bits;
1626+ unsigned char value;
1627+ } seq_fields;
1628+ unsigned char num_slice_groups_minus1;
1629+ unsigned char slice_group_map_type;
1630+ signed char pic_init_qp_minus26;
1631+ signed char chroma_qp_index_offset;
1632+ signed char second_chroma_qp_index_offset;
1633+ union {
1634+ struct {
1635+ unsigned char entropy_coding_mode_flag : 1;
1636+ unsigned char weighted_pred_flag : 1;
1637+ unsigned char weighted_bipred_idc : 2;
1638+ unsigned char transform_8x8_mode_flag : 1;
1639+ unsigned char field_pic_flag : 1;
1640+ unsigned char constrained_intra_pred_flag : 1;
1641+ } bits;
1642+ unsigned char value;
1643+ } pic_fields;
1644+ unsigned short frame_num;
1645+} VAPictureParameterBufferH264_0_30;
1646+
1647+/* H.264 Slice Parameter Buffer (0.30) */
1648+typedef struct _VASliceParameterBufferH264_0_30
1649+{
1650+ unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
1651+ unsigned int slice_data_offset;/* the offset to the NAL start code for this slice */
1652+ unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
1653+ unsigned short slice_data_bit_offset; /* bit offset from NAL start code to the beginning of slice data */
1654+ unsigned short first_mb_in_slice;
1655+ unsigned char slice_type;
1656+ unsigned char direct_spatial_mv_pred_flag;
1657+ unsigned char num_ref_idx_l0_active_minus1;
1658+ unsigned char num_ref_idx_l1_active_minus1;
1659+ unsigned char cabac_init_idc;
1660+ char slice_qp_delta;
1661+ unsigned char disable_deblocking_filter_idc;
1662+ char slice_alpha_c0_offset_div2;
1663+ char slice_beta_offset_div2;
1664+ VAPictureH264 RefPicList0[32]; /* See 8.2.4.2 */
1665+ VAPictureH264 RefPicList1[32]; /* See 8.2.4.2 */
1666+ unsigned char luma_log2_weight_denom;
1667+ unsigned char chroma_log2_weight_denom;
1668+ unsigned char luma_weight_l0_flag;
1669+ short luma_weight_l0[32];
1670+ short luma_offset_l0[32];
1671+ unsigned char chroma_weight_l0_flag;
1672+ short chroma_weight_l0[32][2];
1673+ short chroma_offset_l0[32][2];
1674+ unsigned char luma_weight_l1_flag;
1675+ short luma_weight_l1[32];
1676+ short luma_offset_l1[32];
1677+ unsigned char chroma_weight_l1_flag;
1678+ short chroma_weight_l1[32][2];
1679+ short chroma_offset_l1[32][2];
1680+} VASliceParameterBufferH264_0_30;
1681+
1682+/* VC-1 Picture Parameter Buffer (0.30) */
1683+typedef struct _VAPictureParameterBufferVC1_0_30
1684+{
1685+ VASurfaceID forward_reference_picture;
1686+ VASurfaceID backward_reference_picture;
1687+ /* if out-of-loop post-processing is done on the render
1688+ target, then we need to keep the in-loop decoded
1689+ picture as a reference picture */
1690+ VASurfaceID inloop_decoded_picture;
1691+
1692+ /* sequence layer for AP or meta data for SP and MP */
1693+ union {
1694+ struct {
1695+ unsigned char interlace : 1; /* SEQUENCE_LAYER::INTERLACE */
1696+ unsigned char syncmarker : 1;/* METADATA::SYNCMARKER */
1697+ unsigned char overlap : 1;/* METADATA::OVERLAP */
1698+ } bits;
1699+ unsigned char value;
1700+ } sequence_fields;
1701+
1702+ unsigned short coded_width; /* ENTRY_POINT_LAYER::CODED_WIDTH */
1703+ unsigned short coded_height; /* ENTRY_POINT_LAYER::CODED_HEIGHT */
1704+ unsigned char closed_entry; /* ENTRY_POINT_LAYER::CLOSED_ENTRY */
1705+ unsigned char broken_link; /* ENTRY_POINT_LAYER::BROKEN_LINK */
1706+ unsigned char loopfilter; /* ENTRY_POINT_LAYER::LOOPFILTER */
1707+ unsigned char conditional_overlap_flag; /* ENTRY_POINT_LAYER::CONDOVER */
1708+ unsigned char fast_uvmc_flag; /* ENTRY_POINT_LAYER::FASTUVMC */
1709+ union {
1710+ struct {
1711+ unsigned char luma_flag : 1; /* ENTRY_POINT_LAYER::RANGE_MAPY_FLAG */
1712+ unsigned char luma : 3; /* ENTRY_POINT_LAYER::RANGE_MAPY */
1713+ unsigned char chroma_flag : 1; /* ENTRY_POINT_LAYER::RANGE_MAPUV_FLAG */
1714+ unsigned char chroma : 3; /* ENTRY_POINT_LAYER::RANGE_MAPUV */
1715+ } bits;
1716+ unsigned char value;
1717+ } range_mapping_fields;
1718+
1719+ unsigned char b_picture_fraction; /* PICTURE_LAYER::BFRACTION */
1720+ unsigned char cbp_table; /* PICTURE_LAYER::CBPTAB/ICBPTAB */
1721+ unsigned char mb_mode_table; /* PICTURE_LAYER::MBMODETAB */
1722+ unsigned char range_reduction_frame;/* PICTURE_LAYER::RANGEREDFRM */
1723+ unsigned char rounding_control; /* PICTURE_LAYER::RNDCTRL */
1724+ unsigned char post_processing; /* PICTURE_LAYER::POSTPROC */
1725+ unsigned char picture_resolution_index; /* PICTURE_LAYER::RESPIC */
1726+ unsigned char luma_scale; /* PICTURE_LAYER::LUMSCALE */
1727+ unsigned char luma_shift; /* PICTURE_LAYER::LUMSHIFT */
1728+ union {
1729+ struct {
1730+ unsigned char picture_type : 2; /* PICTURE_LAYER::PTYPE */
1731+ unsigned char frame_coding_mode : 3; /* PICTURE_LAYER::FCM */
1732+ unsigned char top_field_first : 1; /* PICTURE_LAYER::TFF */
1733+ unsigned char is_first_field : 1; /* set to 1 if it is the first field */
1734+ unsigned char intensity_compensation : 1; /* PICTURE_LAYER::INTCOMP */
1735+ } bits;
1736+ unsigned char value;
1737+ } picture_fields;
1738+ union {
1739+ struct {
1740+ unsigned char mv_type_mb : 1; /* PICTURE::MVTYPEMB */
1741+ unsigned char direct_mb : 1; /* PICTURE::DIRECTMB */
1742+ unsigned char skip_mb : 1; /* PICTURE::SKIPMB */
1743+ unsigned char field_tx : 1; /* PICTURE::FIELDTX */
1744+ unsigned char forward_mb : 1; /* PICTURE::FORWARDMB */
1745+ unsigned char ac_pred : 1; /* PICTURE::ACPRED */
1746+ unsigned char overflags : 1; /* PICTURE::OVERFLAGS */
1747+ } flags;
1748+ unsigned char value;
1749+ } raw_coding;
1750+ union {
1751+ struct {
1752+ unsigned char bp_mv_type_mb : 1; /* PICTURE::MVTYPEMB */
1753+ unsigned char bp_direct_mb : 1; /* PICTURE::DIRECTMB */
1754+ unsigned char bp_skip_mb : 1; /* PICTURE::SKIPMB */
1755+ unsigned char bp_field_tx : 1; /* PICTURE::FIELDTX */
1756+ unsigned char bp_forward_mb : 1; /* PICTURE::FORWARDMB */
1757+ unsigned char bp_ac_pred : 1; /* PICTURE::ACPRED */
1758+ unsigned char bp_overflags : 1; /* PICTURE::OVERFLAGS */
1759+ } flags;
1760+ unsigned char value;
1761+ } bitplane_present; /* signal what bitplane is being passed via the bitplane buffer */
1762+ union {
1763+ struct {
1764+ unsigned char reference_distance_flag : 1;/* PICTURE_LAYER::REFDIST_FLAG */
1765+ unsigned char reference_distance : 5;/* PICTURE_LAYER::REFDIST */
1766+ unsigned char num_reference_pictures: 1;/* PICTURE_LAYER::NUMREF */
1767+ unsigned char reference_field_pic_indicator : 1;/* PICTURE_LAYER::REFFIELD */
1768+ } bits;
1769+ unsigned short value;
1770+ } reference_fields;
1771+ union {
1772+ struct {
1773+ unsigned char mv_mode : 3; /* PICTURE_LAYER::MVMODE */
1774+ unsigned char mv_mode2 : 3; /* PICTURE_LAYER::MVMODE2 */
1775+ unsigned char mv_table : 3; /* PICTURE_LAYER::MVTAB/IMVTAB */
1776+ unsigned char two_mv_block_pattern_table: 2; /* PICTURE_LAYER::2MVBPTAB */
1777+ unsigned char four_mv_switch : 1; /* PICTURE_LAYER::4MVSWITCH */
1778+ unsigned char four_mv_block_pattern_table : 2; /* PICTURE_LAYER::4MVBPTAB */
1779+ unsigned char extended_mv_flag : 1; /* ENTRY_POINT_LAYER::EXTENDED_MV */
1780+ unsigned char extended_mv_range : 2; /* PICTURE_LAYER::MVRANGE */
1781+ unsigned char extended_dmv_flag : 1; /* ENTRY_POCHAR_LAYER::EXTENDED_DMV */
1782+ unsigned char extended_dmv_range : 2; /* PICTURE_LAYER::DMVRANGE */
1783+ } bits;
1784+ unsigned int value;
1785+ } mv_fields;
1786+ union {
1787+ struct {
1788+ unsigned char dquant : 2; /* ENTRY_POINT_LAYER::DQUANT */
1789+ unsigned char quantizer : 2; /* ENTRY_POINT_LAYER::QUANTIZER */
1790+ unsigned char half_qp : 1; /* PICTURE_LAYER::HALFQP */
1791+ unsigned char pic_quantizer_scale : 5;/* PICTURE_LAYER::PQUANT */
1792+ unsigned char pic_quantizer_type : 1;/* PICTURE_LAYER::PQUANTIZER */
1793+ unsigned char dq_frame : 1; /* VOPDQUANT::DQUANTFRM */
1794+ unsigned char dq_profile : 2; /* VOPDQUANT::DQPROFILE */
1795+ unsigned char dq_sb_edge : 2; /* VOPDQUANT::DQSBEDGE */
1796+ unsigned char dq_db_edge : 2; /* VOPDQUANT::DQDBEDGE */
1797+ unsigned char dq_binary_level : 1; /* VOPDQUANT::DQBILEVEL */
1798+ unsigned char alt_pic_quantizer : 5;/* VOPDQUANT::ALTPQUANT */
1799+ } bits;
1800+ unsigned long value;
1801+ } pic_quantizer_fields;
1802+ union {
1803+ struct {
1804+ unsigned char variable_sized_transform_flag : 1;/* ENTRY_POINT_LAYER::VSTRANSFORM */
1805+ unsigned char mb_level_transform_type_flag : 1;/* PICTURE_LAYER::TTMBF */
1806+ unsigned char frame_level_transform_type : 2;/* PICTURE_LAYER::TTFRM */
1807+ unsigned char transform_ac_codingset_idx1 : 2;/* PICTURE_LAYER::TRANSACFRM */
1808+ unsigned char transform_ac_codingset_idx2 : 2;/* PICTURE_LAYER::TRANSACFRM2 */
1809+ unsigned char intra_transform_dc_table : 1;/* PICTURE_LAYER::TRANSDCTAB */
1810+ } bits;
1811+ unsigned short value;
1812+ } transform_fields;
1813+} VAPictureParameterBufferVC1_0_30;
1814+
1815+/* MPEG-2 Picture Parameter Buffer (0.30) */
1816+typedef struct _VAPictureParameterBufferMPEG2_0_30
1817+{
1818+ unsigned short horizontal_size;
1819+ unsigned short vertical_size;
1820+ VASurfaceID forward_reference_picture;
1821+ VASurfaceID backward_reference_picture;
1822+ /* meanings of the following fields are the same as in the standard */
1823+ int picture_coding_type;
1824+ int f_code; /* pack all four fcode into this */
1825+ union {
1826+ struct {
1827+ unsigned int intra_dc_precision : 2;
1828+ unsigned int picture_structure : 2;
1829+ unsigned int top_field_first : 1;
1830+ unsigned int frame_pred_frame_dct : 1;
1831+ unsigned int concealment_motion_vectors : 1;
1832+ unsigned int q_scale_type : 1;
1833+ unsigned int intra_vlc_format : 1;
1834+ unsigned int alternate_scan : 1;
1835+ unsigned int repeat_first_field : 1;
1836+ unsigned int progressive_frame : 1;
1837+ unsigned int is_first_field : 1; /* indicate whether the current field
1838+ * is the first field for field picture
1839+ */
1840+ } bits;
1841+ unsigned int value;
1842+ } picture_coding_extension;
1843+} VAPictureParameterBufferMPEG2_0_30;
1844+
1845+/* MPEG-2 Slice Parameter Buffer (0.29) */
1846+typedef VASliceParameterBufferMPEG2_0_29 VASliceParameterBufferMPEG2_0_30;
1847+
1848+/* MPEG-4 Picture Parameter Buffer (0.30) */
1849+typedef struct _VAPictureParameterBufferMPEG4_0_30
1850+{
1851+ unsigned short vop_width;
1852+ unsigned short vop_height;
1853+ VASurfaceID forward_reference_picture;
1854+ VASurfaceID backward_reference_picture;
1855+ union {
1856+ struct {
1857+ unsigned char short_video_header : 1;
1858+ unsigned char chroma_format : 2;
1859+ unsigned char interlaced : 1;
1860+ unsigned char obmc_disable : 1;
1861+ unsigned char sprite_enable : 2;
1862+ unsigned char sprite_warping_accuracy : 2;
1863+ unsigned char quant_type : 1;
1864+ unsigned char quarter_sample : 1;
1865+ unsigned char data_partitioned : 1;
1866+ unsigned char reversible_vlc : 1;
1867+ } bits;
1868+ unsigned short value;
1869+ } vol_fields;
1870+ unsigned char no_of_sprite_warping_points;
1871+ short sprite_trajectory_du[3];
1872+ short sprite_trajectory_dv[3];
1873+ unsigned char quant_precision;
1874+ union {
1875+ struct {
1876+ unsigned char vop_coding_type : 2;
1877+ unsigned char backward_reference_vop_coding_type : 2;
1878+ unsigned char vop_rounding_type : 1;
1879+ unsigned char intra_dc_vlc_thr : 3;
1880+ unsigned char top_field_first : 1;
1881+ unsigned char alternate_vertical_scan_flag : 1;
1882+ } bits;
1883+ unsigned short value;
1884+ } vop_fields;
1885+ unsigned char vop_fcode_forward;
1886+ unsigned char vop_fcode_backward;
1887+ /* short header related */
1888+ unsigned char num_gobs_in_vop;
1889+ unsigned char num_macroblocks_in_gob;
1890+ /* for direct mode prediction */
1891+ short TRB;
1892+ short TRD;
1893+} VAPictureParameterBufferMPEG4_0_30;
1894+
1895+/* Encode Slice Parameter Buffer (0.30) */
1896+typedef struct _VAEncSliceParameterBuffer_0_30
1897+{
1898+ unsigned int start_row_number; /* starting MB row number for this slice */
1899+ unsigned int slice_height; /* slice height measured in MB */
1900+ union {
1901+ struct {
1902+ unsigned char is_intra : 1;
1903+ unsigned char disable_deblocking_filter_idc : 2;
1904+ } bits;
1905+ unsigned char value;
1906+ } slice_flags;
1907+} VAEncSliceParameterBuffer_0_30;
1908+
1909+/* MPEG-4 Picture Parameter Buffer (0.31) */
1910+typedef struct _VAPictureParameterBufferMPEG4_0_31
1911+{
1912+ unsigned short vop_width;
1913+ unsigned short vop_height;
1914+ VASurfaceID forward_reference_picture;
1915+ VASurfaceID backward_reference_picture;
1916+ union {
1917+ struct {
1918+ unsigned int short_video_header : 1;
1919+ unsigned int chroma_format : 2;
1920+ unsigned int interlaced : 1;
1921+ unsigned int obmc_disable : 1;
1922+ unsigned int sprite_enable : 2;
1923+ unsigned int sprite_warping_accuracy : 2;
1924+ unsigned int quant_type : 1;
1925+ unsigned int quarter_sample : 1;
1926+ unsigned int data_partitioned : 1;
1927+ unsigned int reversible_vlc : 1;
1928+ } bits;
1929+ unsigned int value;
1930+ } vol_fields;
1931+ unsigned char no_of_sprite_warping_points;
1932+ short sprite_trajectory_du[3];
1933+ short sprite_trajectory_dv[3];
1934+ unsigned char quant_precision;
1935+ union {
1936+ struct {
1937+ unsigned int vop_coding_type : 2;
1938+ unsigned int backward_reference_vop_coding_type : 2;
1939+ unsigned int vop_rounding_type : 1;
1940+ unsigned int intra_dc_vlc_thr : 3;
1941+ unsigned int top_field_first : 1;
1942+ unsigned int alternate_vertical_scan_flag : 1;
1943+ } bits;
1944+ unsigned int value;
1945+ } vop_fields;
1946+ unsigned char vop_fcode_forward;
1947+ unsigned char vop_fcode_backward;
1948+ /* short header related */
1949+ unsigned char num_gobs_in_vop;
1950+ unsigned char num_macroblocks_in_gob;
1951+ /* for direct mode prediction */
1952+ short TRB;
1953+ short TRD;
1954+} VAPictureParameterBufferMPEG4_0_31;
1955+
1956+typedef struct VADriverContext_0_29 *VADriverContextP_0_29;
1957+
1958+/* Driver VTable (0.29) */
1959+struct VADriverVTable_0_29
1960+{
1961+ VAStatus (*vaTerminate) ( VADriverContextP_0_29 ctx );
1962+
1963+ VAStatus (*vaQueryConfigProfiles) (
1964+ VADriverContextP_0_29 ctx,
1965+ VAProfile *profile_list, /* out */
1966+ int *num_profiles /* out */
1967+ );
1968+
1969+ VAStatus (*vaQueryConfigEntrypoints) (
1970+ VADriverContextP_0_29 ctx,
1971+ VAProfile profile,
1972+ VAEntrypoint *entrypoint_list, /* out */
1973+ int *num_entrypoints /* out */
1974+ );
1975+
1976+ VAStatus (*vaGetConfigAttributes) (
1977+ VADriverContextP_0_29 ctx,
1978+ VAProfile profile,
1979+ VAEntrypoint entrypoint,
1980+ VAConfigAttrib *attrib_list, /* in/out */
1981+ int num_attribs
1982+ );
1983+
1984+ VAStatus (*vaCreateConfig) (
1985+ VADriverContextP_0_29 ctx,
1986+ VAProfile profile,
1987+ VAEntrypoint entrypoint,
1988+ VAConfigAttrib *attrib_list,
1989+ int num_attribs,
1990+ VAConfigID *config_id /* out */
1991+ );
1992+
1993+ VAStatus (*vaDestroyConfig) (
1994+ VADriverContextP_0_29 ctx,
1995+ VAConfigID config_id
1996+ );
1997+
1998+ VAStatus (*vaQueryConfigAttributes) (
1999+ VADriverContextP_0_29 ctx,
2000+ VAConfigID config_id,
2001+ VAProfile *profile, /* out */
2002+ VAEntrypoint *entrypoint, /* out */
2003+ VAConfigAttrib *attrib_list, /* out */
2004+ int *num_attribs /* out */
2005+ );
2006+
2007+ VAStatus (*vaCreateSurfaces) (
2008+ VADriverContextP_0_29 ctx,
2009+ int width,
2010+ int height,
2011+ int format,
2012+ int num_surfaces,
2013+ VASurfaceID *surfaces /* out */
2014+ );
2015+
2016+ VAStatus (*vaDestroySurfaces) (
2017+ VADriverContextP_0_29 ctx,
2018+ VASurfaceID *surface_list,
2019+ int num_surfaces
2020+ );
2021+
2022+ VAStatus (*vaCreateContext) (
2023+ VADriverContextP_0_29 ctx,
2024+ VAConfigID config_id,
2025+ int picture_width,
2026+ int picture_height,
2027+ int flag,
2028+ VASurfaceID *render_targets,
2029+ int num_render_targets,
2030+ VAContextID *context /* out */
2031+ );
2032+
2033+ VAStatus (*vaDestroyContext) (
2034+ VADriverContextP_0_29 ctx,
2035+ VAContextID context
2036+ );
2037+
2038+ VAStatus (*vaCreateBuffer) (
2039+ VADriverContextP_0_29 ctx,
2040+ VAContextID context, /* in */
2041+ VABufferType type, /* in */
2042+ unsigned int size, /* in */
2043+ unsigned int num_elements, /* in */
2044+ void *data, /* in */
2045+ VABufferID *buf_id /* out */
2046+ );
2047+
2048+ VAStatus (*vaBufferSetNumElements) (
2049+ VADriverContextP_0_29 ctx,
2050+ VABufferID buf_id, /* in */
2051+ unsigned int num_elements /* in */
2052+ );
2053+
2054+ VAStatus (*vaMapBuffer) (
2055+ VADriverContextP_0_29 ctx,
2056+ VABufferID buf_id, /* in */
2057+ void **pbuf /* out */
2058+ );
2059+
2060+ VAStatus (*vaUnmapBuffer) (
2061+ VADriverContextP_0_29 ctx,
2062+ VABufferID buf_id /* in */
2063+ );
2064+
2065+ VAStatus (*vaDestroyBuffer) (
2066+ VADriverContextP_0_29 ctx,
2067+ VABufferID buffer_id
2068+ );
2069+
2070+ VAStatus (*vaBeginPicture) (
2071+ VADriverContextP_0_29 ctx,
2072+ VAContextID context,
2073+ VASurfaceID render_target
2074+ );
2075+
2076+ VAStatus (*vaRenderPicture) (
2077+ VADriverContextP_0_29 ctx,
2078+ VAContextID context,
2079+ VABufferID *buffers,
2080+ int num_buffers
2081+ );
2082+
2083+ VAStatus (*vaEndPicture) (
2084+ VADriverContextP_0_29 ctx,
2085+ VAContextID context
2086+ );
2087+
2088+ VAStatus (*vaSyncSurface) (
2089+ VADriverContextP_0_29 ctx,
2090+ VAContextID context,
2091+ VASurfaceID render_target
2092+ );
2093+
2094+ VAStatus (*vaQuerySurfaceStatus) (
2095+ VADriverContextP_0_29 ctx,
2096+ VASurfaceID render_target,
2097+ VASurfaceStatus *status /* out */
2098+ );
2099+
2100+ VAStatus (*vaPutSurface) (
2101+ VADriverContextP_0_29 ctx,
2102+ VASurfaceID surface,
2103+ unsigned long draw, /* X Drawable */
2104+ short srcx,
2105+ short srcy,
2106+ unsigned short srcw,
2107+ unsigned short srch,
2108+ short destx,
2109+ short desty,
2110+ unsigned short destw,
2111+ unsigned short desth,
2112+ VARectangle *cliprects, /* client supplied clip list */
2113+ unsigned int number_cliprects, /* number of clip rects in the clip list */
2114+ unsigned int flags /* de-interlacing flags */
2115+ );
2116+
2117+ VAStatus (*vaQueryImageFormats) (
2118+ VADriverContextP_0_29 ctx,
2119+ VAImageFormat *format_list, /* out */
2120+ int *num_formats /* out */
2121+ );
2122+
2123+ VAStatus (*vaCreateImage) (
2124+ VADriverContextP_0_29 ctx,
2125+ VAImageFormat *format,
2126+ int width,
2127+ int height,
2128+ VAImage *image /* out */
2129+ );
2130+
2131+ VAStatus (*vaDeriveImage) (
2132+ VADriverContextP_0_29 ctx,
2133+ VASurfaceID surface,
2134+ VAImage *image /* out */
2135+ );
2136+
2137+ VAStatus (*vaDestroyImage) (
2138+ VADriverContextP_0_29 ctx,
2139+ VAImageID image
2140+ );
2141+
2142+ VAStatus (*vaSetImagePalette) (
2143+ VADriverContextP_0_29 ctx,
2144+ VAImageID image,
2145+ /*
2146+ * pointer to an array holding the palette data. The size of the array is
2147+ * num_palette_entries * entry_bytes in size. The order of the components
2148+ * in the palette is described by the component_order in VAImage struct
2149+ */
2150+ unsigned char *palette
2151+ );
2152+
2153+ VAStatus (*vaGetImage) (
2154+ VADriverContextP_0_29 ctx,
2155+ VASurfaceID surface,
2156+ int x, /* coordinates of the upper left source pixel */
2157+ int y,
2158+ unsigned int width, /* width and height of the region */
2159+ unsigned int height,
2160+ VAImageID image
2161+ );
2162+
2163+ VAStatus (*vaPutImage) (
2164+ VADriverContextP_0_29 ctx,
2165+ VASurfaceID surface,
2166+ VAImageID image,
2167+ int src_x,
2168+ int src_y,
2169+ unsigned int width,
2170+ unsigned int height,
2171+ int dest_x,
2172+ int dest_y
2173+ );
2174+
2175+ VAStatus (*vaPutImage2) (
2176+ VADriverContextP_0_29 ctx,
2177+ VASurfaceID surface,
2178+ VAImageID image,
2179+ int src_x,
2180+ int src_y,
2181+ unsigned int src_width,
2182+ unsigned int src_height,
2183+ int dest_x,
2184+ int dest_y,
2185+ unsigned int dest_width,
2186+ unsigned int dest_height
2187+ );
2188+
2189+ VAStatus (*vaQuerySubpictureFormats) (
2190+ VADriverContextP_0_29 ctx,
2191+ VAImageFormat *format_list, /* out */
2192+ unsigned int *flags, /* out */
2193+ unsigned int *num_formats /* out */
2194+ );
2195+
2196+ VAStatus (*vaCreateSubpicture) (
2197+ VADriverContextP_0_29 ctx,
2198+ VAImageID image,
2199+ VASubpictureID *subpicture /* out */
2200+ );
2201+
2202+ VAStatus (*vaDestroySubpicture) (
2203+ VADriverContextP_0_29 ctx,
2204+ VASubpictureID subpicture
2205+ );
2206+
2207+ VAStatus (*vaSetSubpictureImage) (
2208+ VADriverContextP_0_29 ctx,
2209+ VASubpictureID subpicture,
2210+ VAImageID image
2211+ );
2212+
2213+ VAStatus (*vaSetSubpicturePalette) (
2214+ VADriverContextP_0_29 ctx,
2215+ VASubpictureID subpicture,
2216+ /*
2217+ * pointer to an array holding the palette data. The size of the array is
2218+ * num_palette_entries * entry_bytes in size. The order of the components
2219+ * in the palette is described by the component_order in VASubpicture struct
2220+ */
2221+ unsigned char *palette
2222+ );
2223+
2224+ VAStatus (*vaSetSubpictureChromakey) (
2225+ VADriverContextP_0_29 ctx,
2226+ VASubpictureID subpicture,
2227+ unsigned int chromakey_min,
2228+ unsigned int chromakey_max,
2229+ unsigned int chromakey_mask
2230+ );
2231+
2232+ VAStatus (*vaSetSubpictureGlobalAlpha) (
2233+ VADriverContextP_0_29 ctx,
2234+ VASubpictureID subpicture,
2235+ float global_alpha
2236+ );
2237+
2238+ VAStatus (*vaAssociateSubpicture) (
2239+ VADriverContextP_0_29 ctx,
2240+ VASubpictureID subpicture,
2241+ VASurfaceID *target_surfaces,
2242+ int num_surfaces,
2243+ short src_x, /* upper left offset in subpicture */
2244+ short src_y,
2245+ short dest_x, /* upper left offset in surface */
2246+ short dest_y,
2247+ unsigned short width,
2248+ unsigned short height,
2249+ /*
2250+ * whether to enable chroma-keying or global-alpha
2251+ * see VA_SUBPICTURE_XXX values
2252+ */
2253+ unsigned int flags
2254+ );
2255+
2256+ VAStatus (*vaAssociateSubpicture2) (
2257+ VADriverContextP_0_29 ctx,
2258+ VASubpictureID subpicture,
2259+ VASurfaceID *target_surfaces,
2260+ int num_surfaces,
2261+ short src_x, /* upper left offset in subpicture */
2262+ short src_y,
2263+ unsigned short src_width,
2264+ unsigned short src_height,
2265+ short dest_x, /* upper left offset in surface */
2266+ short dest_y,
2267+ unsigned short dest_width,
2268+ unsigned short dest_height,
2269+ /*
2270+ * whether to enable chroma-keying or global-alpha
2271+ * see VA_SUBPICTURE_XXX values
2272+ */
2273+ unsigned int flags
2274+ );
2275+
2276+ VAStatus (*vaDeassociateSubpicture) (
2277+ VADriverContextP_0_29 ctx,
2278+ VASubpictureID subpicture,
2279+ VASurfaceID *target_surfaces,
2280+ int num_surfaces
2281+ );
2282+
2283+ VAStatus (*vaQueryDisplayAttributes) (
2284+ VADriverContextP_0_29 ctx,
2285+ VADisplayAttribute *attr_list, /* out */
2286+ int *num_attributes /* out */
2287+ );
2288+
2289+ VAStatus (*vaGetDisplayAttributes) (
2290+ VADriverContextP_0_29 ctx,
2291+ VADisplayAttribute *attr_list, /* in/out */
2292+ int num_attributes
2293+ );
2294+
2295+ VAStatus (*vaSetDisplayAttributes) (
2296+ VADriverContextP_0_29 ctx,
2297+ VADisplayAttribute *attr_list,
2298+ int num_attributes
2299+ );
2300+
2301+
2302+ VAStatus (*vaDbgCopySurfaceToBuffer) (
2303+ VADriverContextP_0_29 ctx,
2304+ VASurfaceID surface,
2305+ void **buffer, /* out */
2306+ unsigned int *stride /* out */
2307+ );
2308+};
2309+
2310+/* Driver context (0.29) */
2311+struct VADriverContext_0_29
2312+{
2313+ void *old_pNext; /* preserved for binary compatibility */
2314+
2315+ void *pDriverData;
2316+ struct VADriverVTable_0_29 vtable;
2317+
2318+ void *x11_dpy;
2319+ int x11_screen;
2320+
2321+ int version_major;
2322+ int version_minor;
2323+ int max_profiles;
2324+ int max_entrypoints;
2325+ int max_attributes;
2326+ int max_image_formats;
2327+ int max_subpic_formats;
2328+ int max_display_attributes;
2329+ const char *str_vendor;
2330+
2331+ void *handle; /* dlopen handle */
2332+};
2333+
2334+/* Forward declarations for VA API 0.30 */
2335+struct v4l2_format;
2336+struct v4l2_buffer;
2337+typedef struct VADriverContext_0_30 *VADriverContextP_0_30;
2338+
2339+/* Driver VTable (0.30) */
2340+struct VADriverVTable_0_30
2341+{
2342+ VAStatus (*vaTerminate) ( VADriverContextP_0_30 ctx );
2343+
2344+ VAStatus (*vaQueryConfigProfiles) (
2345+ VADriverContextP_0_30 ctx,
2346+ VAProfile *profile_list, /* out */
2347+ int *num_profiles /* out */
2348+ );
2349+
2350+ VAStatus (*vaQueryConfigEntrypoints) (
2351+ VADriverContextP_0_30 ctx,
2352+ VAProfile profile,
2353+ VAEntrypoint *entrypoint_list, /* out */
2354+ int *num_entrypoints /* out */
2355+ );
2356+
2357+ VAStatus (*vaGetConfigAttributes) (
2358+ VADriverContextP_0_30 ctx,
2359+ VAProfile profile,
2360+ VAEntrypoint entrypoint,
2361+ VAConfigAttrib *attrib_list, /* in/out */
2362+ int num_attribs
2363+ );
2364+
2365+ VAStatus (*vaCreateConfig) (
2366+ VADriverContextP_0_30 ctx,
2367+ VAProfile profile,
2368+ VAEntrypoint entrypoint,
2369+ VAConfigAttrib *attrib_list,
2370+ int num_attribs,
2371+ VAConfigID *config_id /* out */
2372+ );
2373+
2374+ VAStatus (*vaDestroyConfig) (
2375+ VADriverContextP_0_30 ctx,
2376+ VAConfigID config_id
2377+ );
2378+
2379+ VAStatus (*vaQueryConfigAttributes) (
2380+ VADriverContextP_0_30 ctx,
2381+ VAConfigID config_id,
2382+ VAProfile *profile, /* out */
2383+ VAEntrypoint *entrypoint, /* out */
2384+ VAConfigAttrib *attrib_list, /* out */
2385+ int *num_attribs /* out */
2386+ );
2387+
2388+ VAStatus (*vaCreateSurfaces) (
2389+ VADriverContextP_0_30 ctx,
2390+ int width,
2391+ int height,
2392+ int format,
2393+ int num_surfaces,
2394+ VASurfaceID *surfaces /* out */
2395+ );
2396+
2397+ VAStatus (*vaDestroySurfaces) (
2398+ VADriverContextP_0_30 ctx,
2399+ VASurfaceID *surface_list,
2400+ int num_surfaces
2401+ );
2402+
2403+ VAStatus (*vaCreateContext) (
2404+ VADriverContextP_0_30 ctx,
2405+ VAConfigID config_id,
2406+ int picture_width,
2407+ int picture_height,
2408+ int flag,
2409+ VASurfaceID *render_targets,
2410+ int num_render_targets,
2411+ VAContextID *context /* out */
2412+ );
2413+
2414+ VAStatus (*vaDestroyContext) (
2415+ VADriverContextP_0_30 ctx,
2416+ VAContextID context
2417+ );
2418+
2419+ VAStatus (*vaCreateBuffer) (
2420+ VADriverContextP_0_30 ctx,
2421+ VAContextID context, /* in */
2422+ VABufferType type, /* in */
2423+ unsigned int size, /* in */
2424+ unsigned int num_elements, /* in */
2425+ void *data, /* in */
2426+ VABufferID *buf_id /* out */
2427+ );
2428+
2429+ VAStatus (*vaBufferSetNumElements) (
2430+ VADriverContextP_0_30 ctx,
2431+ VABufferID buf_id, /* in */
2432+ unsigned int num_elements /* in */
2433+ );
2434+
2435+ VAStatus (*vaMapBuffer) (
2436+ VADriverContextP_0_30 ctx,
2437+ VABufferID buf_id, /* in */
2438+ void **pbuf /* out */
2439+ );
2440+
2441+ VAStatus (*vaUnmapBuffer) (
2442+ VADriverContextP_0_30 ctx,
2443+ VABufferID buf_id /* in */
2444+ );
2445+
2446+ VAStatus (*vaDestroyBuffer) (
2447+ VADriverContextP_0_30 ctx,
2448+ VABufferID buffer_id
2449+ );
2450+
2451+ VAStatus (*vaBeginPicture) (
2452+ VADriverContextP_0_30 ctx,
2453+ VAContextID context,
2454+ VASurfaceID render_target
2455+ );
2456+
2457+ VAStatus (*vaRenderPicture) (
2458+ VADriverContextP_0_30 ctx,
2459+ VAContextID context,
2460+ VABufferID *buffers,
2461+ int num_buffers
2462+ );
2463+
2464+ VAStatus (*vaEndPicture) (
2465+ VADriverContextP_0_30 ctx,
2466+ VAContextID context
2467+ );
2468+
2469+ VAStatus (*vaSyncSurface) (
2470+ VADriverContextP_0_30 ctx,
2471+ VAContextID context,
2472+ VASurfaceID render_target
2473+ );
2474+
2475+ VAStatus (*vaQuerySurfaceStatus) (
2476+ VADriverContextP_0_30 ctx,
2477+ VASurfaceID render_target,
2478+ VASurfaceStatus *status /* out */
2479+ );
2480+
2481+ VAStatus (*vaPutSurface) (
2482+ VADriverContextP_0_30 ctx,
2483+ VASurfaceID surface,
2484+ unsigned long draw, /* X Drawable */
2485+ short srcx,
2486+ short srcy,
2487+ unsigned short srcw,
2488+ unsigned short srch,
2489+ short destx,
2490+ short desty,
2491+ unsigned short destw,
2492+ unsigned short desth,
2493+ VARectangle *cliprects, /* client supplied clip list */
2494+ unsigned int number_cliprects, /* number of clip rects in the clip list */
2495+ unsigned int flags /* de-interlacing flags */
2496+ );
2497+
2498+ VAStatus (*vaQueryImageFormats) (
2499+ VADriverContextP_0_30 ctx,
2500+ VAImageFormat *format_list, /* out */
2501+ int *num_formats /* out */
2502+ );
2503+
2504+ VAStatus (*vaCreateImage) (
2505+ VADriverContextP_0_30 ctx,
2506+ VAImageFormat *format,
2507+ int width,
2508+ int height,
2509+ VAImage *image /* out */
2510+ );
2511+
2512+ VAStatus (*vaDeriveImage) (
2513+ VADriverContextP_0_30 ctx,
2514+ VASurfaceID surface,
2515+ VAImage *image /* out */
2516+ );
2517+
2518+ VAStatus (*vaDestroyImage) (
2519+ VADriverContextP_0_30 ctx,
2520+ VAImageID image
2521+ );
2522+
2523+ VAStatus (*vaSetImagePalette) (
2524+ VADriverContextP_0_30 ctx,
2525+ VAImageID image,
2526+ /*
2527+ * pointer to an array holding the palette data. The size of the array is
2528+ * num_palette_entries * entry_bytes in size. The order of the components
2529+ * in the palette is described by the component_order in VAImage struct
2530+ */
2531+ unsigned char *palette
2532+ );
2533+
2534+ VAStatus (*vaGetImage) (
2535+ VADriverContextP_0_30 ctx,
2536+ VASurfaceID surface,
2537+ int x, /* coordinates of the upper left source pixel */
2538+ int y,
2539+ unsigned int width, /* width and height of the region */
2540+ unsigned int height,
2541+ VAImageID image
2542+ );
2543+
2544+ VAStatus (*vaPutImage) (
2545+ VADriverContextP_0_30 ctx,
2546+ VASurfaceID surface,
2547+ VAImageID image,
2548+ int src_x,
2549+ int src_y,
2550+ unsigned int width,
2551+ unsigned int height,
2552+ int dest_x,
2553+ int dest_y
2554+ );
2555+
2556+ VAStatus (*vaPutImage2) (
2557+ VADriverContextP_0_30 ctx,
2558+ VASurfaceID surface,
2559+ VAImageID image,
2560+ int src_x,
2561+ int src_y,
2562+ unsigned int src_width,
2563+ unsigned int src_height,
2564+ int dest_x,
2565+ int dest_y,
2566+ unsigned int dest_width,
2567+ unsigned int dest_height
2568+ );
2569+
2570+ VAStatus (*vaQuerySubpictureFormats) (
2571+ VADriverContextP_0_30 ctx,
2572+ VAImageFormat *format_list, /* out */
2573+ unsigned int *flags, /* out */
2574+ unsigned int *num_formats /* out */
2575+ );
2576+
2577+ VAStatus (*vaCreateSubpicture) (
2578+ VADriverContextP_0_30 ctx,
2579+ VAImageID image,
2580+ VASubpictureID *subpicture /* out */
2581+ );
2582+
2583+ VAStatus (*vaDestroySubpicture) (
2584+ VADriverContextP_0_30 ctx,
2585+ VASubpictureID subpicture
2586+ );
2587+
2588+ VAStatus (*vaSetSubpictureImage) (
2589+ VADriverContextP_0_30 ctx,
2590+ VASubpictureID subpicture,
2591+ VAImageID image
2592+ );
2593+
2594+ VAStatus (*vaSetSubpictureChromakey) (
2595+ VADriverContextP_0_30 ctx,
2596+ VASubpictureID subpicture,
2597+ unsigned int chromakey_min,
2598+ unsigned int chromakey_max,
2599+ unsigned int chromakey_mask
2600+ );
2601+
2602+ VAStatus (*vaSetSubpictureGlobalAlpha) (
2603+ VADriverContextP_0_30 ctx,
2604+ VASubpictureID subpicture,
2605+ float global_alpha
2606+ );
2607+
2608+ VAStatus (*vaAssociateSubpicture) (
2609+ VADriverContextP_0_30 ctx,
2610+ VASubpictureID subpicture,
2611+ VASurfaceID *target_surfaces,
2612+ int num_surfaces,
2613+ short src_x, /* upper left offset in subpicture */
2614+ short src_y,
2615+ short dest_x, /* upper left offset in surface */
2616+ short dest_y,
2617+ unsigned short width,
2618+ unsigned short height,
2619+ /*
2620+ * whether to enable chroma-keying or global-alpha
2621+ * see VA_SUBPICTURE_XXX values
2622+ */
2623+ unsigned int flags
2624+ );
2625+
2626+ VAStatus (*vaAssociateSubpicture2) (
2627+ VADriverContextP_0_30 ctx,
2628+ VASubpictureID subpicture,
2629+ VASurfaceID *target_surfaces,
2630+ int num_surfaces,
2631+ short src_x, /* upper left offset in subpicture */
2632+ short src_y,
2633+ unsigned short src_width,
2634+ unsigned short src_height,
2635+ short dest_x, /* upper left offset in surface */
2636+ short dest_y,
2637+ unsigned short dest_width,
2638+ unsigned short dest_height,
2639+ /*
2640+ * whether to enable chroma-keying or global-alpha
2641+ * see VA_SUBPICTURE_XXX values
2642+ */
2643+ unsigned int flags
2644+ );
2645+
2646+ VAStatus (*vaDeassociateSubpicture) (
2647+ VADriverContextP_0_30 ctx,
2648+ VASubpictureID subpicture,
2649+ VASurfaceID *target_surfaces,
2650+ int num_surfaces
2651+ );
2652+
2653+ VAStatus (*vaQueryDisplayAttributes) (
2654+ VADriverContextP_0_30 ctx,
2655+ VADisplayAttribute *attr_list, /* out */
2656+ int *num_attributes /* out */
2657+ );
2658+
2659+ VAStatus (*vaGetDisplayAttributes) (
2660+ VADriverContextP_0_30 ctx,
2661+ VADisplayAttribute *attr_list, /* in/out */
2662+ int num_attributes
2663+ );
2664+
2665+ VAStatus (*vaSetDisplayAttributes) (
2666+ VADriverContextP_0_30 ctx,
2667+ VADisplayAttribute *attr_list,
2668+ int num_attributes
2669+ );
2670+
2671+ /* device specific */
2672+ VAStatus (*vaCreateSurfaceFromCIFrame) (
2673+ VADriverContextP_0_30 ctx,
2674+ unsigned long frame_id,
2675+ VASurfaceID *surface /* out */
2676+ );
2677+
2678+
2679+ VAStatus (*vaCreateSurfaceFromV4L2Buf) (
2680+ VADriverContextP_0_30 ctx,
2681+ int v4l2_fd, /* file descriptor of V4L2 device */
2682+ struct v4l2_format *v4l2_fmt, /* format of V4L2 */
2683+ struct v4l2_buffer *v4l2_buf, /* V4L2 buffer */
2684+ VASurfaceID *surface /* out */
2685+ );
2686+
2687+ VAStatus (*vaCopySurfaceToBuffer) (
2688+ VADriverContextP_0_30 ctx,
2689+ VASurfaceID surface,
2690+ unsigned int *fourcc, /* out for follow argument */
2691+ unsigned int *luma_stride,
2692+ unsigned int *chroma_u_stride,
2693+ unsigned int *chroma_v_stride,
2694+ unsigned int *luma_offset,
2695+ unsigned int *chroma_u_offset,
2696+ unsigned int *chroma_v_offset,
2697+ void **buffer
2698+ );
2699+};
2700+
2701+/* Driver context (0.30) */
2702+struct VADriverContext_0_30
2703+{
2704+ void *pDriverData;
2705+ struct VADriverVTable_0_30 vtable;
2706+
2707+ void *x11_dpy;
2708+ int x11_screen;
2709+ int version_major;
2710+ int version_minor;
2711+ int max_profiles;
2712+ int max_entrypoints;
2713+ int max_attributes;
2714+ int max_image_formats;
2715+ int max_subpic_formats;
2716+ int max_display_attributes;
2717+ const char *str_vendor;
2718+
2719+ void *handle; /* dlopen handle */
2720+
2721+ void *dri_state;
2722+};
2723+
2724+/* Driver VTable and context (0.31) */
2725+#define VADriverVTable_0_31 VADriverVTable
2726+#define VADriverContext_0_31 VADriverContext
2727+
2728+#endif /* VA_COMPAT_H */
2729diff --git a/src/va_compat_template.h b/src/va_compat_template.h
2730new file mode 100644
2731index 0000000..18349de
2732--- /dev/null
2733+++ b/src/va_compat_template.h
2734@@ -0,0 +1,539 @@
2735+/*
2736+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
2737+ *
2738+ * Permission is hereby granted, free of charge, to any person obtaining a
2739+ * copy of this software and associated documentation files (the
2740+ * "Software"), to deal in the Software without restriction, including
2741+ * without limitation the rights to use, copy, modify, merge, publish,
2742+ * distribute, sub license, and/or sell copies of the Software, and to
2743+ * permit persons to whom the Software is furnished to do so, subject to
2744+ * the following conditions:
2745+ *
2746+ * The above copyright notice and this permission notice (including the
2747+ * next paragraph) shall be included in all copies or substantial portions
2748+ * of the Software.
2749+ *
2750+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
2751+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2752+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2753+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
2754+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2755+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2756+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2757+ */
2758+
2759+#undef CONCAT_
2760+#define CONCAT_(x, y) x##y
2761+#undef CONCAT
2762+#define CONCAT(x, y) CONCAT_(x, y)
2763+#undef MKCOMPAT_
2764+#define MKCOMPAT_(NAME,MINOR) CONCAT(CONCAT(NAME,_0_),MINOR)
2765+#undef MKCOMPAT
2766+#define MKCOMPAT(NAME) MKCOMPAT_(NAME,COMPAT_MINOR)
2767+#undef STRUCT
2768+#define STRUCT(BUFFER, CODEC) MKCOMPAT(VA##BUFFER##Buffer##CODEC)
2769+#undef TRANSLATE_1
2770+#define TRANSLATE_1(NAME) CONCAT(va_compat_translate_,NAME)
2771+#undef TRANSLATE_
2772+#define TRANSLATE_(NAME) TRANSLATE_1(MKCOMPAT(NAME))
2773+#undef TRANSLATE
2774+#define TRANSLATE(BUFFER, CODEC) TRANSLATE_1(STRUCT(BUFFER,CODEC))
2775+
2776+#undef COPY_ARRAY
2777+#define COPY_ARRAY(DST, SRC, ARRAY) \
2778+ memcpy((DST)->ARRAY, (SRC)->ARRAY, sizeof((DST)->ARRAY))
2779+
2780+#undef COPY_FIELD
2781+#define COPY_FIELD(DST, SRC, MEMBER) \
2782+ (DST)->MEMBER = (SRC)->MEMBER
2783+
2784+#undef COPY_VTABLE__
2785+#define COPY_VTABLE__(DST, DST_MEMBER, SRC, SRC_MEMBER) \
2786+ (DST##_vtable)->DST_MEMBER = (SRC##_vtable)->SRC_MEMBER
2787+
2788+#undef COPY_VTABLE_
2789+#define COPY_VTABLE_(DST, DST_SUFFIX, SRC, MEMBER) \
2790+ COPY_VTABLE__(DST, MEMBER##_##DST_SUFFIX, SRC, MEMBER)
2791+
2792+#undef COPY_VTABLE
2793+#define COPY_VTABLE(DST, SRC, MEMBER) \
2794+ COPY_VTABLE__(DST, MEMBER, SRC, MEMBER)
2795+
2796+/* 0.29 */
2797+#if COMPAT_MAJOR == 0 && COMPAT_MINOR == 29
2798+#undef BFV
2799+#define BFV(a, b) a
2800+#undef BFM
2801+#define BFM(a, b, c) c
2802+#undef COPY_BIT_FIELD
2803+#define COPY_BIT_FIELD(DST, SRC, FIELD, MEMBER) \
2804+ (DST)->MEMBER = (SRC)->FIELD.bits.MEMBER
2805+#undef COPY_BIT_FLAG
2806+#define COPY_BIT_FLAG(DST, SRC, FIELD, MEMBER) \
2807+ (DST)->MEMBER = (SRC)->FIELD.flags.MEMBER
2808+#endif
2809+
2810+/* 0.29 glue to match 0.30 names */
2811+#undef M_raw_coding
2812+#undef M_bitplane_present
2813+#undef M_luma_flag
2814+#undef M_luma
2815+#undef M_chroma_flag
2816+#undef M_chroma
2817+
2818+#if COMPAT_MAJOR == 0 && COMPAT_MINOR == 29
2819+#define M_raw_coding raw_coding_flag
2820+#define M_bitplane_present bitplane_present_flag
2821+#define M_luma_flag range_mapping_luma_flag
2822+#define M_luma range_mapping_luma
2823+#define M_chroma_flag range_mapping_chroma_flag
2824+#define M_chroma range_mapping_chroma
2825+#else
2826+#define M_raw_coding raw_coding
2827+#define M_bitplane_present bitplane_present
2828+#define M_luma_flag luma_flag
2829+#define M_luma luma
2830+#define M_chroma_flag chroma_flag
2831+#define M_chroma chroma
2832+#endif
2833+
2834+/* 0.30 */
2835+#if COMPAT_MAJOR == 0 && COMPAT_MINOR == 30
2836+#undef BFV
2837+#define BFV(a, b) a.b
2838+#undef BFM
2839+#define BFM(a, b, c) a.b.c
2840+#undef COPY_BIT_FIELD
2841+#define COPY_BIT_FIELD(DST, SRC, FIELD, MEMBER) \
2842+ (DST)->FIELD.bits.MEMBER = (SRC)->FIELD.bits.MEMBER
2843+#undef COPY_BIT_FLAG
2844+#define COPY_BIT_FLAG(DST, SRC, FIELD, MEMBER) \
2845+ (DST)->FIELD.flags.MEMBER = (SRC)->FIELD.flags.MEMBER
2846+#endif
2847+
2848+#if COMPAT_MAJOR == 0 && COMPAT_MINOR < 31
2849+static VAStatus TRANSLATE_(VAPictureH264)(
2850+ VACompatContextP ctx,
2851+ void *dest_pic,
2852+ const void *src_pic
2853+)
2854+{
2855+ MKCOMPAT(VAPictureH264) *dest = dest_pic;
2856+ const VAPictureH264 *src = src_pic;
2857+
2858+ COPY_FIELD(dest, src, picture_id);
2859+ COPY_FIELD(dest, src, flags);
2860+ COPY_FIELD(dest, src, TopFieldOrderCnt);
2861+ COPY_FIELD(dest, src, BottomFieldOrderCnt);
2862+
2863+ return VA_STATUS_SUCCESS;
2864+}
2865+
2866+static VAStatus TRANSLATE(PictureParameter,H264)(
2867+ VACompatContextP ctx,
2868+ void *dest_buffer,
2869+ const void *src_buffer
2870+)
2871+{
2872+ STRUCT(PictureParameter,H264) *dest = dest_buffer;
2873+ const VAPictureParameterBufferH264 *src = src_buffer;
2874+ VAStatus status;
2875+ int i;
2876+
2877+ status = TRANSLATE_(VAPictureH264)(ctx,
2878+ &dest->CurrPic, &src->CurrPic);
2879+ if (status != VA_STATUS_SUCCESS)
2880+ return status;
2881+
2882+ for (i = 0; i < 16; i++) {
2883+ status = TRANSLATE_(VAPictureH264)(ctx,
2884+ &dest->ReferenceFrames[i],
2885+ &src->ReferenceFrames[i]);
2886+ if (status != VA_STATUS_SUCCESS)
2887+ return status;
2888+ }
2889+
2890+ COPY_FIELD(dest, src, picture_width_in_mbs_minus1);
2891+ COPY_FIELD(dest, src, picture_height_in_mbs_minus1);
2892+ COPY_FIELD(dest, src, bit_depth_luma_minus8);
2893+ COPY_FIELD(dest, src, bit_depth_chroma_minus8);
2894+ COPY_FIELD(dest, src, num_ref_frames);
2895+ dest->BFV(seq_fields, value) = 0; /* reset all bits */
2896+ COPY_BIT_FIELD(dest, src, seq_fields, chroma_format_idc);
2897+ COPY_BIT_FIELD(dest, src, seq_fields, residual_colour_transform_flag);
2898+ COPY_BIT_FIELD(dest, src, seq_fields, frame_mbs_only_flag);
2899+ COPY_BIT_FIELD(dest, src, seq_fields, mb_adaptive_frame_field_flag);
2900+ COPY_BIT_FIELD(dest, src, seq_fields, direct_8x8_inference_flag);
2901+ COPY_BIT_FIELD(dest, src, seq_fields, MinLumaBiPredSize8x8);
2902+ COPY_FIELD(dest, src, num_slice_groups_minus1);
2903+ COPY_FIELD(dest, src, slice_group_map_type);
2904+ COPY_FIELD(dest, src, pic_init_qp_minus26);
2905+ COPY_FIELD(dest, src, chroma_qp_index_offset);
2906+ COPY_FIELD(dest, src, second_chroma_qp_index_offset);
2907+ dest->BFV(pic_fields, value) = 0; /* reset all bits */
2908+ COPY_BIT_FIELD(dest, src, pic_fields, entropy_coding_mode_flag);
2909+ COPY_BIT_FIELD(dest, src, pic_fields, weighted_pred_flag);
2910+ COPY_BIT_FIELD(dest, src, pic_fields, weighted_bipred_idc);
2911+ COPY_BIT_FIELD(dest, src, pic_fields, transform_8x8_mode_flag);
2912+ COPY_BIT_FIELD(dest, src, pic_fields, field_pic_flag);
2913+ COPY_BIT_FIELD(dest, src, pic_fields, constrained_intra_pred_flag);
2914+ COPY_FIELD(dest, src, frame_num);
2915+
2916+ return VA_STATUS_SUCCESS;
2917+}
2918+
2919+static VAStatus TRANSLATE(SliceParameter,H264)(
2920+ VACompatContextP ctx,
2921+ void *dest_buffer,
2922+ const void *src_buffer
2923+)
2924+{
2925+ STRUCT(SliceParameter,H264) *dest = dest_buffer;
2926+ const VASliceParameterBufferH264 *src = src_buffer;
2927+ VAStatus status;
2928+ int i;
2929+
2930+ COPY_FIELD(dest, src, slice_data_size);
2931+ COPY_FIELD(dest, src, slice_data_offset);
2932+ COPY_FIELD(dest, src, slice_data_flag);
2933+ COPY_FIELD(dest, src, slice_data_bit_offset);
2934+ COPY_FIELD(dest, src, first_mb_in_slice);
2935+ COPY_FIELD(dest, src, slice_type);
2936+ COPY_FIELD(dest, src, direct_spatial_mv_pred_flag);
2937+ COPY_FIELD(dest, src, num_ref_idx_l0_active_minus1);
2938+ COPY_FIELD(dest, src, num_ref_idx_l1_active_minus1);
2939+ COPY_FIELD(dest, src, cabac_init_idc);
2940+ COPY_FIELD(dest, src, slice_qp_delta);
2941+ COPY_FIELD(dest, src, disable_deblocking_filter_idc);
2942+ COPY_FIELD(dest, src, slice_alpha_c0_offset_div2);
2943+ COPY_FIELD(dest, src, slice_beta_offset_div2);
2944+ for (i = 0; i < 32; i++) {
2945+ status = TRANSLATE_(VAPictureH264)(ctx,
2946+ &dest->RefPicList0[i],
2947+ &src->RefPicList0[i]);
2948+ if (status != VA_STATUS_SUCCESS)
2949+ return status;
2950+ status = TRANSLATE_(VAPictureH264)(ctx,
2951+ &dest->RefPicList1[i],
2952+ &src->RefPicList1[i]);
2953+ if (status != VA_STATUS_SUCCESS)
2954+ return status;
2955+ }
2956+ COPY_FIELD(dest, src, luma_log2_weight_denom);
2957+ COPY_FIELD(dest, src, chroma_log2_weight_denom);
2958+ COPY_FIELD(dest, src, luma_weight_l0_flag);
2959+ COPY_ARRAY(dest, src, luma_weight_l0);
2960+ COPY_ARRAY(dest, src, luma_offset_l0);
2961+ COPY_FIELD(dest, src, chroma_weight_l0_flag);
2962+ COPY_ARRAY(dest, src, chroma_weight_l0);
2963+ COPY_ARRAY(dest, src, chroma_offset_l0);
2964+ COPY_FIELD(dest, src, luma_weight_l1_flag);
2965+ COPY_ARRAY(dest, src, luma_weight_l1);
2966+ COPY_ARRAY(dest, src, luma_offset_l1);
2967+ COPY_FIELD(dest, src, chroma_weight_l1_flag);
2968+ COPY_ARRAY(dest, src, chroma_weight_l1);
2969+ COPY_ARRAY(dest, src, chroma_offset_l1);
2970+
2971+ return VA_STATUS_SUCCESS;
2972+}
2973+
2974+static VAStatus TRANSLATE(PictureParameter,VC1)(
2975+ VACompatContextP ctx,
2976+ void *dest_buffer,
2977+ const void *src_buffer
2978+)
2979+{
2980+ STRUCT(PictureParameter,VC1) *dest = dest_buffer;
2981+ const VAPictureParameterBufferVC1 *src = src_buffer;
2982+
2983+ COPY_FIELD(dest, src, forward_reference_picture);
2984+ COPY_FIELD(dest, src, backward_reference_picture);
2985+ COPY_FIELD(dest, src, inloop_decoded_picture);
2986+ dest->BFV(sequence_fields, value) = 0; /* reset all bits */
2987+ COPY_BIT_FIELD(dest, src, sequence_fields, interlace);
2988+ COPY_BIT_FIELD(dest, src, sequence_fields, syncmarker);
2989+ COPY_BIT_FIELD(dest, src, sequence_fields, overlap);
2990+ COPY_FIELD(dest, src, coded_width);
2991+ COPY_FIELD(dest, src, coded_height);
2992+#if COMPAT_MAJOR == 0 && COMPAT_MINOR == 30
2993+ dest->closed_entry = src->entrypoint_fields.bits.closed_entry;
2994+ dest->broken_link = src->entrypoint_fields.bits.broken_link;
2995+ dest->loopfilter = src->entrypoint_fields.bits.loopfilter;
2996+#else
2997+ COPY_BIT_FIELD(dest, src, entrypoint_fields, closed_entry);
2998+ COPY_BIT_FIELD(dest, src, entrypoint_fields, broken_link);
2999+ COPY_BIT_FIELD(dest, src, entrypoint_fields, loopfilter);
3000+#endif
3001+ COPY_FIELD(dest, src, conditional_overlap_flag);
3002+ COPY_FIELD(dest, src, fast_uvmc_flag);
3003+ dest->BFV(range_mapping_fields, value) = 0; /* reset all bits */
3004+ dest->BFM(range_mapping_fields, bits, M_luma_flag) =
3005+ src->range_mapping_fields.bits.luma_flag;
3006+ dest->BFM(range_mapping_fields, bits, M_luma) =
3007+ src->range_mapping_fields.bits.luma;
3008+ dest->BFM(range_mapping_fields, bits, M_chroma_flag) =
3009+ src->range_mapping_fields.bits.chroma_flag;
3010+ dest->BFM(range_mapping_fields, bits, M_chroma) =
3011+ src->range_mapping_fields.bits.chroma;
3012+ COPY_FIELD(dest, src, b_picture_fraction);
3013+ COPY_FIELD(dest, src, cbp_table);
3014+ COPY_FIELD(dest, src, mb_mode_table);
3015+ COPY_FIELD(dest, src, range_reduction_frame);
3016+ COPY_FIELD(dest, src, rounding_control);
3017+ COPY_FIELD(dest, src, post_processing);
3018+ COPY_FIELD(dest, src, picture_resolution_index);
3019+ COPY_FIELD(dest, src, luma_scale);
3020+ COPY_FIELD(dest, src, luma_shift);
3021+ dest->BFV(picture_fields, value) = 0; /* reset all bits */
3022+ COPY_BIT_FIELD(dest, src, picture_fields, picture_type);
3023+ COPY_BIT_FIELD(dest, src, picture_fields, frame_coding_mode);
3024+ COPY_BIT_FIELD(dest, src, picture_fields, top_field_first);
3025+ COPY_BIT_FIELD(dest, src, picture_fields, is_first_field);
3026+ COPY_BIT_FIELD(dest, src, picture_fields, intensity_compensation);
3027+ dest->BFV(M_raw_coding, value) = 0; /* reset all bits */
3028+ COPY_BIT_FLAG(dest, src, raw_coding, mv_type_mb);
3029+ COPY_BIT_FLAG(dest, src, raw_coding, direct_mb);
3030+ COPY_BIT_FLAG(dest, src, raw_coding, skip_mb);
3031+ COPY_BIT_FLAG(dest, src, raw_coding, field_tx);
3032+ COPY_BIT_FLAG(dest, src, raw_coding, forward_mb);
3033+ COPY_BIT_FLAG(dest, src, raw_coding, ac_pred);
3034+ COPY_BIT_FLAG(dest, src, raw_coding, overflags);
3035+ dest->BFV(M_bitplane_present, value) = 0; /* reset all bits */
3036+ COPY_BIT_FLAG(dest, src, bitplane_present, bp_mv_type_mb);
3037+ COPY_BIT_FLAG(dest, src, bitplane_present, bp_direct_mb);
3038+ COPY_BIT_FLAG(dest, src, bitplane_present, bp_skip_mb);
3039+ COPY_BIT_FLAG(dest, src, bitplane_present, bp_field_tx);
3040+ COPY_BIT_FLAG(dest, src, bitplane_present, bp_forward_mb);
3041+ COPY_BIT_FLAG(dest, src, bitplane_present, bp_ac_pred);
3042+ COPY_BIT_FLAG(dest, src, bitplane_present, bp_overflags);
3043+ dest->BFV(reference_fields, value) = 0; /* reset all bits */
3044+ COPY_BIT_FIELD(dest, src, reference_fields, reference_distance_flag);
3045+ COPY_BIT_FIELD(dest, src, reference_fields, reference_distance);
3046+ COPY_BIT_FIELD(dest, src, reference_fields, num_reference_pictures);
3047+ COPY_BIT_FIELD(dest, src, reference_fields, reference_field_pic_indicator);
3048+ dest->BFV(mv_fields, value) = 0; /* reset all bits */
3049+ COPY_BIT_FIELD(dest, src, mv_fields, mv_mode);
3050+ COPY_BIT_FIELD(dest, src, mv_fields, mv_mode2);
3051+ COPY_BIT_FIELD(dest, src, mv_fields, mv_table);
3052+ COPY_BIT_FIELD(dest, src, mv_fields, two_mv_block_pattern_table);
3053+ COPY_BIT_FIELD(dest, src, mv_fields, four_mv_switch);
3054+ COPY_BIT_FIELD(dest, src, mv_fields, four_mv_block_pattern_table);
3055+ COPY_BIT_FIELD(dest, src, mv_fields, extended_mv_flag);
3056+ COPY_BIT_FIELD(dest, src, mv_fields, extended_mv_range);
3057+ COPY_BIT_FIELD(dest, src, mv_fields, extended_dmv_flag);
3058+ COPY_BIT_FIELD(dest, src, mv_fields, extended_dmv_range);
3059+ dest->BFV(pic_quantizer_fields, value) = 0; /* reset all bits */
3060+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, dquant);
3061+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, quantizer);
3062+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, half_qp);
3063+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, pic_quantizer_scale);
3064+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, pic_quantizer_type);
3065+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, dq_frame);
3066+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, dq_profile);
3067+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, dq_sb_edge);
3068+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, dq_db_edge);
3069+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, dq_binary_level);
3070+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, alt_pic_quantizer);
3071+ dest->BFV(transform_fields, value) = 0; /* reset all bits */
3072+ COPY_BIT_FIELD(dest, src, transform_fields, variable_sized_transform_flag);
3073+ COPY_BIT_FIELD(dest, src, transform_fields, mb_level_transform_type_flag);
3074+ COPY_BIT_FIELD(dest, src, transform_fields, frame_level_transform_type);
3075+ COPY_BIT_FIELD(dest, src, transform_fields, transform_ac_codingset_idx1);
3076+ COPY_BIT_FIELD(dest, src, transform_fields, transform_ac_codingset_idx2);
3077+ COPY_BIT_FIELD(dest, src, transform_fields, intra_transform_dc_table);
3078+
3079+ if (src->picture_fields.bits.picture_type == 4) {
3080+ dest->BFM(picture_fields, bits, picture_type) = 1; /* P-frame */
3081+ ctx->skip_frame = 1;
3082+ }
3083+
3084+ return VA_STATUS_SUCCESS;
3085+}
3086+
3087+static VAStatus TRANSLATE(PictureParameter,MPEG2)(
3088+ VACompatContextP ctx,
3089+ void *dest_buffer,
3090+ const void *src_buffer
3091+)
3092+{
3093+ STRUCT(PictureParameter,MPEG2) *dest = dest_buffer;
3094+ const VAPictureParameterBufferMPEG2 *src = src_buffer;
3095+
3096+ COPY_FIELD(dest, src, horizontal_size);
3097+ COPY_FIELD(dest, src, vertical_size);
3098+ COPY_FIELD(dest, src, forward_reference_picture);
3099+ COPY_FIELD(dest, src, backward_reference_picture);
3100+ COPY_FIELD(dest, src, picture_coding_type);
3101+ COPY_FIELD(dest, src, f_code);
3102+ dest->BFV(picture_coding_extension, value) = 0; /* reset all bits */
3103+ COPY_BIT_FIELD(dest, src, picture_coding_extension, intra_dc_precision);
3104+ COPY_BIT_FIELD(dest, src, picture_coding_extension, picture_structure);
3105+ COPY_BIT_FIELD(dest, src, picture_coding_extension, top_field_first);
3106+ COPY_BIT_FIELD(dest, src, picture_coding_extension, frame_pred_frame_dct);
3107+ COPY_BIT_FIELD(dest, src, picture_coding_extension, concealment_motion_vectors);
3108+ COPY_BIT_FIELD(dest, src, picture_coding_extension, q_scale_type);
3109+ COPY_BIT_FIELD(dest, src, picture_coding_extension, intra_vlc_format);
3110+ COPY_BIT_FIELD(dest, src, picture_coding_extension, alternate_scan);
3111+ COPY_BIT_FIELD(dest, src, picture_coding_extension, repeat_first_field);
3112+ COPY_BIT_FIELD(dest, src, picture_coding_extension, progressive_frame);
3113+ COPY_BIT_FIELD(dest, src, picture_coding_extension, is_first_field);
3114+
3115+ return VA_STATUS_SUCCESS;
3116+}
3117+
3118+static VAStatus TRANSLATE(SliceParameter,MPEG2)(
3119+ VACompatContextP ctx,
3120+ void *dest_buffer,
3121+ const void *src_buffer
3122+)
3123+{
3124+ STRUCT(SliceParameter,MPEG2) *dest = dest_buffer;
3125+ const VASliceParameterBufferMPEG2 *src = src_buffer;
3126+
3127+ COPY_FIELD(dest, src, slice_data_size);
3128+ COPY_FIELD(dest, src, slice_data_offset);
3129+ COPY_FIELD(dest, src, slice_data_flag);
3130+ COPY_FIELD(dest, src, macroblock_offset);
3131+ COPY_FIELD(dest, src, slice_vertical_position);
3132+ COPY_FIELD(dest, src, quantiser_scale_code);
3133+ COPY_FIELD(dest, src, intra_slice_flag);
3134+
3135+ return VA_STATUS_SUCCESS;
3136+}
3137+#endif
3138+
3139+static VAStatus TRANSLATE(PictureParameter,MPEG4)(
3140+ VACompatContextP ctx,
3141+ void *dest_buffer,
3142+ const void *src_buffer
3143+)
3144+{
3145+ STRUCT(PictureParameter,MPEG4) *dest = dest_buffer;
3146+ const VAPictureParameterBufferMPEG4 *src = src_buffer;
3147+
3148+ COPY_FIELD(dest, src, vop_width);
3149+ COPY_FIELD(dest, src, vop_height);
3150+ COPY_FIELD(dest, src, forward_reference_picture);
3151+ COPY_FIELD(dest, src, backward_reference_picture);
3152+ dest->BFV(vol_fields, value) = 0; /* reset all bits */
3153+ COPY_BIT_FIELD(dest, src, vol_fields, short_video_header);
3154+ COPY_BIT_FIELD(dest, src, vol_fields, chroma_format);
3155+ COPY_BIT_FIELD(dest, src, vol_fields, interlaced);
3156+ COPY_BIT_FIELD(dest, src, vol_fields, obmc_disable);
3157+ COPY_BIT_FIELD(dest, src, vol_fields, sprite_enable);
3158+ COPY_BIT_FIELD(dest, src, vol_fields, sprite_warping_accuracy);
3159+ COPY_BIT_FIELD(dest, src, vol_fields, quant_type);
3160+ COPY_BIT_FIELD(dest, src, vol_fields, quarter_sample);
3161+ COPY_BIT_FIELD(dest, src, vol_fields, data_partitioned);
3162+ COPY_BIT_FIELD(dest, src, vol_fields, reversible_vlc);
3163+ COPY_FIELD(dest, src, no_of_sprite_warping_points);
3164+ COPY_ARRAY(dest, src, sprite_trajectory_du);
3165+ COPY_ARRAY(dest, src, sprite_trajectory_dv);
3166+ COPY_FIELD(dest, src, quant_precision);
3167+ dest->BFV(vop_fields, value) = 0; /* reset all bits */
3168+ COPY_BIT_FIELD(dest, src, vop_fields, vop_coding_type);
3169+ COPY_BIT_FIELD(dest, src, vop_fields, backward_reference_vop_coding_type);
3170+ COPY_BIT_FIELD(dest, src, vop_fields, vop_rounding_type);
3171+ COPY_BIT_FIELD(dest, src, vop_fields, intra_dc_vlc_thr);
3172+ COPY_BIT_FIELD(dest, src, vop_fields, top_field_first);
3173+ COPY_BIT_FIELD(dest, src, vop_fields, alternate_vertical_scan_flag);
3174+ COPY_FIELD(dest, src, vop_fcode_forward);
3175+ COPY_FIELD(dest, src, vop_fcode_backward);
3176+ COPY_FIELD(dest, src, num_gobs_in_vop);
3177+ COPY_FIELD(dest, src, num_macroblocks_in_gob);
3178+ COPY_FIELD(dest, src, TRB);
3179+ COPY_FIELD(dest, src, TRD);
3180+
3181+ return VA_STATUS_SUCCESS;
3182+}
3183+
3184+#if COMPAT_MAJOR == 0 && COMPAT_MINOR == 30
3185+static VAStatus TRANSLATE_(VAEncSliceParameterBuffer)(
3186+ VACompatContextP ctx,
3187+ void *dest_buffer,
3188+ const void *src_buffer
3189+)
3190+{
3191+ MKCOMPAT(VAEncSliceParameterBuffer) * const dest = dest_buffer;
3192+ const VAEncSliceParameterBuffer * const src = src_buffer;
3193+
3194+ COPY_FIELD(dest, src, start_row_number);
3195+ COPY_FIELD(dest, src, slice_height);
3196+ dest->BFV(slice_flags, value) = 0; /* reset all bits */
3197+ COPY_BIT_FIELD(dest, src, slice_flags, is_intra);
3198+ COPY_BIT_FIELD(dest, src, slice_flags, disable_deblocking_filter_idc);
3199+
3200+ return VA_STATUS_SUCCESS;
3201+}
3202+#endif
3203+
3204+static void TRANSLATE_(VADriverContext)(
3205+ VACompatContext *dest,
3206+ const struct MKCOMPAT(VADriverContext) *src
3207+)
3208+{
3209+ VACompatDriverVTable *dest_vtable = &dest->vtable;
3210+ const struct MKCOMPAT(VADriverVTable) *src_vtable = &src->vtable;
3211+
3212+ memset(dest_vtable, 0, sizeof(*dest_vtable));
3213+ COPY_VTABLE(dest, src, vaTerminate);
3214+ COPY_VTABLE(dest, src, vaQueryConfigProfiles);
3215+ COPY_VTABLE(dest, src, vaQueryConfigEntrypoints);
3216+ COPY_VTABLE(dest, src, vaGetConfigAttributes);
3217+ COPY_VTABLE(dest, src, vaCreateConfig);
3218+ COPY_VTABLE(dest, src, vaDestroyConfig);
3219+ COPY_VTABLE(dest, src, vaQueryConfigAttributes);
3220+ COPY_VTABLE(dest, src, vaCreateSurfaces);
3221+ COPY_VTABLE(dest, src, vaDestroySurfaces);
3222+ COPY_VTABLE(dest, src, vaCreateContext);
3223+ COPY_VTABLE(dest, src, vaDestroyContext);
3224+ COPY_VTABLE(dest, src, vaCreateBuffer);
3225+ COPY_VTABLE(dest, src, vaBufferSetNumElements);
3226+ COPY_VTABLE(dest, src, vaMapBuffer);
3227+ COPY_VTABLE(dest, src, vaUnmapBuffer);
3228+ COPY_VTABLE(dest, src, vaDestroyBuffer);
3229+ COPY_VTABLE(dest, src, vaBeginPicture);
3230+ COPY_VTABLE(dest, src, vaRenderPicture);
3231+ COPY_VTABLE(dest, src, vaEndPicture);
3232+ COPY_VTABLE(dest, src, vaQuerySurfaceStatus);
3233+ COPY_VTABLE(dest, src, vaPutSurface);
3234+ COPY_VTABLE(dest, src, vaQueryImageFormats);
3235+ COPY_VTABLE(dest, src, vaCreateImage);
3236+ COPY_VTABLE(dest, src, vaDeriveImage);
3237+ COPY_VTABLE(dest, src, vaDestroyImage);
3238+ COPY_VTABLE(dest, src, vaSetImagePalette);
3239+ COPY_VTABLE(dest, src, vaGetImage);
3240+ COPY_VTABLE(dest, src, vaQuerySubpictureFormats);
3241+ COPY_VTABLE(dest, src, vaCreateSubpicture);
3242+ COPY_VTABLE(dest, src, vaDestroySubpicture);
3243+ COPY_VTABLE(dest, src, vaSetSubpictureImage);
3244+ COPY_VTABLE(dest, src, vaSetSubpictureChromakey);
3245+ COPY_VTABLE(dest, src, vaSetSubpictureGlobalAlpha);
3246+ COPY_VTABLE(dest, src, vaDeassociateSubpicture);
3247+ COPY_VTABLE(dest, src, vaQueryDisplayAttributes);
3248+ COPY_VTABLE(dest, src, vaGetDisplayAttributes);
3249+ COPY_VTABLE(dest, src, vaSetDisplayAttributes);
3250+#if COMPAT_MAJOR == 0 && COMPAT_MINOR <= 29
3251+ COPY_VTABLE(dest, src, vaSetSubpicturePalette);
3252+ COPY_VTABLE(dest, src, vaDbgCopySurfaceToBuffer);
3253+#endif
3254+#if COMPAT_MAJOR == 0 && COMPAT_MINOR >= 30
3255+ COPY_VTABLE(dest, src, vaCreateSurfaceFromCIFrame);
3256+ COPY_VTABLE(dest, src, vaCreateSurfaceFromV4L2Buf);
3257+ COPY_VTABLE(dest, src, vaCopySurfaceToBuffer);
3258+#endif
3259+#if COMPAT_MAJOR == 0 && COMPAT_MINOR >= 31
3260+ COPY_VTABLE(dest, src, vaSyncSurface);
3261+ COPY_VTABLE(dest, src, vaPutImage);
3262+ COPY_VTABLE(dest, src, vaAssociateSubpicture);
3263+#else
3264+ COPY_VTABLE_(dest, pre31, src, vaSyncSurface);
3265+ COPY_VTABLE_(dest, pre31, src, vaPutImage);
3266+ COPY_VTABLE_(dest, pre31, src, vaPutImage2);
3267+ COPY_VTABLE_(dest, pre31, src, vaAssociateSubpicture);
3268+ COPY_VTABLE_(dest, pre31, src, vaAssociateSubpicture2);
3269+#endif
3270+}
3271+
3272+#undef COMPAT_MAJOR
3273+#undef COMPAT_MINOR