Port codec objects to GstVaapiMiniObject.

This commit is contained in:
Gwenole Beauchesne 2012-12-03 11:19:08 +01:00
parent 1130a46837
commit f88374d642
5 changed files with 188 additions and 556 deletions

View file

@ -35,98 +35,69 @@
/* --- Base Codec Object --- */ /* --- Base Codec Object --- */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
G_DEFINE_TYPE(GstVaapiCodecObject, gst_vaapi_codec_object, GST_TYPE_MINI_OBJECT) #define GST_VAAPI_CODEC_OBJECT_GET_CLASS(object) \
gst_vaapi_codec_object_get_class(object)
static void const GstVaapiCodecObjectClass *
gst_vaapi_codec_object_finalize(GstMiniObject *object) gst_vaapi_codec_object_get_class(GstVaapiCodecObject *object)
{ {
GstVaapiCodecObject * const obj = GST_VAAPI_CODEC_OBJECT(object); return (const GstVaapiCodecObjectClass *)
gst_vaapi_mini_object_get_class(GST_VAAPI_MINI_OBJECT(object));
obj->codec = NULL;
}
static void
gst_vaapi_codec_object_init(GstVaapiCodecObject *obj)
{
obj->codec = NULL;
} }
static gboolean static gboolean
gst_vaapi_codec_object_create( gst_vaapi_codec_object_create(GstVaapiCodecObject *object,
GstVaapiCodecObject *obj, const GstVaapiCodecObjectConstructorArgs *args)
const GstVaapiCodecObjectConstructorArgs *args
)
{ {
obj->codec = args->codec; const GstVaapiCodecObjectClass *klass;
g_return_val_if_fail(args->param_size > 0, FALSE);
if (GST_VAAPI_MINI_OBJECT_FLAG_IS_SET(object,
GST_VAAPI_CODEC_OBJECT_FLAG_CONSTRUCTED))
return TRUE;
klass = GST_VAAPI_CODEC_OBJECT_GET_CLASS(object);
if (!klass->create || !klass->create(object, args))
return FALSE;
GST_VAAPI_MINI_OBJECT_FLAG_SET(object,
GST_VAAPI_CODEC_OBJECT_FLAG_CONSTRUCTED);
return TRUE; return TRUE;
} }
static void
gst_vaapi_codec_object_class_init(GstVaapiCodecObjectClass *klass)
{
GstMiniObjectClass * const object_class = GST_MINI_OBJECT_CLASS(klass);
object_class->finalize = gst_vaapi_codec_object_finalize;
klass->construct = gst_vaapi_codec_object_create;
}
GstVaapiCodecObject * GstVaapiCodecObject *
gst_vaapi_codec_object_new( gst_vaapi_codec_object_new(const GstVaapiCodecObjectClass *object_class,
GType type, GstVaapiCodecBase *codec, gconstpointer param, guint param_size,
GstVaapiCodecBase *codec, gconstpointer data, guint data_size, guint flags)
gconstpointer param,
guint param_size,
gconstpointer data,
guint data_size
)
{ {
GstMiniObject *obj; GstVaapiMiniObject *obj;
GstVaapiCodecObject *va_obj; GstVaapiCodecObject *va_obj;
GstVaapiCodecObjectConstructorArgs args; GstVaapiCodecObjectConstructorArgs args;
obj = gst_mini_object_new(type); g_return_val_if_fail(codec != NULL, NULL);
obj = gst_vaapi_mini_object_new0(&object_class->parent_class);
if (!obj) if (!obj)
return NULL; return NULL;
va_obj = GST_VAAPI_CODEC_OBJECT(obj); va_obj = GST_VAAPI_CODEC_OBJECT(obj);
args.codec = codec; va_obj->codec = codec;
args.param = param; args.param = param;
args.param_size = param_size; args.param_size = param_size;
args.data = data; args.data = data;
args.data_size = data_size; args.data_size = data_size;
args.flags = 0; args.flags = flags;
if (gst_vaapi_codec_object_construct(va_obj, &args))
if (gst_vaapi_codec_object_create(va_obj, &args))
return va_obj; return va_obj;
gst_mini_object_unref(obj); gst_vaapi_mini_object_unref(obj);
return NULL; return NULL;
} }
gboolean
gst_vaapi_codec_object_construct(
GstVaapiCodecObject *obj,
const GstVaapiCodecObjectConstructorArgs *args
)
{
GstVaapiCodecObjectClass *klass;
g_return_val_if_fail(GST_VAAPI_CODEC_OBJECT(obj), FALSE);
g_return_val_if_fail(args->codec != NULL, FALSE);
g_return_val_if_fail(args->param_size > 0, FALSE);
if (GST_MINI_OBJECT_FLAG_IS_SET(obj, GST_VAAPI_CODEC_OBJECT_FLAG_CONSTRUCTED))
return TRUE;
klass = GST_VAAPI_CODEC_OBJECT_GET_CLASS(obj);
if (!klass || !klass->construct || !klass->construct(obj, args))
return FALSE;
GST_MINI_OBJECT_FLAG_SET(obj, GST_VAAPI_CODEC_OBJECT_FLAG_CONSTRUCTED);
return TRUE;
}
#define GET_DECODER(obj) GST_VAAPI_DECODER_CAST((obj)->parent_instance.codec) #define GET_DECODER(obj) GST_VAAPI_DECODER_CAST((obj)->parent_instance.codec)
#define GET_CONTEXT(obj) GET_DECODER(obj)->priv->context
#define GET_VA_DISPLAY(obj) GET_DECODER(obj)->priv->va_display #define GET_VA_DISPLAY(obj) GET_DECODER(obj)->priv->va_display
#define GET_VA_CONTEXT(obj) GET_DECODER(obj)->priv->va_context #define GET_VA_CONTEXT(obj) GET_DECODER(obj)->priv->va_context
@ -134,23 +105,22 @@ gst_vaapi_codec_object_construct(
/* --- Inverse Quantization Matrices --- */ /* --- Inverse Quantization Matrices --- */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiIqMatrix, GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiIqMatrix, gst_vaapi_iq_matrix);
gst_vaapi_iq_matrix,
GST_VAAPI_TYPE_CODEC_OBJECT)
static void void
gst_vaapi_iq_matrix_destroy(GstVaapiIqMatrix *iq_matrix) gst_vaapi_iq_matrix_destroy(GstVaapiIqMatrix *iq_matrix)
{ {
vaapi_destroy_buffer(GET_VA_DISPLAY(iq_matrix), &iq_matrix->param_id); vaapi_destroy_buffer(GET_VA_DISPLAY(iq_matrix), &iq_matrix->param_id);
iq_matrix->param = NULL; iq_matrix->param = NULL;
} }
static gboolean gboolean
gst_vaapi_iq_matrix_create( gst_vaapi_iq_matrix_create(
GstVaapiIqMatrix *iq_matrix, GstVaapiIqMatrix *iq_matrix,
const GstVaapiCodecObjectConstructorArgs *args const GstVaapiCodecObjectConstructorArgs *args
) )
{ {
iq_matrix->param_id = VA_INVALID_ID;
return vaapi_create_buffer(GET_VA_DISPLAY(iq_matrix), return vaapi_create_buffer(GET_VA_DISPLAY(iq_matrix),
GET_VA_CONTEXT(iq_matrix), GET_VA_CONTEXT(iq_matrix),
VAIQMatrixBufferType, VAIQMatrixBufferType,
@ -160,13 +130,6 @@ gst_vaapi_iq_matrix_create(
&iq_matrix->param); &iq_matrix->param);
} }
static void
gst_vaapi_iq_matrix_init(GstVaapiIqMatrix *iq_matrix)
{
iq_matrix->param = NULL;
iq_matrix->param_id = VA_INVALID_ID;
}
GstVaapiIqMatrix * GstVaapiIqMatrix *
gst_vaapi_iq_matrix_new( gst_vaapi_iq_matrix_new(
GstVaapiDecoder *decoder, GstVaapiDecoder *decoder,
@ -179,10 +142,11 @@ gst_vaapi_iq_matrix_new(
g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL); g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL);
object = gst_vaapi_codec_object_new( object = gst_vaapi_codec_object_new(
GST_VAAPI_TYPE_IQ_MATRIX, &GstVaapiIqMatrixClass,
GST_VAAPI_CODEC_BASE(decoder), GST_VAAPI_CODEC_BASE(decoder),
param, param_size, param, param_size,
NULL, 0 NULL, 0,
0
); );
if (!object) if (!object)
return NULL; return NULL;
@ -193,23 +157,22 @@ gst_vaapi_iq_matrix_new(
/* --- VC-1 Bit Planes --- */ /* --- VC-1 Bit Planes --- */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiBitPlane, GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiBitPlane, gst_vaapi_bitplane);
gst_vaapi_bitplane,
GST_VAAPI_TYPE_CODEC_OBJECT)
static void void
gst_vaapi_bitplane_destroy(GstVaapiBitPlane *bitplane) gst_vaapi_bitplane_destroy(GstVaapiBitPlane *bitplane)
{ {
vaapi_destroy_buffer(GET_VA_DISPLAY(bitplane), &bitplane->data_id); vaapi_destroy_buffer(GET_VA_DISPLAY(bitplane), &bitplane->data_id);
bitplane->data = NULL; bitplane->data = NULL;
} }
static gboolean gboolean
gst_vaapi_bitplane_create( gst_vaapi_bitplane_create(
GstVaapiBitPlane *bitplane, GstVaapiBitPlane *bitplane,
const GstVaapiCodecObjectConstructorArgs *args const GstVaapiCodecObjectConstructorArgs *args
) )
{ {
bitplane->data_id = VA_INVALID_ID;
return vaapi_create_buffer(GET_VA_DISPLAY(bitplane), return vaapi_create_buffer(GET_VA_DISPLAY(bitplane),
GET_VA_CONTEXT(bitplane), GET_VA_CONTEXT(bitplane),
VABitPlaneBufferType, VABitPlaneBufferType,
@ -219,12 +182,6 @@ gst_vaapi_bitplane_create(
(void **)&bitplane->data); (void **)&bitplane->data);
} }
static void
gst_vaapi_bitplane_init(GstVaapiBitPlane *bitplane)
{
bitplane->data = NULL;
bitplane->data_id = VA_INVALID_ID;
}
GstVaapiBitPlane * GstVaapiBitPlane *
gst_vaapi_bitplane_new(GstVaapiDecoder *decoder, guint8 *data, guint data_size) gst_vaapi_bitplane_new(GstVaapiDecoder *decoder, guint8 *data, guint data_size)
@ -234,10 +191,11 @@ gst_vaapi_bitplane_new(GstVaapiDecoder *decoder, guint8 *data, guint data_size)
g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL); g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL);
object = gst_vaapi_codec_object_new( object = gst_vaapi_codec_object_new(
GST_VAAPI_TYPE_BITPLANE, &GstVaapiBitPlaneClass,
GST_VAAPI_CODEC_BASE(decoder), GST_VAAPI_CODEC_BASE(decoder),
data, data_size, data, data_size,
NULL, 0 NULL, 0,
0
); );
if (!object) if (!object)
return NULL; return NULL;
@ -249,23 +207,22 @@ gst_vaapi_bitplane_new(GstVaapiDecoder *decoder, guint8 *data, guint data_size)
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
#if USE_JPEG_DECODER #if USE_JPEG_DECODER
GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiHuffmanTable, GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiHuffmanTable, gst_vaapi_huffman_table);
gst_vaapi_huffman_table,
GST_VAAPI_TYPE_CODEC_OBJECT)
static void void
gst_vaapi_huffman_table_destroy(GstVaapiHuffmanTable *huf_table) gst_vaapi_huffman_table_destroy(GstVaapiHuffmanTable *huf_table)
{ {
vaapi_destroy_buffer(GET_VA_DISPLAY(huf_table), &huf_table->param_id); vaapi_destroy_buffer(GET_VA_DISPLAY(huf_table), &huf_table->param_id);
huf_table->param = NULL; huf_table->param = NULL;
} }
static gboolean gboolean
gst_vaapi_huffman_table_create( gst_vaapi_huffman_table_create(
GstVaapiHuffmanTable *huf_table, GstVaapiHuffmanTable *huf_table,
const GstVaapiCodecObjectConstructorArgs *args const GstVaapiCodecObjectConstructorArgs *args
) )
{ {
huf_table->param_id = VA_INVALID_ID;
return vaapi_create_buffer(GET_VA_DISPLAY(huf_table), return vaapi_create_buffer(GET_VA_DISPLAY(huf_table),
GET_VA_CONTEXT(huf_table), GET_VA_CONTEXT(huf_table),
VAHuffmanTableBufferType, VAHuffmanTableBufferType,
@ -275,13 +232,6 @@ gst_vaapi_huffman_table_create(
(void **)&huf_table->param); (void **)&huf_table->param);
} }
static void
gst_vaapi_huffman_table_init(GstVaapiHuffmanTable *huf_table)
{
huf_table->param = NULL;
huf_table->param_id = VA_INVALID_ID;
}
GstVaapiHuffmanTable * GstVaapiHuffmanTable *
gst_vaapi_huffman_table_new( gst_vaapi_huffman_table_new(
GstVaapiDecoder *decoder, GstVaapiDecoder *decoder,
@ -294,10 +244,11 @@ gst_vaapi_huffman_table_new(
g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL); g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL);
object = gst_vaapi_codec_object_new( object = gst_vaapi_codec_object_new(
GST_VAAPI_TYPE_HUFFMAN_TABLE, &GstVaapiHuffmanTableClass,
GST_VAAPI_CODEC_BASE(decoder), GST_VAAPI_CODEC_BASE(decoder),
data, data_size, data, data_size,
NULL, 0 NULL, 0,
0
); );
if (!object) if (!object)
return NULL; return NULL;

View file

@ -23,7 +23,7 @@
#ifndef GST_VAAPI_CODEC_COMMON_H #ifndef GST_VAAPI_CODEC_COMMON_H
#define GST_VAAPI_CODEC_COMMON_H #define GST_VAAPI_CODEC_COMMON_H
#include <gst/gstminiobject.h> #include <gst/vaapi/gstvaapiminiobject.h>
#include <gst/vaapi/gstvaapidecoder.h> #include <gst/vaapi/gstvaapidecoder.h>
G_BEGIN_DECLS G_BEGIN_DECLS
@ -32,11 +32,8 @@ typedef gpointer GstVaapiCodecBase;
typedef struct _GstVaapiCodecObject GstVaapiCodecObject; typedef struct _GstVaapiCodecObject GstVaapiCodecObject;
typedef struct _GstVaapiCodecObjectClass GstVaapiCodecObjectClass; typedef struct _GstVaapiCodecObjectClass GstVaapiCodecObjectClass;
typedef struct _GstVaapiIqMatrix GstVaapiIqMatrix; typedef struct _GstVaapiIqMatrix GstVaapiIqMatrix;
typedef struct _GstVaapiIqMatrixClass GstVaapiIqMatrixClass;
typedef struct _GstVaapiBitPlane GstVaapiBitPlane; typedef struct _GstVaapiBitPlane GstVaapiBitPlane;
typedef struct _GstVaapiBitPlaneClass GstVaapiBitPlaneClass;
typedef struct _GstVaapiHuffmanTable GstVaapiHuffmanTable; typedef struct _GstVaapiHuffmanTable GstVaapiHuffmanTable;
typedef struct _GstVaapiHuffmanTableClass GstVaapiHuffmanTableClass;
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
/* --- Base Codec Object --- */ /* --- Base Codec Object --- */
@ -46,38 +43,15 @@ typedef struct _GstVaapiHuffmanTableClass GstVaapiHuffmanTableClass;
#define GST_VAAPI_CODEC_BASE(obj) \ #define GST_VAAPI_CODEC_BASE(obj) \
((GstVaapiCodecBase *)(obj)) ((GstVaapiCodecBase *)(obj))
#define GST_VAAPI_TYPE_CODEC_OBJECT \ #define GST_VAAPI_CODEC_OBJECT(obj) \
(gst_vaapi_codec_object_get_type()) ((GstVaapiCodecObject *)(obj))
#define GST_VAAPI_CODEC_OBJECT(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), \
GST_VAAPI_TYPE_CODEC_OBJECT, \
GstVaapiCodecObject))
#define GST_VAAPI_CODEC_OBJECT_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), \
GST_VAAPI_TYPE_CODEC_OBJECT, \
GstVaapiCodecObjectClass))
#define GST_VAAPI_IS_CODEC_OBJECT(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_VAAPI_TYPE_CODEC_OBJECT))
#define GST_VAAPI_IS_CODEC_OBJECT_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_VAAPI_TYPE_CODEC_OBJECT))
#define GST_VAAPI_CODEC_OBJECT_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), \
GST_VAAPI_TYPE_CODEC_OBJECT, \
GstVaapiCodecObjectClass))
enum { enum {
GST_VAAPI_CODEC_OBJECT_FLAG_CONSTRUCTED = (GST_MINI_OBJECT_FLAG_LAST << 0), GST_VAAPI_CODEC_OBJECT_FLAG_CONSTRUCTED = (1 << 0),
GST_VAAPI_CODEC_OBJECT_FLAG_LAST = (GST_MINI_OBJECT_FLAG_LAST << 1) GST_VAAPI_CODEC_OBJECT_FLAG_LAST = (1 << 1)
}; };
typedef struct { typedef struct {
GstVaapiCodecObject *obj;
GstVaapiCodecBase *codec;
gconstpointer param; gconstpointer param;
guint param_size; guint param_size;
gconstpointer data; gconstpointer data;
@ -85,14 +59,20 @@ typedef struct {
guint flags; guint flags;
} GstVaapiCodecObjectConstructorArgs; } GstVaapiCodecObjectConstructorArgs;
typedef gboolean
(*GstVaapiCodecObjectCreateFunc)(GstVaapiCodecObject *object,
const GstVaapiCodecObjectConstructorArgs *args);
typedef GDestroyNotify GstVaapiCodecObjectDestroyFunc;
/** /**
* GstVaapiCodecObject: * GstVaapiCodecObject:
* *
* A #GstMiniObject holding the base codec object data * A #GstVaapiMiniObject holding the base codec object data
*/ */
struct _GstVaapiCodecObject { struct _GstVaapiCodecObject {
/*< private >*/ /*< private >*/
GstMiniObject parent_instance; GstVaapiMiniObject parent_instance;
GstVaapiCodecBase *codec; GstVaapiCodecBase *codec;
}; };
@ -103,65 +83,28 @@ struct _GstVaapiCodecObject {
*/ */
struct _GstVaapiCodecObjectClass { struct _GstVaapiCodecObjectClass {
/*< private >*/ /*< private >*/
GstMiniObjectClass parent_class; GstVaapiMiniObjectClass parent_class;
gboolean (*construct) (GstVaapiCodecObject *obj, GstVaapiCodecObjectCreateFunc create;
const GstVaapiCodecObjectConstructorArgs *args);
}; };
G_GNUC_INTERNAL G_GNUC_INTERNAL
GType const GstVaapiCodecObjectClass *
gst_vaapi_codec_object_get_type(void) G_GNUC_CONST; gst_vaapi_codec_object_get_class(GstVaapiCodecObject *object) G_GNUC_CONST;
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiCodecObject * GstVaapiCodecObject *
gst_vaapi_codec_object_new( gst_vaapi_codec_object_new(const GstVaapiCodecObjectClass *object_class,
GType type, GstVaapiCodecBase *codec, gconstpointer param, guint param_size,
GstVaapiCodecBase *codec, gconstpointer data, guint data_size, guint flags);
gconstpointer param,
guint param_size,
gconstpointer data,
guint data_size
);
G_GNUC_INTERNAL
gboolean
gst_vaapi_codec_object_construct(
GstVaapiCodecObject *obj,
const GstVaapiCodecObjectConstructorArgs *args
);
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
/* --- Inverse Quantization Matrices --- */ /* --- Inverse Quantization Matrices --- */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
#define GST_VAAPI_TYPE_IQ_MATRIX \
(gst_vaapi_iq_matrix_get_type())
#define GST_VAAPI_IQ_MATRIX_CAST(obj) \ #define GST_VAAPI_IQ_MATRIX_CAST(obj) \
((GstVaapiIqMatrix *)(obj)) ((GstVaapiIqMatrix *)(obj))
#define GST_VAAPI_IQ_MATRIX(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), \
GST_VAAPI_TYPE_IQ_MATRIX, \
GstVaapiIqMatrix))
#define GST_VAAPI_IQ_MATRIX_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), \
GST_VAAPI_TYPE_IQ_MATRIX, \
GstVaapiIqMatrixClass))
#define GST_VAAPI_IS_IQ_MATRIX(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_VAAPI_TYPE_IQ_MATRIX))
#define GST_VAAPI_IS_IQ_MATRIX_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_VAAPI_TYPE_IQ_MATRIX))
#define GST_VAAPI_IQ_MATRIX_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), \
GST_VAAPI_TYPE_IQ_MATRIX, \
GstVaapiIqMatrixClass))
/** /**
* GstVaapiIqMatrix: * GstVaapiIqMatrix:
* *
@ -176,20 +119,6 @@ struct _GstVaapiIqMatrix {
gpointer param; gpointer param;
}; };
/**
* GstVaapiIqMatrixClass:
*
* The #GstVaapiIqMatrix base class.
*/
struct _GstVaapiIqMatrixClass {
/*< private >*/
GstVaapiCodecObjectClass parent_class;
};
G_GNUC_INTERNAL
GType
gst_vaapi_iq_matrix_get_type(void) G_GNUC_CONST;
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiIqMatrix * GstVaapiIqMatrix *
gst_vaapi_iq_matrix_new( gst_vaapi_iq_matrix_new(
@ -202,33 +131,9 @@ gst_vaapi_iq_matrix_new(
/* --- VC-1 Bit Planes --- */ /* --- VC-1 Bit Planes --- */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
#define GST_VAAPI_TYPE_BITPLANE \
(gst_vaapi_bitplane_get_type())
#define GST_VAAPI_BITPLANE_CAST(obj) \ #define GST_VAAPI_BITPLANE_CAST(obj) \
((GstVaapiBitPlane *)(obj)) ((GstVaapiBitPlane *)(obj))
#define GST_VAAPI_BITPLANE(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), \
GST_VAAPI_TYPE_BITPLANE, \
GstVaapiBitPlane))
#define GST_VAAPI_BITPLANE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), \
GST_VAAPI_TYPE_BITPLANE, \
GstVaapiBitPlaneClass))
#define GST_VAAPI_IS_BITPLANE(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_VAAPI_TYPE_BITPLANE))
#define GST_VAAPI_IS_BITPLANE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_VAAPI_TYPE_BITPLANE))
#define GST_VAAPI_BITPLANE_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), \
GST_VAAPI_TYPE_BITPLANE, \
GstVaapiBitPlaneClass))
/** /**
* GstVaapiBitPlane: * GstVaapiBitPlane:
* *
@ -243,20 +148,6 @@ struct _GstVaapiBitPlane {
guint8 *data; guint8 *data;
}; };
/**
* GstVaapiBitPlaneClass:
*
* The #GstVaapiBitPlane base class.
*/
struct _GstVaapiBitPlaneClass {
/*< private >*/
GstVaapiCodecObjectClass parent_class;
};
G_GNUC_INTERNAL
GType
gst_vaapi_bitplane_get_type(void) G_GNUC_CONST;
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiBitPlane * GstVaapiBitPlane *
gst_vaapi_bitplane_new(GstVaapiDecoder *decoder, guint8 *data, guint data_size); gst_vaapi_bitplane_new(GstVaapiDecoder *decoder, guint8 *data, guint data_size);
@ -265,33 +156,9 @@ gst_vaapi_bitplane_new(GstVaapiDecoder *decoder, guint8 *data, guint data_size);
/* --- JPEG Huffman Tables --- */ /* --- JPEG Huffman Tables --- */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
#define GST_VAAPI_TYPE_HUFFMAN_TABLE \
(gst_vaapi_huffman_table_get_type())
#define GST_VAAPI_HUFFMAN_TABLE_CAST(obj) \ #define GST_VAAPI_HUFFMAN_TABLE_CAST(obj) \
((GstVaapiHuffmanTable *)(obj)) ((GstVaapiHuffmanTable *)(obj))
#define GST_VAAPI_HUFFMAN_TABLE(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), \
GST_VAAPI_TYPE_HUFFMAN_TABLE, \
GstVaapiHuffmanTable))
#define GST_VAAPI_HUFFMAN_TABLE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), \
GST_VAAPI_TYPE_HUFFMAN_TABLE, \
GstVaapiHuffmanTableClass))
#define GST_VAAPI_IS_HUFFMAN_TABLE(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_VAAPI_TYPE_HUFFMAN_TABLE))
#define GST_VAAPI_IS_HUFFMAN_TABLE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_VAAPI_TYPE_HUFFMAN_TABLE))
#define GST_VAAPI_HUFFMAN_TABLE_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), \
GST_VAAPI_TYPE_HUFFMAN_TABLE, \
GstVaapiHuffmanTableClass))
/** /**
* GstVaapiHuffmanTable: * GstVaapiHuffmanTable:
* *
@ -306,20 +173,6 @@ struct _GstVaapiHuffmanTable {
gpointer param; gpointer param;
}; };
/**
* GstVaapiHuffmanTableClass:
*
* The #GstVaapiHuffmanTable base class.
*/
struct _GstVaapiHuffmanTableClass {
/*< private >*/
GstVaapiCodecObjectClass parent_class;
};
G_GNUC_INTERNAL
GType
gst_vaapi_huffman_table_get_type(void) G_GNUC_CONST;
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiHuffmanTable * GstVaapiHuffmanTable *
gst_vaapi_huffman_table_new( gst_vaapi_huffman_table_new(
@ -332,56 +185,26 @@ gst_vaapi_huffman_table_new(
/* --- Helpers to create codec-dependent objects --- */ /* --- Helpers to create codec-dependent objects --- */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
#define GST_VAAPI_CODEC_DEFINE_TYPE(type, prefix, base_type) \ #define GST_VAAPI_CODEC_DEFINE_TYPE(type, prefix) \
G_DEFINE_TYPE(type, prefix, base_type) \ G_GNUC_INTERNAL \
\ void \
static void \ prefix##_destroy(type *); \
prefix##_destroy(type *); \ \
\ G_GNUC_INTERNAL \
static gboolean \ gboolean \
prefix##_create( \ prefix##_create( \
type *, \ type *, \
const GstVaapiCodecObjectConstructorArgs *args \ const GstVaapiCodecObjectConstructorArgs *args \
); \ ); \
\ \
static void \ static const GstVaapiCodecObjectClass type##Class = { \
prefix##_finalize(GstMiniObject *object) \ .parent_class = { \
{ \ .size = sizeof(type), \
GstMiniObjectClass *parent_class; \ .finalize = (GstVaapiCodecObjectDestroyFunc) \
\ prefix##_destroy \
prefix##_destroy((type *)object); \ }, \
\ .create = (GstVaapiCodecObjectCreateFunc) \
parent_class = GST_MINI_OBJECT_CLASS(prefix##_parent_class); \ prefix##_create, \
if (parent_class->finalize) \
parent_class->finalize(object); \
} \
\
static gboolean \
prefix##_construct( \
GstVaapiCodecObject *object, \
const GstVaapiCodecObjectConstructorArgs *args \
) \
{ \
GstVaapiCodecObjectClass *parent_class; \
\
parent_class = GST_VAAPI_CODEC_OBJECT_CLASS(prefix##_parent_class); \
if (parent_class->construct) { \
if (!parent_class->construct(object, args)) \
return FALSE; \
} \
return prefix##_create((type *)object, args); \
} \
\
static void \
prefix##_class_init(type##Class *klass) \
{ \
GstMiniObjectClass * const object_class = \
GST_MINI_OBJECT_CLASS(klass); \
GstVaapiCodecObjectClass * const codec_class = \
GST_VAAPI_CODEC_OBJECT_CLASS(klass); \
\
object_class->finalize = prefix##_finalize; \
codec_class->construct = prefix##_construct; \
} }
#define GST_VAAPI_IQ_MATRIX_NEW(codec, decoder) \ #define GST_VAAPI_IQ_MATRIX_NEW(codec, decoder) \

View file

@ -43,9 +43,7 @@
typedef struct _GstVaapiFrameStore GstVaapiFrameStore; typedef struct _GstVaapiFrameStore GstVaapiFrameStore;
typedef struct _GstVaapiFrameStoreClass GstVaapiFrameStoreClass; typedef struct _GstVaapiFrameStoreClass GstVaapiFrameStoreClass;
typedef struct _GstVaapiPictureH264 GstVaapiPictureH264; typedef struct _GstVaapiPictureH264 GstVaapiPictureH264;
typedef struct _GstVaapiPictureH264Class GstVaapiPictureH264Class;
typedef struct _GstVaapiSliceH264 GstVaapiSliceH264; typedef struct _GstVaapiSliceH264 GstVaapiSliceH264;
typedef struct _GstVaapiSliceH264Class GstVaapiSliceH264Class;
// Used for field_poc[] // Used for field_poc[]
#define TOP_FIELD 0 #define TOP_FIELD 0
@ -55,32 +53,14 @@ typedef struct _GstVaapiSliceH264Class GstVaapiSliceH264Class;
/* --- H.264 Pictures --- */ /* --- H.264 Pictures --- */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
#define GST_VAAPI_TYPE_PICTURE_H264 \
(gst_vaapi_picture_h264_get_type())
#define GST_VAAPI_PICTURE_H264_CAST(obj) \ #define GST_VAAPI_PICTURE_H264_CAST(obj) \
((GstVaapiPictureH264 *)(obj)) ((GstVaapiPictureH264 *)(obj))
#define GST_VAAPI_PICTURE_H264(obj) \ #define GST_VAAPI_PICTURE_H264(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), \ GST_VAAPI_PICTURE_H264_CAST(obj)
GST_VAAPI_TYPE_PICTURE_H264, \
GstVaapiPictureH264))
#define GST_VAAPI_PICTURE_H264_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), \
GST_VAAPI_TYPE_PICTURE_H264, \
GstVaapiPictureH264Class))
#define GST_VAAPI_IS_PICTURE_H264(obj) \ #define GST_VAAPI_IS_PICTURE_H264(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_VAAPI_TYPE_PICTURE_H264)) (GST_VAAPI_PICTURE_H264(obj) != NULL)
#define GST_VAAPI_IS_PICTURE_H264_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_VAAPI_TYPE_PICTURE_H264))
#define GST_VAAPI_PICTURE_H264_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), \
GST_VAAPI_TYPE_PICTURE_H264, \
GstVaapiPictureH264Class))
/* /*
* Extended picture flags: * Extended picture flags:
@ -133,35 +113,27 @@ struct _GstVaapiPictureH264 {
guint output_needed : 1; guint output_needed : 1;
}; };
struct _GstVaapiPictureH264Class { GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiPictureH264, gst_vaapi_picture_h264);
/*< private >*/
GstVaapiPictureClass parent_class;
};
GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiPictureH264, void
gst_vaapi_picture_h264, gst_vaapi_picture_h264_destroy(GstVaapiPictureH264 *picture)
GST_VAAPI_TYPE_PICTURE)
static void
gst_vaapi_picture_h264_destroy(GstVaapiPictureH264 *decoder)
{ {
gst_vaapi_picture_destroy(GST_VAAPI_PICTURE(picture));
} }
static gboolean gboolean
gst_vaapi_picture_h264_create( gst_vaapi_picture_h264_create(
GstVaapiPictureH264 *picture, GstVaapiPictureH264 *picture,
const GstVaapiCodecObjectConstructorArgs *args const GstVaapiCodecObjectConstructorArgs *args
) )
{ {
return TRUE; if (!gst_vaapi_picture_create(GST_VAAPI_PICTURE(picture), args))
} return FALSE;
static void
gst_vaapi_picture_h264_init(GstVaapiPictureH264 *picture)
{
picture->field_poc[0] = G_MAXINT32; picture->field_poc[0] = G_MAXINT32;
picture->field_poc[1] = G_MAXINT32; picture->field_poc[1] = G_MAXINT32;
picture->output_needed = FALSE; picture->output_needed = FALSE;
return TRUE;
} }
static inline GstVaapiPictureH264 * static inline GstVaapiPictureH264 *
@ -172,10 +144,11 @@ gst_vaapi_picture_h264_new(GstVaapiDecoderH264 *decoder)
g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL); g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL);
object = gst_vaapi_codec_object_new( object = gst_vaapi_codec_object_new(
GST_VAAPI_TYPE_PICTURE_H264, &GstVaapiPictureH264Class,
GST_VAAPI_CODEC_BASE(decoder), GST_VAAPI_CODEC_BASE(decoder),
NULL, sizeof(VAPictureParameterBufferH264), NULL, sizeof(VAPictureParameterBufferH264),
NULL, 0 NULL, 0,
0
); );
if (!object) if (!object)
return NULL; return NULL;
@ -228,66 +201,39 @@ gst_vaapi_picture_h264_get_last_slice(GstVaapiPictureH264 *picture)
/* --- Slices --- */ /* --- Slices --- */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
#define GST_VAAPI_TYPE_SLICE_H264 \
(gst_vaapi_slice_h264_get_type())
#define GST_VAAPI_SLICE_H264_CAST(obj) \ #define GST_VAAPI_SLICE_H264_CAST(obj) \
((GstVaapiSliceH264 *)(obj)) ((GstVaapiSliceH264 *)(obj))
#define GST_VAAPI_SLICE_H264(obj) \ #define GST_VAAPI_SLICE_H264(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), \ GST_VAAPI_SLICE_H264(obj)
GST_VAAPI_TYPE_SLICE_H264, \
GstVaapiSliceH264))
#define GST_VAAPI_SLICE_H264_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), \
GST_VAAPI_TYPE_SLICE_H264, \
GstVaapiSliceH264Class))
#define GST_VAAPI_IS_SLICE_H264(obj) \ #define GST_VAAPI_IS_SLICE_H264(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_VAAPI_TYPE_SLICE_H264)) (GST_VAAPI_SLICE_H264(obj) != NULL)
#define GST_VAAPI_IS_SLICE_H264_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_VAAPI_TYPE_SLICE_H264))
#define GST_VAAPI_SLICE_H264_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), \
GST_VAAPI_TYPE_SLICE_H264, \
GstVaapiSliceH264Class))
struct _GstVaapiSliceH264 { struct _GstVaapiSliceH264 {
GstVaapiSlice base; GstVaapiSlice base;
GstH264SliceHdr slice_hdr; // parsed slice_header() GstH264SliceHdr slice_hdr; // parsed slice_header()
}; };
struct _GstVaapiSliceH264Class { GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiSliceH264, gst_vaapi_slice_h264);
/*< private >*/
GstVaapiSliceClass parent_class;
};
GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiSliceH264, void
gst_vaapi_slice_h264,
GST_VAAPI_TYPE_SLICE)
static void
gst_vaapi_slice_h264_destroy(GstVaapiSliceH264 *slice) gst_vaapi_slice_h264_destroy(GstVaapiSliceH264 *slice)
{ {
gst_vaapi_slice_destroy(GST_VAAPI_SLICE(slice));
} }
static gboolean gboolean
gst_vaapi_slice_h264_create( gst_vaapi_slice_h264_create(
GstVaapiSliceH264 *slice, GstVaapiSliceH264 *slice,
const GstVaapiCodecObjectConstructorArgs *args const GstVaapiCodecObjectConstructorArgs *args
) )
{ {
if (!gst_vaapi_slice_create(GST_VAAPI_SLICE(slice), args))
return FALSE;
return TRUE; return TRUE;
} }
static void
gst_vaapi_slice_h264_init(GstVaapiSliceH264 *slice)
{
}
static inline GstVaapiSliceH264 * static inline GstVaapiSliceH264 *
gst_vaapi_slice_h264_new( gst_vaapi_slice_h264_new(
GstVaapiDecoderH264 *decoder, GstVaapiDecoderH264 *decoder,
@ -300,10 +246,11 @@ gst_vaapi_slice_h264_new(
g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL); g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL);
object = gst_vaapi_codec_object_new( object = gst_vaapi_codec_object_new(
GST_VAAPI_TYPE_SLICE_H264, &GstVaapiSliceH264Class,
GST_VAAPI_CODEC_BASE(decoder), GST_VAAPI_CODEC_BASE(decoder),
NULL, sizeof(VASliceParameterBufferH264), NULL, sizeof(VASliceParameterBufferH264),
data, data_size data, data_size,
0
); );
if (!object) if (!object)
return NULL; return NULL;
@ -2927,7 +2874,7 @@ decode_slice(GstVaapiDecoderH264 *decoder, GstH264NalUnit *nalu)
error: error:
if (slice) if (slice)
gst_mini_object_unref(GST_MINI_OBJECT(slice)); gst_vaapi_mini_object_unref(GST_VAAPI_MINI_OBJECT(slice));
return status; return status;
} }

View file

@ -40,9 +40,7 @@
/* --- Pictures --- */ /* --- Pictures --- */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiPicture, GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiPicture, gst_vaapi_picture);
gst_vaapi_picture,
GST_VAAPI_TYPE_CODEC_OBJECT)
enum { enum {
GST_VAAPI_CREATE_PICTURE_FLAG_CLONE = 1 << 0, GST_VAAPI_CREATE_PICTURE_FLAG_CLONE = 1 << 0,
@ -52,12 +50,12 @@ enum {
static void static void
destroy_slice_cb(gpointer data, gpointer user_data) destroy_slice_cb(gpointer data, gpointer user_data)
{ {
GstMiniObject * const object = data; GstVaapiMiniObject * const object = data;
gst_mini_object_unref(object); gst_vaapi_mini_object_unref(object);
} }
static void void
gst_vaapi_picture_destroy(GstVaapiPicture *picture) gst_vaapi_picture_destroy(GstVaapiPicture *picture)
{ {
if (picture->slices) { if (picture->slices) {
@ -66,20 +64,12 @@ gst_vaapi_picture_destroy(GstVaapiPicture *picture)
picture->slices = NULL; picture->slices = NULL;
} }
if (picture->iq_matrix) { gst_vaapi_mini_object_replace((GstVaapiMiniObject **)&picture->iq_matrix,
gst_mini_object_unref(GST_MINI_OBJECT(picture->iq_matrix)); NULL);
picture->iq_matrix = NULL; gst_vaapi_mini_object_replace((GstVaapiMiniObject **)&picture->huf_table,
} NULL);
gst_vaapi_mini_object_replace((GstVaapiMiniObject **)&picture->bitplane,
if (picture->huf_table) { NULL);
gst_mini_object_unref(GST_MINI_OBJECT(picture->huf_table));
picture->huf_table = NULL;
}
if (picture->bitplane) {
gst_mini_object_unref(GST_MINI_OBJECT(picture->bitplane));
picture->bitplane = NULL;
}
if (picture->proxy) { if (picture->proxy) {
gst_vaapi_surface_proxy_unref(picture->proxy); gst_vaapi_surface_proxy_unref(picture->proxy);
@ -96,7 +86,7 @@ gst_vaapi_picture_destroy(GstVaapiPicture *picture)
picture->param = NULL; picture->param = NULL;
} }
static gboolean gboolean
gst_vaapi_picture_create( gst_vaapi_picture_create(
GstVaapiPicture *picture, GstVaapiPicture *picture,
const GstVaapiCodecObjectConstructorArgs *args const GstVaapiCodecObjectConstructorArgs *args
@ -139,6 +129,9 @@ gst_vaapi_picture_create(
} }
} }
else { else {
picture->type = GST_VAAPI_PICTURE_TYPE_NONE;
picture->pts = GST_CLOCK_TIME_NONE;
picture->surface = gst_vaapi_context_get_surface(GET_CONTEXT(picture)); picture->surface = gst_vaapi_context_get_surface(GET_CONTEXT(picture));
if (!picture->surface) if (!picture->surface)
return FALSE; return FALSE;
@ -153,6 +146,7 @@ gst_vaapi_picture_create(
} }
picture->surface_id = gst_vaapi_surface_get_id(picture->surface); picture->surface_id = gst_vaapi_surface_get_id(picture->surface);
picture->param_id = VA_INVALID_ID;
success = vaapi_create_buffer( success = vaapi_create_buffer(
GET_VA_DISPLAY(picture), GET_VA_DISPLAY(picture),
GET_VA_CONTEXT(picture), GET_VA_CONTEXT(picture),
@ -172,24 +166,6 @@ gst_vaapi_picture_create(
return TRUE; return TRUE;
} }
static void
gst_vaapi_picture_init(GstVaapiPicture *picture)
{
picture->type = GST_VAAPI_PICTURE_TYPE_NONE;
picture->surface = NULL;
picture->proxy = NULL;
picture->surface_id = VA_INVALID_ID;
picture->param = NULL;
picture->param_id = VA_INVALID_ID;
picture->param_size = 0;
picture->slices = NULL;
picture->iq_matrix = NULL;
picture->huf_table = NULL;
picture->bitplane = NULL;
picture->pts = GST_CLOCK_TIME_NONE;
picture->poc = 0;
}
GstVaapiPicture * GstVaapiPicture *
gst_vaapi_picture_new( gst_vaapi_picture_new(
GstVaapiDecoder *decoder, GstVaapiDecoder *decoder,
@ -202,10 +178,11 @@ gst_vaapi_picture_new(
g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL); g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL);
object = gst_vaapi_codec_object_new( object = gst_vaapi_codec_object_new(
GST_VAAPI_TYPE_PICTURE, &GstVaapiPictureClass,
GST_VAAPI_CODEC_BASE(decoder), GST_VAAPI_CODEC_BASE(decoder),
param, param_size, param, param_size,
NULL, 0 NULL, 0,
0
); );
if (!object) if (!object)
return NULL; return NULL;
@ -215,31 +192,20 @@ gst_vaapi_picture_new(
GstVaapiPicture * GstVaapiPicture *
gst_vaapi_picture_new_field(GstVaapiPicture *picture) gst_vaapi_picture_new_field(GstVaapiPicture *picture)
{ {
GType type; GstVaapiDecoder * const decoder = GET_DECODER(picture);
GstMiniObject *obj; GstVaapiCodecObject *object;
GstVaapiCodecObject *va_obj;
GstVaapiCodecObjectConstructorArgs args;
g_return_val_if_fail(GST_VAAPI_IS_PICTURE(picture), NULL); object = gst_vaapi_codec_object_new(
gst_vaapi_codec_object_get_class(&picture->parent_instance),
type = G_TYPE_FROM_CLASS(GST_VAAPI_PICTURE_GET_CLASS(picture)); GST_VAAPI_CODEC_BASE(decoder),
obj = gst_mini_object_new(type); NULL, picture->param_size,
if (!obj) picture, 0,
(GST_VAAPI_CREATE_PICTURE_FLAG_CLONE|
GST_VAAPI_CREATE_PICTURE_FLAG_FIELD)
);
if (!object)
return NULL; return NULL;
return GST_VAAPI_PICTURE_CAST(object);
va_obj = GST_VAAPI_CODEC_OBJECT(obj);
args.codec = GST_VAAPI_CODEC_BASE(GET_DECODER(picture));
args.param = NULL;
args.param_size = picture->param_size;
args.data = picture;
args.data_size = 0;
args.flags = (GST_VAAPI_CREATE_PICTURE_FLAG_CLONE|
GST_VAAPI_CREATE_PICTURE_FLAG_FIELD);
if (gst_vaapi_codec_object_construct(va_obj, &args))
return GST_VAAPI_PICTURE_CAST(va_obj);
gst_mini_object_unref(obj);
return NULL;
} }
void void
@ -357,11 +323,9 @@ gst_vaapi_picture_output(GstVaapiPicture *picture)
/* --- Slices --- */ /* --- Slices --- */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiSlice, GST_VAAPI_CODEC_DEFINE_TYPE(GstVaapiSlice, gst_vaapi_slice);
gst_vaapi_slice,
GST_VAAPI_TYPE_CODEC_OBJECT)
static void void
gst_vaapi_slice_destroy(GstVaapiSlice *slice) gst_vaapi_slice_destroy(GstVaapiSlice *slice)
{ {
VADisplay const va_display = GET_VA_DISPLAY(slice); VADisplay const va_display = GET_VA_DISPLAY(slice);
@ -371,7 +335,7 @@ gst_vaapi_slice_destroy(GstVaapiSlice *slice)
slice->param = NULL; slice->param = NULL;
} }
static gboolean gboolean
gst_vaapi_slice_create( gst_vaapi_slice_create(
GstVaapiSlice *slice, GstVaapiSlice *slice,
const GstVaapiCodecObjectConstructorArgs *args const GstVaapiCodecObjectConstructorArgs *args
@ -380,6 +344,7 @@ gst_vaapi_slice_create(
VASliceParameterBufferBase *slice_param; VASliceParameterBufferBase *slice_param;
gboolean success; gboolean success;
slice->data_id = VA_INVALID_ID;
success = vaapi_create_buffer( success = vaapi_create_buffer(
GET_VA_DISPLAY(slice), GET_VA_DISPLAY(slice),
GET_VA_CONTEXT(slice), GET_VA_CONTEXT(slice),
@ -392,6 +357,7 @@ gst_vaapi_slice_create(
if (!success) if (!success)
return FALSE; return FALSE;
slice->param_id = VA_INVALID_ID;
success = vaapi_create_buffer( success = vaapi_create_buffer(
GET_VA_DISPLAY(slice), GET_VA_DISPLAY(slice),
GET_VA_CONTEXT(slice), GET_VA_CONTEXT(slice),
@ -411,14 +377,6 @@ gst_vaapi_slice_create(
return TRUE; return TRUE;
} }
static void
gst_vaapi_slice_init(GstVaapiSlice *slice)
{
slice->param = NULL;
slice->param_id = VA_INVALID_ID;
slice->data_id = VA_INVALID_ID;
}
GstVaapiSlice * GstVaapiSlice *
gst_vaapi_slice_new( gst_vaapi_slice_new(
GstVaapiDecoder *decoder, GstVaapiDecoder *decoder,
@ -433,10 +391,11 @@ gst_vaapi_slice_new(
g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL); g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), NULL);
object = gst_vaapi_codec_object_new( object = gst_vaapi_codec_object_new(
GST_VAAPI_TYPE_SLICE, &GstVaapiSliceClass,
GST_VAAPI_CODEC_BASE(decoder), GST_VAAPI_CODEC_BASE(decoder),
param, param_size, param, param_size,
data, data_size data, data_size,
0
); );
return GST_VAAPI_SLICE_CAST(object); return GST_VAAPI_SLICE_CAST(object);
} }

View file

@ -28,40 +28,20 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _GstVaapiPicture GstVaapiPicture; typedef struct _GstVaapiPicture GstVaapiPicture;
typedef struct _GstVaapiPictureClass GstVaapiPictureClass;
typedef struct _GstVaapiSlice GstVaapiSlice; typedef struct _GstVaapiSlice GstVaapiSlice;
typedef struct _GstVaapiSliceClass GstVaapiSliceClass;
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
/* --- Pictures --- */ /* --- Pictures --- */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
#define GST_VAAPI_TYPE_PICTURE \
(gst_vaapi_picture_get_type())
#define GST_VAAPI_PICTURE_CAST(obj) \ #define GST_VAAPI_PICTURE_CAST(obj) \
((GstVaapiPicture *)(obj)) ((GstVaapiPicture *)(obj))
#define GST_VAAPI_PICTURE(obj) \ #define GST_VAAPI_PICTURE(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), \ GST_VAAPI_PICTURE_CAST(obj)
GST_VAAPI_TYPE_PICTURE, \
GstVaapiPicture))
#define GST_VAAPI_PICTURE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), \
GST_VAAPI_TYPE_PICTURE, \
GstVaapiPictureClass))
#define GST_VAAPI_IS_PICTURE(obj) \ #define GST_VAAPI_IS_PICTURE(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_VAAPI_TYPE_PICTURE)) (GST_VAAPI_PICTURE(obj) != NULL)
#define GST_VAAPI_IS_PICTURE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_VAAPI_TYPE_PICTURE))
#define GST_VAAPI_PICTURE_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), \
GST_VAAPI_TYPE_PICTURE, \
GstVaapiPictureClass))
typedef enum { typedef enum {
GST_VAAPI_PICTURE_TYPE_NONE = 0, // Undefined GST_VAAPI_PICTURE_TYPE_NONE = 0, // Undefined
@ -96,10 +76,10 @@ enum {
GST_VAAPI_PICTURE_FLAG_LAST = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 6), GST_VAAPI_PICTURE_FLAG_LAST = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 6),
}; };
#define GST_VAAPI_PICTURE_FLAGS GST_MINI_OBJECT_FLAGS #define GST_VAAPI_PICTURE_FLAGS GST_VAAPI_MINI_OBJECT_FLAGS
#define GST_VAAPI_PICTURE_FLAG_IS_SET GST_MINI_OBJECT_FLAG_IS_SET #define GST_VAAPI_PICTURE_FLAG_IS_SET GST_VAAPI_MINI_OBJECT_FLAG_IS_SET
#define GST_VAAPI_PICTURE_FLAG_SET GST_MINI_OBJECT_FLAG_SET #define GST_VAAPI_PICTURE_FLAG_SET GST_VAAPI_MINI_OBJECT_FLAG_SET
#define GST_VAAPI_PICTURE_FLAG_UNSET GST_MINI_OBJECT_FLAG_UNSET #define GST_VAAPI_PICTURE_FLAG_UNSET GST_VAAPI_MINI_OBJECT_FLAG_UNSET
#define GST_VAAPI_PICTURE_IS_SKIPPED(picture) \ #define GST_VAAPI_PICTURE_IS_SKIPPED(picture) \
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_SKIPPED) GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_SKIPPED)
@ -152,19 +132,14 @@ struct _GstVaapiPicture {
guint structure; guint structure;
}; };
/** G_GNUC_INTERNAL
* GstVaapiPictureClass: void
* gst_vaapi_picture_destroy(GstVaapiPicture *picture);
* The #GstVaapiPicture base class.
*/
struct _GstVaapiPictureClass {
/*< private >*/
GstVaapiCodecObjectClass parent_class;
};
G_GNUC_INTERNAL G_GNUC_INTERNAL
GType gboolean
gst_vaapi_picture_get_type(void) G_GNUC_CONST; gst_vaapi_picture_create(GstVaapiPicture *picture,
const GstVaapiCodecObjectConstructorArgs *args);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiPicture * GstVaapiPicture *
@ -193,49 +168,31 @@ gst_vaapi_picture_output(GstVaapiPicture *picture);
static inline gpointer static inline gpointer
gst_vaapi_picture_ref(gpointer ptr) gst_vaapi_picture_ref(gpointer ptr)
{ {
return gst_mini_object_ref(GST_MINI_OBJECT(ptr)); return gst_vaapi_mini_object_ref(GST_VAAPI_MINI_OBJECT(ptr));
} }
static inline void static inline void
gst_vaapi_picture_unref(gpointer ptr) gst_vaapi_picture_unref(gpointer ptr)
{ {
gst_mini_object_unref(GST_MINI_OBJECT(ptr)); gst_vaapi_mini_object_unref(GST_VAAPI_MINI_OBJECT(ptr));
} }
#define gst_vaapi_picture_replace(old_picture_p, new_picture) \ #define gst_vaapi_picture_replace(old_picture_p, new_picture) \
gst_mini_object_replace((GstMiniObject **)(old_picture_p), \ gst_vaapi_mini_object_replace((GstVaapiMiniObject **)(old_picture_p), \
(GstMiniObject *)(new_picture)) (GstVaapiMiniObject *)(new_picture))
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
/* --- Slices --- */ /* --- Slices --- */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
#define GST_VAAPI_TYPE_SLICE \
(gst_vaapi_slice_get_type())
#define GST_VAAPI_SLICE_CAST(obj) \ #define GST_VAAPI_SLICE_CAST(obj) \
((GstVaapiSlice *)(obj)) ((GstVaapiSlice *)(obj))
#define GST_VAAPI_SLICE(obj) \ #define GST_VAAPI_SLICE(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), \ GST_VAAPI_SLICE_CAST(obj)
GST_VAAPI_TYPE_SLICE, \
GstVaapiSlice))
#define GST_VAAPI_SLICE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), \
GST_VAAPI_TYPE_SLICE, \
GstVaapiSliceClass))
#define GST_VAAPI_IS_SLICE(obj) \ #define GST_VAAPI_IS_SLICE(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_VAAPI_TYPE_SLICE)) (GST_VAAPI_SLICE(obj) != NULL)
#define GST_VAAPI_IS_SLICE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_VAAPI_TYPE_SLICE))
#define GST_VAAPI_SLICE_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), \
GST_VAAPI_TYPE_SLICE, \
GstVaapiSliceClass))
/** /**
* GstVaapiSlice: * GstVaapiSlice:
@ -252,19 +209,14 @@ struct _GstVaapiSlice {
gpointer param; gpointer param;
}; };
/** G_GNUC_INTERNAL
* GstVaapiSliceClass: void
* gst_vaapi_slice_destroy(GstVaapiSlice *slice);
* The #GstVaapiSlice base class.
*/
struct _GstVaapiSliceClass {
/*< private >*/
GstVaapiCodecObjectClass parent_class;
};
G_GNUC_INTERNAL G_GNUC_INTERNAL
GType gboolean
gst_vaapi_slice_get_type(void) G_GNUC_CONST; gst_vaapi_slice_create(GstVaapiSlice *slice,
const GstVaapiCodecObjectConstructorArgs *args);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiSlice * GstVaapiSlice *