mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-09-29 07:12:36 +00:00
vapostproc: Copy missing fields at fixate.
When caps negotiation implies a caps feature change, some fields might get lost. This patch brings them back from input caps. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1109>
This commit is contained in:
parent
5ae1072c2f
commit
60be3dbd2a
1 changed files with 25 additions and 14 deletions
|
@ -1470,6 +1470,29 @@ done:
|
||||||
g_value_unset (&tpar);
|
g_value_unset (&tpar);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
copy_misc_fields_from_input (GstVaVpp * self, GstCaps * in_caps,
|
||||||
|
GstCaps * out_caps)
|
||||||
|
{
|
||||||
|
const gchar *fields[] = { "interlace-mode", "field-order", "multiview-mode",
|
||||||
|
"multiview-flags", "framerate"
|
||||||
|
};
|
||||||
|
GstStructure *out_caps_s = gst_caps_get_structure (out_caps, 0);
|
||||||
|
GstStructure *in_caps_s = gst_caps_get_structure (in_caps, 0);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (fields); i++) {
|
||||||
|
const GValue *in_field = gst_structure_get_value (in_caps_s, fields[i]);
|
||||||
|
const GValue *out_field = gst_structure_get_value (out_caps_s, fields[i]);
|
||||||
|
|
||||||
|
if (out_field && gst_value_is_fixed (out_field))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (in_field)
|
||||||
|
gst_structure_set_value (out_caps_s, fields[i], in_field);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static GstCaps *
|
static GstCaps *
|
||||||
gst_va_vpp_fixate_caps (GstBaseTransform * trans, GstPadDirection direction,
|
gst_va_vpp_fixate_caps (GstBaseTransform * trans, GstPadDirection direction,
|
||||||
GstCaps * caps, GstCaps * othercaps)
|
GstCaps * caps, GstCaps * othercaps)
|
||||||
|
@ -1500,20 +1523,8 @@ gst_va_vpp_fixate_caps (GstBaseTransform * trans, GstPadDirection direction,
|
||||||
/* fixate remaining fields */
|
/* fixate remaining fields */
|
||||||
result = gst_caps_fixate (result);
|
result = gst_caps_fixate (result);
|
||||||
|
|
||||||
/* copy the framerate */
|
/* some fields might be lost while feature caps conversion */
|
||||||
{
|
copy_misc_fields_from_input (self, caps, result);
|
||||||
GstStructure *fixated_struct = gst_caps_get_structure (result, 0);
|
|
||||||
const GValue *framerate =
|
|
||||||
gst_structure_get_value (fixated_struct, "framerate");
|
|
||||||
|
|
||||||
if (!(framerate && gst_value_is_fixed (framerate))) {
|
|
||||||
GstStructure *orig_struct = gst_caps_get_structure (caps, 0);
|
|
||||||
const GValue *orig_framerate =
|
|
||||||
gst_structure_get_value (orig_struct, "framerate");
|
|
||||||
|
|
||||||
gst_structure_set_value (fixated_struct, "framerate", orig_framerate);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (direction == GST_PAD_SINK) {
|
if (direction == GST_PAD_SINK) {
|
||||||
if (gst_caps_is_subset (caps, result)) {
|
if (gst_caps_is_subset (caps, result)) {
|
||||||
|
|
Loading…
Reference in a new issue