va_image.c revision 2b296ec77c2b95e7632b45100de5a0878ac2a294
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**************************************************************************
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2010 Thomas Balling Sørensen & Orasanu Lucian.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All Rights Reserved.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy of this software and associated documentation files (the
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "Software"), to deal in the Software without restriction, including
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * without limitation the rights to use, copy, modify, merge, publish,
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distribute, sub license, and/or sell copies of the Software, and to
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * permit persons to whom the Software is furnished to do so, subject to
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the following conditions:
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The above copyright notice and this permission notice (including the
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * next paragraph) shall be included in all copies or substantial portions
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the Software.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) **************************************************************************/
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <util/u_memory.h>
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <util/u_format.h>
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <util/u_debug.h>
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <pipe/p_format.h>
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <va/va.h>
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <va/va_backend.h>
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "va_private.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct  {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	enum pipe_format pipe_format;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VAImageFormat       va_format;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} va_image_formats_supported_t;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const va_image_formats_supported_t va_image_formats_supported[VA_MAX_IMAGE_FORMATS_SUPPORTED] =
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{ PIPE_FORMAT_B8G8R8A8_UNORM,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { VA_FOURCC('B','G','R','A'), VA_LSB_FIRST, 32, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 }},
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { PIPE_FORMAT_R8G8B8A8_UNORM,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  { VA_FOURCC_RGBA, VA_LSB_FIRST, 32, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)boolean vlCreateHTAB(void);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void vlDestroyHTAB(void);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)vlHandle vlAddDataHTAB(void *data);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* vlGetDataHTAB(vlHandle handle);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VAStatus
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)vlVaQueryImageFormats ( 	VADriverContextP ctx,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            VAImageFormat *format_list,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int *num_formats)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!ctx)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return VA_STATUS_ERROR_INVALID_CONTEXT;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!(format_list && num_formats))
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return VA_STATUS_ERROR_UNKNOWN;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int n = 0;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	num_formats[0] = VA_MAX_IMAGE_FORMATS_SUPPORTED;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Query supported formats */
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (n = 0; n < VA_MAX_IMAGE_FORMATS_SUPPORTED; n++)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		format_list[n] = va_image_formats_supported[n].va_format;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return VA_STATUS_SUCCESS;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VAStatus vlVaCreateImage(	VADriverContextP ctx,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            VAImageFormat *format,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int width,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int height,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            VAImage *image)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!ctx)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return VA_STATUS_ERROR_INVALID_CONTEXT;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if(!format)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return VA_STATUS_ERROR_UNKNOWN;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!(width && height))
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return VA_STATUS_ERROR_INVALID_IMAGE_FORMAT;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!vlCreateHTAB())
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return VA_STATUS_ERROR_UNKNOWN;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (format->fourcc) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case VA_FOURCC('B','G','R','A'):
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VA_INFO("Creating BGRA image of size %dx%d\n",width,height);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	break;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case VA_FOURCC_RGBA:
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VA_INFO("Creating RGBA image of size %dx%d\n",width,height);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	break;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VA_ERROR("Couldn't create image of type %0x08\n",format->fourcc);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	break;
107	}
108
109	VA_INFO("Image %p created successfully\n",format);
110
111	return VA_STATUS_SUCCESS;
112}
113
114VAStatus vlVaDeriveImage(	VADriverContextP ctx,
115                            VASurfaceID surface,
116                            VAImage *image)
117{
118	if (!ctx)
119		return VA_STATUS_ERROR_INVALID_CONTEXT;
120
121
122	return VA_STATUS_ERROR_UNIMPLEMENTED;
123}
124
125VAStatus vlVaDestroyImage(	VADriverContextP ctx,
126                            VAImageID image)
127{
128	if (!ctx)
129		return VA_STATUS_ERROR_INVALID_CONTEXT;
130
131
132	return VA_STATUS_ERROR_UNIMPLEMENTED;
133}
134
135VAStatus vlVaSetImagePalette(	VADriverContextP ctx,
136                            VAImageID image,
137                            unsigned char *palette)
138{
139	if (!ctx)
140		return VA_STATUS_ERROR_INVALID_CONTEXT;
141
142
143	return VA_STATUS_ERROR_UNIMPLEMENTED;
144}
145
146VAStatus vlVaGetImage(		VADriverContextP ctx,
147                            VASurfaceID surface,
148                            int x,
149                            int y,
150                            unsigned int width,
151                            unsigned int height,
152                            VAImageID image)
153{
154	if (!ctx)
155		return VA_STATUS_ERROR_INVALID_CONTEXT;
156
157
158	return VA_STATUS_ERROR_UNIMPLEMENTED;
159}
160
161VAStatus vlVaPutImage(		VADriverContextP ctx,
162                            VASurfaceID surface,
163                            VAImageID image,
164                            int src_x,
165                            int src_y,
166                            unsigned int src_width,
167                            unsigned int src_height,
168                            int dest_x,
169                            int dest_y,
170                            unsigned int dest_width,
171                            unsigned int dest_height)
172{
173	if (!ctx)
174		return VA_STATUS_ERROR_INVALID_CONTEXT;
175
176
177	return VA_STATUS_ERROR_UNIMPLEMENTED;
178}
179