diff options
author | Edward Hervey <edward@centricular.com> | 2020-05-20 10:46:45 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2020-05-20 16:51:47 +0300 |
commit | 5dd3643d9474acc3095c43afda8ad70a567f286b (patch) | |
tree | 8cd06919556502afa7c564927d2af1e8faaa2ba3 | |
parent | e8282661b624190688017b739ae595eaf806e328 (diff) |
flvdemux: Answer bitrate queries from upstream
If upstream (such as queue2 in urisourcebin) asks for our bitrate, check if we
have stored audio/video bitrates, and use them.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/596>
-rw-r--r-- | gst/flv/gstflvdemux.c | 61 | ||||
-rw-r--r-- | gst/flv/gstflvdemux.h | 2 |
2 files changed, 61 insertions, 2 deletions
diff --git a/gst/flv/gstflvdemux.c b/gst/flv/gstflvdemux.c index 16356d4728..6607990096 100644 --- a/gst/flv/gstflvdemux.c +++ b/gst/flv/gstflvdemux.c @@ -107,6 +107,8 @@ static gboolean flv_demux_handle_seek_push (GstFlvDemux * demux, static gboolean gst_flv_demux_handle_seek_pull (GstFlvDemux * demux, GstEvent * event, gboolean seeking); +static gboolean gst_flv_demux_sink_query (GstPad * pad, GstObject * parent, + GstQuery * query); static gboolean gst_flv_demux_query (GstPad * pad, GstObject * parent, GstQuery * query); static gboolean gst_flv_demux_src_event (GstPad * pad, GstObject * parent, @@ -372,11 +374,13 @@ gst_flv_demux_parse_metadata_item (GstFlvDemux * demux, GstByteReader * reader, } else if (!strcmp (tag_name, "framerate")) { demux->framerate = d; } else if (!strcmp (tag_name, "audiodatarate")) { + demux->audio_bitrate = (guint) (d * 1024); gst_tag_list_add (demux->audio_tags, GST_TAG_MERGE_REPLACE, - GST_TAG_NOMINAL_BITRATE, (guint) (d * 1024), NULL); + GST_TAG_NOMINAL_BITRATE, demux->audio_bitrate, NULL); } else if (!strcmp (tag_name, "videodatarate")) { + demux->video_bitrate = (guint) (d * 1024); gst_tag_list_add (demux->video_tags, GST_TAG_MERGE_REPLACE, - GST_TAG_NOMINAL_BITRATE, (guint) (d * 1024), NULL); + GST_TAG_NOMINAL_BITRATE, demux->video_bitrate, NULL); } else { GST_INFO_OBJECT (demux, "Tag \'%s\' not handled", tag_name); } @@ -2055,6 +2059,9 @@ gst_flv_demux_cleanup (GstFlvDemux * demux) demux->filepositions = NULL; } + demux->video_bitrate = 0; + demux->audio_bitrate = 0; + gst_flv_demux_clear_tags (demux); } @@ -3283,6 +3290,54 @@ gst_flv_demux_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) } static gboolean +gst_flv_demux_sink_query (GstPad * pad, GstObject * parent, GstQuery * query) +{ + GstFlvDemux *demux; + gboolean ret = FALSE; + + demux = GST_FLV_DEMUX (parent); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_BITRATE: + { + guint total_bitrate = 0; + + if (demux->audio_pad) { + if (!demux->audio_bitrate) { + GST_DEBUG_OBJECT (demux, + "Have audio pad but no audio bitrate, can't answer BITRATE query"); + break; + } + total_bitrate = demux->audio_bitrate; + } + if (demux->video_pad) { + if (!demux->video_bitrate) { + GST_DEBUG_OBJECT (demux, + "Have video pad but no video bitrate, can't answer BITRATE query"); + break; + } + total_bitrate += demux->video_bitrate; + } + + GST_DEBUG_OBJECT (demux, + "bitrate query. total_bitrate:%" G_GUINT32_FORMAT, total_bitrate); + + if (total_bitrate) { + /* Padding of 2kbit/s for container overhead */ + gst_query_set_bitrate (query, total_bitrate + 2048); + ret = TRUE; + } + break; + } + default: + ret = gst_pad_query_default (pad, parent, query); + break; + } + + return ret; +} + +static gboolean gst_flv_demux_src_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstFlvDemux *demux; @@ -3655,6 +3710,8 @@ gst_flv_demux_init (GstFlvDemux * demux) GST_DEBUG_FUNCPTR (gst_flv_demux_sink_activate)); gst_pad_set_activatemode_function (demux->sinkpad, GST_DEBUG_FUNCPTR (gst_flv_demux_sink_activate_mode)); + gst_pad_set_query_function (demux->sinkpad, + GST_DEBUG_FUNCPTR (gst_flv_demux_sink_query)); gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad); diff --git a/gst/flv/gstflvdemux.h b/gst/flv/gstflvdemux.h index 4eb1791760..275613cf58 100644 --- a/gst/flv/gstflvdemux.h +++ b/gst/flv/gstflvdemux.h @@ -106,6 +106,7 @@ struct _GstFlvDemux GstClockTime audio_start; guint32 last_audio_pts; GstClockTime audio_time_offset; + guint32 audio_bitrate; /* Video infos */ guint32 w; @@ -123,6 +124,7 @@ struct _GstFlvDemux guint32 last_video_dts; GstClockTime video_time_offset; gdouble framerate; + guint32 video_bitrate; gboolean random_access; gboolean need_header; |