2 * @COPYRIGHT@ Intel Confidential - Unreleased Software
5 #include "va_backend.h"
7 #include "dummy_drv_video.h"
16 #define INIT_DRIVER_DATA struct dummy_driver_data *driver_data = (struct dummy_driver_data *) ctx->pDriverData;
18 #define CONFIG(id) ((object_config_p) object_heap_lookup( &driver_data->config_heap, id ))
19 #define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id ))
20 #define SURFACE(id) ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id ))
21 #define BUFFER(id) ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id ))
23 #define CONFIG_ID_OFFSET 0x01000000
24 #define CONTEXT_ID_OFFSET 0x02000000
25 #define SURFACE_ID_OFFSET 0x04000000
26 #define BUFFER_ID_OFFSET 0x08000000
28 static void dummy__error_message(const char *msg, ...)
32 fprintf(stderr, "dummy_drv_video error: ");
34 vfprintf(stderr, msg, args);
38 static void dummy__information_message(const char *msg, ...)
42 fprintf(stderr, "dummy_drv_video: ");
44 vfprintf(stderr, msg, args);
48 VAStatus dummy_QueryConfigProfiles(
50 VAProfile *profile_list, /* out */
51 int *num_profiles /* out */
57 profile_list[i++] = VAProfileMPEG2Simple;
58 profile_list[i++] = VAProfileMPEG2Main;
59 profile_list[i++] = VAProfileMPEG4Simple;
60 profile_list[i++] = VAProfileMPEG4AdvancedSimple;
61 profile_list[i++] = VAProfileMPEG4Main;
62 profile_list[i++] = VAProfileH264Baseline;
63 profile_list[i++] = VAProfileH264Main;
64 profile_list[i++] = VAProfileH264High;
65 profile_list[i++] = VAProfileVC1Simple;
66 profile_list[i++] = VAProfileVC1Main;
67 profile_list[i++] = VAProfileVC1Advanced;
69 /* If the assert fails then DUMMY_MAX_PROFILES needs to be bigger */
70 ASSERT(i <= DUMMY_MAX_PROFILES);
73 return VA_STATUS_SUCCESS;
76 VAStatus dummy_QueryConfigEntrypoints(
79 VAEntrypoint *entrypoint_list, /* out */
80 int *num_entrypoints /* out */
86 case VAProfileMPEG2Simple:
87 case VAProfileMPEG2Main:
89 entrypoint_list[0] = VAEntrypointVLD;
90 entrypoint_list[1] = VAEntrypointMoComp;
93 case VAProfileMPEG4Simple:
94 case VAProfileMPEG4AdvancedSimple:
95 case VAProfileMPEG4Main:
97 entrypoint_list[0] = VAEntrypointVLD;
100 case VAProfileH264Baseline:
101 case VAProfileH264Main:
102 case VAProfileH264High:
103 *num_entrypoints = 1;
104 entrypoint_list[0] = VAEntrypointVLD;
107 case VAProfileVC1Simple:
108 case VAProfileVC1Main:
109 case VAProfileVC1Advanced:
110 *num_entrypoints = 1;
111 entrypoint_list[0] = VAEntrypointVLD;
115 *num_entrypoints = 0;
119 /* If the assert fails then DUMMY_MAX_ENTRYPOINTS needs to be bigger */
120 ASSERT(*num_entrypoints <= DUMMY_MAX_ENTRYPOINTS);
121 return VA_STATUS_SUCCESS;
124 VAStatus dummy_QueryConfigAttributes(
125 VADriverContextP ctx,
127 VAEntrypoint entrypoint,
128 VAConfigAttrib *attrib_list, /* in/out */
136 /* Other attributes don't seem to be defined */
137 /* What to do if we don't know the attribute? */
138 for (i = 0; i < num_attribs; i++)
140 switch (attrib_list[i].type)
142 case VAConfigAttribRTFormat:
143 attrib_list[i].value = VA_RT_FORMAT_YUV420;
148 attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
153 return VA_STATUS_SUCCESS;
156 static VAStatus dummy__update_attribute(object_config_p obj_config, VAConfigAttrib *attrib)
159 /* Check existing attrbiutes */
160 for(i = 0; obj_config->attrib_count < i; i++)
162 if (obj_config->attrib_list[i].type == attrib->type)
164 /* Update existing attribute */
165 obj_config->attrib_list[i].value = attrib->value;
166 return VA_STATUS_SUCCESS;
169 if (obj_config->attrib_count < DUMMY_MAX_CONFIG_ATTRIBUTES)
171 i = obj_config->attrib_count;
172 obj_config->attrib_list[i].type = attrib->type;
173 obj_config->attrib_list[i].value = attrib->value;
174 obj_config->attrib_count++;
175 return VA_STATUS_SUCCESS;
177 return VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
180 VAStatus dummy_CreateConfig(
181 VADriverContextP ctx,
183 VAEntrypoint entrypoint,
184 VAConfigAttrib *attrib_list,
186 VAConfigID *config_id /* out */
192 object_config_p obj_config;
195 /* Validate profile & entrypoint */
197 case VAProfileMPEG2Simple:
198 case VAProfileMPEG2Main:
199 if ((VAEntrypointVLD == entrypoint) ||
200 (VAEntrypointMoComp == entrypoint))
202 vaStatus = VA_STATUS_SUCCESS;
206 vaStatus = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
210 case VAProfileMPEG4Simple:
211 case VAProfileMPEG4AdvancedSimple:
212 case VAProfileMPEG4Main:
213 if (VAEntrypointVLD == entrypoint)
215 vaStatus = VA_STATUS_SUCCESS;
219 vaStatus = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
223 case VAProfileH264Baseline:
224 case VAProfileH264Main:
225 case VAProfileH264High:
226 if (VAEntrypointVLD == entrypoint)
228 vaStatus = VA_STATUS_SUCCESS;
232 vaStatus = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
236 case VAProfileVC1Simple:
237 case VAProfileVC1Main:
238 case VAProfileVC1Advanced:
239 if (VAEntrypointVLD == entrypoint)
241 vaStatus = VA_STATUS_SUCCESS;
245 vaStatus = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
250 vaStatus = VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
254 if (VA_STATUS_SUCCESS != vaStatus)
259 configID = object_heap_allocate( &driver_data->config_heap );
260 obj_config = CONFIG(configID);
261 if (NULL == obj_config)
263 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
267 obj_config->profile = profile;
268 obj_config->entrypoint = entrypoint;
269 obj_config->attrib_list[0].type = VAConfigAttribRTFormat;
270 obj_config->attrib_list[0].value = VA_RT_FORMAT_YUV420;
271 obj_config->attrib_count = 1;
273 for(i = 0; i < num_attribs; i++)
275 vaStatus = dummy__update_attribute(obj_config, &(attrib_list[i]));
276 if (VA_STATUS_SUCCESS != vaStatus)
283 if (VA_STATUS_SUCCESS != vaStatus)
285 object_heap_free( &driver_data->config_heap, (object_base_p) obj_config);
289 *config_id = configID;
295 VAStatus dummy_GetConfigAttributes(
296 VADriverContextP ctx,
297 VAConfigID config_id,
298 VAProfile *profile, /* out */
299 VAEntrypoint *entrypoint, /* out */
300 VAConfigAttrib *attrib_list, /* out */
301 int *num_attribs /* out */
305 VAStatus vaStatus = VA_STATUS_SUCCESS;
306 object_config_p obj_config;
309 obj_config = CONFIG(config_id);
312 *profile = obj_config->profile;
313 *entrypoint = obj_config->entrypoint;
314 *num_attribs = obj_config->attrib_count;
315 for(i = 0; i < obj_config->attrib_count; i++)
317 attrib_list[i] = obj_config->attrib_list[i];
323 VAStatus dummy_CreateSurfaces(
324 VADriverContextP ctx,
329 VASurface *surfaces /* out */
333 VAStatus vaStatus = VA_STATUS_SUCCESS;
336 /* We only support one format */
337 if (VA_RT_FORMAT_YUV420 != format)
339 return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT;
342 for (i = 0; i < num_surfaces; i++)
344 int surfaceID = object_heap_allocate( &driver_data->surface_heap );
345 object_surface_p obj_surface = SURFACE(surfaceID);
346 if (NULL == obj_surface)
348 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
351 obj_surface->surface = &(surfaces[i]);
352 obj_surface->surface->surface_id = surfaceID;
353 obj_surface->surface->context_id = -1;
354 obj_surface->surface->width = width;
355 obj_surface->surface->height = height;
356 obj_surface->surface->format = format;
357 obj_surface->surface->privData = NULL;
361 if (VA_STATUS_SUCCESS != vaStatus)
363 /* surfaces[i-1] was the last successful allocation */
366 object_surface_p obj_surface = SURFACE(surfaces[i].surface_id);
367 surfaces[i].surface_id = -1;
369 object_heap_free( &driver_data->surface_heap, (object_base_p) obj_surface);
376 VAStatus dummy_DestroySurface(
377 VADriverContextP ctx,
378 VASurface *surface_list,
384 for(i = num_surfaces; i--; )
386 object_surface_p obj_surface = SURFACE(surface_list[i].surface_id);
388 object_heap_free( &driver_data->surface_heap, (object_base_p) obj_surface);
390 return VA_STATUS_SUCCESS;
393 VAStatus dummy_CreateContext(
394 VADriverContextP ctx,
395 VAConfigID config_id,
399 VASurface *render_targets,
400 int num_render_targets,
401 VAContext *context /* out */
405 VAStatus vaStatus = VA_STATUS_SUCCESS;
406 object_config_p obj_config;
409 obj_config = CONFIG(config_id);
410 if (NULL == obj_config)
412 vaStatus = VA_STATUS_ERROR_INVALID_CONFIG;
417 /* Validate picture dimensions */
419 int contextID = object_heap_allocate( &driver_data->context_heap );
420 object_context_p obj_context = CONTEXT(contextID);
421 if (NULL == obj_context)
423 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
427 obj_context->context = context;
428 obj_context->current_render_target = -1;
430 obj_context->context->context_id = contextID;
431 obj_context->context->config_id = config_id;
432 obj_context->context->picture_width = picture_width;
433 obj_context->context->picture_height = picture_height;
434 obj_context->context->num_render_targets = num_render_targets;
435 obj_context->context->render_targets = (VASurfaceID *) malloc(num_render_targets * sizeof(VASurfaceID));
436 for(i = 0; i < num_render_targets; i++)
438 if (NULL == SURFACE(render_targets[i].surface_id))
440 vaStatus = VA_STATUS_ERROR_INVALID_SURFACE;
443 obj_context->context->render_targets[i] = render_targets[i].surface_id;
445 obj_context->context->flags = flag;
446 obj_context->context->privData = NULL;
449 if (VA_STATUS_SUCCESS != vaStatus)
451 free(obj_context->context->render_targets);
452 obj_context->context->render_targets = NULL;
453 obj_context->context->context_id = -1;
454 obj_context->context->config_id = -1;
455 obj_context->context->picture_width = 0;
456 obj_context->context->picture_height = 0;
457 free(obj_context->context->render_targets);
458 obj_context->context->render_targets = NULL;
459 obj_context->context->num_render_targets = 0;
460 obj_context->context->flags = 0;
461 obj_context->context->privData = NULL;
462 object_heap_free( &driver_data->context_heap, (object_base_p) obj_context);
469 VAStatus dummy_DestroyContext(
470 VADriverContextP ctx,
475 object_context_p obj_context = CONTEXT(context->context_id);
478 obj_context->context->context_id = -1;
479 obj_context->context->config_id = -1;
480 obj_context->context->picture_width = 0;
481 obj_context->context->picture_height = 0;
482 if (obj_context->context->render_targets)
484 free(obj_context->context->render_targets);
486 obj_context->context->render_targets = NULL;
487 obj_context->context->num_render_targets = 0;
488 obj_context->context->flags = 0;
489 obj_context->context->privData = NULL;
491 obj_context->context = NULL;
492 obj_context->current_render_target = -1;
494 object_heap_free( &driver_data->context_heap, (object_base_p) obj_context);
496 return VA_STATUS_SUCCESS;
500 VAStatus dummy_CreateBuffer(
501 VADriverContextP ctx,
502 VABufferType type, /* in */
503 VABufferID *buf_desc /* out */
507 VAStatus vaStatus = VA_STATUS_SUCCESS;
509 object_buffer_p obj_buffer;
514 case VAPictureParameterBufferType:
515 case VAPictureBitPlaneBufferType:
516 case VAIQMatrixBufferType:
517 case VASliceParameterBufferType:
518 case VASliceDataBufferType:
519 case VAMacroblockParameterBufferType:
520 case VAResidualDataBufferType:
521 case VADeblockingParameterBufferType:
525 vaStatus = VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE;
529 bufferID = object_heap_allocate( &driver_data->buffer_heap );
530 obj_buffer = BUFFER(bufferID);
531 if (NULL == obj_buffer)
533 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
537 obj_buffer->buffer_data = NULL;
539 *buf_desc = bufferID;
544 static VAStatus dummy__allocate_buffer(object_buffer_p obj_buffer, int size)
546 VAStatus vaStatus = VA_STATUS_SUCCESS;
548 obj_buffer->buffer_data = realloc(obj_buffer->buffer_data, size);
549 if (NULL == obj_buffer->buffer_data)
551 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
556 VAStatus dummy_BufferData(
557 VADriverContextP ctx,
558 VABufferID buf_id, /* in */
559 unsigned int size, /* in */
560 unsigned int num_elements, /* in */
565 VAStatus vaStatus = VA_STATUS_SUCCESS;
566 object_buffer_p obj_buffer = BUFFER(buf_id);
569 vaStatus = dummy__allocate_buffer(obj_buffer, size * num_elements);
570 if (VA_STATUS_SUCCESS == vaStatus)
572 obj_buffer->max_num_elements = num_elements;
573 obj_buffer->num_elements = num_elements;
576 memcpy(obj_buffer->buffer_data, data, size * num_elements);
583 VAStatus dummy_BufferSetNumElements(
584 VADriverContextP ctx,
585 VABufferID buf_id, /* in */
586 unsigned int num_elements /* in */
590 VAStatus vaStatus = VA_STATUS_SUCCESS;
591 object_buffer_p obj_buffer = BUFFER(buf_id);
594 if ((num_elements < 0) || (num_elements > obj_buffer->max_num_elements))
596 vaStatus = VA_STATUS_ERROR_UNKNOWN;
598 if (VA_STATUS_SUCCESS == vaStatus)
600 obj_buffer->num_elements = num_elements;
606 VAStatus dummy_MapBuffer(
607 VADriverContextP ctx,
608 VABufferID buf_id, /* in */
609 void **pbuf /* out */
613 VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN;
614 object_buffer_p obj_buffer = BUFFER(buf_id);
616 if (NULL == obj_buffer)
618 vaStatus = VA_STATUS_ERROR_INVALID_BUFFER;
622 if (NULL != obj_buffer->buffer_data)
624 *pbuf = obj_buffer->buffer_data;
625 vaStatus = VA_STATUS_SUCCESS;
630 VAStatus dummy_UnmapBuffer(
631 VADriverContextP ctx,
632 VABufferID buf_id /* in */
636 return VA_STATUS_SUCCESS;
639 static void dummy__destroy_buffer(struct dummy_driver_data *driver_data, object_buffer_p obj_buffer)
641 if (NULL != obj_buffer->buffer_data)
643 free(obj_buffer->buffer_data);
644 obj_buffer->buffer_data = NULL;
647 object_heap_free( &driver_data->buffer_heap, (object_base_p) obj_buffer);
650 VAStatus dummy_DestroyBuffer(
651 VADriverContextP ctx,
656 object_buffer_p obj_buffer = BUFFER(buffer_id);
659 dummy__destroy_buffer(driver_data, obj_buffer);
660 return VA_STATUS_SUCCESS;
663 VAStatus dummy_BeginPicture(
664 VADriverContextP ctx,
666 VASurface *render_target
670 VAStatus vaStatus = VA_STATUS_SUCCESS;
671 object_context_p obj_context;
672 object_surface_p obj_surface;
674 obj_context = CONTEXT(context->context_id);
677 obj_surface = SURFACE(render_target->surface_id);
680 obj_context->current_render_target = obj_surface->base.id;
685 VAStatus dummy_RenderPicture(
686 VADriverContextP ctx,
693 VAStatus vaStatus = VA_STATUS_SUCCESS;
694 object_context_p obj_context;
695 object_surface_p obj_surface;
698 obj_context = CONTEXT(context->context_id);
701 obj_surface = SURFACE(obj_context->current_render_target);
704 /* verify that we got valid buffer references */
705 for(i = 0; i < num_buffers; i++)
707 object_buffer_p obj_buffer = BUFFER(buffers[i]);
709 if (NULL == obj_buffer)
711 vaStatus = VA_STATUS_ERROR_INVALID_BUFFER;
719 VAStatus dummy_EndPicture(
720 VADriverContextP ctx,
725 VAStatus vaStatus = VA_STATUS_SUCCESS;
726 object_context_p obj_context;
727 object_surface_p obj_surface;
729 obj_context = CONTEXT(context->context_id);
732 obj_surface = SURFACE(obj_context->current_render_target);
735 // For now, assume that we are done with rendering right away
736 obj_context->current_render_target = -1;
742 VAStatus dummy_SyncSurface(
743 VADriverContextP ctx,
745 VASurface *render_target
749 VAStatus vaStatus = VA_STATUS_SUCCESS;
750 object_context_p obj_context;
751 object_surface_p obj_surface;
753 obj_context = CONTEXT(context->context_id);
756 obj_surface = SURFACE(render_target->surface_id);
759 /* Assume that this shouldn't be called before vaEndPicture() */
760 ASSERT( obj_context->current_render_target != obj_surface->base.id );
765 VAStatus dummy_QuerySurfaceStatus(
766 VADriverContextP ctx,
768 VASurface *render_target,
769 VASurfaceStatus *status /* out */
773 VAStatus vaStatus = VA_STATUS_SUCCESS;
774 object_context_p obj_context;
775 object_surface_p obj_surface;
777 obj_context = CONTEXT(context->context_id);
780 obj_surface = SURFACE(render_target->surface_id);
783 /* Assume that we are busy until vaEndPicture() is called */
784 if ( obj_context->current_render_target == obj_surface->base.id )
786 *status = VASurfaceRendering;
790 *status = VASurfaceReady;
796 VAStatus dummy_PutSurface(
797 VADriverContextP ctx,
799 Drawable draw, /* X Drawable */
806 unsigned short destw,
807 unsigned short desth,
808 int flags /* de-interlacing flags */
812 return VA_STATUS_ERROR_UNKNOWN;
815 VAStatus dummy_DbgCopySurfaceToBuffer(
816 VADriverContextP ctx,
818 void **buffer, /* out */
819 unsigned int *stride /* out */
823 return VA_STATUS_ERROR_UNKNOWN;
826 VAStatus dummy_Terminate( VADriverContextP ctx )
829 object_buffer_p obj_buffer;
830 object_surface_p obj_surface;
831 object_context_p obj_context;
832 object_config_p obj_config;
833 object_heap_iterator iter;
835 /* Clean up left over buffers */
836 obj_buffer = (object_buffer_p) object_heap_first( &driver_data->buffer_heap, &iter);
839 dummy__information_message("vaTerminate: bufferID %08x still allocated, destroying\n", obj_buffer->base.id);
840 dummy__destroy_buffer(driver_data, obj_buffer);
841 obj_buffer = (object_buffer_p) object_heap_next( &driver_data->buffer_heap, &iter);
843 object_heap_destroy( &driver_data->buffer_heap );
846 object_heap_destroy( &driver_data->surface_heap );
849 object_heap_destroy( &driver_data->context_heap );
851 /* Clean up configIDs */
852 obj_config = (object_config_p) object_heap_first( &driver_data->config_heap, &iter);
855 object_heap_free( &driver_data->config_heap, (object_base_p) obj_config);
856 obj_config = (object_config_p) object_heap_next( &driver_data->config_heap, &iter);
858 object_heap_destroy( &driver_data->config_heap );
860 free(ctx->pDriverData);
861 ctx->pDriverData = NULL;
863 return VA_STATUS_SUCCESS;
866 VAStatus __vaDriverInit_0_18( VADriverContextP ctx )
870 struct dummy_driver_data *driver_data;
873 ctx->version_major = 0;
874 ctx->version_minor = 18;
875 ctx->max_profiles = DUMMY_MAX_PROFILES;
876 ctx->max_entrypoints = DUMMY_MAX_ENTRYPOINTS;
877 ctx->max_attributes = DUMMY_MAX_CONFIG_ATTRIBUTES;
879 ctx->vtable.vaTerminate = dummy_Terminate;
880 ctx->vtable.vaQueryConfigEntrypoints = dummy_QueryConfigEntrypoints;
881 ctx->vtable.vaTerminate = dummy_Terminate;
882 ctx->vtable.vaQueryConfigProfiles = dummy_QueryConfigProfiles;
883 ctx->vtable.vaQueryConfigEntrypoints = dummy_QueryConfigEntrypoints;
884 ctx->vtable.vaQueryConfigAttributes = dummy_QueryConfigAttributes;
885 ctx->vtable.vaCreateConfig = dummy_CreateConfig;
886 ctx->vtable.vaGetConfigAttributes = dummy_GetConfigAttributes;
887 ctx->vtable.vaCreateSurfaces = dummy_CreateSurfaces;
888 ctx->vtable.vaDestroySurface = dummy_DestroySurface;
889 ctx->vtable.vaCreateContext = dummy_CreateContext;
890 ctx->vtable.vaDestroyContext = dummy_DestroyContext;
891 ctx->vtable.vaCreateBuffer = dummy_CreateBuffer;
892 ctx->vtable.vaBufferData = dummy_BufferData;
893 ctx->vtable.vaBufferSetNumElements = dummy_BufferSetNumElements;
894 ctx->vtable.vaMapBuffer = dummy_MapBuffer;
895 ctx->vtable.vaUnmapBuffer = dummy_UnmapBuffer;
896 ctx->vtable.vaDestroyBuffer = dummy_DestroyBuffer;
897 ctx->vtable.vaBeginPicture = dummy_BeginPicture;
898 ctx->vtable.vaRenderPicture = dummy_RenderPicture;
899 ctx->vtable.vaEndPicture = dummy_EndPicture;
900 ctx->vtable.vaSyncSurface = dummy_SyncSurface;
901 ctx->vtable.vaQuerySurfaceStatus = dummy_QuerySurfaceStatus;
902 ctx->vtable.vaPutSurface = dummy_PutSurface;
903 ctx->vtable.vaDbgCopySurfaceToBuffer = dummy_DbgCopySurfaceToBuffer;
905 driver_data = (struct dummy_driver_data *) malloc( sizeof(*driver_data) );
906 ctx->pDriverData = (void *) driver_data;
908 result = object_heap_init( &driver_data->config_heap, sizeof(struct object_config), CONFIG_ID_OFFSET );
909 ASSERT( result == 0 );
911 result = object_heap_init( &driver_data->context_heap, sizeof(struct object_context), CONTEXT_ID_OFFSET );
912 ASSERT( result == 0 );
914 result = object_heap_init( &driver_data->surface_heap, sizeof(struct object_surface), SURFACE_ID_OFFSET );
915 ASSERT( result == 0 );
917 result = object_heap_init( &driver_data->buffer_heap, sizeof(struct object_buffer), BUFFER_ID_OFFSET );
918 ASSERT( result == 0 );
921 return VA_STATUS_SUCCESS;