/* invoked if actual VASurface size (not the cropped values) * changed */ static void gst_vaapi_decoder_state_changed (GstVaapiDecoder * decoder, const GstVideoCodecState * codec_state, gpointer user_data) { GstVaapiDecode *const decode = GST_VAAPIDECODE (user_data); g_assert (decode->decoder == decoder); if (!gst_vaapi_decode_input_state_replace (decode, codec_state)) return; if (!gst_vaapidecode_update_sink_caps (decode, decode->input_state->caps)) return; }
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; }