return ret;
}
+static GstVaapiVideoBuffer *
+_get_video_buffer(
+ GstVaapiBaseEncoder* encoder,
+ GstBuffer *buf
+)
+{
+ if (GST_VAAPI_IS_VIDEO_BUFFER(buf))
+ return GST_VAAPI_VIDEO_BUFFER(buf);
+ return NULL;
+}
+
static EncoderStatus
gst_vaapi_base_encoder_encode_default(
GstVaapiEncoder* base,
- GstBuffer *raw_pic
+ GstBuffer *pic
)
{
GstVaapiBaseEncoder* encoder = GST_VAAPI_BASE_ENCODER(base);
gboolean is_key = FALSE;
VABufferID* coded_buf = NULL;
GstVaapiSurface *buffer_surface = NULL;
+ gboolean is_prepared_buffer = FALSE;
ENCODER_ASSERT(display && context);
/* Video Buffer */
GstVaapiVideoBuffer *video_buffer = NULL;
- ENCODER_CHECK_STATUS(raw_pic || base_class->prepare_next_input_buffer,
+ ENCODER_CHECK_STATUS(pic || base_class->prepare_next_input_buffer,
ENCODER_DATA_ERR,
"Need a picture to encode");
- if (raw_pic) {
- /* load picture to surface */
- if (GST_VAAPI_IS_VIDEO_BUFFER(raw_pic)) {
- video_buffer = GST_VAAPI_VIDEO_BUFFER(raw_pic);
- gst_buffer_ref(GST_BUFFER_CAST(video_buffer));
- } else {
- /* do something else */
- }
- } else {
+ if (!pic)
priv->need_flush = TRUE;
- }
again:
if (base_class->prepare_next_input_buffer) {
- GstVaapiVideoBuffer* tmp_buf = NULL;
+ GstBuffer* tmp_buf = NULL;
ret = base_class->prepare_next_input_buffer(encoder,
- video_buffer,
+ pic,
priv->need_flush,
&tmp_buf);
priv->need_flush = FALSE;
- if (video_buffer) {
- gst_buffer_unref(GST_BUFFER_CAST(video_buffer));
- video_buffer = NULL;
- }
if (ret != ENCODER_NO_ERROR || !tmp_buf)
goto end;
- video_buffer = tmp_buf;
+
+ is_prepared_buffer = TRUE;
+ pic = tmp_buf;
}
+ video_buffer = _get_video_buffer(encoder, pic);
+ ENCODER_CHECK_STATUS(
+ video_buffer,
+ ENCODER_SURFACE_ERR,
+ "vaapi encoder doesn't has video buffer");
+
buffer_surface = gst_vaapi_video_buffer_get_surface(video_buffer);
while ((coded_buf = pop_idle_buffer_id(encoder)) == NULL) {
/* Push coded buffer to another task */
GstVaapiEncoderBufferInfo* info = gst_vaapi_encoder_buffer_info_new(encoder);
info->id = coded_buf;
- info->timestamp = GST_BUFFER_TIMESTAMP(video_buffer);
- info->duration = GST_BUFFER_DURATION(video_buffer);
+ info->timestamp = GST_BUFFER_TIMESTAMP(pic);
+ info->duration = GST_BUFFER_DURATION(pic);
info->is_key = is_key;
push_busy_buffer_info(encoder, info);
priv->frame_count++;
- if (base_class->prepare_next_input_buffer) {
- if (video_buffer) {
- gst_buffer_unref(GST_BUFFER_CAST(video_buffer));
- }
- video_buffer = NULL;
+ if (is_prepared_buffer) {
+ if (pic)
+ gst_buffer_unref(pic);
+ pic = NULL;
buffer_surface = NULL;
coded_buf = NULL;
goto again;
if (ret < ENCODER_NO_ERROR && base_class->encode_frame_failed) {
base_class->encode_frame_failed(encoder, video_buffer);
}
- if (video_buffer) {
- gst_buffer_unref(GST_BUFFER_CAST(video_buffer));
- video_buffer = NULL;
- }
+ if (pic && is_prepared_buffer)
+ gst_buffer_unref(pic);
+
return ret;
}
static EncoderStatus
gst_vaapi_encoder_h264_prepare_next_buffer(
GstVaapiBaseEncoder* base,
- GstVaapiVideoBuffer *display_buf,
+ GstBuffer *display_buf,
gboolean need_flush,
- GstVaapiVideoBuffer **out_buf
+ GstBuffer **out_buf
)
{
EncoderStatus ret = ENCODER_NO_ERROR;
GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
GstVaapiEncoderH264Private *priv = encoder->priv;
- GstVaapiVideoBuffer *return_buf = NULL;
+ GstBuffer *return_buf = NULL;
//guint64 pts = 0;
if (NULL == display_buf && g_queue_is_empty(priv->queued_buffers)) {
return_buf = display_buf;
} else {
if (need_flush) {
- return_buf = (GstVaapiVideoBuffer*)g_queue_pop_tail(priv->queued_buffers);
+ return_buf = (GstBuffer*)g_queue_pop_tail(priv->queued_buffers);
priv->cur_slice_type = SLICE_TYPE_P;
priv->cur_display_num = priv->gop_count - 1;
++priv->cur_decode_num;
} else {
- return_buf = (GstVaapiVideoBuffer*)g_queue_pop_head(priv->queued_buffers);
+ return_buf = (GstBuffer*)g_queue_pop_head(priv->queued_buffers);
priv->cur_slice_type = SLICE_TYPE_B;
priv->cur_display_num =
priv->gop_count - 2 - g_queue_get_length(priv->queued_buffers);