2 * gstvaapicodec_objects.c - VA codec objects abstraction
4 * Copyright (C) 2010-2011 Splitted-Desktop Systems
5 * Copyright (C) 2011-2012 Intel Corporation
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public License
9 * as published by the Free Software Foundation; either version 2.1
10 * of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free
19 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 * Boston, MA 02110-1301 USA
25 #include <gst/vaapi/gstvaapicontext.h>
26 #include "gstvaapicodec_objects.h"
27 #include "gstvaapidecoder_priv.h"
28 #include "gstvaapicompat.h"
29 #include "gstvaapiutils.h"
32 #include "gstvaapidebug.h"
34 /* ------------------------------------------------------------------------- */
35 /* --- Base Codec Object --- */
36 /* ------------------------------------------------------------------------- */
38 G_DEFINE_TYPE(GstVaapiCodecObject, gst_vaapi_codec_object, GST_TYPE_MINI_OBJECT)
41 gst_vaapi_codec_object_finalize(GstMiniObject *object)
43 GstVaapiCodecObject * const obj = GST_VAAPI_CODEC_OBJECT(object);
49 gst_vaapi_codec_object_init(GstVaapiCodecObject *obj)
55 gst_vaapi_codec_object_create(
56 GstVaapiCodecObject *obj,
57 const GstVaapiCodecObjectConstructorArgs *args
60 obj->codec = args->codec;
65 gst_vaapi_codec_object_class_init(GstVaapiCodecObjectClass *klass)
67 GstMiniObjectClass * const object_class = GST_MINI_OBJECT_CLASS(klass);
69 object_class->finalize = gst_vaapi_codec_object_finalize;
70 klass->construct = gst_vaapi_codec_object_create;
74 gst_vaapi_codec_object_new(
76 GstVaapiCodecBase *codec,
84 GstVaapiCodecObject *va_obj;
85 GstVaapiCodecObjectConstructorArgs args;
87 obj = gst_mini_object_new(type);
91 va_obj = GST_VAAPI_CODEC_OBJECT(obj);
94 args.param_size = param_size;
96 args.data_size = data_size;
98 if (gst_vaapi_codec_object_construct(va_obj, &args))
101 gst_mini_object_unref(obj);
106 gst_vaapi_codec_object_construct(
107 GstVaapiCodecObject *obj,
108 const GstVaapiCodecObjectConstructorArgs *args
111 GstVaapiCodecObjectClass *klass;
113 g_return_val_if_fail(GST_VAAPI_CODEC_OBJECT(obj), FALSE);
114 g_return_val_if_fail(args->codec != NULL, FALSE);
115 g_return_val_if_fail(args->param_size > 0, FALSE);
117 if (GST_MINI_OBJECT_FLAG_IS_SET(obj, GST_VAAPI_CODEC_OBJECT_FLAG_CONSTRUCTED))
120 klass = GST_VAAPI_CODEC_OBJECT_GET_CLASS(obj);
121 if (!klass || !klass->construct || !klass->construct(obj, args))
124 GST_MINI_OBJECT_FLAG_SET(obj, GST_VAAPI_CODEC_OBJECT_FLAG_CONSTRUCTED);
128 #define GET_DECODER(obj) GST_VAAPI_DECODER_CAST((obj)->parent_instance.codec)
129 #define GET_CONTEXT(obj) GET_DECODER(obj)->priv->context
130 #define GET_VA_DISPLAY(obj) GET_DECODER(obj)->priv->va_display
131 #define GET_VA_CONTEXT(obj) GET_DECODER(obj)->priv->va_context
133 /* ------------------------------------------------------------------------- */
134 /* --- Inverse Quantization Matrices --- */
135 /* ------------------------------------------------------------------------- */
137 GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiIqMatrix,
139 GST_VAAPI_TYPE_CODEC_OBJECT)
142 gst_vaapi_iq_matrix_destroy(GstVaapiIqMatrix *iq_matrix)
144 vaapi_destroy_buffer(GET_VA_DISPLAY(iq_matrix), &iq_matrix->param_id);
145 iq_matrix->param = NULL;
149 gst_vaapi_iq_matrix_create(
150 GstVaapiIqMatrix *iq_matrix,
151 const GstVaapiCodecObjectConstructorArgs *args
154 return vaapi_create_buffer(GET_VA_DISPLAY(iq_matrix),
155 GET_VA_CONTEXT(iq_matrix),
156 VAIQMatrixBufferType,
159 &iq_matrix->param_id,
164 gst_vaapi_iq_matrix_init(GstVaapiIqMatrix *iq_matrix)
166 iq_matrix->param = NULL;
167 iq_matrix->param_id = VA_INVALID_ID;
171 gst_vaapi_iq_matrix_new(
172 GstVaapiDecoder *decoder,
177 GstVaapiCodecObject *object;
179 g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL);
181 object = gst_vaapi_codec_object_new(
182 GST_VAAPI_TYPE_IQ_MATRIX,
183 GST_VAAPI_CODEC_BASE(decoder),
189 return GST_VAAPI_IQ_MATRIX_CAST(object);
192 /* ------------------------------------------------------------------------- */
193 /* --- VC-1 Bit Planes --- */
194 /* ------------------------------------------------------------------------- */
196 GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiBitPlane,
198 GST_VAAPI_TYPE_CODEC_OBJECT)
201 gst_vaapi_bitplane_destroy(GstVaapiBitPlane *bitplane)
203 vaapi_destroy_buffer(GET_VA_DISPLAY(bitplane), &bitplane->data_id);
204 bitplane->data = NULL;
208 gst_vaapi_bitplane_create(
209 GstVaapiBitPlane *bitplane,
210 const GstVaapiCodecObjectConstructorArgs *args
213 return vaapi_create_buffer(GET_VA_DISPLAY(bitplane),
214 GET_VA_CONTEXT(bitplane),
215 VABitPlaneBufferType,
219 (void **)&bitplane->data);
223 gst_vaapi_bitplane_init(GstVaapiBitPlane *bitplane)
225 bitplane->data = NULL;
226 bitplane->data_id = VA_INVALID_ID;
230 gst_vaapi_bitplane_new(GstVaapiDecoder *decoder, guint8 *data, guint data_size)
232 GstVaapiCodecObject *object;
234 g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL);
236 object = gst_vaapi_codec_object_new(
237 GST_VAAPI_TYPE_BITPLANE,
238 GST_VAAPI_CODEC_BASE(decoder),
244 return GST_VAAPI_BITPLANE_CAST(object);
247 /* ------------------------------------------------------------------------- */
248 /* --- JPEG Huffman Tables --- */
249 /* ------------------------------------------------------------------------- */
252 GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiHuffmanTable,
253 gst_vaapi_huffman_table,
254 GST_VAAPI_TYPE_CODEC_OBJECT)
257 gst_vaapi_huffman_table_destroy(GstVaapiHuffmanTable *huf_table)
259 vaapi_destroy_buffer(GET_VA_DISPLAY(huf_table), &huf_table->param_id);
260 huf_table->param = NULL;
264 gst_vaapi_huffman_table_create(
265 GstVaapiHuffmanTable *huf_table,
266 const GstVaapiCodecObjectConstructorArgs *args
269 return vaapi_create_buffer(GET_VA_DISPLAY(huf_table),
270 GET_VA_CONTEXT(huf_table),
271 VAHuffmanTableBufferType,
274 &huf_table->param_id,
275 (void **)&huf_table->param);
279 gst_vaapi_huffman_table_init(GstVaapiHuffmanTable *huf_table)
281 huf_table->param = NULL;
282 huf_table->param_id = VA_INVALID_ID;
285 GstVaapiHuffmanTable *
286 gst_vaapi_huffman_table_new(
287 GstVaapiDecoder *decoder,
292 GstVaapiCodecObject *object;
294 g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL);
296 object = gst_vaapi_codec_object_new(
297 GST_VAAPI_TYPE_HUFFMAN_TABLE,
298 GST_VAAPI_CODEC_BASE(decoder),
304 return GST_VAAPI_HUFFMAN_TABLE_CAST(object);