static gboolean gst_vaapidecode_flush (GstVideoDecoder * vdec) { GstVaapiDecode *const decode = GST_VAAPIDECODE (vdec); if (!decode->decoder) return FALSE; GST_LOG_OBJECT (vdec, "flushing"); gst_vaapidecode_purge (decode); /* There could be issues if we avoid the reset() while doing * seeking: we have to reset the internal state */ return gst_vaapidecode_reset (decode, decode->sinkpad_caps, TRUE); }
static gboolean gst_vaapidecode_set_format (GstVideoDecoder * vdec, GstVideoCodecState * state) { GstVaapiPluginBase *const plugin = GST_VAAPI_PLUGIN_BASE (vdec); GstVaapiDecode *const decode = GST_VAAPIDECODE (vdec); if (!gst_vaapi_decode_input_state_replace (decode, state)) return TRUE; if (!gst_vaapidecode_update_sink_caps (decode, state->caps)) return FALSE; if (!gst_vaapi_plugin_base_set_caps (plugin, decode->sinkpad_caps, NULL)) return FALSE; if (!gst_vaapidecode_reset (decode, decode->sinkpad_caps, FALSE)) return FALSE; return TRUE; }
static gboolean gst_vaapidecode_set_caps(GstPad *pad, GstCaps *caps) { GstVaapiDecode * const decode = GST_VAAPIDECODE(GST_OBJECT_PARENT(pad)); g_return_val_if_fail(pad == decode->sinkpad, FALSE); if (!gst_vaapidecode_update_sink_caps(decode, caps)) return FALSE; if (!gst_vaapidecode_update_src_caps(decode, caps)) return FALSE; if (!gst_vaapidecode_reset(decode, decode->sinkpad_caps)) return FALSE; /* Propagate NEWSEGMENT event downstream, now that pads are linked */ if (decode->delayed_new_seg) { if (gst_pad_push_event(decode->srcpad, decode->delayed_new_seg)) gst_event_unref(decode->delayed_new_seg); decode->delayed_new_seg = NULL; } return TRUE; }