h264ccextractor,h265ccextractor: Do not resend caps per output buffer

Send caps event only when it's required

Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4281
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8596>
This commit is contained in:
Seungha Yang 2025-03-07 01:09:23 +09:00 committed by GStreamer Marge Bot
parent 2f2a6e76bc
commit dba3bdd0cf
2 changed files with 28 additions and 4 deletions

View File

@ -96,6 +96,7 @@ struct _GstH264CCExtractor
gboolean on_eos;
gint fps_n;
gint fps_d;
gboolean need_negotiate;
};
#define gst_h264_cc_extractor_parent_class parent_class
@ -199,6 +200,8 @@ gst_h264_cc_extractor_set_format (GstVideoDecoder * decoder,
GstCaps *caps;
gboolean ret;
self->need_negotiate = TRUE;
/* Assume caption type is cea708 raw which is common cc type
* embedded in SEI */
if (self->caption_type == GST_VIDEO_CAPTION_TYPE_UNKNOWN)
@ -225,7 +228,12 @@ static gboolean
gst_h264_cc_extractor_negotiate (GstVideoDecoder * decoder)
{
GstH264CCExtractor *self = GST_H264_CC_EXTRACTOR (decoder);
GstCaps *caps = gst_video_caption_type_to_caps (self->caption_type);
GstCaps *caps;
if (!self->need_negotiate)
return TRUE;
caps = gst_video_caption_type_to_caps (self->caption_type);
gst_caps_set_simple (caps,
"framerate", GST_TYPE_FRACTION, self->fps_n, self->fps_d, NULL);
@ -233,6 +241,8 @@ gst_h264_cc_extractor_negotiate (GstVideoDecoder * decoder)
gst_pad_set_caps (decoder->srcpad, caps);
gst_caps_unref (caps);
self->need_negotiate = FALSE;
return TRUE;
}
@ -425,8 +435,10 @@ gst_h264_cc_extractor_output_picture (GstH264Decoder * decoder,
}
}
if (updated)
if (updated) {
self->need_negotiate = TRUE;
gst_video_decoder_negotiate (videodec);
}
gst_h264_picture_unref (picture);

View File

@ -93,6 +93,7 @@ struct _GstH265CCExtractor
gboolean on_eos;
gint fps_n;
gint fps_d;
gboolean need_negotiate;
};
#define gst_h265_cc_extractor_parent_class parent_class
@ -194,6 +195,8 @@ gst_h265_cc_extractor_set_format (GstVideoDecoder * decoder,
GstCaps *caps;
gboolean ret;
self->need_negotiate = TRUE;
/* Assume caption type is cea708 raw which is common cc type
* embedded in SEI */
if (self->caption_type == GST_VIDEO_CAPTION_TYPE_UNKNOWN)
@ -220,7 +223,12 @@ static gboolean
gst_h265_cc_extractor_negotiate (GstVideoDecoder * decoder)
{
GstH265CCExtractor *self = GST_H265_CC_EXTRACTOR (decoder);
GstCaps *caps = gst_video_caption_type_to_caps (self->caption_type);
GstCaps *caps;
if (!self->need_negotiate)
return TRUE;
caps = gst_video_caption_type_to_caps (self->caption_type);
gst_caps_set_simple (caps,
"framerate", GST_TYPE_FRACTION, self->fps_n, self->fps_d, NULL);
@ -228,6 +236,8 @@ gst_h265_cc_extractor_negotiate (GstVideoDecoder * decoder)
gst_pad_set_caps (decoder->srcpad, caps);
gst_caps_unref (caps);
self->need_negotiate = FALSE;
return TRUE;
}
@ -399,8 +409,10 @@ gst_h265_cc_extractor_output_picture (GstH265Decoder * decoder,
}
}
if (updated)
if (updated) {
self->need_negotiate = TRUE;
gst_video_decoder_negotiate (videodec);
}
gst_h265_picture_unref (picture);