summaryrefslogtreecommitdiffstats
path: root/gst/matroska/matroska-mux.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/matroska/matroska-mux.c')
-rw-r--r--gst/matroska/matroska-mux.c40
1 files changed, 32 insertions, 8 deletions
diff --git a/gst/matroska/matroska-mux.c b/gst/matroska/matroska-mux.c
index 39a95b2d..7d30294f 100644
--- a/gst/matroska/matroska-mux.c
+++ b/gst/matroska/matroska-mux.c
@@ -96,11 +96,10 @@ static GstStaticPadTemplate videosink_templ =
);
#define COMMON_AUDIO_CAPS \
- "channels = (int) [ 1, 8 ], " \
- "rate = (int) [ 8000, 96000 ]"
+ "channels = (int) [ 1, MAX ], " \
+ "rate = (int) [ 1, MAX ]"
/* FIXME:
- * * audio/x-raw-float: endianness needs defining.
* * require codec data, etc as needed
*/
static GstStaticPadTemplate audiosink_templ =
@@ -129,6 +128,22 @@ static GstStaticPadTemplate audiosink_templ =
"endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, "
"signed = (boolean) true, "
COMMON_AUDIO_CAPS ";"
+ "audio/x-raw-int, "
+ "width = (int) 24, "
+ "depth = (int) 24, "
+ "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, "
+ "signed = (boolean) true, "
+ COMMON_AUDIO_CAPS ";"
+ "audio/x-raw-int, "
+ "width = (int) 32, "
+ "depth = (int) 32, "
+ "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, "
+ "signed = (boolean) true, "
+ COMMON_AUDIO_CAPS ";"
+ "audio/x-raw-float, "
+ "width = (int) [ 32, 64 ], "
+ "endianness = (int) LITTLE_ENDIAN, "
+ COMMON_AUDIO_CAPS ";"
"audio/x-tta, "
"width = (int) { 8, 16, 24 }, "
"channels = (int) { 1, 2 }, " "rate = (int) [ 8000, 96000 ]")
@@ -1034,8 +1049,7 @@ gst_matroska_mux_audio_pad_setcaps (GstPad * pad, GstCaps * caps)
return TRUE;
} else if (!strcmp (mimetype, "audio/x-raw-int")) {
gint endianness, width, depth;
-
- gboolean signedness;
+ gboolean signedness = G_LITTLE_ENDIAN;
if (!gst_structure_get_int (structure, "width", &width) ||
!gst_structure_get_int (structure, "depth", &depth) ||
@@ -1055,8 +1069,8 @@ gst_matroska_mux_audio_pad_setcaps (GstPad * pad, GstCaps * caps)
return FALSE;
}
- /* where is this spec'ed out? (tpm) */
- if ((width == 8 && signedness) || (width == 16 && !signedness)) {
+ /* FIXME: where is this spec'ed out? (tpm) */
+ if ((width == 8 && signedness) || (width >= 16 && !signedness)) {
GST_DEBUG_OBJECT (mux, "8-bit PCM must be unsigned, 16-bit PCM signed");
return FALSE;
}
@@ -1069,7 +1083,17 @@ gst_matroska_mux_audio_pad_setcaps (GstPad * pad, GstCaps * caps)
return TRUE;
} else if (!strcmp (mimetype, "audio/x-raw-float")) {
- /* FIXME: endianness is undefined */
+ gint width;
+
+ if (!gst_structure_get_int (structure, "width", &width)) {
+ GST_DEBUG_OBJECT (mux, "broken caps, width field missing");
+ return FALSE;
+ }
+
+ audiocontext->bitdepth = width;
+ context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT);
+
+ return TRUE;
} else if (!strcmp (mimetype, "audio/x-vorbis")) {
const GValue *streamheader;