qtdemux: fix 16-bit PCM audio advertised with 'raw ' fourcc

'NONE' and 'raw ' fourcc don't always contain U8 audio, it can
be more bits as well, in which case it's just like 'twos'.

https://bugzilla.gnome.org/show_bug.cgi?id=752613
This commit is contained in:
Manasa Athreya 2015-07-27 13:34:14 +09:00 committed by Tim-Philipp Müller
parent a55b9060f8
commit e6381ef285

View file

@ -11730,31 +11730,32 @@ qtdemux_audio_caps (GstQTDemux * qtdemux, QtDemuxStream * stream,
const GstStructure *s;
const gchar *name;
gint endian = 0;
GstAudioFormat format = 0;
gint depth;
GST_DEBUG_OBJECT (qtdemux, "resolve fourcc 0x%08x", GUINT32_TO_BE (fourcc));
depth = stream->bytes_per_packet * 8;
switch (fourcc) {
case GST_MAKE_FOURCC ('N', 'O', 'N', 'E'):
case GST_MAKE_FOURCC ('r', 'a', 'w', ' '):
_codec ("Raw 8-bit PCM audio");
caps = gst_caps_new_simple ("audio/x-raw",
"format", G_TYPE_STRING, "U8",
"layout", G_TYPE_STRING, "interleaved", NULL);
break;
/* 8-bit audio is unsigned */
if (depth == 8)
format = GST_AUDIO_FORMAT_U8;
/* otherwise it's signed and big-endian just like 'twos' */
case GST_MAKE_FOURCC ('t', 'w', 'o', 's'):
endian = G_BIG_ENDIAN;
/* fall-through */
case GST_MAKE_FOURCC ('s', 'o', 'w', 't'):
{
gchar *str;
gint depth;
GstAudioFormat format;
if (!endian)
endian = G_LITTLE_ENDIAN;
depth = stream->bytes_per_packet * 8;
format = gst_audio_format_build_integer (TRUE, endian, depth, depth);
if (!format)
format = gst_audio_format_build_integer (TRUE, endian, depth, depth);
str = g_strdup_printf ("Raw %d-bit PCM audio", depth);
_codec (str);