flvmux: Store incoming bitrate tags and send in the metadata
authorJan Schmidt <jan@centricular.com>
Wed, 29 Jul 2015 14:59:15 +0000 (00:59 +1000)
committerJan Schmidt <jan@centricular.com>
Sat, 5 Sep 2015 13:45:37 +0000 (23:45 +1000)
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
gst/flv/gstflvmux.h

index 6694caf5eb4fbed816de99cbe7123987e96ab59d..b42f91e398ee17f12a6ebd3d12096f25541b6927 100644 (file)
@@ -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++;
     }
   }
 
index a87afcb615dc0950ef13cd44142ca2bf85fbeb14..3b0c8af2e567ce3080c1dc7311219e363a2df695 100644 (file)
@@ -52,6 +52,8 @@ typedef struct
   guint video_codec;
   GstBuffer *video_codec_data;
 
+  guint bitrate;
+
   GstClockTime last_timestamp;
   gint64 pts;
   gint64 dts;