Update to VA API v0.25
[profile/ivi/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_DestroyImage(
455         VADriverContextP ctx,
456         VAImageID image
457 )
458 {
459     INIT_DRIVER_DATA
460     
461     /* TODO */
462     return VA_STATUS_SUCCESS;
463 }
464
465 VAStatus dummy_SetImagePalette(
466         VADriverContextP ctx,
467         VAImageID image,
468         unsigned char *palette
469 )
470 {
471     INIT_DRIVER_DATA
472     
473     /* TODO */
474     return VA_STATUS_SUCCESS;
475 }
476
477 VAStatus dummy_GetImage(
478         VADriverContextP ctx,
479         VASurfaceID surface,
480         int x,     /* coordinates of the upper left source pixel */
481         int y,
482         unsigned int width, /* width and height of the region */
483         unsigned int height,
484         VAImageID image
485 )
486 {
487     INIT_DRIVER_DATA
488     
489     /* TODO */
490     return VA_STATUS_SUCCESS;
491 }
492
493 VAStatus dummy_PutImage(
494         VADriverContextP ctx,
495         VASurfaceID surface,
496         VAImageID image,
497         int src_x,
498         int src_y,
499         unsigned int width,
500         unsigned int height,
501         int dest_x,
502         int dest_y 
503 )
504 {
505     INIT_DRIVER_DATA
506     
507     /* TODO */
508     return VA_STATUS_SUCCESS;
509 }
510
511 VAStatus dummy_QuerySubpictureFormats(
512         VADriverContextP ctx,
513         VAImageFormat *format_list,        /* out */
514         unsigned int *flags,       /* out */
515         unsigned int *num_formats  /* out */
516 )
517 {
518     INIT_DRIVER_DATA
519     
520     /* TODO */
521     return VA_STATUS_SUCCESS;
522 }
523
524 VAStatus dummy_CreateSubpicture(
525         VADriverContextP ctx,
526         VAImageID image,
527         VASubpictureID *subpicture   /* out */
528 )
529 {
530     INIT_DRIVER_DATA
531     
532     /* TODO */
533     return VA_STATUS_SUCCESS;
534 }
535
536 VAStatus dummy_DestroySubpicture(
537         VADriverContextP ctx,
538         VASubpictureID subpicture
539 )
540 {
541     INIT_DRIVER_DATA
542     
543     /* TODO */
544     return VA_STATUS_SUCCESS;
545 }
546
547 VAStatus dummy_SetSubpictureImage(
548         VADriverContextP ctx,
549         VASubpictureID subpicture,
550         VAImageID image
551 )
552 {
553     INIT_DRIVER_DATA
554     
555     /* TODO */
556     return VA_STATUS_SUCCESS;
557 }
558
559 VAStatus dummy_SetSubpicturePalette(
560         VADriverContextP ctx,
561         VASubpictureID subpicture,
562         /*
563          * pointer to an array holding the palette data.  The size of the array is
564          * num_palette_entries * entry_bytes in size.  The order of the components
565          * in the palette is described by the component_order in VASubpicture struct
566          */
567         unsigned char *palette
568 )
569 {
570     INIT_DRIVER_DATA
571     
572     /* TODO */
573     return VA_STATUS_SUCCESS;
574 }
575
576 VAStatus dummy_SetSubpictureChromakey(
577         VADriverContextP ctx,
578         VASubpictureID subpicture,
579         unsigned int chromakey_min,
580         unsigned int chromakey_max,
581         unsigned int chromakey_mask
582 )
583 {
584     INIT_DRIVER_DATA
585     
586     /* TODO */
587     return VA_STATUS_SUCCESS;
588 }
589
590 VAStatus dummy_SetSubpictureGlobalAlpha(
591         VADriverContextP ctx,
592         VASubpictureID subpicture,
593         float global_alpha 
594 )
595 {
596     INIT_DRIVER_DATA
597     
598     /* TODO */
599     return VA_STATUS_SUCCESS;
600 }
601
602 VAStatus dummy_AssociateSubpicture(
603         VADriverContextP ctx,
604         VASubpictureID subpicture,
605         VASurfaceID *target_surfaces,
606         int num_surfaces,
607         short src_x, /* upper left offset in subpicture */
608         short src_y,
609         short dest_x, /* upper left offset in surface */
610         short dest_y,
611         unsigned short width,
612         unsigned short height,
613         /*
614          * whether to enable chroma-keying or global-alpha
615          * see VA_SUBPICTURE_XXX values
616          */
617         unsigned int flags
618 )
619 {
620     INIT_DRIVER_DATA
621     
622     /* TODO */
623     return VA_STATUS_SUCCESS;
624 }
625
626 VAStatus dummy_DeassociateSubpicture(
627         VADriverContextP ctx,
628         VASubpictureID subpicture,
629         VASurfaceID *target_surfaces,
630         int num_surfaces
631 )
632 {
633     INIT_DRIVER_DATA
634     
635     /* TODO */
636     return VA_STATUS_SUCCESS;
637 }
638
639 VAStatus dummy_CreateContext(
640                 VADriverContextP ctx,
641                 VAConfigID config_id,
642                 int picture_width,
643                 int picture_height,
644                 int flag,
645                 VASurfaceID *render_targets,
646                 int num_render_targets,
647                 VAContextID *context            /* out */
648         )
649 {
650     INIT_DRIVER_DATA
651     VAStatus vaStatus = VA_STATUS_SUCCESS;
652     object_config_p obj_config;
653     int i;
654
655     obj_config = CONFIG(config_id);
656     if (NULL == obj_config)
657     {
658         vaStatus = VA_STATUS_ERROR_INVALID_CONFIG;
659         return vaStatus;
660     }
661
662     /* Validate flag */
663     /* Validate picture dimensions */
664
665     int contextID = object_heap_allocate( &driver_data->context_heap );
666     object_context_p obj_context = CONTEXT(contextID);
667     if (NULL == obj_context)
668     {
669         vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
670         return vaStatus;
671     }
672
673     obj_context->context_id  = contextID;
674     *context = contextID;
675     obj_context->current_render_target = -1;
676     obj_context->config_id = config_id;
677     obj_context->picture_width = picture_width;
678     obj_context->picture_height = picture_height;
679     obj_context->num_render_targets = num_render_targets;
680     obj_context->render_targets = (VASurfaceID *) malloc(num_render_targets * sizeof(VASurfaceID));
681     for(i = 0; i < num_render_targets; i++)
682     {
683         if (NULL == SURFACE(render_targets[i]))
684         {
685             vaStatus = VA_STATUS_ERROR_INVALID_SURFACE;
686             break;
687         }
688         obj_context->render_targets[i] = render_targets[i];
689     }
690     obj_context->flags = flag;
691
692     /* Error recovery */
693     if (VA_STATUS_SUCCESS != vaStatus)
694     {
695         obj_context->context_id = -1;
696         obj_context->config_id = -1;
697         free(obj_context->render_targets);
698         obj_context->render_targets = NULL;
699         obj_context->num_render_targets = 0;
700         obj_context->flags = 0;
701         object_heap_free( &driver_data->context_heap, (object_base_p) obj_context);
702     }
703
704     return vaStatus;
705 }
706
707
708 VAStatus dummy_DestroyContext(
709                 VADriverContextP ctx,
710                 VAContextID context
711         )
712 {
713     INIT_DRIVER_DATA
714     object_context_p obj_context = CONTEXT(context);
715     ASSERT(obj_context);
716
717     obj_context->context_id = -1;
718     obj_context->config_id = -1;
719     obj_context->picture_width = 0;
720     obj_context->picture_height = 0;
721     if (obj_context->render_targets)
722     {
723         free(obj_context->render_targets);
724     }
725     obj_context->render_targets = NULL;
726     obj_context->num_render_targets = 0;
727     obj_context->flags = 0;
728
729     obj_context->current_render_target = -1;
730
731     object_heap_free( &driver_data->context_heap, (object_base_p) obj_context);
732
733     return VA_STATUS_SUCCESS;
734 }
735
736
737 VAStatus dummy_CreateBuffer(
738                 VADriverContextP ctx,
739                 VABufferType type,  /* in */
740                 VABufferID *buf_desc    /* out */
741         )
742 {
743     INIT_DRIVER_DATA
744     VAStatus vaStatus = VA_STATUS_SUCCESS;
745     int bufferID;
746     object_buffer_p obj_buffer;
747
748     /* Validate type */
749     switch (type)
750     {
751         case VAPictureParameterBufferType:
752         case VAIQMatrixBufferType:
753         case VABitPlaneBufferType:
754         case VASliceGroupMapBufferType:
755         case VASliceParameterBufferType:
756         case VASliceDataBufferType:
757         case VAMacroblockParameterBufferType:
758         case VAResidualDataBufferType:
759         case VADeblockingParameterBufferType:
760         case VAImageBufferType:
761             /* Ok */
762             break;
763         default:
764             vaStatus = VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE;
765             return vaStatus;
766     }
767
768     bufferID = object_heap_allocate( &driver_data->buffer_heap );
769     obj_buffer = BUFFER(bufferID);
770     if (NULL == obj_buffer)
771     {
772         vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
773         return vaStatus;
774     }
775
776     obj_buffer->buffer_data = NULL;
777
778     *buf_desc = bufferID;
779
780     return vaStatus;
781 }
782
783 static VAStatus dummy__allocate_buffer(object_buffer_p obj_buffer, int size)
784 {
785     VAStatus vaStatus = VA_STATUS_SUCCESS;
786
787     obj_buffer->buffer_data = realloc(obj_buffer->buffer_data, size);
788     if (NULL == obj_buffer->buffer_data)
789     {
790         vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
791     }
792     return vaStatus;
793 }
794
795 VAStatus dummy_BufferData(
796                 VADriverContextP ctx,
797                 VABufferID buf_id,      /* in */
798         unsigned int size,      /* in */
799         unsigned int num_elements,      /* in */
800         void *data              /* in */
801         )
802 {
803     INIT_DRIVER_DATA
804     VAStatus vaStatus = VA_STATUS_SUCCESS;
805     object_buffer_p obj_buffer = BUFFER(buf_id);
806     ASSERT(obj_buffer);
807
808     vaStatus = dummy__allocate_buffer(obj_buffer, size * num_elements);
809     if (VA_STATUS_SUCCESS == vaStatus)
810     {
811         obj_buffer->max_num_elements = num_elements;
812         obj_buffer->num_elements = num_elements;
813         if (data)
814         {
815             memcpy(obj_buffer->buffer_data, data, size * num_elements);
816         }
817     }
818
819     return vaStatus;
820 }
821
822 VAStatus dummy_BufferSetNumElements(
823                 VADriverContextP ctx,
824                 VABufferID buf_id,      /* in */
825         unsigned int num_elements       /* in */
826         )
827 {
828     INIT_DRIVER_DATA
829     VAStatus vaStatus = VA_STATUS_SUCCESS;
830     object_buffer_p obj_buffer = BUFFER(buf_id);
831     ASSERT(obj_buffer);
832
833     if ((num_elements < 0) || (num_elements > obj_buffer->max_num_elements))
834     {
835         vaStatus = VA_STATUS_ERROR_UNKNOWN;
836     }
837     if (VA_STATUS_SUCCESS == vaStatus)
838     {
839         obj_buffer->num_elements = num_elements;
840     }
841
842     return vaStatus;
843 }
844
845 VAStatus dummy_MapBuffer(
846                 VADriverContextP ctx,
847                 VABufferID buf_id,      /* in */
848                 void **pbuf         /* out */
849         )
850 {
851     INIT_DRIVER_DATA
852     VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN;
853     object_buffer_p obj_buffer = BUFFER(buf_id);
854     ASSERT(obj_buffer);
855     if (NULL == obj_buffer)
856     {
857         vaStatus = VA_STATUS_ERROR_INVALID_BUFFER;
858         return vaStatus;
859     }
860
861     if (NULL != obj_buffer->buffer_data)
862     {
863         *pbuf = obj_buffer->buffer_data;
864         vaStatus = VA_STATUS_SUCCESS;
865     }
866     return vaStatus;
867 }
868
869 VAStatus dummy_UnmapBuffer(
870                 VADriverContextP ctx,
871                 VABufferID buf_id       /* in */
872         )
873 {
874     /* Do nothing */
875     return VA_STATUS_SUCCESS;
876 }
877
878 static void dummy__destroy_buffer(struct dummy_driver_data *driver_data, object_buffer_p obj_buffer)
879 {
880     if (NULL != obj_buffer->buffer_data)
881     {
882         free(obj_buffer->buffer_data);
883         obj_buffer->buffer_data = NULL;
884     }
885
886     object_heap_free( &driver_data->buffer_heap, (object_base_p) obj_buffer);
887 }
888
889 VAStatus dummy_DestroyBuffer(
890                 VADriverContextP ctx,
891                 VABufferID buffer_id
892         )
893 {
894     INIT_DRIVER_DATA
895     object_buffer_p obj_buffer = BUFFER(buffer_id);
896     ASSERT(obj_buffer);
897
898     dummy__destroy_buffer(driver_data, obj_buffer);
899     return VA_STATUS_SUCCESS;
900 }
901
902 VAStatus dummy_BeginPicture(
903                 VADriverContextP ctx,
904                 VAContextID context,
905                 VASurfaceID render_target
906         )
907 {
908     INIT_DRIVER_DATA
909     VAStatus vaStatus = VA_STATUS_SUCCESS;
910     object_context_p obj_context;
911     object_surface_p obj_surface;
912
913     obj_context = CONTEXT(context);
914     ASSERT(obj_context);
915
916     obj_surface = SURFACE(render_target);
917     ASSERT(obj_surface);
918
919     obj_context->current_render_target = obj_surface->base.id;
920
921     return vaStatus;
922 }
923
924 VAStatus dummy_RenderPicture(
925                 VADriverContextP ctx,
926                 VAContextID context,
927                 VABufferID *buffers,
928                 int num_buffers
929         )
930 {
931     INIT_DRIVER_DATA
932     VAStatus vaStatus = VA_STATUS_SUCCESS;
933     object_context_p obj_context;
934     object_surface_p obj_surface;
935     int i;
936
937     obj_context = CONTEXT(context);
938     ASSERT(obj_context);
939
940     obj_surface = SURFACE(obj_context->current_render_target);
941     ASSERT(obj_surface);
942
943     /* verify that we got valid buffer references */
944     for(i = 0; i < num_buffers; i++)
945     {
946         object_buffer_p obj_buffer = BUFFER(buffers[i]);
947         ASSERT(obj_buffer);
948         if (NULL == obj_buffer)
949         {
950             vaStatus = VA_STATUS_ERROR_INVALID_BUFFER;
951             break;
952         }
953     }
954
955     return vaStatus;
956 }
957
958 VAStatus dummy_EndPicture(
959                 VADriverContextP ctx,
960                 VAContextID context
961         )
962 {
963     INIT_DRIVER_DATA
964     VAStatus vaStatus = VA_STATUS_SUCCESS;
965     object_context_p obj_context;
966     object_surface_p obj_surface;
967
968     obj_context = CONTEXT(context);
969     ASSERT(obj_context);
970
971     obj_surface = SURFACE(obj_context->current_render_target);
972     ASSERT(obj_surface);
973
974     // For now, assume that we are done with rendering right away
975     obj_context->current_render_target = -1;
976
977     return vaStatus;
978 }
979
980
981 VAStatus dummy_SyncSurface(
982                 VADriverContextP ctx,
983                 VAContextID context,
984                 VASurfaceID render_target
985         )
986 {
987     INIT_DRIVER_DATA
988     VAStatus vaStatus = VA_STATUS_SUCCESS;
989     object_context_p obj_context;
990     object_surface_p obj_surface;
991
992     obj_context = CONTEXT(context);
993     ASSERT(obj_context);
994
995     obj_surface = SURFACE(render_target);
996     ASSERT(obj_surface);
997
998     /* Assume that this shouldn't be called before vaEndPicture() */
999     ASSERT( obj_context->current_render_target != obj_surface->base.id );
1000
1001     return vaStatus;
1002 }
1003
1004 VAStatus dummy_QuerySurfaceStatus(
1005                 VADriverContextP ctx,
1006                 VASurfaceID render_target,
1007                 VASurfaceStatus *status /* out */
1008         )
1009 {
1010     INIT_DRIVER_DATA
1011     VAStatus vaStatus = VA_STATUS_SUCCESS;
1012     object_surface_p obj_surface;
1013
1014     obj_surface = SURFACE(render_target);
1015     ASSERT(obj_surface);
1016
1017     *status = VASurfaceReady;
1018
1019     return vaStatus;
1020 }
1021
1022 VAStatus dummy_PutSurface(
1023                 VADriverContextP ctx,
1024                 VASurfaceID surface,
1025                 Drawable draw, /* X Drawable */
1026                 short srcx,
1027                 short srcy,
1028                 unsigned short srcw,
1029                 unsigned short srch,
1030                 short destx,
1031                 short desty,
1032                 unsigned short destw,
1033                 unsigned short desth,
1034                 VARectangle *cliprects, /* client supplied clip list */
1035                 unsigned int number_cliprects, /* number of clip rects in the clip list */
1036                 unsigned int flags /* de-interlacing flags */
1037         )
1038 {
1039     /* TODO */
1040     return VA_STATUS_ERROR_UNKNOWN;
1041 }
1042
1043 /* 
1044  * Query display attributes 
1045  * The caller must provide a "attr_list" array that can hold at
1046  * least vaMaxNumDisplayAttributes() entries. The actual number of attributes
1047  * returned in "attr_list" is returned in "num_attributes".
1048  */
1049 VAStatus dummy_QueryDisplayAttributes (
1050                 VADriverContextP ctx,
1051                 VADisplayAttribute *attr_list,  /* out */
1052                 int *num_attributes             /* out */
1053         )
1054 {
1055     /* TODO */
1056     return VA_STATUS_ERROR_UNKNOWN;
1057 }
1058
1059 /* 
1060  * Get display attributes 
1061  * This function returns the current attribute values in "attr_list".
1062  * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field
1063  * from vaQueryDisplayAttributes() can have their values retrieved.  
1064  */
1065 VAStatus dummy_GetDisplayAttributes (
1066                 VADriverContextP ctx,
1067                 VADisplayAttribute *attr_list,  /* in/out */
1068                 int num_attributes
1069         )
1070 {
1071     /* TODO */
1072     return VA_STATUS_ERROR_UNKNOWN;
1073 }
1074
1075 /* 
1076  * Set display attributes 
1077  * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field
1078  * from vaQueryDisplayAttributes() can be set.  If the attribute is not settable or 
1079  * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED
1080  */
1081 VAStatus dummy_SetDisplayAttributes (
1082                 VADriverContextP ctx,
1083                 VADisplayAttribute *attr_list,
1084                 int num_attributes
1085         )
1086 {
1087     /* TODO */
1088     return VA_STATUS_ERROR_UNKNOWN;
1089 }
1090
1091
1092 VAStatus dummy_DbgCopySurfaceToBuffer(
1093                 VADriverContextP ctx,
1094                 VASurfaceID surface,
1095                 void **buffer, /* out */
1096                 unsigned int *stride /* out */
1097         )
1098 {
1099     /* TODO */
1100     return VA_STATUS_ERROR_UNKNOWN;
1101 }
1102
1103 VAStatus dummy_Terminate( VADriverContextP ctx )
1104 {
1105     INIT_DRIVER_DATA
1106     object_buffer_p obj_buffer;
1107     object_surface_p obj_surface;
1108     object_context_p obj_context;
1109     object_config_p obj_config;
1110     object_heap_iterator iter;
1111
1112     /* Clean up left over buffers */
1113     obj_buffer = (object_buffer_p) object_heap_first( &driver_data->buffer_heap, &iter);
1114     while (obj_buffer)
1115     {
1116         dummy__information_message("vaTerminate: bufferID %08x still allocated, destroying\n", obj_buffer->base.id);
1117         dummy__destroy_buffer(driver_data, obj_buffer);
1118         obj_buffer = (object_buffer_p) object_heap_next( &driver_data->buffer_heap, &iter);
1119     }
1120     object_heap_destroy( &driver_data->buffer_heap );
1121
1122     /* TODO cleanup */
1123     object_heap_destroy( &driver_data->surface_heap );
1124
1125     /* TODO cleanup */
1126     object_heap_destroy( &driver_data->context_heap );
1127
1128     /* Clean up configIDs */
1129     obj_config = (object_config_p) object_heap_first( &driver_data->config_heap, &iter);
1130     while (obj_config)
1131     {
1132         object_heap_free( &driver_data->config_heap, (object_base_p) obj_config);
1133         obj_config = (object_config_p) object_heap_next( &driver_data->config_heap, &iter);
1134     }
1135     object_heap_destroy( &driver_data->config_heap );
1136
1137     free(ctx->pDriverData);
1138     ctx->pDriverData = NULL;
1139
1140     return VA_STATUS_SUCCESS;
1141 }
1142
1143 VAStatus __vaDriverInit_0_25(  VADriverContextP ctx )
1144 {
1145     object_base_p obj;
1146     int result;
1147     struct dummy_driver_data *driver_data;
1148     int i;
1149
1150     ctx->version_major = 0;
1151     ctx->version_minor = 25;
1152     ctx->max_profiles = DUMMY_MAX_PROFILES;
1153     ctx->max_entrypoints = DUMMY_MAX_ENTRYPOINTS;
1154     ctx->max_attributes = DUMMY_MAX_CONFIG_ATTRIBUTES;
1155     ctx->max_image_formats = DUMMY_MAX_IMAGE_FORMATS;
1156     ctx->max_subpic_formats = DUMMY_MAX_SUBPIC_FORMATS;
1157     ctx->max_display_attributes = DUMMY_MAX_DISPLAY_ATTRIBUTES;
1158     ctx->str_vendor = DUMMY_STR_VENDOR;
1159
1160     ctx->vtable.vaTerminate = dummy_Terminate;
1161     ctx->vtable.vaQueryConfigEntrypoints = dummy_QueryConfigEntrypoints;
1162     ctx->vtable.vaQueryConfigProfiles = dummy_QueryConfigProfiles;
1163     ctx->vtable.vaQueryConfigEntrypoints = dummy_QueryConfigEntrypoints;
1164     ctx->vtable.vaQueryConfigAttributes = dummy_QueryConfigAttributes;
1165     ctx->vtable.vaCreateConfig = dummy_CreateConfig;
1166     ctx->vtable.vaDestroyConfig = dummy_DestroyConfig;
1167     ctx->vtable.vaGetConfigAttributes = dummy_GetConfigAttributes;
1168     ctx->vtable.vaCreateSurfaces = dummy_CreateSurfaces;
1169     ctx->vtable.vaDestroySurfaces = dummy_DestroySurfaces;
1170     ctx->vtable.vaCreateContext = dummy_CreateContext;
1171     ctx->vtable.vaDestroyContext = dummy_DestroyContext;
1172     ctx->vtable.vaCreateBuffer = dummy_CreateBuffer;
1173     ctx->vtable.vaBufferData = dummy_BufferData;
1174     ctx->vtable.vaBufferSetNumElements = dummy_BufferSetNumElements;
1175     ctx->vtable.vaMapBuffer = dummy_MapBuffer;
1176     ctx->vtable.vaUnmapBuffer = dummy_UnmapBuffer;
1177     ctx->vtable.vaDestroyBuffer = dummy_DestroyBuffer;
1178     ctx->vtable.vaBeginPicture = dummy_BeginPicture;
1179     ctx->vtable.vaRenderPicture = dummy_RenderPicture;
1180     ctx->vtable.vaEndPicture = dummy_EndPicture;
1181     ctx->vtable.vaSyncSurface = dummy_SyncSurface;
1182     ctx->vtable.vaQuerySurfaceStatus = dummy_QuerySurfaceStatus;
1183     ctx->vtable.vaPutSurface = dummy_PutSurface;
1184     ctx->vtable.vaQueryImageFormats = dummy_QueryImageFormats;
1185     ctx->vtable.vaCreateImage = dummy_CreateImage;
1186     ctx->vtable.vaDestroyImage = dummy_DestroyImage;
1187     ctx->vtable.vaSetImagePalette = dummy_SetImagePalette;
1188     ctx->vtable.vaGetImage = dummy_GetImage;
1189     ctx->vtable.vaPutImage = dummy_PutImage;
1190     ctx->vtable.vaQuerySubpictureFormats = dummy_QuerySubpictureFormats;
1191     ctx->vtable.vaCreateSubpicture = dummy_CreateSubpicture;
1192     ctx->vtable.vaDestroySubpicture = dummy_DestroySubpicture;
1193     ctx->vtable.vaSetSubpictureImage = dummy_SetSubpictureImage;
1194     ctx->vtable.vaSetSubpicturePalette = dummy_SetSubpicturePalette;
1195     ctx->vtable.vaSetSubpictureChromakey = dummy_SetSubpictureChromakey;
1196     ctx->vtable.vaSetSubpictureGlobalAlpha = dummy_SetSubpictureGlobalAlpha;
1197     ctx->vtable.vaAssociateSubpicture = dummy_AssociateSubpicture;
1198     ctx->vtable.vaDeassociateSubpicture = dummy_DeassociateSubpicture;
1199     ctx->vtable.vaQueryDisplayAttributes = dummy_QueryDisplayAttributes;
1200     ctx->vtable.vaGetDisplayAttributes = dummy_GetDisplayAttributes;
1201     ctx->vtable.vaSetDisplayAttributes = dummy_SetDisplayAttributes;
1202     
1203     ctx->vtable.vaDbgCopySurfaceToBuffer = dummy_DbgCopySurfaceToBuffer;
1204
1205     driver_data = (struct dummy_driver_data *) malloc( sizeof(*driver_data) );
1206     ctx->pDriverData = (void *) driver_data;
1207
1208     result = object_heap_init( &driver_data->config_heap, sizeof(struct object_config), CONFIG_ID_OFFSET );
1209     ASSERT( result == 0 );
1210
1211     result = object_heap_init( &driver_data->context_heap, sizeof(struct object_context), CONTEXT_ID_OFFSET );
1212     ASSERT( result == 0 );
1213
1214     result = object_heap_init( &driver_data->surface_heap, sizeof(struct object_surface), SURFACE_ID_OFFSET );
1215     ASSERT( result == 0 );
1216
1217     result = object_heap_init( &driver_data->buffer_heap, sizeof(struct object_buffer), BUFFER_ID_OFFSET );
1218     ASSERT( result == 0 );
1219
1220
1221     return VA_STATUS_SUCCESS;
1222 }
1223