mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
Initialize decoder earlier.
This commit is contained in:
parent
2d90a2dd3a
commit
f53a5781ad
1 changed files with 36 additions and 27 deletions
|
@ -168,38 +168,49 @@ gst_vaapidecode_ensure_display(GstVaapiDecode *decode)
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_vaapidecode_create(GstVaapiDecode *decode)
|
gst_vaapidecode_create(GstVaapiDecode *decode, GstCaps *caps)
|
||||||
{
|
{
|
||||||
if (!gst_vaapidecode_ensure_display(decode))
|
if (!gst_vaapidecode_ensure_display(decode))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (decode->use_ffmpeg)
|
if (decode->use_ffmpeg)
|
||||||
decode->decoder =
|
decode->decoder = gst_vaapi_decoder_ffmpeg_new(decode->display, caps);
|
||||||
gst_vaapi_decoder_ffmpeg_new(decode->display, decode->decoder_caps);
|
if (!decode->decoder)
|
||||||
return decode->decoder != NULL;
|
return FALSE;
|
||||||
|
|
||||||
|
decode->decoder_caps = gst_caps_ref(caps);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_vaapidecode_destroy(GstVaapiDecode *decode)
|
gst_vaapidecode_destroy(GstVaapiDecode *decode)
|
||||||
{
|
{
|
||||||
if (decode->decoder_caps) {
|
|
||||||
gst_caps_unref(decode->decoder_caps);
|
|
||||||
decode->decoder_caps = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (decode->decoder) {
|
if (decode->decoder) {
|
||||||
gst_vaapi_decoder_put_buffer(decode->decoder, NULL);
|
gst_vaapi_decoder_put_buffer(decode->decoder, NULL);
|
||||||
g_object_unref(decode->decoder);
|
g_object_unref(decode->decoder);
|
||||||
decode->decoder = NULL;
|
decode->decoder = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (decode->display) {
|
if (decode->decoder_caps) {
|
||||||
g_object_unref(decode->display);
|
gst_caps_unref(decode->decoder_caps);
|
||||||
decode->display = NULL;
|
decode->decoder_caps = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gst_vaapidecode_base_init(gpointer klass)
|
static gboolean
|
||||||
|
gst_vaapidecode_reset(GstVaapiDecode *decode, GstCaps *caps)
|
||||||
|
{
|
||||||
|
if (decode->decoder &&
|
||||||
|
decode->decoder_caps &&
|
||||||
|
gst_caps_is_always_compatible(caps, decode->decoder_caps))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
gst_vaapidecode_destroy(decode);
|
||||||
|
return gst_vaapidecode_create(decode, caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_vaapidecode_base_init(gpointer klass)
|
||||||
{
|
{
|
||||||
GstElementClass * const element_class = GST_ELEMENT_CLASS(klass);
|
GstElementClass * const element_class = GST_ELEMENT_CLASS(klass);
|
||||||
|
|
||||||
|
@ -221,7 +232,14 @@ static void gst_vaapidecode_base_init(gpointer klass)
|
||||||
static void
|
static void
|
||||||
gst_vaapidecode_finalize(GObject *object)
|
gst_vaapidecode_finalize(GObject *object)
|
||||||
{
|
{
|
||||||
gst_vaapidecode_destroy(GST_VAAPIDECODE(object));
|
GstVaapiDecode * const decode = GST_VAAPIDECODE(object);
|
||||||
|
|
||||||
|
gst_vaapidecode_destroy(decode);
|
||||||
|
|
||||||
|
if (decode->display) {
|
||||||
|
g_object_unref(decode->display);
|
||||||
|
decode->display = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
G_OBJECT_CLASS(parent_class)->finalize(object);
|
G_OBJECT_CLASS(parent_class)->finalize(object);
|
||||||
}
|
}
|
||||||
|
@ -328,7 +346,6 @@ gst_vaapidecode_set_caps(GstPad *pad, GstCaps *caps)
|
||||||
gboolean success;
|
gboolean success;
|
||||||
|
|
||||||
g_return_val_if_fail(pad == decode->sinkpad, FALSE);
|
g_return_val_if_fail(pad == decode->sinkpad, FALSE);
|
||||||
decode->decoder_caps = gst_caps_ref(caps);
|
|
||||||
|
|
||||||
other_caps = gst_caps_from_string(gst_vaapidecode_src_caps_str);
|
other_caps = gst_caps_from_string(gst_vaapidecode_src_caps_str);
|
||||||
if (!other_caps)
|
if (!other_caps)
|
||||||
|
@ -351,7 +368,10 @@ gst_vaapidecode_set_caps(GstPad *pad, GstCaps *caps)
|
||||||
|
|
||||||
success = gst_pad_set_caps(decode->srcpad, other_caps);
|
success = gst_pad_set_caps(decode->srcpad, other_caps);
|
||||||
gst_caps_unref(other_caps);
|
gst_caps_unref(other_caps);
|
||||||
return success;
|
if (!success)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return gst_vaapidecode_reset(decode, caps);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
|
@ -359,11 +379,6 @@ gst_vaapidecode_chain(GstPad *pad, GstBuffer *buf)
|
||||||
{
|
{
|
||||||
GstVaapiDecode * const decode = GST_VAAPIDECODE(GST_OBJECT_PARENT(pad));
|
GstVaapiDecode * const decode = GST_VAAPIDECODE(GST_OBJECT_PARENT(pad));
|
||||||
|
|
||||||
if (!decode->decoder) {
|
|
||||||
if (!gst_vaapidecode_create(decode))
|
|
||||||
goto error_create_decoder;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!gst_vaapi_decoder_put_buffer(decode->decoder, buf))
|
if (!gst_vaapi_decoder_put_buffer(decode->decoder, buf))
|
||||||
goto error_push_buffer;
|
goto error_push_buffer;
|
||||||
|
|
||||||
|
@ -371,12 +386,6 @@ gst_vaapidecode_chain(GstPad *pad, GstBuffer *buf)
|
||||||
return gst_vaapidecode_step(decode);
|
return gst_vaapidecode_step(decode);
|
||||||
|
|
||||||
/* ERRORS */
|
/* ERRORS */
|
||||||
error_create_decoder:
|
|
||||||
{
|
|
||||||
GST_DEBUG("failed to create decoder");
|
|
||||||
gst_buffer_unref(buf);
|
|
||||||
return GST_FLOW_UNEXPECTED;
|
|
||||||
}
|
|
||||||
error_push_buffer:
|
error_push_buffer:
|
||||||
{
|
{
|
||||||
GST_DEBUG("failed to push input buffer to decoder");
|
GST_DEBUG("failed to push input buffer to decoder");
|
||||||
|
|
Loading…
Reference in a new issue