OSDN Git Service

Fix interface revision of dummy driver.
[android-x86/hardware-intel-common-libva.git] / dummy_drv_video / dummy_drv_video.c
1 /*
2  * Copyright (c) 2007 Intel Corporation. All Rights Reserved.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the
6  * "Software"), to deal in the Software without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sub license, and/or sell copies of the Software, and to
9  * permit persons to whom the Software is furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the
13  * next paragraph) shall be included in all copies or substantial portions
14  * of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24
25 #include "va_backend.h"
26
27 #include "dummy_drv_video.h"
28
29 #include "assert.h"
30 #include <stdio.h>
31 #include <string.h>
32 #include <stdarg.h>
33
34 #define ASSERT  assert
35
36 #define INIT_DRIVER_DATA        struct dummy_driver_data *driver_data = (struct dummy_driver_data *) ctx->pDriverData;
37
38 #define CONFIG(id)  ((object_config_p) object_heap_lookup( &driver_data->config_heap, id ))
39 #define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id ))
40 #define SURFACE(id)     ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id ))
41 #define BUFFER(id)  ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id ))
42
43 #define CONFIG_ID_OFFSET                0x01000000
44 #define CONTEXT_ID_OFFSET               0x02000000
45 #define SURFACE_ID_OFFSET               0x04000000
46 #define BUFFER_ID_OFFSET                0x08000000
47
48 static void dummy__error_message(const char *msg, ...)
49 {
50     va_list args;
51
52     fprintf(stderr, "dummy_drv_video error: ");
53     va_start(args, msg);
54     vfprintf(stderr, msg, args);
55     va_end(args);
56 }
57
58 static void dummy__information_message(const char *msg, ...)
59 {
60     va_list args;
61
62     fprintf(stderr, "dummy_drv_video: ");
63     va_start(args, msg);
64     vfprintf(stderr, msg, args);
65     va_end(args);
66 }
67
68 VAStatus dummy_QueryConfigProfiles(
69                 VADriverContextP ctx,
70                 VAProfile *profile_list,        /* out */
71                 int *num_profiles                       /* out */
72         )
73 {
74     INIT_DRIVER_DATA
75     int i = 0;
76
77     profile_list[i++] = VAProfileMPEG2Simple;
78     profile_list[i++] = VAProfileMPEG2Main;
79     profile_list[i++] = VAProfileMPEG4Simple;
80     profile_list[i++] = VAProfileMPEG4AdvancedSimple;
81     profile_list[i++] = VAProfileMPEG4Main;
82     profile_list[i++] = VAProfileH264Baseline;
83     profile_list[i++] = VAProfileH264Main;
84     profile_list[i++] = VAProfileH264High;
85     profile_list[i++] = VAProfileVC1Simple;
86     profile_list[i++] = VAProfileVC1Main;
87     profile_list[i++] = VAProfileVC1Advanced;
88
89     /* If the assert fails then DUMMY_MAX_PROFILES needs to be bigger */
90     ASSERT(i <= DUMMY_MAX_PROFILES);
91     *num_profiles = i;
92
93     return VA_STATUS_SUCCESS;
94 }
95
96 VAStatus dummy_QueryConfigEntrypoints(
97                 VADriverContextP ctx,
98                 VAProfile profile,
99                 VAEntrypoint  *entrypoint_list, /* out */
100                 int *num_entrypoints            /* out */
101         )
102 {
103     INIT_DRIVER_DATA
104
105     switch (profile) {
106         case VAProfileMPEG2Simple:
107         case VAProfileMPEG2Main:
108                 *num_entrypoints = 2;
109                 entrypoint_list[0] = VAEntrypointVLD;
110                 entrypoint_list[1] = VAEntrypointMoComp;
111                 break;
112
113         case VAProfileMPEG4Simple:
114         case VAProfileMPEG4AdvancedSimple:
115         case VAProfileMPEG4Main:
116                 *num_entrypoints = 1;
117                 entrypoint_list[0] = VAEntrypointVLD;
118                 break;
119
120         case VAProfileH264Baseline:
121         case VAProfileH264Main:
122         case VAProfileH264High:
123                 *num_entrypoints = 1;
124                 entrypoint_list[0] = VAEntrypointVLD;
125                 break;
126
127         case VAProfileVC1Simple:
128         case VAProfileVC1Main:
129         case VAProfileVC1Advanced:
130                 *num_entrypoints = 1;
131                 entrypoint_list[0] = VAEntrypointVLD;
132                 break;
133
134         default:
135                 *num_entrypoints = 0;
136                 break;
137     }
138
139     /* If the assert fails then DUMMY_MAX_ENTRYPOINTS needs to be bigger */
140     ASSERT(*num_entrypoints <= DUMMY_MAX_ENTRYPOINTS);
141     return VA_STATUS_SUCCESS;
142 }
143
144 VAStatus dummy_GetConfigAttributes(
145                 VADriverContextP ctx,
146                 VAProfile profile,
147                 VAEntrypoint entrypoint,
148                 VAConfigAttrib *attrib_list,    /* in/out */
149                 int num_attribs
150         )
151 {
152     INIT_DRIVER_DATA
153
154     int i;
155
156     /* Other attributes don't seem to be defined */
157     /* What to do if we don't know the attribute? */
158     for (i = 0; i < num_attribs; i++)
159     {
160         switch (attrib_list[i].type)
161         {
162           case VAConfigAttribRTFormat:
163               attrib_list[i].value = VA_RT_FORMAT_YUV420;
164               break;
165
166           default:
167               /* Do nothing */
168               attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
169               break;
170         }
171     }
172
173     return VA_STATUS_SUCCESS;
174 }
175
176 static VAStatus dummy__update_attribute(object_config_p obj_config, VAConfigAttrib *attrib)
177 {
178     int i;
179     /* Check existing attrbiutes */
180     for(i = 0; obj_config->attrib_count < i; i++)
181     {
182         if (obj_config->attrib_list[i].type == attrib->type)
183         {
184             /* Update existing attribute */
185             obj_config->attrib_list[i].value = attrib->value;
186             return VA_STATUS_SUCCESS;
187         }
188     }
189     if (obj_config->attrib_count < DUMMY_MAX_CONFIG_ATTRIBUTES)
190     {
191         i = obj_config->attrib_count;
192         obj_config->attrib_list[i].type = attrib->type;
193         obj_config->attrib_list[i].value = attrib->value;
194         obj_config->attrib_count++;
195         return VA_STATUS_SUCCESS;
196     }
197     return VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
198 }
199
200 VAStatus dummy_CreateConfig(
201                 VADriverContextP ctx,
202                 VAProfile profile,
203                 VAEntrypoint entrypoint,
204                 VAConfigAttrib *attrib_list,
205                 int num_attribs,
206                 VAConfigID *config_id           /* out */
207         )
208 {
209     INIT_DRIVER_DATA
210     VAStatus vaStatus;
211     int configID;
212     object_config_p obj_config;
213     int i;
214
215     /* Validate profile & entrypoint */
216     switch (profile) {
217         case VAProfileMPEG2Simple:
218         case VAProfileMPEG2Main:
219                 if ((VAEntrypointVLD == entrypoint) ||
220                     (VAEntrypointMoComp == entrypoint))
221                 {
222                     vaStatus = VA_STATUS_SUCCESS;
223                 }
224                 else
225                 {
226                     vaStatus = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
227                 }
228                 break;
229
230         case VAProfileMPEG4Simple:
231         case VAProfileMPEG4AdvancedSimple:
232         case VAProfileMPEG4Main:
233                 if (VAEntrypointVLD == entrypoint)
234                 {
235                     vaStatus = VA_STATUS_SUCCESS;
236                 }
237                 else
238                 {
239                     vaStatus = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
240                 }
241                 break;
242
243         case VAProfileH264Baseline:
244         case VAProfileH264Main:
245         case VAProfileH264High:
246                 if (VAEntrypointVLD == entrypoint)
247                 {
248                     vaStatus = VA_STATUS_SUCCESS;
249                 }
250                 else
251                 {
252                     vaStatus = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
253                 }
254                 break;
255
256         case VAProfileVC1Simple:
257         case VAProfileVC1Main:
258         case VAProfileVC1Advanced:
259                 if (VAEntrypointVLD == entrypoint)
260                 {
261                     vaStatus = VA_STATUS_SUCCESS;
262                 }
263                 else
264                 {
265                     vaStatus = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
266                 }
267                 break;
268
269         default:
270                 vaStatus = VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
271                 break;
272     }
273
274     if (VA_STATUS_SUCCESS != vaStatus)
275     {
276         return vaStatus;
277     }
278
279     configID = object_heap_allocate( &driver_data->config_heap );
280     obj_config = CONFIG(configID);
281     if (NULL == obj_config)
282     {
283         vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
284         return vaStatus;
285     }
286
287     obj_config->profile = profile;
288     obj_config->entrypoint = entrypoint;
289     obj_config->attrib_list[0].type = VAConfigAttribRTFormat;
290     obj_config->attrib_list[0].value = VA_RT_FORMAT_YUV420;
291     obj_config->attrib_count = 1;
292
293     for(i = 0; i < num_attribs; i++)
294     {
295         vaStatus = dummy__update_attribute(obj_config, &(attrib_list[i]));
296         if (VA_STATUS_SUCCESS != vaStatus)
297         {
298             break;
299         }
300     }
301
302     /* Error recovery */
303     if (VA_STATUS_SUCCESS != vaStatus)
304     {
305         object_heap_free( &driver_data->config_heap, (object_base_p) obj_config);
306     }
307     else
308     {
309         *config_id = configID;
310     }
311
312     return vaStatus;
313 }
314
315 VAStatus dummy_DestroyConfig(
316                 VADriverContextP ctx,
317                 VAConfigID config_id
318         )
319 {
320     INIT_DRIVER_DATA
321     VAStatus vaStatus;
322     object_config_p obj_config;
323
324     obj_config = CONFIG(config_id);
325     if (NULL == obj_config)
326     {
327         vaStatus = VA_STATUS_ERROR_INVALID_CONFIG;
328         return vaStatus;
329     }
330
331     object_heap_free( &driver_data->config_heap, (object_base_p) obj_config);
332     return VA_STATUS_SUCCESS;
333 }
334
335 VAStatus dummy_QueryConfigAttributes(
336                 VADriverContextP ctx,
337                 VAConfigID config_id,
338                 VAProfile *profile,             /* out */
339                 VAEntrypoint *entrypoint,       /* out */
340                 VAConfigAttrib *attrib_list,    /* out */
341                 int *num_attribs                /* out */
342         )
343 {
344     INIT_DRIVER_DATA
345     VAStatus vaStatus = VA_STATUS_SUCCESS;
346     object_config_p obj_config;
347     int i;
348
349     obj_config = CONFIG(config_id);
350     ASSERT(obj_config);
351
352     *profile = obj_config->profile;
353     *entrypoint = obj_config->entrypoint;
354     *num_attribs =  obj_config->attrib_count;
355     for(i = 0; i < obj_config->attrib_count; i++)
356     {
357         attrib_list[i] = obj_config->attrib_list[i];
358     }
359
360     return vaStatus;
361 }
362
363 VAStatus dummy_CreateSurfaces(
364                 VADriverContextP ctx,
365                 int width,
366                 int height,
367                 int format,
368                 int num_surfaces,
369                 VASurfaceID *surfaces           /* out */
370         )
371 {
372     INIT_DRIVER_DATA
373     VAStatus vaStatus = VA_STATUS_SUCCESS;
374     int i;
375
376     /* We only support one format */
377     if (VA_RT_FORMAT_YUV420 != format)
378     {
379         return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT;
380     }
381
382     for (i = 0; i < num_surfaces; i++)
383     {
384         int surfaceID = object_heap_allocate( &driver_data->surface_heap );
385         object_surface_p obj_surface = SURFACE(surfaceID);
386         if (NULL == obj_surface)
387         {
388             vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
389             break;
390         }
391         obj_surface->surface_id = surfaceID;
392         surfaces[i] = surfaceID;
393     }
394
395     /* Error recovery */
396     if (VA_STATUS_SUCCESS != vaStatus)
397     {
398         /* surfaces[i-1] was the last successful allocation */
399         for(; i--; )
400         {
401             object_surface_p obj_surface = SURFACE(surfaces[i]);
402             surfaces[i] = VA_INVALID_SURFACE;
403             ASSERT(obj_surface);
404             object_heap_free( &driver_data->surface_heap, (object_base_p) obj_surface);
405         }
406     }
407
408     return vaStatus;
409 }
410
411 VAStatus dummy_DestroySurfaces(
412                 VADriverContextP ctx,
413                 VASurfaceID *surface_list,
414                 int num_surfaces
415         )
416 {
417     INIT_DRIVER_DATA
418     int i;
419     for(i = num_surfaces; i--; )
420     {
421         object_surface_p obj_surface = SURFACE(surface_list[i]);
422         ASSERT(obj_surface);
423         object_heap_free( &driver_data->surface_heap, (object_base_p) obj_surface);
424     }
425     return VA_STATUS_SUCCESS;
426 }
427
428 VAStatus dummy_QueryImageFormats(
429         VADriverContextP ctx,
430         VAImageFormat *format_list,        /* out */
431         int *num_formats           /* out */
432 )
433 {
434     INIT_DRIVER_DATA
435     
436     /* TODO */
437     return VA_STATUS_SUCCESS;
438 }
439
440 VAStatus dummy_CreateImage(
441         VADriverContextP ctx,
442         VAImageFormat *format,
443         int width,
444         int height,
445         VAImage *image     /* out */
446 )
447 {
448     INIT_DRIVER_DATA
449     
450     /* TODO */
451     return VA_STATUS_SUCCESS;
452 }
453
454 VAStatus dummy_DeriveImage(
455         VADriverContextP ctx,
456         VASurfaceID surface,
457         VAImage *image     /* out */
458 )
459 {
460     INIT_DRIVER_DATA
461     
462     /* TODO */
463     return VA_STATUS_SUCCESS;
464 }
465
466 VAStatus dummy_DestroyImage(
467         VADriverContextP ctx,
468         VAImageID image
469 )
470 {
471     INIT_DRIVER_DATA
472     
473     /* TODO */
474     return VA_STATUS_SUCCESS;
475 }
476
477 VAStatus dummy_SetImagePalette(
478         VADriverContextP ctx,
479         VAImageID image,
480         unsigned char *palette
481 )
482 {
483     INIT_DRIVER_DATA
484     
485     /* TODO */
486     return VA_STATUS_SUCCESS;
487 }
488
489 VAStatus dummy_GetImage(
490         VADriverContextP ctx,
491         VASurfaceID surface,
492         int x,     /* coordinates of the upper left source pixel */
493         int y,
494         unsigned int width, /* width and height of the region */
495         unsigned int height,
496         VAImageID image
497 )
498 {
499     INIT_DRIVER_DATA
500     
501     /* TODO */
502     return VA_STATUS_SUCCESS;
503 }
504
505 VAStatus dummy_PutImage(
506         VADriverContextP ctx,
507         VASurfaceID surface,
508         VAImageID image,
509         int src_x,
510         int src_y,
511         unsigned int width,
512         unsigned int height,
513         int dest_x,
514         int dest_y 
515 )
516 {
517     INIT_DRIVER_DATA
518     
519     /* TODO */
520     return VA_STATUS_SUCCESS;
521 }
522
523 VAStatus dummy_PutImage2(
524         VADriverContextP ctx,
525         VASurfaceID surface,
526         VAImageID image,
527         int src_x,
528         int src_y,
529         unsigned int src_width,
530         unsigned int src_height,
531         int dest_x,
532         int dest_y,
533         unsigned int dest_width,
534         unsigned int dest_height
535 )
536 {
537     INIT_DRIVER_DATA
538     
539     /* TODO */
540     return VA_STATUS_SUCCESS;
541 }
542
543 VAStatus dummy_QuerySubpictureFormats(
544         VADriverContextP ctx,
545         VAImageFormat *format_list,        /* out */
546         unsigned int *flags,       /* out */
547         unsigned int *num_formats  /* out */
548 )
549 {
550     INIT_DRIVER_DATA
551     
552     /* TODO */
553     return VA_STATUS_SUCCESS;
554 }
555
556 VAStatus dummy_CreateSubpicture(
557         VADriverContextP ctx,
558         VAImageID image,
559         VASubpictureID *subpicture   /* out */
560 )
561 {
562     INIT_DRIVER_DATA
563     
564     /* TODO */
565     return VA_STATUS_SUCCESS;
566 }
567
568 VAStatus dummy_DestroySubpicture(
569         VADriverContextP ctx,
570         VASubpictureID subpicture
571 )
572 {
573     INIT_DRIVER_DATA
574     
575     /* TODO */
576     return VA_STATUS_SUCCESS;
577 }
578
579 VAStatus dummy_SetSubpictureImage(
580         VADriverContextP ctx,
581         VASubpictureID subpicture,
582         VAImageID image
583 )
584 {
585     INIT_DRIVER_DATA
586     
587     /* TODO */
588     return VA_STATUS_SUCCESS;
589 }
590
591 VAStatus dummy_SetSubpicturePalette(
592         VADriverContextP ctx,
593         VASubpictureID subpicture,
594         /*
595          * pointer to an array holding the palette data.  The size of the array is
596          * num_palette_entries * entry_bytes in size.  The order of the components
597          * in the palette is described by the component_order in VASubpicture struct
598          */
599         unsigned char *palette
600 )
601 {
602     INIT_DRIVER_DATA
603     
604     /* TODO */
605     return VA_STATUS_SUCCESS;
606 }
607
608 VAStatus dummy_SetSubpictureChromakey(
609         VADriverContextP ctx,
610         VASubpictureID subpicture,
611         unsigned int chromakey_min,
612         unsigned int chromakey_max,
613         unsigned int chromakey_mask
614 )
615 {
616     INIT_DRIVER_DATA
617     
618     /* TODO */
619     return VA_STATUS_SUCCESS;
620 }
621
622 VAStatus dummy_SetSubpictureGlobalAlpha(
623         VADriverContextP ctx,
624         VASubpictureID subpicture,
625         float global_alpha 
626 )
627 {
628     INIT_DRIVER_DATA
629     
630     /* TODO */
631     return VA_STATUS_SUCCESS;
632 }
633
634 VAStatus dummy_AssociateSubpicture(
635         VADriverContextP ctx,
636         VASubpictureID subpicture,
637         VASurfaceID *target_surfaces,
638         int num_surfaces,
639         short src_x, /* upper left offset in subpicture */
640         short src_y,
641         short dest_x, /* upper left offset in surface */
642         short dest_y,
643         unsigned short width,
644         unsigned short height,
645         /*
646          * whether to enable chroma-keying or global-alpha
647          * see VA_SUBPICTURE_XXX values
648          */
649         unsigned int flags
650 )
651 {
652     INIT_DRIVER_DATA
653     
654     /* TODO */
655     return VA_STATUS_SUCCESS;
656 }
657
658 VAStatus dummy_AssociateSubpicture2(
659         VADriverContextP ctx,
660         VASubpictureID subpicture,
661         VASurfaceID *target_surfaces,
662         int num_surfaces,
663         short src_x, /* upper left offset in subpicture */
664         short src_y,
665         unsigned short src_width,
666         unsigned short src_height,
667         short dest_x, /* upper left offset in surface */
668         short dest_y,
669         unsigned short dest_width,
670         unsigned short dest_height,
671         /*
672          * whether to enable chroma-keying or global-alpha
673          * see VA_SUBPICTURE_XXX values
674          */
675         unsigned int flags
676 )
677 {
678     INIT_DRIVER_DATA
679     
680     /* TODO */
681     return VA_STATUS_SUCCESS;
682 }
683
684 VAStatus dummy_DeassociateSubpicture(
685         VADriverContextP ctx,
686         VASubpictureID subpicture,
687         VASurfaceID *target_surfaces,
688         int num_surfaces
689 )
690 {
691     INIT_DRIVER_DATA
692     
693     /* TODO */
694     return VA_STATUS_SUCCESS;
695 }
696
697 VAStatus dummy_CreateContext(
698                 VADriverContextP ctx,
699                 VAConfigID config_id,
700                 int picture_width,
701                 int picture_height,
702                 int flag,
703                 VASurfaceID *render_targets,
704                 int num_render_targets,
705                 VAContextID *context            /* out */
706         )
707 {
708     INIT_DRIVER_DATA
709     VAStatus vaStatus = VA_STATUS_SUCCESS;
710     object_config_p obj_config;
711     int i;
712
713     obj_config = CONFIG(config_id);
714     if (NULL == obj_config)
715     {
716         vaStatus = VA_STATUS_ERROR_INVALID_CONFIG;
717         return vaStatus;
718     }
719
720     /* Validate flag */
721     /* Validate picture dimensions */
722
723     int contextID = object_heap_allocate( &driver_data->context_heap );
724     object_context_p obj_context = CONTEXT(contextID);
725     if (NULL == obj_context)
726     {
727         vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
728         return vaStatus;
729     }
730
731     obj_context->context_id  = contextID;
732     *context = contextID;
733     obj_context->current_render_target = -1;
734     obj_context->config_id = config_id;
735     obj_context->picture_width = picture_width;
736     obj_context->picture_height = picture_height;
737     obj_context->num_render_targets = num_render_targets;
738     obj_context->render_targets = (VASurfaceID *) malloc(num_render_targets * sizeof(VASurfaceID));
739     for(i = 0; i < num_render_targets; i++)
740     {
741         if (NULL == SURFACE(render_targets[i]))
742         {
743             vaStatus = VA_STATUS_ERROR_INVALID_SURFACE;
744             break;
745         }
746         obj_context->render_targets[i] = render_targets[i];
747     }
748     obj_context->flags = flag;
749
750     /* Error recovery */
751     if (VA_STATUS_SUCCESS != vaStatus)
752     {
753         obj_context->context_id = -1;
754         obj_context->config_id = -1;
755         free(obj_context->render_targets);
756         obj_context->render_targets = NULL;
757         obj_context->num_render_targets = 0;
758         obj_context->flags = 0;
759         object_heap_free( &driver_data->context_heap, (object_base_p) obj_context);
760     }
761
762     return vaStatus;
763 }
764
765
766 VAStatus dummy_DestroyContext(
767                 VADriverContextP ctx,
768                 VAContextID context
769         )
770 {
771     INIT_DRIVER_DATA
772     object_context_p obj_context = CONTEXT(context);
773     ASSERT(obj_context);
774
775     obj_context->context_id = -1;
776     obj_context->config_id = -1;
777     obj_context->picture_width = 0;
778     obj_context->picture_height = 0;
779     if (obj_context->render_targets)
780     {
781         free(obj_context->render_targets);
782     }
783     obj_context->render_targets = NULL;
784     obj_context->num_render_targets = 0;
785     obj_context->flags = 0;
786
787     obj_context->current_render_target = -1;
788
789     object_heap_free( &driver_data->context_heap, (object_base_p) obj_context);
790
791     return VA_STATUS_SUCCESS;
792 }
793
794
795
796 static VAStatus dummy__allocate_buffer(object_buffer_p obj_buffer, int size)
797 {
798     VAStatus vaStatus = VA_STATUS_SUCCESS;
799
800     obj_buffer->buffer_data = realloc(obj_buffer->buffer_data, size);
801     if (NULL == obj_buffer->buffer_data)
802     {
803         vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
804     }
805     return vaStatus;
806 }
807
808 VAStatus dummy_CreateBuffer(
809                 VADriverContextP ctx,
810                 VAContextID context,    /* in */
811                 VABufferType type,      /* in */
812                 unsigned int size,              /* in */
813                 unsigned int num_elements,      /* in */
814                 void *data,                     /* in */
815                 VABufferID *buf_id              /* out */
816 )
817 {
818     INIT_DRIVER_DATA
819     VAStatus vaStatus = VA_STATUS_SUCCESS;
820     int bufferID;
821     object_buffer_p obj_buffer;
822
823     /* Validate type */
824     switch (type)
825     {
826         case VAPictureParameterBufferType:
827         case VAIQMatrixBufferType:
828         case VABitPlaneBufferType:
829         case VASliceGroupMapBufferType:
830         case VASliceParameterBufferType:
831         case VASliceDataBufferType:
832         case VAMacroblockParameterBufferType:
833         case VAResidualDataBufferType:
834         case VADeblockingParameterBufferType:
835         case VAImageBufferType:
836             /* Ok */
837             break;
838         default:
839             vaStatus = VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE;
840             return vaStatus;
841     }
842
843     bufferID = object_heap_allocate( &driver_data->buffer_heap );
844     obj_buffer = BUFFER(bufferID);
845     if (NULL == obj_buffer)
846     {
847         vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
848         return vaStatus;
849     }
850
851     obj_buffer->buffer_data = NULL;
852
853     vaStatus = dummy__allocate_buffer(obj_buffer, size * num_elements);
854     if (VA_STATUS_SUCCESS == vaStatus)
855     {
856         obj_buffer->max_num_elements = num_elements;
857         obj_buffer->num_elements = num_elements;
858         if (data)
859         {
860             memcpy(obj_buffer->buffer_data, data, size * num_elements);
861         }
862     }
863
864     if (VA_STATUS_SUCCESS == vaStatus)
865     {
866         *buf_id = bufferID;
867     }
868
869     return vaStatus;
870 }
871
872
873 VAStatus dummy_BufferSetNumElements(
874                 VADriverContextP ctx,
875                 VABufferID buf_id,      /* in */
876         unsigned int num_elements       /* in */
877         )
878 {
879     INIT_DRIVER_DATA
880     VAStatus vaStatus = VA_STATUS_SUCCESS;
881     object_buffer_p obj_buffer = BUFFER(buf_id);
882     ASSERT(obj_buffer);
883
884     if ((num_elements < 0) || (num_elements > obj_buffer->max_num_elements))
885     {
886         vaStatus = VA_STATUS_ERROR_UNKNOWN;
887     }
888     if (VA_STATUS_SUCCESS == vaStatus)
889     {
890         obj_buffer->num_elements = num_elements;
891     }
892
893     return vaStatus;
894 }
895
896 VAStatus dummy_MapBuffer(
897                 VADriverContextP ctx,
898                 VABufferID buf_id,      /* in */
899                 void **pbuf         /* out */
900         )
901 {
902     INIT_DRIVER_DATA
903     VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN;
904     object_buffer_p obj_buffer = BUFFER(buf_id);
905     ASSERT(obj_buffer);
906     if (NULL == obj_buffer)
907     {
908         vaStatus = VA_STATUS_ERROR_INVALID_BUFFER;
909         return vaStatus;
910     }
911
912     if (NULL != obj_buffer->buffer_data)
913     {
914         *pbuf = obj_buffer->buffer_data;
915         vaStatus = VA_STATUS_SUCCESS;
916     }
917     return vaStatus;
918 }
919
920 VAStatus dummy_UnmapBuffer(
921                 VADriverContextP ctx,
922                 VABufferID buf_id       /* in */
923         )
924 {
925     /* Do nothing */
926     return VA_STATUS_SUCCESS;
927 }
928
929 static void dummy__destroy_buffer(struct dummy_driver_data *driver_data, object_buffer_p obj_buffer)
930 {
931     if (NULL != obj_buffer->buffer_data)
932     {
933         free(obj_buffer->buffer_data);
934         obj_buffer->buffer_data = NULL;
935     }
936
937     object_heap_free( &driver_data->buffer_heap, (object_base_p) obj_buffer);
938 }
939
940 VAStatus dummy_DestroyBuffer(
941                 VADriverContextP ctx,
942                 VABufferID buffer_id
943         )
944 {
945     INIT_DRIVER_DATA
946     object_buffer_p obj_buffer = BUFFER(buffer_id);
947     ASSERT(obj_buffer);
948
949     dummy__destroy_buffer(driver_data, obj_buffer);
950     return VA_STATUS_SUCCESS;
951 }
952
953 VAStatus dummy_BeginPicture(
954                 VADriverContextP ctx,
955                 VAContextID context,
956                 VASurfaceID render_target
957         )
958 {
959     INIT_DRIVER_DATA
960     VAStatus vaStatus = VA_STATUS_SUCCESS;
961     object_context_p obj_context;
962     object_surface_p obj_surface;
963
964     obj_context = CONTEXT(context);
965     ASSERT(obj_context);
966
967     obj_surface = SURFACE(render_target);
968     ASSERT(obj_surface);
969
970     obj_context->current_render_target = obj_surface->base.id;
971
972     return vaStatus;
973 }
974
975 VAStatus dummy_RenderPicture(
976                 VADriverContextP ctx,
977                 VAContextID context,
978                 VABufferID *buffers,
979                 int num_buffers
980         )
981 {
982     INIT_DRIVER_DATA
983     VAStatus vaStatus = VA_STATUS_SUCCESS;
984     object_context_p obj_context;
985     object_surface_p obj_surface;
986     int i;
987
988     obj_context = CONTEXT(context);
989     ASSERT(obj_context);
990
991     obj_surface = SURFACE(obj_context->current_render_target);
992     ASSERT(obj_surface);
993
994     /* verify that we got valid buffer references */
995     for(i = 0; i < num_buffers; i++)
996     {
997         object_buffer_p obj_buffer = BUFFER(buffers[i]);
998         ASSERT(obj_buffer);
999         if (NULL == obj_buffer)
1000         {
1001             vaStatus = VA_STATUS_ERROR_INVALID_BUFFER;
1002             break;
1003         }
1004     }
1005     
1006     /* Release buffers */
1007     for(i = 0; i < num_buffers; i++)
1008     {
1009         object_buffer_p obj_buffer = BUFFER(buffers[i]);
1010         ASSERT(obj_buffer);
1011         dummy__destroy_buffer(driver_data, obj_buffer);
1012     }
1013
1014     return vaStatus;
1015 }
1016
1017 VAStatus dummy_EndPicture(
1018                 VADriverContextP ctx,
1019                 VAContextID context
1020         )
1021 {
1022     INIT_DRIVER_DATA
1023     VAStatus vaStatus = VA_STATUS_SUCCESS;
1024     object_context_p obj_context;
1025     object_surface_p obj_surface;
1026
1027     obj_context = CONTEXT(context);
1028     ASSERT(obj_context);
1029
1030     obj_surface = SURFACE(obj_context->current_render_target);
1031     ASSERT(obj_surface);
1032
1033     // For now, assume that we are done with rendering right away
1034     obj_context->current_render_target = -1;
1035
1036     return vaStatus;
1037 }
1038
1039
1040 VAStatus dummy_SyncSurface(
1041                 VADriverContextP ctx,
1042                 VAContextID context,
1043                 VASurfaceID render_target
1044         )
1045 {
1046     INIT_DRIVER_DATA
1047     VAStatus vaStatus = VA_STATUS_SUCCESS;
1048     object_context_p obj_context;
1049     object_surface_p obj_surface;
1050
1051     obj_context = CONTEXT(context);
1052     ASSERT(obj_context);
1053
1054     obj_surface = SURFACE(render_target);
1055     ASSERT(obj_surface);
1056
1057     /* Assume that this shouldn't be called before vaEndPicture() */
1058     ASSERT( obj_context->current_render_target != obj_surface->base.id );
1059
1060     return vaStatus;
1061 }
1062
1063 VAStatus dummy_QuerySurfaceStatus(
1064                 VADriverContextP ctx,
1065                 VASurfaceID render_target,
1066                 VASurfaceStatus *status /* out */
1067         )
1068 {
1069     INIT_DRIVER_DATA
1070     VAStatus vaStatus = VA_STATUS_SUCCESS;
1071     object_surface_p obj_surface;
1072
1073     obj_surface = SURFACE(render_target);
1074     ASSERT(obj_surface);
1075
1076     *status = VASurfaceReady;
1077
1078     return vaStatus;
1079 }
1080
1081 VAStatus dummy_PutSurface(
1082                 VADriverContextP ctx,
1083                 VASurfaceID surface,
1084                 Drawable draw, /* X Drawable */
1085                 short srcx,
1086                 short srcy,
1087                 unsigned short srcw,
1088                 unsigned short srch,
1089                 short destx,
1090                 short desty,
1091                 unsigned short destw,
1092                 unsigned short desth,
1093                 VARectangle *cliprects, /* client supplied clip list */
1094                 unsigned int number_cliprects, /* number of clip rects in the clip list */
1095                 unsigned int flags /* de-interlacing flags */
1096         )
1097 {
1098     /* TODO */
1099     return VA_STATUS_ERROR_UNKNOWN;
1100 }
1101
1102 /* 
1103  * Query display attributes 
1104  * The caller must provide a "attr_list" array that can hold at
1105  * least vaMaxNumDisplayAttributes() entries. The actual number of attributes
1106  * returned in "attr_list" is returned in "num_attributes".
1107  */
1108 VAStatus dummy_QueryDisplayAttributes (
1109                 VADriverContextP ctx,
1110                 VADisplayAttribute *attr_list,  /* out */
1111                 int *num_attributes             /* out */
1112         )
1113 {
1114     /* TODO */
1115     return VA_STATUS_ERROR_UNKNOWN;
1116 }
1117
1118 /* 
1119  * Get display attributes 
1120  * This function returns the current attribute values in "attr_list".
1121  * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field
1122  * from vaQueryDisplayAttributes() can have their values retrieved.  
1123  */
1124 VAStatus dummy_GetDisplayAttributes (
1125                 VADriverContextP ctx,
1126                 VADisplayAttribute *attr_list,  /* in/out */
1127                 int num_attributes
1128         )
1129 {
1130     /* TODO */
1131     return VA_STATUS_ERROR_UNKNOWN;
1132 }
1133
1134 /* 
1135  * Set display attributes 
1136  * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field
1137  * from vaQueryDisplayAttributes() can be set.  If the attribute is not settable or 
1138  * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED
1139  */
1140 VAStatus dummy_SetDisplayAttributes (
1141                 VADriverContextP ctx,
1142                 VADisplayAttribute *attr_list,
1143                 int num_attributes
1144         )
1145 {
1146     /* TODO */
1147     return VA_STATUS_ERROR_UNKNOWN;
1148 }
1149
1150
1151 VAStatus dummy_DbgCopySurfaceToBuffer(
1152                 VADriverContextP ctx,
1153                 VASurfaceID surface,
1154                 void **buffer, /* out */
1155                 unsigned int *stride /* out */
1156         )
1157 {
1158     /* TODO */
1159     return VA_STATUS_ERROR_UNKNOWN;
1160 }
1161
1162 VAStatus dummy_Terminate( VADriverContextP ctx )
1163 {
1164     INIT_DRIVER_DATA
1165     object_buffer_p obj_buffer;
1166     object_surface_p obj_surface;
1167     object_context_p obj_context;
1168     object_config_p obj_config;
1169     object_heap_iterator iter;
1170
1171     /* Clean up left over buffers */
1172     obj_buffer = (object_buffer_p) object_heap_first( &driver_data->buffer_heap, &iter);
1173     while (obj_buffer)
1174     {
1175         dummy__information_message("vaTerminate: bufferID %08x still allocated, destroying\n", obj_buffer->base.id);
1176         dummy__destroy_buffer(driver_data, obj_buffer);
1177         obj_buffer = (object_buffer_p) object_heap_next( &driver_data->buffer_heap, &iter);
1178     }
1179     object_heap_destroy( &driver_data->buffer_heap );
1180
1181     /* TODO cleanup */
1182     object_heap_destroy( &driver_data->surface_heap );
1183
1184     /* TODO cleanup */
1185     object_heap_destroy( &driver_data->context_heap );
1186
1187     /* Clean up configIDs */
1188     obj_config = (object_config_p) object_heap_first( &driver_data->config_heap, &iter);
1189     while (obj_config)
1190     {
1191         object_heap_free( &driver_data->config_heap, (object_base_p) obj_config);
1192         obj_config = (object_config_p) object_heap_next( &driver_data->config_heap, &iter);
1193     }
1194     object_heap_destroy( &driver_data->config_heap );
1195
1196     free(ctx->pDriverData);
1197     ctx->pDriverData = NULL;
1198
1199     return VA_STATUS_SUCCESS;
1200 }
1201
1202 VAStatus __vaDriverInit_0_29(  VADriverContextP ctx )
1203 {
1204     object_base_p obj;
1205     int result;
1206     struct dummy_driver_data *driver_data;
1207     int i;
1208
1209     ctx->version_major = 0;
1210     ctx->version_minor = 29;
1211     ctx->max_profiles = DUMMY_MAX_PROFILES;
1212     ctx->max_entrypoints = DUMMY_MAX_ENTRYPOINTS;
1213     ctx->max_attributes = DUMMY_MAX_CONFIG_ATTRIBUTES;
1214     ctx->max_image_formats = DUMMY_MAX_IMAGE_FORMATS;
1215     ctx->max_subpic_formats = DUMMY_MAX_SUBPIC_FORMATS;
1216     ctx->max_display_attributes = DUMMY_MAX_DISPLAY_ATTRIBUTES;
1217     ctx->str_vendor = DUMMY_STR_VENDOR;
1218
1219     ctx->vtable.vaTerminate = dummy_Terminate;
1220     ctx->vtable.vaQueryConfigEntrypoints = dummy_QueryConfigEntrypoints;
1221     ctx->vtable.vaQueryConfigProfiles = dummy_QueryConfigProfiles;
1222     ctx->vtable.vaQueryConfigEntrypoints = dummy_QueryConfigEntrypoints;
1223     ctx->vtable.vaQueryConfigAttributes = dummy_QueryConfigAttributes;
1224     ctx->vtable.vaCreateConfig = dummy_CreateConfig;
1225     ctx->vtable.vaDestroyConfig = dummy_DestroyConfig;
1226     ctx->vtable.vaGetConfigAttributes = dummy_GetConfigAttributes;
1227     ctx->vtable.vaCreateSurfaces = dummy_CreateSurfaces;
1228     ctx->vtable.vaDestroySurfaces = dummy_DestroySurfaces;
1229     ctx->vtable.vaCreateContext = dummy_CreateContext;
1230     ctx->vtable.vaDestroyContext = dummy_DestroyContext;
1231     ctx->vtable.vaCreateBuffer = dummy_CreateBuffer;
1232     ctx->vtable.vaBufferSetNumElements = dummy_BufferSetNumElements;
1233     ctx->vtable.vaMapBuffer = dummy_MapBuffer;
1234     ctx->vtable.vaUnmapBuffer = dummy_UnmapBuffer;
1235     ctx->vtable.vaDestroyBuffer = dummy_DestroyBuffer;
1236     ctx->vtable.vaBeginPicture = dummy_BeginPicture;
1237     ctx->vtable.vaRenderPicture = dummy_RenderPicture;
1238     ctx->vtable.vaEndPicture = dummy_EndPicture;
1239     ctx->vtable.vaSyncSurface = dummy_SyncSurface;
1240     ctx->vtable.vaQuerySurfaceStatus = dummy_QuerySurfaceStatus;
1241     ctx->vtable.vaPutSurface = dummy_PutSurface;
1242     ctx->vtable.vaQueryImageFormats = dummy_QueryImageFormats;
1243     ctx->vtable.vaCreateImage = dummy_CreateImage;
1244     ctx->vtable.vaDeriveImage = dummy_DeriveImage;
1245     ctx->vtable.vaDestroyImage = dummy_DestroyImage;
1246     ctx->vtable.vaSetImagePalette = dummy_SetImagePalette;
1247     ctx->vtable.vaGetImage = dummy_GetImage;
1248     ctx->vtable.vaPutImage = dummy_PutImage;
1249     ctx->vtable.vaPutImage2 = dummy_PutImage2;
1250     ctx->vtable.vaQuerySubpictureFormats = dummy_QuerySubpictureFormats;
1251     ctx->vtable.vaCreateSubpicture = dummy_CreateSubpicture;
1252     ctx->vtable.vaDestroySubpicture = dummy_DestroySubpicture;
1253     ctx->vtable.vaSetSubpictureImage = dummy_SetSubpictureImage;
1254     ctx->vtable.vaSetSubpicturePalette = dummy_SetSubpicturePalette;
1255     ctx->vtable.vaSetSubpictureChromakey = dummy_SetSubpictureChromakey;
1256     ctx->vtable.vaSetSubpictureGlobalAlpha = dummy_SetSubpictureGlobalAlpha;
1257     ctx->vtable.vaAssociateSubpicture = dummy_AssociateSubpicture;
1258     ctx->vtable.vaAssociateSubpicture2 = dummy_AssociateSubpicture2;
1259     ctx->vtable.vaDeassociateSubpicture = dummy_DeassociateSubpicture;
1260     ctx->vtable.vaQueryDisplayAttributes = dummy_QueryDisplayAttributes;
1261     ctx->vtable.vaGetDisplayAttributes = dummy_GetDisplayAttributes;
1262     ctx->vtable.vaSetDisplayAttributes = dummy_SetDisplayAttributes;
1263     
1264     ctx->vtable.vaDbgCopySurfaceToBuffer = dummy_DbgCopySurfaceToBuffer;
1265
1266     driver_data = (struct dummy_driver_data *) malloc( sizeof(*driver_data) );
1267     ctx->pDriverData = (void *) driver_data;
1268
1269     result = object_heap_init( &driver_data->config_heap, sizeof(struct object_config), CONFIG_ID_OFFSET );
1270     ASSERT( result == 0 );
1271
1272     result = object_heap_init( &driver_data->context_heap, sizeof(struct object_context), CONTEXT_ID_OFFSET );
1273     ASSERT( result == 0 );
1274
1275     result = object_heap_init( &driver_data->surface_heap, sizeof(struct object_surface), SURFACE_ID_OFFSET );
1276     ASSERT( result == 0 );
1277
1278     result = object_heap_init( &driver_data->buffer_heap, sizeof(struct object_buffer), BUFFER_ID_OFFSET );
1279     ASSERT( result == 0 );
1280
1281
1282     return VA_STATUS_SUCCESS;
1283 }
1284