mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-29 02:28:27 +00:00
Simplify GstVaapiDecoder API.
This commit is contained in:
parent
5128ed9951
commit
73766f9466
3 changed files with 11 additions and 158 deletions
|
@ -38,7 +38,7 @@
|
||||||
|
|
||||||
G_DEFINE_TYPE(GstVaapiDecoder, gst_vaapi_decoder, G_TYPE_OBJECT);
|
G_DEFINE_TYPE(GstVaapiDecoder, gst_vaapi_decoder, G_TYPE_OBJECT);
|
||||||
|
|
||||||
/* XXX: Make it a GstVaapiDecodedSurface + propagate PTS */
|
/* XXX: Make it a GstVaapiDecodedSurface? */
|
||||||
typedef struct _DecodedSurface DecodedSurface;
|
typedef struct _DecodedSurface DecodedSurface;
|
||||||
struct _DecodedSurface {
|
struct _DecodedSurface {
|
||||||
GstVaapiSurfaceProxy *proxy;
|
GstVaapiSurfaceProxy *proxy;
|
||||||
|
@ -78,31 +78,6 @@ create_eos_buffer(void)
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstBuffer *
|
|
||||||
create_buffer(const guchar *buf, guint buf_size, gboolean copy)
|
|
||||||
{
|
|
||||||
GstBuffer *buffer;
|
|
||||||
|
|
||||||
if (!buf || !buf_size)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
buffer = gst_buffer_new();
|
|
||||||
if (!buffer)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (copy) {
|
|
||||||
buffer->malloc_data = g_malloc(buf_size);
|
|
||||||
if (!buffer->malloc_data) {
|
|
||||||
gst_buffer_unref(buffer);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
memcpy(buffer->malloc_data, buf, buf_size);
|
|
||||||
buf = buffer->malloc_data;
|
|
||||||
}
|
|
||||||
init_buffer(buffer, buf, buf_size);
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
destroy_buffer(GstBuffer *buffer)
|
destroy_buffer(GstBuffer *buffer)
|
||||||
{
|
{
|
||||||
|
@ -410,108 +385,6 @@ gst_vaapi_decoder_init(GstVaapiDecoder *decoder)
|
||||||
priv->surfaces = g_queue_new();
|
priv->surfaces = g_queue_new();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_vaapi_decoder_get_frame_rate:
|
|
||||||
* @decoder: a #GstVaapiDecoder
|
|
||||||
* @num: return location for the numerator of the frame rate
|
|
||||||
* @den: return location for the denominator of the frame rate
|
|
||||||
*
|
|
||||||
* Retrieves the current frame rate as the fraction @num / @den. The
|
|
||||||
* default frame rate is 30 fps.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
gst_vaapi_decoder_get_frame_rate(
|
|
||||||
GstVaapiDecoder *decoder,
|
|
||||||
guint *num,
|
|
||||||
guint *den
|
|
||||||
)
|
|
||||||
{
|
|
||||||
g_return_if_fail(GST_VAAPI_IS_DECODER(decoder));
|
|
||||||
|
|
||||||
if (num)
|
|
||||||
*num = decoder->priv->fps_n;
|
|
||||||
|
|
||||||
if (den)
|
|
||||||
*den = decoder->priv->fps_d;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_vaapi_decoder_set_frame_rate:
|
|
||||||
* @decoder: a #GstVaapiDecoder
|
|
||||||
* @num: the numerator of the frame rate
|
|
||||||
* @den: the denominator of the frame rate
|
|
||||||
*
|
|
||||||
* Sets the frame rate for the stream to @num / @den. By default, the
|
|
||||||
* decoder will use the frame rate encoded in the elementary stream.
|
|
||||||
* If none is available, the decoder will default to 30 fps.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
gst_vaapi_decoder_set_frame_rate(
|
|
||||||
GstVaapiDecoder *decoder,
|
|
||||||
guint num,
|
|
||||||
guint den
|
|
||||||
)
|
|
||||||
{
|
|
||||||
g_return_if_fail(GST_VAAPI_IS_DECODER(decoder));
|
|
||||||
|
|
||||||
decoder->priv->fps_n = num;
|
|
||||||
decoder->priv->fps_d = den;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_vaapi_decoder_put_buffer_data:
|
|
||||||
* @decoder: a #GstVaapiDecoder
|
|
||||||
* @buf: pointer to buffer data
|
|
||||||
* @buf_size: size of buffer data in bytes
|
|
||||||
*
|
|
||||||
* Queues @buf_size bytes from the data @buf to the HW decoder. The
|
|
||||||
* caller is responsible for making sure @buf is live beyond this
|
|
||||||
* function. So, this function is mostly useful with static data
|
|
||||||
* buffers. gst_vaapi_decoder_put_buffer_data_copy() does the same but
|
|
||||||
* copies the data.
|
|
||||||
*
|
|
||||||
* Caller can notify an End-Of-Stream with @buf set to %NULL and
|
|
||||||
* @buf_size set to zero.
|
|
||||||
*
|
|
||||||
* Return value: %TRUE on success
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
gst_vaapi_decoder_put_buffer_data(
|
|
||||||
GstVaapiDecoder *decoder,
|
|
||||||
const guchar *buf,
|
|
||||||
guint buf_size
|
|
||||||
)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), FALSE);
|
|
||||||
|
|
||||||
return push_buffer(decoder, create_buffer(buf, buf_size, FALSE));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_vaapi_decoder_put_buffer_data_copy:
|
|
||||||
* @decoder: a #GstVaapiDecoder
|
|
||||||
* @buf: pointer to buffer data
|
|
||||||
* @buf_size: size of buffer data in bytes
|
|
||||||
*
|
|
||||||
* Queues a copy of @buf to the HW decoder.
|
|
||||||
*
|
|
||||||
* Caller can notify an End-Of-Stream with @buf set to %NULL and
|
|
||||||
* @buf_size set to zero.
|
|
||||||
*
|
|
||||||
* Return value: %TRUE on success
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
gst_vaapi_decoder_put_buffer_data_copy(
|
|
||||||
GstVaapiDecoder *decoder,
|
|
||||||
const guchar *buf,
|
|
||||||
guint buf_size
|
|
||||||
)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), FALSE);
|
|
||||||
|
|
||||||
return push_buffer(decoder, create_buffer(buf, buf_size, TRUE));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_vaapi_decoder_put_buffer:
|
* gst_vaapi_decoder_put_buffer:
|
||||||
* @decoder: a #GstVaapiDecoder
|
* @decoder: a #GstVaapiDecoder
|
||||||
|
|
|
@ -109,34 +109,6 @@ struct _GstVaapiDecoderClass {
|
||||||
GType
|
GType
|
||||||
gst_vaapi_decoder_get_type(void);
|
gst_vaapi_decoder_get_type(void);
|
||||||
|
|
||||||
void
|
|
||||||
gst_vaapi_decoder_get_frame_rate(
|
|
||||||
GstVaapiDecoder *decoder,
|
|
||||||
guint *num,
|
|
||||||
guint *den
|
|
||||||
);
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_vaapi_decoder_set_frame_rate(
|
|
||||||
GstVaapiDecoder *decoder,
|
|
||||||
guint num,
|
|
||||||
guint den
|
|
||||||
);
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gst_vaapi_decoder_put_buffer_data(
|
|
||||||
GstVaapiDecoder *decoder,
|
|
||||||
const guchar *buf,
|
|
||||||
guint buf_size
|
|
||||||
);
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gst_vaapi_decoder_put_buffer_data_copy(
|
|
||||||
GstVaapiDecoder *decoder,
|
|
||||||
const guchar *buf,
|
|
||||||
guint buf_size
|
|
||||||
);
|
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
gst_vaapi_decoder_put_buffer(GstVaapiDecoder *decoder, GstBuffer *buf);
|
gst_vaapi_decoder_put_buffer(GstVaapiDecoder *decoder, GstBuffer *buf);
|
||||||
|
|
||||||
|
|
|
@ -82,6 +82,7 @@ main(int argc, char *argv[])
|
||||||
GstStructure *structure;
|
GstStructure *structure;
|
||||||
GstVaapiDecoderStatus status;
|
GstVaapiDecoderStatus status;
|
||||||
const CodecDefs *codec;
|
const CodecDefs *codec;
|
||||||
|
GstBuffer *buffer;
|
||||||
GstVaapiSurfaceProxy *proxy;
|
GstVaapiSurfaceProxy *proxy;
|
||||||
VideoDecodeInfo info;
|
VideoDecodeInfo info;
|
||||||
|
|
||||||
|
@ -128,9 +129,17 @@ main(int argc, char *argv[])
|
||||||
decoder = gst_vaapi_decoder_ffmpeg_new_from_caps(display, decoder_caps);
|
decoder = gst_vaapi_decoder_ffmpeg_new_from_caps(display, decoder_caps);
|
||||||
if (!decoder)
|
if (!decoder)
|
||||||
g_error("could not create FFmpeg decoder");
|
g_error("could not create FFmpeg decoder");
|
||||||
|
gst_caps_unref(decoder_caps);
|
||||||
|
|
||||||
if (!gst_vaapi_decoder_put_buffer_data(decoder, info.data, info.data_size))
|
buffer = gst_buffer_new();
|
||||||
|
if (!buffer)
|
||||||
|
g_error("could not create encoded data buffer");
|
||||||
|
gst_buffer_set_data(buffer, (guchar *)info.data, info.data_size);
|
||||||
|
|
||||||
|
if (!gst_vaapi_decoder_put_buffer(decoder, buffer))
|
||||||
g_error("could not send video data to the decoder");
|
g_error("could not send video data to the decoder");
|
||||||
|
gst_buffer_unref(buffer);
|
||||||
|
|
||||||
if (!gst_vaapi_decoder_put_buffer(decoder, NULL))
|
if (!gst_vaapi_decoder_put_buffer(decoder, NULL))
|
||||||
g_error("could not send EOS to the decoder");
|
g_error("could not send EOS to the decoder");
|
||||||
|
|
||||||
|
@ -150,7 +159,6 @@ main(int argc, char *argv[])
|
||||||
pause();
|
pause();
|
||||||
|
|
||||||
g_object_unref(proxy);
|
g_object_unref(proxy);
|
||||||
gst_caps_unref(decoder_caps);
|
|
||||||
g_object_unref(decoder);
|
g_object_unref(decoder);
|
||||||
g_object_unref(window);
|
g_object_unref(window);
|
||||||
g_object_unref(display);
|
g_object_unref(display);
|
||||||
|
|
Loading…
Reference in a new issue