summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArun Raghavan <arun.raghavan@collabora.co.uk>2010-07-06 14:48:08 +0530
committerThiago Santos <thiago.sousa.santos@collabora.co.uk>2010-07-07 23:21:51 -0300
commitc28613d8dbde2b2f09cef07ec03a736a6aa3dba5 (patch)
tree20aa866f16b0dcbc86a371a6054e81f865cb5a55
parent827e401e3a16f77477bf0a9f1fd91df91ef2b772 (diff)
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
-rw-r--r--gst/qtmux/atoms.c24
-rw-r--r--gst/qtmux/atoms.h2
-rw-r--r--gst/qtmux/gstqtmux.c3
3 files changed, 29 insertions, 0 deletions
diff --git a/gst/qtmux/atoms.c b/gst/qtmux/atoms.c
index 253aef493..2c74d42a4 100644
--- a/gst/qtmux/atoms.c
+++ b/gst/qtmux/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/qtmux/atoms.h b/gst/qtmux/atoms.h
index 5b59a7696..bdf83bed0 100644
--- a/gst/qtmux/atoms.h
+++ b/gst/qtmux/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/qtmux/gstqtmux.c b/gst/qtmux/gstqtmux.c
index ffcd4202b..3b7d9472f 100644
--- a/gst/qtmux/gstqtmux.c
+++ b/gst/qtmux/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);