From db2967125b578c7d03040ee8d7539d47c8004e17 Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Thu, 30 Jul 2015 00:59:15 +1000 Subject: [PATCH] flvmux: Store incoming bitrate tags and send in the metadata Apparently the Microsoft Azure RTMP server requires that the videodatarate and audiodatarate metadata be provided, so set those, even if it's to 0. Use the actual input bitrate tags if available. --- gst/flv/gstflvmux.c | 33 +++++++++++++++++++++++++++++++-- gst/flv/gstflvmux.h | 2 ++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/gst/flv/gstflvmux.c b/gst/flv/gstflvmux.c index 6694caf5eb..b42f91e398 100644 --- a/gst/flv/gstflvmux.c +++ b/gst/flv/gstflvmux.c @@ -280,23 +280,37 @@ gst_flv_mux_handle_src_event (GstPad * pad, GstObject * parent, return gst_pad_event_default (pad, parent, event); } +/* Extract per-codec relevant tags for + * insertion into the metadata later - ie bitrate, + * but maybe others in the future */ +static void +gst_flv_mux_store_codec_tags (GstFlvMux * mux, + GstFlvPad * flvpad, GstTagList * list) +{ + /* Look for a bitrate as either nominal or actual bitrate tag */ + if (gst_tag_list_get_uint (list, GST_TAG_NOMINAL_BITRATE, &flvpad->bitrate) || + gst_tag_list_get_uint (list, GST_TAG_BITRATE, &flvpad->bitrate)) { + GST_DEBUG_OBJECT (mux, "Stored bitrate for pad %" GST_PTR_FORMAT " = %u", + flvpad, flvpad->bitrate); + } +} + static gboolean gst_flv_mux_handle_sink_event (GstCollectPads * pads, GstCollectData * data, GstEvent * event, gpointer user_data) { GstFlvMux *mux = GST_FLV_MUX (user_data); + GstFlvPad *flvpad = (GstFlvPad *) data; gboolean ret = TRUE; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CAPS: { GstCaps *caps; - GstFlvPad *flvpad; gst_event_parse_caps (event, &caps); /* find stream data */ - flvpad = (GstFlvPad *) data; g_assert (flvpad); if (flvpad->video) { @@ -316,6 +330,7 @@ gst_flv_mux_handle_sink_event (GstCollectPads * pads, GstCollectData * data, gst_event_parse_tag (event, &list); gst_tag_setter_merge_tags (setter, list, mode); + gst_flv_mux_store_codec_tags (mux, flvpad, list); mux->new_tags = TRUE; ret = TRUE; gst_event_unref (event); @@ -888,6 +903,13 @@ tags: script_tag = gst_buffer_append (script_tag, tmp); tags_written++; } + + GST_DEBUG_OBJECT (mux, "putting videodatarate %u KB/s in the metadata", + cpad->bitrate / 1024); + tmp = gst_flv_mux_create_number_script_value ("videodatarate", + cpad->bitrate / 1024); + script_tag = gst_buffer_append (script_tag, tmp); + tags_written++; } } @@ -912,6 +934,13 @@ tags: cpad->audio_codec); script_tag = gst_buffer_append (script_tag, tmp); tags_written++; + + GST_DEBUG_OBJECT (mux, "putting audiodatarate %u KB/s in the metadata", + cpad->bitrate / 1024); + tmp = gst_flv_mux_create_number_script_value ("audiodatarate", + cpad->bitrate / 1024); + script_tag = gst_buffer_append (script_tag, tmp); + tags_written++; } } diff --git a/gst/flv/gstflvmux.h b/gst/flv/gstflvmux.h index a87afcb615..3b0c8af2e5 100644 --- a/gst/flv/gstflvmux.h +++ b/gst/flv/gstflvmux.h @@ -52,6 +52,8 @@ typedef struct guint video_codec; GstBuffer *video_codec_data; + guint bitrate; + GstClockTime last_timestamp; gint64 pts; gint64 dts;