From a97d3acb90a335bf2e9c9ed13d62091b25442580 Mon Sep 17 00:00:00 2001 From: Jochen Henneberg Date: Sun, 30 Jul 2023 10:48:12 +0200 Subject: [PATCH] rtp/vp8depay+vp9depay: Enable hdrext aggregation for VP8 and VP9 Part-of: --- subprojects/gst-plugins-good/gst/rtp/gstrtpvp8depay.c | 8 ++++++++ subprojects/gst-plugins-good/gst/rtp/gstrtpvp9depay.c | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/subprojects/gst-plugins-good/gst/rtp/gstrtpvp8depay.c b/subprojects/gst-plugins-good/gst/rtp/gstrtpvp8depay.c index 3428f43f66..708bceb688 100644 --- a/subprojects/gst-plugins-good/gst/rtp/gstrtpvp8depay.c +++ b/subprojects/gst-plugins-good/gst/rtp/gstrtpvp8depay.c @@ -82,6 +82,9 @@ enum static void gst_rtp_vp8_depay_init (GstRtpVP8Depay * self) { + gst_rtp_base_depayload_set_aggregate_hdrext_enabled (GST_RTP_BASE_DEPAYLOAD + (self), TRUE); + self->adapter = gst_adapter_new (); self->started = FALSE; self->wait_for_keyframe = DEFAULT_WAIT_FOR_KEYFRAME; @@ -351,6 +354,8 @@ gst_rtp_vp8_depay_process (GstRTPBaseDepayload * depay, GstRTPBuffer * rtp) if (frame_start) { if (G_UNLIKELY (self->started)) { GST_DEBUG_OBJECT (depay, "Incomplete frame, flushing adapter"); + /* keep the current buffer because it may still be used later */ + gst_rtp_base_depayload_flush (depay, TRUE); gst_adapter_clear (self->adapter); self->started = FALSE; @@ -425,6 +430,7 @@ gst_rtp_vp8_depay_process (GstRTPBaseDepayload * depay, GstRTPBuffer * rtp) GST_BUFFER_FLAG_SET (out, GST_BUFFER_FLAG_DELTA_UNIT); if (self->waiting_for_keyframe) { + gst_rtp_base_depayload_flush (depay, FALSE); gst_buffer_unref (out); out = NULL; GST_INFO_OBJECT (self, "Dropping inter-frame before intra-frame"); @@ -473,10 +479,12 @@ gst_rtp_vp8_depay_process (GstRTPBaseDepayload * depay, GstRTPBuffer * rtp) } done: + gst_rtp_base_depayload_dropped (depay); return NULL; too_small: GST_DEBUG_OBJECT (self, "Invalid rtp packet (too small), ignoring"); + gst_rtp_base_depayload_flush (depay, FALSE); gst_adapter_clear (self->adapter); self->started = FALSE; diff --git a/subprojects/gst-plugins-good/gst/rtp/gstrtpvp9depay.c b/subprojects/gst-plugins-good/gst/rtp/gstrtpvp9depay.c index 94348c5c8e..5c5f71c76c 100644 --- a/subprojects/gst-plugins-good/gst/rtp/gstrtpvp9depay.c +++ b/subprojects/gst-plugins-good/gst/rtp/gstrtpvp9depay.c @@ -83,6 +83,9 @@ enum static void gst_rtp_vp9_depay_init (GstRtpVP9Depay * self) { + gst_rtp_base_depayload_set_aggregate_hdrext_enabled (GST_RTP_BASE_DEPAYLOAD + (self), TRUE); + self->adapter = gst_adapter_new (); self->started = FALSE; self->inter_picture = FALSE; @@ -421,6 +424,8 @@ gst_rtp_vp9_depay_process (GstRTPBaseDepayload * depay, GstRTPBuffer * rtp) if (is_start_of_picture) { if (G_UNLIKELY (self->started)) { GST_DEBUG_OBJECT (depay, "Incomplete frame, flushing adapter"); + /* keep the current buffer because it may still be used later */ + gst_rtp_base_depayload_flush (depay, TRUE); gst_adapter_clear (self->adapter); self->started = FALSE; flushed_adapter = TRUE; @@ -503,6 +508,7 @@ gst_rtp_vp9_depay_process (GstRTPBaseDepayload * depay, GstRTPBuffer * rtp) GST_BUFFER_FLAG_SET (out, GST_BUFFER_FLAG_DELTA_UNIT); if (self->waiting_for_keyframe) { + gst_rtp_base_depayload_flush (depay, FALSE); gst_buffer_unref (out); out = NULL; GST_INFO_OBJECT (self, "Dropping inter-frame before intra-frame"); @@ -547,10 +553,12 @@ gst_rtp_vp9_depay_process (GstRTPBaseDepayload * depay, GstRTPBuffer * rtp) } done: + gst_rtp_base_depayload_dropped (depay); return NULL; too_small: GST_LOG_OBJECT (self, "Invalid rtp packet (too small), ignoring"); + gst_rtp_base_depayload_flush (depay, FALSE); gst_adapter_clear (self->adapter); self->started = FALSE; goto done;