)
{
GstVaapiBaseEncoderPrivate *priv = base_encoder->priv;
- GstVaapiDisplay *display = ENCODER_DISPLAY(base_encoder);
VADisplay va_dpy;
VAContextID context_id;
VAStatus va_status = VA_STATUS_SUCCESS;
- gboolean is_locked = FALSE;
guint i = 0;
gboolean ret = TRUE;
guint32 buffer_size =
(ENCODER_WIDTH(base_encoder) * ENCODER_HEIGHT(base_encoder) * 400) /
(16*16);
- ENCODER_ASSERT(display && context);
+ ENCODER_ASSERT(context);
ENCODER_ASSERT(priv->available_code_buffers);
ENCODER_ASSERT(!priv->coded_bufs);
priv->coded_bufs = (VABufferID*)
g_malloc0(priv->coded_buf_num * sizeof(priv->coded_bufs[0]));
- ENCODER_ACQUIRE_DISPLAY_LOCK(display);
for (i = 0; i < priv->coded_buf_num; i++) {
va_status = vaCreateBuffer(va_dpy,
context_id,
if (VA_STATUS_SUCCESS != va_status)
break;
}
- ENCODER_RELEASE_DISPLAY_LOCK(display);
ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
FALSE,
"create coded buffer failed.");
GstVaapiDisplay *display = ENCODER_DISPLAY(base_encoder);
guint32 available_buf_count = priv->coded_buf_num;
guint32 i;
- gboolean is_locked = FALSE;
ENCODER_ASSERT(display);
VAAPI_UNUSED_ARG(va_status);
}
g_mutex_unlock(priv->code_buffer_lock);
- ENCODER_ACQUIRE_DISPLAY_LOCK(display);
for (i = 0; i < priv->coded_buf_num; i++) {
va_status = vaDestroyBuffer(va_dpy, priv->coded_bufs[i]);
}
- ENCODER_RELEASE_DISPLAY_LOCK(display);
return ENCODER_NO_ERROR;
}
EncoderStatus ret = ENCODER_NO_ERROR;
gboolean is_key = FALSE;
VABufferID* coded_buf = NULL;
- VAStatus va_status = VA_STATUS_SUCCESS;
- VASurfaceID buffer_surface_id = VA_INVALID_SURFACE;
GstVaapiSurface *buffer_surface = NULL;
- gboolean is_locked = FALSE;
- VADisplay va_dpy;
- VAContextID context_id;
ENCODER_ASSERT(display && context);
- va_dpy = ENCODER_VA_DISPLAY(encoder);
- context_id = ENCODER_VA_CONTEXT(encoder);
/* Video Buffer */
GstVaapiVideoBuffer *video_buffer = NULL;
}
buffer_surface = gst_vaapi_video_buffer_get_surface(video_buffer);
- buffer_surface_id = (VASurfaceID)GST_VAAPI_OBJECT_ID(buffer_surface);
- ENCODER_CHECK_STATUS(buffer_surface_id != VA_INVALID_SURFACE,
- ENCODER_SURFACE_ERR,
- "surface id == VA_INVALID_SURFACE");
-
- /* begin surface*/
- ENCODER_ACQUIRE_DISPLAY_LOCK(display);
- va_status = vaBeginPicture(va_dpy, context_id, buffer_surface_id);
- //ENCODER_RELEASE_DISPLAY_LOCK(display);
-
- ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
- ENCODER_PICTURE_ERR,
- "vaBeginPicture error");
/*get valid coded buffer*/
coded_buf = pop_available_coded_buffer(priv);
ENCODER_PICTURE_ERR,
"base_prepare_encoding failed");
- /* end picture */
- //ENCODER_ACQUIRE_DISPLAY_LOCK(display);
- va_status = vaEndPicture(va_dpy, context_id);
- ENCODER_RELEASE_DISPLAY_LOCK(display);
- ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
- ENCODER_PICTURE_ERR,
- "vaEndPicture error");
-
/*query surface result*/
ret = base_query_encoding_status(base_encoder,
buffer_surface,
}
end:
- ENCODER_RELEASE_DISPLAY_LOCK(display);
if (ret > ENCODER_NO_ERROR) {
ret = ENCODER_NO_ERROR;
}
#include <string.h>
#include "gstvaapidisplay_x11.h"
+#include "gstvaapiobject_priv.h"
+#include "gstvaapidisplay_priv.h"
GST_DEBUG_CATEGORY_STATIC (gst_vaapi_encoder_debug);
#define GST_CAT_DEFAULT gst_vaapi_encoder_debug
}
EncoderStatus
+gst_vaapi_encoder_render_picture(
+ GstVaapiEncoder *encoder,
+ GstVaapiSurface *surface,
+ VABufferID *bufs,
+ guint num
+)
+{
+ GstVaapiDisplay *display;
+ VASurfaceID surface_id;
+ VAContextID context_id;
+ VADisplay va_display;
+ VAStatus va_status;
+ gboolean is_locked = FALSE;
+ EncoderStatus ret = ENCODER_NO_ERROR;
+
+ display = ENCODER_DISPLAY(encoder);
+
+ g_return_val_if_fail(surface, ENCODER_PARAMETER_ERR);
+ g_return_val_if_fail(ENCODER_CONTEXT(encoder), ENCODER_PARAMETER_ERR);
+
+ surface_id = (VASurfaceID)GST_VAAPI_OBJECT_ID(surface);
+ context_id = ENCODER_VA_CONTEXT(encoder);
+ va_display = ENCODER_VA_DISPLAY(encoder);
+ g_return_val_if_fail(surface_id != VA_INVALID_SURFACE, ENCODER_PARAMETER_ERR);
+
+ /* begin surface*/
+ ENCODER_ACQUIRE_DISPLAY_LOCK(display);
+ va_status = vaBeginPicture(va_display, context_id, surface_id);
+ ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
+ ENCODER_PARAMETER_ERR,
+ "vaBeginPicture failed");
+
+ va_status = vaRenderPicture(va_display,
+ context_id,
+ bufs,
+ num);
+ ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
+ ENCODER_PARAMETER_ERR,
+ "vaRenderPicture failed");
+
+ va_status = vaEndPicture(va_display, context_id);
+ ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
+ ENCODER_PARAMETER_ERR,
+ "vaRenderPicture failed");
+
+end:
+ ENCODER_RELEASE_DISPLAY_LOCK(display);
+ return ret;
+}
+
+EncoderStatus
gst_vaapi_encoder_uninitialize(GstVaapiEncoder* encoder)
{
EncoderStatus ret = ENCODER_NO_ERROR;
EncoderStatus
gst_vaapi_encoder_close(GstVaapiEncoder* encoder);
+EncoderStatus
+gst_vaapi_encoder_render_picture(
+ GstVaapiEncoder *encoder,
+ GstVaapiSurface *buffer_surface,
+ VABufferID *bufs,
+ guint num
+);
+
/* close display */
EncoderStatus
gst_vaapi_encoder_uninitialize(GstVaapiEncoder* encoder);
GstVaapiContext *context = ENCODER_CONTEXT(base);
VADisplay va_dpy = ENCODER_VA_DISPLAY(base);
VAContextID context_id = ENCODER_VA_CONTEXT(base);
+ VABufferID va_buffers[64];
+ guint32 va_buffers_count = 0;
VAStatus va_status = VA_STATUS_SUCCESS;
EncoderStatus ret = ENCODER_NO_ERROR;
ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
ENCODER_ENC_RES_ERR,
"h263 alloc seq-buffer failed.");
- va_status = vaRenderPicture(va_dpy, context_id, &priv->seq_param_id, 1);
- ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
- ENCODER_PICTURE_ERR,
- "h263 vaRenderPicture seq-parameters failed.");
+ va_buffers[va_buffers_count++] = priv->seq_param_id;
}
/* set reference and reconstructed surfaces */
sizeof(pic_param), 1, &pic_param, &priv->pic_param_id);
ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS ==va_status,
ENCODER_ENC_RES_ERR, "h263 creating pic-param buffer failed.");
- va_status = vaRenderPicture(va_dpy, context_id, &priv->pic_param_id, 1);
- ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS ==va_status,
- ENCODER_PICTURE_ERR, "h263 rendering pic-param buffer failed.");
+ va_buffers[va_buffers_count++] = priv->pic_param_id;
+
/*initialize slice parameters, only ONE slice for h263*/
VAEncSliceParameterBuffer slice_param = { 0 };
slice_param.start_row_number = 0;
ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS ==va_status,
ENCODER_ENC_RES_ERR,
"h263 creating slice-parameters buffer failed.");
+ va_buffers[va_buffers_count++] = priv->slic_param_id;
- va_status = vaRenderPicture(va_dpy, context_id, &priv->slic_param_id, 1);
- ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS ==va_status,
+ ret = gst_vaapi_encoder_render_picture(GST_VAAPI_ENCODER_CAST(encoder),
+ surface,
+ va_buffers,
+ va_buffers_count);
+ ENCODER_CHECK_STATUS(ret == ENCODER_NO_ERROR,
ENCODER_PICTURE_ERR,
"h263 rendering slice-parameters buffer failed.");
GstVaapiDisplay *display = ENCODER_DISPLAY(encoder);
GstVaapiContext *context = ENCODER_CONTEXT(encoder);
- gboolean is_locked = FALSE;
-
ENCODER_ASSERT(display);
ENCODER_ASSERT(context);
VAAPI_UNUSED_ARG(va_status);
VADisplay va_dpy = gst_vaapi_display_get_display(display);
- ENCODER_ACQUIRE_DISPLAY_LOCK(display);
if (VA_INVALID_ID != priv->seq_param_id) {
va_status = vaDestroyBuffer(va_dpy, priv->seq_param_id);
priv->seq_param_id = VA_INVALID_ID;
priv->packed_pic_data_id = VA_INVALID_ID;
}
- ENCODER_RELEASE_DISPLAY_LOCK(display);
-
if (priv->slice_param_buffers) {
g_free(priv->slice_param_buffers);
priv->slice_param_buffers = NULL;
)
{
EncoderStatus ret = ENCODER_NO_ERROR;
- VAStatus va_status = VA_STATUS_SUCCESS;
GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
GstVaapiEncoderH264Private *priv = encoder->priv;
- GstVaapiDisplay *display = ENCODER_DISPLAY(base);
GstVaapiContext *context = ENCODER_CONTEXT(base);
- VADisplay va_dpy;
- VAContextID context_id;
VABufferID va_buffers[64];
guint32 va_buffers_count = 0;
gboolean is_params_ok = TRUE;
- gboolean is_locked = FALSE;
ENCODER_ASSERT(context);
- va_dpy = ENCODER_VA_DISPLAY(base);
- context_id = ENCODER_VA_CONTEXT(base);
-
*is_key = (priv->cur_slice_type == SLICE_TYPE_I);
if (!priv->ref_surface1) {
ENCODER_PARAMETER_ERR,
"h264_recreate_slice_param failed");
- /* lock display */
- ENCODER_ACQUIRE_DISPLAY_LOCK(display);
-
/*render all buffers*/
if (VA_INVALID_ID != priv->seq_param_id) {
#if HAVE_OLD_H264_ENCODER
va_buffers[va_buffers_count++] = priv->packed_pic_data_id;
}
}
-
- va_status = vaRenderPicture(va_dpy,
- context_id,
- va_buffers,
- va_buffers_count);
- ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
+ ret = gst_vaapi_encoder_render_picture(GST_VAAPI_ENCODER_CAST(encoder),
+ surface,
+ va_buffers,
+ va_buffers_count);
+ ENCODER_CHECK_STATUS(ret == ENCODER_NO_ERROR,
ENCODER_PICTURE_ERR,
"vaRenderH264Picture failed.");
}
end:
- ENCODER_RELEASE_DISPLAY_LOCK(display);
return ret;
}
GstVaapiContext *context = ENCODER_CONTEXT(base);
VADisplay va_dpy = ENCODER_VA_DISPLAY(encoder);
VAContextID context_id = ENCODER_VA_CONTEXT(encoder);
+ VABufferID va_buffers[64];
+ guint32 va_buffers_count = 0;
VAStatus va_status = VA_STATUS_SUCCESS;
EncoderStatus ret = ENCODER_NO_ERROR;
ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
ENCODER_ENC_RES_ERR,
"mpeg4 alloc seq-buffer failed.");
- va_status = vaRenderPicture(va_dpy, context_id, &priv->seq_param_id, 1);
- ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
- ENCODER_PICTURE_ERR,
- "mpeg4 vaRenderPicture seq-parameters failed.");
+ va_buffers[va_buffers_count++] = priv->seq_param_id;
}
/* set reference and reconstructed surfaces */
ENCODER_ENC_RES_ERR,
"mpeg4 creating pic-param buffer failed.");
- va_status = vaRenderPicture(va_dpy, context_id, &priv->pic_param_id, 1);
- ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS ==va_status,
- ENCODER_PICTURE_ERR,
- "mpeg4 rendering pic-param buffer failed.");
+ va_buffers[va_buffers_count++] = priv->pic_param_id;
/*initialize slice parameters, only ONE slice for mpeg4*/
VAEncSliceParameterBuffer slice_param = { 0 };
ENCODER_ENC_RES_ERR,
"mpeg4 creating slice-parameters buffer failed.");
- va_status = vaRenderPicture(va_dpy, context_id, &priv->slice_param_id, 1);
- ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
+ va_buffers[va_buffers_count++] = priv->slice_param_id;
+
+ ret = gst_vaapi_encoder_render_picture(GST_VAAPI_ENCODER_CAST(encoder),
+ surface,
+ va_buffers,
+ va_buffers_count);
+ ENCODER_CHECK_STATUS(ret == ENCODER_NO_ERROR,
ENCODER_PICTURE_ERR,
"mpeg4 rendering slice-parameters buffer failed.");