From aedf04f957912a0747a2801d9ea597f6efe02e0d Mon Sep 17 00:00:00 2001 From: Sebastian Dröge Date: Sat, 2 Aug 2008 18:11:32 +0000 Subject: gst/matroska/matroska-mux.c: Fix muxing of MP3/MP2 with different MPEG versions by calculating the duration of a fram... Original commit message from CVS: * gst/matroska/matroska-mux.c: (gst_matroska_mux_audio_pad_setcaps): Fix muxing of MP3/MP2 with different MPEG versions by calculating the duration of a frame with the new mpegaudioversion caps field. --- gst/matroska/matroska-mux.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'gst') diff --git a/gst/matroska/matroska-mux.c b/gst/matroska/matroska-mux.c index c4899d39..c2a73453 100644 --- a/gst/matroska/matroska-mux.c +++ b/gst/matroska/matroska-mux.c @@ -978,27 +978,38 @@ gst_matroska_mux_audio_pad_setcaps (GstPad * pad, GstCaps * caps) switch (mpegversion) { case 1:{ gint layer; - - /* FIXME: number of samples per frame also depends on the mpegversion - * which we don't pass as a caps field - */ + gint version = 1; + gint spf; gst_structure_get_int (structure, "layer", &layer); + + if (!gst_structure_get_int (structure, "mpegaudioversion", &version)) { + GST_WARNING_OBJECT (mux, + "Unable to determine MPEG audio version, assuming 1"); + version = 1; + } + + if (layer == 1) + spf = 384; + else if (layer == 2) + spf = 1152; + else if (version == 2) + spf = 576; + else + spf = 1152; + + context->default_duration = + gst_util_uint64_scale (GST_SECOND, spf, audiocontext->samplerate); + switch (layer) { case 1: context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1); - context->default_duration = - 384 * GST_SECOND / audiocontext->samplerate; break; case 2: context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2); - context->default_duration = - 1152 * GST_SECOND / audiocontext->samplerate; break; case 3: context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3); - context->default_duration = - 1152 * GST_SECOND / audiocontext->samplerate; break; default: return FALSE; -- cgit