static GstBuffer * allocate_buffer (GstVaapiCodedBuffer * vbuf) { GstBuffer *buf; gssize size; size = gst_vaapi_coded_buffer_get_size (vbuf); if (size <= 0) { g_warning ("Invalid VA buffer size (%zd)", size); return NULL; } buf = gst_buffer_new_and_alloc (size); if (!buf) { g_warning ("Failed to create output buffer of size %zd", size); return NULL; } if (!gst_vaapi_coded_buffer_copy_into (buf, vbuf)) { g_warning ("Failed to copy VA buffer data"); gst_buffer_unref (buf); return NULL; } return buf; }
static GstFlowReturn gst_vaapiencode_default_alloc_buffer (GstVaapiEncode * encode, GstVaapiCodedBuffer * coded_buf, GstBuffer ** outbuf_ptr) { GstBuffer *buf; gint32 buf_size; g_return_val_if_fail (coded_buf != NULL, GST_FLOW_ERROR); g_return_val_if_fail (outbuf_ptr != NULL, GST_FLOW_ERROR); buf_size = gst_vaapi_coded_buffer_get_size (coded_buf); if (buf_size <= 0) goto error_invalid_buffer; buf = gst_video_encoder_allocate_output_buffer (GST_VIDEO_ENCODER_CAST (encode), buf_size); if (!buf) goto error_create_buffer; if (!gst_vaapi_coded_buffer_copy_into (buf, coded_buf)) goto error_copy_buffer; *outbuf_ptr = buf; return GST_FLOW_OK; /* ERRORS */ error_invalid_buffer: { GST_ERROR ("invalid GstVaapiCodedBuffer size (%d bytes)", buf_size); return GST_VAAPI_ENCODE_FLOW_MEM_ERROR; } error_create_buffer: { GST_ERROR ("failed to create output buffer of size %d", buf_size); return GST_VAAPI_ENCODE_FLOW_MEM_ERROR; } error_copy_buffer: { GST_ERROR ("failed to copy GstVaapiCodedBuffer data"); gst_buffer_unref (buf); return GST_VAAPI_ENCODE_FLOW_MEM_ERROR; } }