mirror of https://git.ffmpeg.org/ffmpeg.git
avformat/mov: read PCM audio configuration box ('pcmC') if available
For ipcm and fpcm streams, big-endian format is the default, but it can be changed with additional 'pcmC' sub-atom of audio sample description. Details can be found in ISO/IEC 23003-5:2020 Fixes ticket #9763. Fixes ticket #9790. Patch simplified by Marton Balint. Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
parent
cd83383f4d
commit
cbe216d3a6
|
@ -1553,6 +1553,9 @@ static void set_last_stream_little_endian(AVFormatContext *fc)
|
||||||
st = fc->streams[fc->nb_streams-1];
|
st = fc->streams[fc->nb_streams-1];
|
||||||
|
|
||||||
switch (st->codecpar->codec_id) {
|
switch (st->codecpar->codec_id) {
|
||||||
|
case AV_CODEC_ID_PCM_S16BE:
|
||||||
|
st->codecpar->codec_id = AV_CODEC_ID_PCM_S16LE;
|
||||||
|
break;
|
||||||
case AV_CODEC_ID_PCM_S24BE:
|
case AV_CODEC_ID_PCM_S24BE:
|
||||||
st->codecpar->codec_id = AV_CODEC_ID_PCM_S24LE;
|
st->codecpar->codec_id = AV_CODEC_ID_PCM_S24LE;
|
||||||
break;
|
break;
|
||||||
|
@ -1579,6 +1582,24 @@ static int mov_read_enda(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mov_read_pcmc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||||
|
{
|
||||||
|
int format_flags;
|
||||||
|
|
||||||
|
if (atom.size < 6) {
|
||||||
|
av_log(c->fc, AV_LOG_ERROR, "Empty pcmC box\n");
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
avio_r8(pb); // version
|
||||||
|
avio_rb24(pb); // flags
|
||||||
|
format_flags = avio_r8(pb);
|
||||||
|
if (format_flags == 1) // indicates little-endian format. If not present, big-endian format is used
|
||||||
|
set_last_stream_little_endian(c->fc);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int mov_read_colr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
static int mov_read_colr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||||
{
|
{
|
||||||
AVStream *st;
|
AVStream *st;
|
||||||
|
@ -7674,6 +7695,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = {
|
||||||
{ MKTAG('S','A','3','D'), mov_read_SA3D }, /* ambisonic audio box */
|
{ MKTAG('S','A','3','D'), mov_read_SA3D }, /* ambisonic audio box */
|
||||||
{ MKTAG('S','A','N','D'), mov_read_SAND }, /* non diegetic audio box */
|
{ MKTAG('S','A','N','D'), mov_read_SAND }, /* non diegetic audio box */
|
||||||
{ MKTAG('i','l','o','c'), mov_read_iloc },
|
{ MKTAG('i','l','o','c'), mov_read_iloc },
|
||||||
|
{ MKTAG('p','c','m','C'), mov_read_pcmc }, /* PCM configuration box */
|
||||||
{ 0, NULL }
|
{ 0, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue