qtmux: Write 'btrt' atom for H.264 media if possible
authorArun Raghavan <arun.raghavan@collabora.co.uk>
Tue, 6 Jul 2010 09:18:08 +0000 (14:48 +0530)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Tue, 12 Apr 2011 19:32:18 +0000 (20:32 +0100)
This writes out the optional 'btrt' atom (MPEG4BitrateBox) for H.264
media if either or both of average and maximum bitrate are available for
the stream.

https://bugzilla.gnome.org/show_bug.cgi?id=623678

gst/quicktime/atoms.c
gst/quicktime/atoms.h
gst/quicktime/gstqtmux.c

index 253aef4..2c74d42 100644 (file)
@@ -3124,6 +3124,30 @@ build_esds_extension (AtomTRAK * trak, guint8 object_type, guint8 stream_type,
       atom_esds_free);
 }
 
+AtomInfo *
+build_btrt_extension (guint32 buffer_size_db, guint32 avg_bitrate,
+    guint32 max_bitrate)
+{
+  AtomData *atom_data;
+  GstBuffer *buf;
+
+  if (buffer_size_db == 0 && avg_bitrate == 0 && max_bitrate == 0)
+    return 0;
+
+  buf = gst_buffer_new_and_alloc (12);
+
+  GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf), buffer_size_db);
+  GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf) + 4, avg_bitrate);
+  GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf) + 8, max_bitrate);
+
+  atom_data =
+      atom_data_new_from_gst_buffer (GST_MAKE_FOURCC ('b', 't', 'r', 't'), buf);
+  gst_buffer_unref (buf);
+
+  return build_atom_info_wrapper ((Atom *) atom_data, atom_data_copy_data,
+      atom_data_free);
+}
+
 static AtomInfo *
 build_mov_wave_extension (AtomTRAK * trak, guint32 fourcc, AtomInfo * atom1,
     AtomInfo * atom2, gboolean terminator)
index 5b59a76..bdf83be 100644 (file)
@@ -726,6 +726,8 @@ AtomInfo *   build_mov_alac_extension    (AtomTRAK * trak, const GstBuffer * cod
 AtomInfo *   build_esds_extension        (AtomTRAK * trak, guint8 object_type,
                                           guint8 stream_type, const GstBuffer * codec_data,
                                           guint32 avg_bitrate, guint32 max_bitrate);
+AtomInfo *   build_btrt_extension        (guint32 buffer_size_db, guint32 avg_bitrate,
+                                          guint32 max_bitrate);
 AtomInfo *   build_jp2h_extension        (AtomTRAK * trak, gint width, gint height,
                                           guint32 fourcc, gint ncomp,
                                           const GValue * cmap_array,
index ffcd420..3b7d947 100644 (file)
@@ -2318,6 +2318,9 @@ gst_qt_mux_video_sink_set_caps (GstPad * pad, GstCaps * caps)
   } else if (strcmp (mimetype, "video/x-h264") == 0) {
     entry.fourcc = FOURCC_avc1;
     qtpad->is_out_of_order = TRUE;
+    ext_atom = build_btrt_extension (0, qtpad->avg_bitrate, qtpad->max_bitrate);
+    if (ext_atom != NULL)
+      ext_atom_list = g_list_prepend (ext_atom_list, ext_atom);
     if (!codec_data)
       GST_WARNING_OBJECT (qtmux, "no codec_data in h264 caps");
     ext_atom = build_codec_data_extension (FOURCC_avcC, codec_data);