From 9e5c575b49b9e895c8a9a5e869642a3ba0b56fd8 Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Tue, 6 Jul 2010 14:48:08 +0530 Subject: [PATCH] qtmux: Write 'btrt' atom for H.264 media if possible 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 | 24 ++++++++++++++++++++++++ gst/quicktime/atoms.h | 2 ++ gst/quicktime/gstqtmux.c | 3 +++ 3 files changed, 29 insertions(+) diff --git a/gst/quicktime/atoms.c b/gst/quicktime/atoms.c index 253aef493a..2c74d42a4f 100644 --- a/gst/quicktime/atoms.c +++ b/gst/quicktime/atoms.c @@ -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) diff --git a/gst/quicktime/atoms.h b/gst/quicktime/atoms.h index 5b59a7696f..bdf83bed01 100644 --- a/gst/quicktime/atoms.h +++ b/gst/quicktime/atoms.h @@ -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, diff --git a/gst/quicktime/gstqtmux.c b/gst/quicktime/gstqtmux.c index ffcd4202b1..3b7d9472f9 100644 --- a/gst/quicktime/gstqtmux.c +++ b/gst/quicktime/gstqtmux.c @@ -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);