AtomInfo *
build_esds_extension (AtomTRAK * trak, guint8 object_type, guint8 stream_type,
- const GstBuffer * codec_data)
+ const GstBuffer * codec_data, guint32 avg_bitrate, guint32 max_bitrate)
{
guint32 track_id;
AtomESDS *esds;
esds->es.dec_conf_desc.object_type = object_type;
esds->es.dec_conf_desc.stream_type = stream_type << 2 | 0x01;
+ if (avg_bitrate > 0)
+ esds->es.dec_conf_desc.avg_bitrate = avg_bitrate;
+ if (max_bitrate > 0)
+ esds->es.dec_conf_desc.max_bitrate = max_bitrate;
+
/* optional DecoderSpecificInfo */
if (codec_data) {
DecoderSpecificInfoDescriptor *desc;
}
AtomInfo *
-build_mov_aac_extension (AtomTRAK * trak, const GstBuffer * codec_data)
+build_mov_aac_extension (AtomTRAK * trak, const GstBuffer * codec_data,
+ guint32 avg_bitrate, guint32 max_bitrate)
{
AtomInfo *esds, *mp4a;
GstBuffer *buf;
/* Add ESDS atom to WAVE */
esds = build_esds_extension (trak, ESDS_OBJECT_TYPE_MPEG4_P3,
- ESDS_STREAM_TYPE_AUDIO, codec_data);
+ ESDS_STREAM_TYPE_AUDIO, codec_data, avg_bitrate, max_bitrate);
/* Add MP4A atom to the WAVE:
* not really in spec, but makes offset based players happy */
GList * ext_atoms_list);
AtomInfo * build_codec_data_extension (guint32 fourcc, const GstBuffer * codec_data);
-AtomInfo * build_mov_aac_extension (AtomTRAK * trak, const GstBuffer * codec_data);
+AtomInfo * build_mov_aac_extension (AtomTRAK * trak, const GstBuffer * codec_data,
+ guint32 avg_bitrate, guint32 max_bitrate);
AtomInfo * build_mov_alac_extension (AtomTRAK * trak, const GstBuffer * codec_data);
AtomInfo * build_esds_extension (AtomTRAK * trak, guint8 object_type,
- guint8 stream_type, const GstBuffer * codec_data);
+ guint8 stream_type, const GstBuffer * codec_data,
+ guint32 avg_bitrate, guint32 max_bitrate);
AtomInfo * build_jp2h_extension (AtomTRAK * trak, gint width, gint height,
guint32 fourcc, gint ncomp,
const GValue * cmap_array,
qtpad->last_dts = 0;
qtpad->first_ts = GST_CLOCK_TIME_NONE;
qtpad->prepare_buf_func = NULL;
+ qtpad->avg_bitrate = 0;
+ qtpad->max_bitrate = 0;
if (qtpad->last_buf)
gst_buffer_replace (&qtpad->last_buf, NULL);
entry.fourcc = FOURCC_mp4a;
ext_atom =
build_esds_extension (qtpad->trak, ESDS_OBJECT_TYPE_MPEG1_P3,
- ESDS_STREAM_TYPE_AUDIO, codec_data);
+ ESDS_STREAM_TYPE_AUDIO, codec_data, qtpad->avg_bitrate,
+ qtpad->max_bitrate);
}
entry.samples_per_packet = 1152;
entry.bytes_per_sample = 2;
entry.fourcc = FOURCC_mp4a;
if (format == GST_QT_MUX_FORMAT_QT)
- ext_atom = build_mov_aac_extension (qtpad->trak, codec_data);
+ ext_atom = build_mov_aac_extension (qtpad->trak, codec_data,
+ qtpad->avg_bitrate, qtpad->max_bitrate);
else
ext_atom =
build_esds_extension (qtpad->trak, ESDS_OBJECT_TYPE_MPEG4_P3,
- ESDS_STREAM_TYPE_AUDIO, codec_data);
+ ESDS_STREAM_TYPE_AUDIO, codec_data, qtpad->avg_bitrate,
+ qtpad->max_bitrate);
break;
default:
break;
entry.fourcc = FOURCC_mp4v;
ext_atom =
build_esds_extension (qtpad->trak, ESDS_OBJECT_TYPE_MPEG4_P2,
- ESDS_STREAM_TYPE_VISUAL, codec_data);
+ ESDS_STREAM_TYPE_VISUAL, codec_data, qtpad->avg_bitrate,
+ qtpad->max_bitrate);
if (ext_atom != NULL)
ext_atom_list = g_list_prepend (ext_atom_list, ext_atom);
if (!codec_data)
{
gboolean ret;
GstQTMux *qtmux;
+ guint32 avg_bitrate = 0, max_bitrate = 0;
qtmux = GST_QT_MUX_CAST (gst_pad_get_parent (pad));
switch (GST_EVENT_TYPE (event)) {
gst_tag_setter_merge_tags (setter, list, mode);
GST_OBJECT_UNLOCK (qtmux);
+
+ if (gst_tag_list_get_uint (list, GST_TAG_BITRATE, &avg_bitrate) |
+ gst_tag_list_get_uint (list, GST_TAG_MAXIMUM_BITRATE, &max_bitrate)) {
+ GstQTPad *qtpad = gst_pad_get_element_private (pad);
+ g_assert (qtpad);
+
+ if (avg_bitrate > 0 && avg_bitrate < G_MAXUINT32)
+ qtpad->avg_bitrate = avg_bitrate;
+ if (max_bitrate > 0 && max_bitrate < G_MAXUINT32)
+ qtpad->max_bitrate = max_bitrate;
+ }
+
break;
}
default: