summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@circular-chaos.org>2008-08-02 18:11:32 +0000
committerSebastian Dröge <slomo@circular-chaos.org>2008-08-02 18:11:32 +0000
commitaedf04f957912a0747a2801d9ea597f6efe02e0d (patch)
tree18f3cf074b2df83130edb587299719042449da5b
parentd43e67fa70d9eed64fd82a83589633e9afee4e90 (diff)
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.
-rw-r--r--ChangeLog7
-rw-r--r--gst/matroska/matroska-mux.c31
2 files changed, 28 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index e83b952d..3c955cb3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
2008-08-02 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ * 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.
+
+2008-08-02 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
* gst/matroska/matroska-demux.c: (gst_matroska_demux_finalize),
(gst_matroska_demux_class_init), (gst_matroska_demux_init),
(gst_matroska_demux_combine_flows), (gst_matroska_demux_reset),
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;