#include "gst/vaapi/gstvaapidisplay_priv.h"
#include "gst/vaapi/gstvaapidebug.h"
-
-#if USE_VAAPI_GLX
-#include "gst/vaapi/gstvaapivideobuffer_glx.h"
-#define gst_vaapi_video_buffer_new_from_pool(pool) \
- gst_vaapi_video_buffer_glx_new_from_pool(pool)
-#endif
-
-
GST_DEBUG_CATEGORY_STATIC (gst_vaapi_base_encoder_debug);
#define GST_CAT_DEFAULT gst_vaapi_base_encoder_debug
#define VA_INVALID_PROFILE 0xffffffff
#define DEFAULT_VA_CODEDBUF_NUM 4
-#define GST_TYPE_ENCODER_SHARED_BUFFER (gst_base_encode_buffer_get_type())
-
-static GstMiniObjectClass *gst_encoder_share_buffer_parent_class = NULL;
-
-typedef struct _GstEncoderShareBuffer GstEncoderShareBuffer;
-struct _GstEncoderShareBuffer {
- GstBuffer buffer;
- VABufferID *coded_id;
- GstVaapiBaseEncoder *encoder;
-};
-
-
struct _GstVaapiBaseEncoderPrivate {
guint32 format; /*NV12, I420,*/
VAProfile profile;
/*total encoded frames*/
guint32 frame_count;
- gboolean frame_notify_flag;
-
VABufferID *coded_bufs;
guint32 coded_buf_num;
GMutex *code_buffer_lock;
GstVaapiSurfacePool *surfaces_pool;
- gboolean need_flush;
+ guint frame_notify_flag : 1;
+ guint need_flush : 1;
};
G_DEFINE_TYPE(GstVaapiBaseEncoder, gst_vaapi_base_encoder, GST_TYPE_VAAPI_ENCODER);
static EncoderStatus gst_vaapi_base_encoder_uninitialize_default(
GstVaapiEncoder* encoder, GstVaapiDisplay *display);
static EncoderStatus gst_vaapi_base_encoder_open_default(GstVaapiEncoder* encoder,
- GstVaapiDisplay *display, void* private_data,
+ GstVaapiDisplay *display,
GstVaapiContext **context);
static EncoderStatus gst_vaapi_base_encoder_close_default(GstVaapiEncoder* encoder,
GstVaapiDisplay *display, GstVaapiContext *context);
GstVaapiDisplay *display, GstVaapiContext *context);
static EncoderStatus base_encoder_release_coded_buffers(GstVaapiBaseEncoder *base_encoder,
GstVaapiDisplay *display, GstVaapiContext *context);
-static EncoderStatus base_put_raw_buffer_to_surface(GstVaapiBaseEncoder *base_encoder,
- GstVaapiDisplay *display, GstBuffer *raw_pic, GstVaapiSurface *surface);
-
static EncoderStatus base_query_encoding_status(GstVaapiBaseEncoder *base_encoder,
GstVaapiDisplay *display, GstVaapiSurface *buffer_surface,
gboolean is_key, GstVaapiVideoBuffer *surface_buffer,
}
static void
-gst_encoder_share_buffer_finalize (GstEncoderShareBuffer *base_buffer)
-{
- GstVaapiBaseEncoder *encoder = NULL;
- VABufferID* coded_id = NULL;
- GstVaapiDisplay *display = NULL;
- GstVaapiBaseEncoderPrivate *encoder_prv = NULL;
-
- gboolean is_locked = FALSE;
-
- encoder = base_buffer->encoder;
- coded_id = base_buffer->coded_id;
- display = ENCODER_DISPLAY(encoder);
- encoder_prv = GST_VAAPI_BASE_ENCODER_GET_PRIVATE(encoder);
-
- ENCODER_ASSERT(display);
- VADisplay va_dpy = gst_vaapi_display_get_display(display);
-
- ENCODER_ASSERT(encoder_prv);
- ENCODER_ASSERT(coded_id && VA_INVALID_ID!= *coded_id);
-
- /*if (--(*base_buffer->ref_coded_id) == 0) */
- {
- /*g_free(base_buffer->ref_coded_id);*/
- ENCODER_ACQUIRE_DISPLAY_LOCK(display);
- vaUnmapBuffer(va_dpy, *coded_id);
- ENCODER_RELEASE_DISPLAY_LOCK(display);
- push_available_coded_buffer(encoder_prv, coded_id);
- }
-
- if (GST_MINI_OBJECT_CLASS(gst_encoder_share_buffer_parent_class)->finalize) {
- GST_MINI_OBJECT_CLASS(gst_encoder_share_buffer_parent_class)->finalize(GST_MINI_OBJECT(base_buffer));
- }
-}
-
-static void
-gst_encode_share_buffer_class_init (gpointer g_class, gpointer class_data)
-{
- GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS(g_class);
-
- gst_encoder_share_buffer_parent_class = g_type_class_peek_parent(g_class);
- ENCODER_ASSERT(gst_encoder_share_buffer_parent_class);
-
- mini_object_class->finalize = (GstMiniObjectFinalizeFunction)
- gst_encoder_share_buffer_finalize;
-}
-
-
-static GType
-gst_base_encode_buffer_get_type (void)
-{
- static GType s_base_encode_buffer_type = 0;
- if (G_UNLIKELY (s_base_encode_buffer_type == 0)) {
- static const GTypeInfo s_base_encode_buffer_info = {
- sizeof(GstBufferClass),
- NULL,
- NULL,
- gst_encode_share_buffer_class_init,
- NULL,
- NULL,
- sizeof(GstEncoderShareBuffer),
- 0,
- NULL,
- NULL
- };
- s_base_encode_buffer_type = g_type_register_static (GST_TYPE_BUFFER,
- "GstEncoderShareBuffer", &s_base_encode_buffer_info, 0);
- }
- return s_base_encode_buffer_type;
-}
-
-static GstEncoderShareBuffer *
-gst_base_encode_share_buffer_new(GstVaapiBaseEncoder *encoder, VABufferID *coded_id)
-{
- GstEncoderShareBuffer *buf = (GstEncoderShareBuffer*)gst_mini_object_new(GST_TYPE_ENCODER_SHARED_BUFFER);
- buf->coded_id = coded_id;
- buf->encoder = encoder;
- return buf;
-}
-
-
-static void
gst_vaapi_base_encoder_init(GstVaapiBaseEncoder *encoder)
{
GstVaapiBaseEncoderPrivate *base_prv = GST_VAAPI_BASE_ENCODER_GET_PRIVATE(encoder);
base_prv->code_buffer_cond = g_cond_new();
base_prv->available_code_buffers = g_queue_new();
- base_prv->surfaces_pool = NULL;
base_prv->need_flush = FALSE;
}
}
EncoderStatus
-gst_vaapi_base_encoder_open_default(GstVaapiEncoder* encoder, GstVaapiDisplay *display, void* private_data, GstVaapiContext **context)
+gst_vaapi_base_encoder_open_default(GstVaapiEncoder* encoder, GstVaapiDisplay *display, GstVaapiContext **context)
{
GstVaapiBaseEncoder* base_encoder = GST_VAAPI_BASE_ENCODER(encoder);
GstVaapiBaseEncoderClass *base_class = GST_VAAPI_BASE_ENCODER_GET_CLASS(encoder);
GstVaapiBaseEncoderPrivate *base_prv = GST_VAAPI_BASE_ENCODER_GET_PRIVATE(encoder);
- GstVaapiSurfacePool *surfaces_pool = private_data;
GstVaapiContext *out_context = NULL;
EncoderStatus ret = ENCODER_NO_ERROR;
ENCODER_ASSERT(ENCODER_DISPLAY(encoder));
-#ifdef _MRST_
- out_context = g_object_new(
- GST_VAAPI_TYPE_CONTEXT,
- "display", display,
- "id", GST_VAAPI_ID(VA_INVALID_ID),
- "entrypoint", gst_vaapi_entrypoint(VAEntrypointEncSlice),
- "width", ENCODER_WIDTH(encoder),
- "height", ENCODER_HEIGHT(encoder),
- NULL
- );
- if (surfaces_pool) {
- gst_vaapi_context_set_surface_pool(out_context, surfaces_pool);
- }
- g_object_set(out_context, "profile", gst_vaapi_profile(base_prv->profile), NULL);
-
-#else
- VAAPI_UNUSED_ARG(surfaces_pool);
out_context = gst_vaapi_context_new(display,
gst_vaapi_profile(base_prv->profile),
gst_vaapi_entrypoint(VAEntrypointEncSlice),
ENCODER_WIDTH(encoder),
ENCODER_HEIGHT(encoder));
-#endif
ENCODER_CHECK_STATUS(out_context, ENCODER_CONTEXT_ERR, "gst_vaapi_context_new failed.");
ENCODER_CHECK_STATUS(VA_INVALID_ID != GST_VAAPI_OBJECT_ID(out_context), ENCODER_CONTEXT_ERR, "gst_vaapi_context_new failed.");
);
*context = out_context;
- base_prv->surfaces_pool = gst_vaapi_context_get_surface_pool(out_context);
- ENCODER_ASSERT(base_prv->surfaces_pool);
return ENCODER_NO_ERROR;
end:
base_encoder_release_coded_buffers(base_encoder, display, context);
base_prv->frame_count = 0;
- if (base_prv->surfaces_pool) {
- g_object_unref(base_prv->surfaces_pool);
- base_prv->surfaces_pool = NULL;
- }
-
return ret;
}
ENCODER_ASSERT(display && context);
VADisplay va_dpy = gst_vaapi_display_get_display(display);
VAContextID context_id = GST_VAAPI_OBJECT_ID(context);
- GstVaapiSurface *new_surface = NULL;
/* Video Buffer */
GstVaapiVideoBuffer *video_buffer = NULL;
video_buffer = GST_VAAPI_VIDEO_BUFFER(raw_pic);
gst_buffer_ref(GST_BUFFER_CAST(video_buffer));
} else {
- ENCODER_CHECK_STATUS(base_prv->surfaces_pool, ENCODER_SURFACE_ERR, "surface pool could not be found in context");
- video_buffer = (GstVaapiVideoBuffer*)gst_vaapi_video_buffer_new_from_pool((GstVaapiVideoPool*)base_prv->surfaces_pool);
- new_surface = gst_vaapi_video_buffer_get_surface(video_buffer); //gst_vaapi_context_get_surface(context);
- ENCODER_CHECK_STATUS(new_surface, ENCODER_SURFACE_ERR, "base_pop_free_surface failed.");
-
- /* put picture to new surface */
- va_status = base_put_raw_buffer_to_surface(base_encoder, display, raw_pic, new_surface);
- ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status, ENCODER_PICTURE_ERR, "va put buffer to surface failed.");
-
- GST_BUFFER_TIMESTAMP(video_buffer) = GST_BUFFER_TIMESTAMP(raw_pic);
- GST_BUFFER_DURATION(video_buffer) = GST_BUFFER_DURATION(raw_pic);
+ /* do something else */
}
} else {
base_prv->need_flush = TRUE;
return TRUE;
}
+#if 0
static EncoderStatus
base_put_raw_buffer_to_surface(GstVaapiBaseEncoder *base_encoder,
GstVaapiDisplay *display,
return ret;
}
+#endif
static EncoderStatus
base_query_encoding_status(GstVaapiBaseEncoder *base_encoder,
static void
gst_vaapi_encoder_init(GstVaapiEncoder *encoder)
{
- GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
- ENCODER_ASSERT(encoder_prv);
- encoder_prv->display = NULL;
- encoder_prv->context = NULL;
- encoder_prv->state = VAAPI_ENC_NULL;
+ GstVaapiEncoderPrivate *priv;
+
+ encoder->priv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
+ priv = encoder->priv;
+ ENCODER_ASSERT(priv);
+
+ priv->display = NULL;
+ priv->context = NULL;
+ priv->state = VAAPI_ENC_NULL;
encoder->width = 0;
encoder->height = 0;
gst_vaapi_encoder_finalize(GObject *object)
{
GstVaapiEncoder* encoder = GST_VAAPI_ENCODER(object);
- GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(object);
- if (VAAPI_ENC_NULL != encoder_prv->state) {
+ GstVaapiEncoderPrivate *priv = encoder->priv;
+ if (VAAPI_ENC_NULL != priv->state) {
gst_vaapi_encoder_uninitialize(encoder);
}
- if (encoder_prv->context) {
- g_object_unref(encoder_prv->context);
- encoder_prv->context = NULL;
+ if (priv->context) {
+ g_object_unref(priv->context);
+ priv->context = NULL;
}
- if (encoder_prv->display) {
- g_object_unref(encoder_prv->display);
- encoder_prv->display = NULL;
+ if (priv->display) {
+ g_object_unref(priv->display);
+ priv->display = NULL;
}
G_OBJECT_CLASS (gst_vaapi_encoder_parent_class)->finalize (object);
gboolean
gst_vaapi_encoder_set_display(GstVaapiEncoder* encoder, GstVaapiDisplay *display)
{
- GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
- if (display == encoder_prv->display) {
+ GstVaapiEncoderPrivate *priv = encoder->priv;
+ if (display == priv->display) {
return TRUE;
}
- if (VAAPI_ENC_INIT < encoder_prv->state) {
+ if (VAAPI_ENC_INIT < priv->state) {
return FALSE;
}
- if (encoder_prv->display) {
- g_object_unref(encoder_prv->display);
- encoder_prv->display = NULL;
+ if (priv->display) {
+ g_object_unref(priv->display);
+ priv->display = NULL;
}
- encoder_prv->display = g_object_ref(display);
+ priv->display = g_object_ref(display);
return TRUE;
}
GstVaapiDisplay *
gst_vaapi_encoder_get_display(GstVaapiEncoder* encoder)
{
- GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
- return (encoder_prv->display ? g_object_ref(encoder_prv->display) : NULL);
+ GstVaapiEncoderPrivate *priv = encoder->priv;
+ return (priv->display ? g_object_ref(priv->display) : NULL);
}
GstVaapiContext *
gst_vaapi_encoder_get_context(GstVaapiEncoder* encoder)
{
- GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
- return (encoder_prv->context ? g_object_ref(encoder_prv->context) : NULL);
+ GstVaapiEncoderPrivate *priv = encoder->priv;
+ return (priv->context ? g_object_ref(priv->context) : NULL);
}
VAAPI_Encode_State
gst_vaapi_encoder_get_state(GstVaapiEncoder* encoder)
{
- GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
- return encoder_prv->state;
+ GstVaapiEncoderPrivate *priv = encoder->priv;
+ return priv->state;
}
{
EncoderStatus ret = ENCODER_NO_ERROR;
GstVaapiEncoderClass *encoder_class = GST_VAAPI_ENCODER_GET_CLASS(encoder);
- GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
+ GstVaapiEncoderPrivate *priv = encoder->priv;
/* check state */
- if (VAAPI_ENC_INIT == encoder_prv->state) {
+ if (VAAPI_ENC_INIT == priv->state) {
return ENCODER_NO_ERROR;
}
- ENCODER_ASSERT(VAAPI_ENC_NULL == encoder_prv->state);
- if (VAAPI_ENC_NULL != encoder_prv->state) {
+ ENCODER_ASSERT(VAAPI_ENC_NULL == priv->state);
+ if (VAAPI_ENC_NULL != priv->state) {
return ENCODER_STATE_ERR;
}
/* create va_dpy*/
- if (!encoder_prv->display) {
- encoder_prv->display = gst_vaapi_display_x11_new(NULL);
- ENCODER_CHECK_STATUS(encoder_prv->display, ENCODER_DISPLAY_ERR, "gst_vaapi_display_x11_new failed.");
+ if (!priv->display) {
+ priv->display = gst_vaapi_display_x11_new(NULL);
+ ENCODER_CHECK_STATUS(priv->display, ENCODER_DISPLAY_ERR, "gst_vaapi_display_x11_new failed.");
}
if (encoder_class->initialize) {
- ret = encoder_class->initialize(encoder, encoder_prv->display);
+ ret = encoder_class->initialize(encoder, priv->display);
ENCODER_CHECK_STATUS (ENCODER_NO_ERROR == ret, ret, "encoder <initialize> failed.");
}
- encoder_prv->state = VAAPI_ENC_INIT;
+ priv->state = VAAPI_ENC_INIT;
end:
return ret;
}
EncoderStatus
-gst_vaapi_encoder_open(GstVaapiEncoder* encoder, void* private_data)
+gst_vaapi_encoder_open(GstVaapiEncoder* encoder)
{
EncoderStatus ret = ENCODER_NO_ERROR;
GstVaapiEncoderClass *encoder_class = GST_VAAPI_ENCODER_GET_CLASS(encoder);
- GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
+ GstVaapiEncoderPrivate *priv = encoder->priv;
/* check state */
- if (VAAPI_ENC_OPENED == encoder_prv->state) {
+ if (VAAPI_ENC_OPENED == priv->state) {
return ENCODER_NO_ERROR;
}
- ENCODER_ASSERT(VAAPI_ENC_INIT == encoder_prv->state);
- if (VAAPI_ENC_INIT != encoder_prv->state) {
+ ENCODER_ASSERT(VAAPI_ENC_INIT == priv->state);
+ if (VAAPI_ENC_INIT != priv->state) {
return ENCODER_STATE_ERR;
}
- ENCODER_ASSERT(!encoder_prv->context);
+ ENCODER_ASSERT(!priv->context);
ENCODER_CHECK_STATUS(encoder_class->open, ENCODER_FUNC_PTR_ERR, "encoder <open> function pointer empty.");
- ret = encoder_class->open(encoder, encoder_prv->display, private_data, &encoder_prv->context);
+ ret = encoder_class->open(encoder, priv->display, &priv->context);
ENCODER_CHECK_STATUS(ENCODER_NO_ERROR == ret, ret, "encoder <open> failed.");
- ENCODER_CHECK_STATUS(encoder_prv->context, ENCODER_CONTEXT_ERR, "encoder <open> context failed.");
+ ENCODER_CHECK_STATUS(priv->context, ENCODER_CONTEXT_ERR, "encoder <open> context failed.");
- encoder_prv->state = VAAPI_ENC_OPENED;
+ priv->state = VAAPI_ENC_OPENED;
end:
return ret;
{
EncoderStatus ret = ENCODER_NO_ERROR;
GstVaapiEncoderClass *encoder_class = GST_VAAPI_ENCODER_GET_CLASS(encoder);
- GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
+ GstVaapiEncoderPrivate *priv = encoder->priv;
- ENCODER_CHECK_STATUS(encoder_prv->state >= VAAPI_ENC_OPENED, ENCODER_STATE_ERR, "encoder was not opened before <encode>.");
+ ENCODER_CHECK_STATUS(priv->state >= VAAPI_ENC_OPENED, ENCODER_STATE_ERR, "encoder was not opened before <encode>.");
ENCODER_CHECK_STATUS(encoder_class->encode, ENCODER_FUNC_PTR_ERR, "encoder <encode> function pointer empty.");
- ret = encoder_class->encode(encoder, encoder_prv->display, encoder_prv->context, raw_pic, coded_pics);
+ ret = encoder_class->encode(encoder, priv->display, priv->context, raw_pic, coded_pics);
ENCODER_CHECK_STATUS(ENCODER_NO_ERROR == ret, ret, "encoder <encode> failed.");
- if (encoder_prv->state < VAAPI_ENC_ENCODING) {
- encoder_prv->state = VAAPI_ENC_ENCODING;
+ if (priv->state < VAAPI_ENC_ENCODING) {
+ priv->state = VAAPI_ENC_ENCODING;
}
end:
return ret;
{
EncoderStatus ret = ENCODER_NO_ERROR;
GstVaapiEncoderClass *encoder_class = GST_VAAPI_ENCODER_GET_CLASS(encoder);
- GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
+ GstVaapiEncoderPrivate *priv = encoder->priv;
- ENCODER_CHECK_STATUS(encoder_prv->state >= VAAPI_ENC_OPENED, ENCODER_STATE_ERR, "encoder was not opened before <get_codec_data>.");
+ ENCODER_CHECK_STATUS(priv->state >= VAAPI_ENC_OPENED, ENCODER_STATE_ERR, "encoder was not opened before <get_codec_data>.");
if (!encoder_class->get_codec_data) {
*codec_data = NULL;
ENCODER_LOG_INFO("There's no codec_data");
{
EncoderStatus ret = ENCODER_NO_ERROR;
GstVaapiEncoderClass *encoder_class = GST_VAAPI_ENCODER_GET_CLASS(encoder);
- GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
+ GstVaapiEncoderPrivate *priv = encoder->priv;
- if (encoder_prv->state < VAAPI_ENC_OPENED) {
+ if (priv->state < VAAPI_ENC_OPENED) {
return ENCODER_STATE_ERR;
}
ENCODER_CHECK_STATUS(encoder_class->flush, ENCODER_FUNC_PTR_ERR, "encoder <flush> function pointer empty.");
- ret = encoder_class->flush(encoder, encoder_prv->display, encoder_prv->context, coded_pics);
+ ret = encoder_class->flush(encoder, priv->display, priv->context, coded_pics);
ENCODER_CHECK_STATUS(ENCODER_NO_ERROR == ret, ret, "encoder <flush> failed.");
- if (encoder_prv->state > VAAPI_ENC_OPENED) {
- encoder_prv->state = VAAPI_ENC_OPENED;
+ if (priv->state > VAAPI_ENC_OPENED) {
+ priv->state = VAAPI_ENC_OPENED;
}
end:
return ret;
{
EncoderStatus ret = ENCODER_NO_ERROR;
GstVaapiEncoderClass *encoder_class = GST_VAAPI_ENCODER_GET_CLASS(encoder);
- GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
+ GstVaapiEncoderPrivate *priv = encoder->priv;
- if (VAAPI_ENC_INIT >= encoder_prv->state) {
+ if (VAAPI_ENC_INIT >= priv->state) {
return ENCODER_NO_ERROR;
}
ENCODER_CHECK_STATUS(encoder_class->close, ENCODER_FUNC_PTR_ERR, "encoder <close> function pointers empty.");
- ret = encoder_class->close(encoder, encoder_prv->display, encoder_prv->context);
+ ret = encoder_class->close(encoder, priv->display, priv->context);
ENCODER_CHECK_STATUS(ENCODER_NO_ERROR == ret, ret, "encoder <close> failed.");
end:
- if (encoder_prv->context) {
- g_object_unref(encoder_prv->context);
- encoder_prv->context = NULL;
+ if (priv->context) {
+ g_object_unref(priv->context);
+ priv->context = NULL;
}
- encoder_prv->state = VAAPI_ENC_INIT;
+ priv->state = VAAPI_ENC_INIT;
return ret;
}
{
EncoderStatus ret = ENCODER_NO_ERROR;
GstVaapiEncoderClass *encoder_class = GST_VAAPI_ENCODER_GET_CLASS(encoder);
- GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
+ GstVaapiEncoderPrivate *priv = encoder->priv;
- if (VAAPI_ENC_NULL == encoder_prv->state) {
+ if (VAAPI_ENC_NULL == priv->state) {
return ENCODER_NO_ERROR;
}
- if (VAAPI_ENC_INIT < encoder_prv->state) {
+ if (VAAPI_ENC_INIT < priv->state) {
ret = gst_vaapi_encoder_close(encoder);
}
- ENCODER_ASSERT(VAAPI_ENC_INIT == encoder_prv->state);
+ ENCODER_ASSERT(VAAPI_ENC_INIT == priv->state);
if (encoder_class->uninitialize) {
- ret = encoder_class->uninitialize(encoder, encoder_prv->display);
+ ret = encoder_class->uninitialize(encoder, priv->display);
ENCODER_CHECK_STATUS(ENCODER_NO_ERROR == ret, ret, "encoder <uninitialize> failed.");
}
end:
- if (encoder_prv->display) {
- g_object_unref(encoder_prv->display);
- encoder_prv->display = NULL;
+ if (priv->display) {
+ g_object_unref(priv->display);
+ priv->display = NULL;
}
- encoder_prv->state = VAAPI_ENC_NULL;
+ priv->state = VAAPI_ENC_NULL;
return ret;
}
#define GST_VAAPI_ENCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_VAAPI_ENCODER, GstVaapiEncoderClass))
#define GST_VAAPI_ENCODER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj),GST_TYPE_VAAPI_ENCODER, GstVaapiEncoderPrivate))
-#define ENCODER_DISPLAY(encoder) (GST_VAAPI_ENCODER_GET_PRIVATE(encoder)->display)
-#define ENCODER_CONTEXT(encoder) (GST_VAAPI_ENCODER_GET_PRIVATE(encoder)->context)
+#define ENCODER_DISPLAY(encoder) (((GstVaapiEncoder*)(encoder))->priv->display)
+#define ENCODER_CONTEXT(encoder) (((GstVaapiEncoder*)(encoder))->priv->context)
#define ENCODER_WIDTH(encoder) (((GstVaapiEncoder*)(encoder))->width)
#define ENCODER_HEIGHT(encoder) (((GstVaapiEncoder*)(encoder))->height)
#define ENCODER_FPS(encoder) (((GstVaapiEncoder*)(encoder))->frame_rate)
struct _GstVaapiEncoder {
GObject parent;
+ GstVaapiEncoderPrivate *priv;
guint32 width;
guint32 height;
/* context [out] */
EncoderStatus (*open) (GstVaapiEncoder* encoder, GstVaapiDisplay *display,
- void* private_data, GstVaapiContext **context);
+ GstVaapiContext **context);
EncoderStatus (*close) (GstVaapiEncoder* encoder, GstVaapiDisplay *display, GstVaapiContext *context);
/* coded_pics [out] */
EncoderStatus gst_vaapi_encoder_initialize(GstVaapiEncoder* encoder);
/* check/open context */
-EncoderStatus gst_vaapi_encoder_open(GstVaapiEncoder* encoder, void* private_data);
+EncoderStatus gst_vaapi_encoder_open(GstVaapiEncoder* encoder);
/* encode one frame */
EncoderStatus gst_vaapi_encoder_encode(GstVaapiEncoder* encoder, GstBuffer *raw_pic, GList **coded_pics);
#include <X11/Xlib.h>
#include <gst/video/videocontext.h>
-#include "gst/vaapi/gstvaapivideobuffer.h"
-#include "gst/vaapi/gstvaapisurfacepool.h"
#include "gst/vaapi/gstvaapiencode_h264.h"
#include "gst/vaapi/gstvaapiencode_h263.h"
#include "gst/vaapi/gstvaapiencode_mpeg4.h"
#include "gst/vaapi/gstvaapibaseencoder.h"
-#include "gst/vaapi/gstvaapipluginutil.h"
-#if USE_VAAPI_GLX
-#include <gst/vaapi/gstvaapivideobuffer_glx.h>
-#define gst_vaapi_video_buffer_new(display) \
- gst_vaapi_video_buffer_glx_new(GST_VAAPI_DISPLAY_GLX(display))
-#endif
+#include "gstvaapipluginutil.h"
+#include "gstvaapipluginbuffer.h"
+
/* gst_debug
GST_DEBUG_CATEGORY_STATIC (gst_vaapi_encode_debug)
}
}
+static inline gboolean
+gst_vaapi_encode_ensure_display(GstVaapiEncode *encode)
+{
+ return gst_vaapi_ensure_display(encode, GST_VAAPI_DISPLAY_TYPE_ANY,
+ &ENCODER_DISPLAY(encode->encoder));
+}
+
+
static gboolean
gst_vaapi_encode_set_caps(GstPad *sink_pad, GstCaps *caps)
{
}
/*set display and initialize encoder*/
- ENCODER_CHECK_STATUS(gst_vaapi_ensure_display(encode, &ENCODER_DISPLAY(encode->encoder)),
+ ENCODER_CHECK_STATUS(gst_vaapi_encode_ensure_display(encode),
FALSE, "encoder ensure display failed on setting caps.")
encoder_ret = gst_vaapi_encoder_initialize(encode->encoder);
ENCODER_CHECK_STATUS (ENCODER_NO_ERROR == encoder_ret,
FALSE, "gst_vaapi_encoder_initialize failed.");
- encoder_ret = gst_vaapi_encoder_open(encode->encoder, NULL);
+ encoder_ret = gst_vaapi_encoder_open(encode->encoder);
ENCODER_CHECK_STATUS (ENCODER_NO_ERROR == encoder_ret,
FALSE, "gst_vaapi_encoder_open failed.");
end:
}
if (!structure || gst_structure_has_name(structure, "video/x-vaapi-surface")) {
ENCODER_ASSERT(encode->encoder);
- ENCODER_CHECK_STATUS(gst_vaapi_ensure_display(encode, &ENCODER_DISPLAY(encode->encoder)),
+ ENCODER_CHECK_STATUS(gst_vaapi_encode_ensure_display(encode),
GST_FLOW_ERROR, "encoder ensure display failed.")
display = ENCODER_DISPLAY(encode->encoder);
- buffer = gst_vaapi_video_buffer_new(display);
+ buffer = (GstBuffer*)gst_vaapi_video_buffer_new(display);
} else { /* video/x-raw-yuv */
buffer = gst_buffer_new_and_alloc(size);
}