static void gst_vaapidecode_finalize(GObject *object) { GstVaapiDecode * const decode = GST_VAAPIDECODE(object); gst_vaapidecode_destroy(decode); if (decode->sinkpad_caps) { gst_caps_unref(decode->sinkpad_caps); decode->sinkpad_caps = NULL; } if (decode->srcpad_caps) { gst_caps_unref(decode->srcpad_caps); decode->srcpad_caps = NULL; } g_clear_object(&decode->display); if (decode->allowed_caps) { gst_caps_unref(decode->allowed_caps); decode->allowed_caps = NULL; } if (decode->delayed_new_seg) { gst_event_unref(decode->delayed_new_seg); decode->delayed_new_seg = NULL; } G_OBJECT_CLASS(gst_vaapidecode_parent_class)->finalize(object); }
static gboolean gst_vaapidecode_close (GstVideoDecoder * vdec) { GstVaapiDecode *const decode = GST_VAAPIDECODE (vdec); gst_vaapi_decode_input_state_replace (decode, NULL); gst_vaapidecode_destroy (decode); gst_vaapi_plugin_base_close (GST_VAAPI_PLUGIN_BASE (decode)); return TRUE; }
static gboolean gst_vaapidecode_close (GstVideoDecoder * vdec) { GstVaapiDecode *const decode = GST_VAAPIDECODE (vdec); gst_vaapidecode_destroy (decode); gst_caps_replace (&decode->allowed_srcpad_caps, NULL); gst_caps_replace (&decode->allowed_sinkpad_caps, NULL); gst_vaapi_plugin_base_close (GST_VAAPI_PLUGIN_BASE (decode)); return TRUE; }
static gboolean gst_vaapidecode_reset(GstVaapiDecode *decode, GstCaps *caps) { GstVaapiCodec codec; /* Only reset decoder if codec type changed */ if (decode->decoder && decode->decoder_caps) { if (gst_caps_is_always_compatible(caps, decode->decoder_caps)) return TRUE; codec = gst_vaapi_codec_from_caps(caps); if (codec == gst_vaapi_decoder_get_codec(decode->decoder)) return TRUE; } gst_vaapidecode_destroy(decode); return gst_vaapidecode_create(decode, caps); }
static gboolean gst_vaapidecode_reset_full (GstVaapiDecode * decode, GstCaps * caps, gboolean hard) { GstVaapiCodec codec; /* Reset tracked frame size */ decode->current_frame_size = 0; if (!hard && decode->decoder && decode->decoder_caps) { if (gst_caps_is_always_compatible (caps, decode->decoder_caps)) return TRUE; codec = gst_vaapi_codec_from_caps (caps); if (codec == gst_vaapi_decoder_get_codec (decode->decoder)) return TRUE; } gst_vaapidecode_destroy (decode); return gst_vaapidecode_create (decode, caps); }
static GstStateChangeReturn gst_vaapidecode_change_state(GstElement *element, GstStateChange transition) { GstVaapiDecode * const decode = GST_VAAPIDECODE(element); GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: decode->is_ready = TRUE; break; case GST_STATE_CHANGE_READY_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = GST_ELEMENT_CLASS(gst_vaapidecode_parent_class)->change_state(element, transition); if (ret != GST_STATE_CHANGE_SUCCESS) return ret; switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: break; case GST_STATE_CHANGE_READY_TO_NULL: gst_vaapidecode_destroy(decode); g_clear_object(&decode->display); decode->is_ready = FALSE; break; default: break; } return GST_STATE_CHANGE_SUCCESS; }