mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-09-08 21:28:45 +00:00
qtdemux: Fix offsets for reading lpcm specific fields
We were reading at the completely wrong positions, 16 bytes later in the data. Also add support for high-aligned samples.
This commit is contained in:
parent
df67c50f67
commit
7d89e73336
2 changed files with 19 additions and 8 deletions
|
@ -255,6 +255,7 @@ G_BEGIN_DECLS
|
||||||
#define FOURCC_wave GST_MAKE_FOURCC('w','a','v','e')
|
#define FOURCC_wave GST_MAKE_FOURCC('w','a','v','e')
|
||||||
#define FOURCC_wide GST_MAKE_FOURCC('w','i','d','e')
|
#define FOURCC_wide GST_MAKE_FOURCC('w','i','d','e')
|
||||||
#define FOURCC_zlib GST_MAKE_FOURCC('z','l','i','b')
|
#define FOURCC_zlib GST_MAKE_FOURCC('z','l','i','b')
|
||||||
|
#define FOURCC_lpcm GST_MAKE_FOURCC('l','p','c','m')
|
||||||
|
|
||||||
#define FOURCC_cfhd GST_MAKE_FOURCC('C','F','H','D')
|
#define FOURCC_cfhd GST_MAKE_FOURCC('C','F','H','D')
|
||||||
#define FOURCC_ap4x GST_MAKE_FOURCC('a','p','4','x')
|
#define FOURCC_ap4x GST_MAKE_FOURCC('a','p','4','x')
|
||||||
|
|
|
@ -10853,6 +10853,7 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
|
||||||
case FOURCC_twos:
|
case FOURCC_twos:
|
||||||
case FOURCC_sowt:
|
case FOURCC_sowt:
|
||||||
case FOURCC_raw_:
|
case FOURCC_raw_:
|
||||||
|
case FOURCC_lpcm:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
|
@ -11475,6 +11476,9 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case FOURCC_lpcm:
|
||||||
|
/* Fully handled elsewhere */
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
GST_INFO_OBJECT (qtdemux,
|
GST_INFO_OBJECT (qtdemux,
|
||||||
"unhandled type %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc));
|
"unhandled type %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc));
|
||||||
|
@ -14252,7 +14256,7 @@ qtdemux_audio_caps (GstQTDemux * qtdemux, QtDemuxStream * stream,
|
||||||
_codec ("Opus");
|
_codec ("Opus");
|
||||||
caps = gst_caps_new_empty_simple ("audio/x-opus");
|
caps = gst_caps_new_empty_simple ("audio/x-opus");
|
||||||
break;
|
break;
|
||||||
case GST_MAKE_FOURCC ('l', 'p', 'c', 'm'):
|
case FOURCC_lpcm:
|
||||||
{
|
{
|
||||||
guint32 flags = 0;
|
guint32 flags = 0;
|
||||||
guint32 depth = 0;
|
guint32 depth = 0;
|
||||||
|
@ -14269,23 +14273,29 @@ qtdemux_audio_caps (GstQTDemux * qtdemux, QtDemuxStream * stream,
|
||||||
};
|
};
|
||||||
_codec ("Raw LPCM audio");
|
_codec ("Raw LPCM audio");
|
||||||
|
|
||||||
if (data && len >= 56) {
|
if (data && len >= 36) {
|
||||||
depth = QT_UINT32 (data + 40);
|
depth = QT_UINT32 (data + 24);
|
||||||
flags = QT_UINT32 (data + 44);
|
flags = QT_UINT32 (data + 28);
|
||||||
width = QT_UINT32 (data + 48) * 8 / entry->n_channels;
|
width = QT_UINT32 (data + 32) * 8 / entry->n_channels;
|
||||||
}
|
}
|
||||||
if ((flags & FLAG_IS_FLOAT) == 0) {
|
if ((flags & FLAG_IS_FLOAT) == 0) {
|
||||||
if (depth == 0)
|
if (depth == 0)
|
||||||
depth = 16;
|
depth = 16;
|
||||||
if (width == 0)
|
if (width == 0)
|
||||||
width = 16;
|
width = 16;
|
||||||
|
if ((flags & FLAG_IS_ALIGNED_HIGH))
|
||||||
|
depth = width;
|
||||||
|
|
||||||
format = gst_audio_format_build_integer ((flags & FLAG_IS_SIGNED) ?
|
format = gst_audio_format_build_integer ((flags & FLAG_IS_SIGNED) ?
|
||||||
TRUE : FALSE, (flags & FLAG_IS_BIG_ENDIAN) ?
|
TRUE : FALSE, (flags & FLAG_IS_BIG_ENDIAN) ?
|
||||||
G_BIG_ENDIAN : G_LITTLE_ENDIAN, width, depth);
|
G_BIG_ENDIAN : G_LITTLE_ENDIAN, width, depth);
|
||||||
caps = gst_caps_new_simple ("audio/x-raw",
|
caps = gst_caps_new_simple ("audio/x-raw",
|
||||||
"format", G_TYPE_STRING, gst_audio_format_to_string (format),
|
"format", G_TYPE_STRING,
|
||||||
"layout", G_TYPE_STRING, (flags & FLAG_IS_NON_INTERLEAVED) ?
|
format !=
|
||||||
"non-interleaved" : "interleaved", NULL);
|
GST_AUDIO_FORMAT_UNKNOWN ? gst_audio_format_to_string (format) :
|
||||||
|
"UNKNOWN", "layout", G_TYPE_STRING,
|
||||||
|
(flags & FLAG_IS_NON_INTERLEAVED) ? "non-interleaved" :
|
||||||
|
"interleaved", NULL);
|
||||||
stream->alignment = GST_ROUND_UP_8 (depth);
|
stream->alignment = GST_ROUND_UP_8 (depth);
|
||||||
stream->alignment = round_up_pow2 (stream->alignment);
|
stream->alignment = round_up_pow2 (stream->alignment);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue