diff options
author | Paul B Mahol <onemda@gmail.com> | 2018-11-27 12:09:03 +0100 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2018-12-01 19:42:17 +0100 |
commit | 2a08faba88027ec4679910bab9ff23925d8f6142 (patch) | |
tree | 232547e4950581a4286feb5669078024ec1244d9 | |
parent | e9967822e41213acb95e4a1b3a9bbfd240bc12c9 (diff) | |
download | ffmpeg-2a08faba88027ec4679910bab9ff23925d8f6142.tar.gz |
avformat/mpegenc: extend muxing PCM-DVD to other depths
Fixes #6783.
-rw-r--r-- | libavformat/mpegenc.c | 27 | ||||
-rw-r--r-- | libavformat/version.h | 2 |
2 files changed, 22 insertions, 7 deletions
diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c index 4c6fa67fb8..1389288b7f 100644 --- a/libavformat/mpegenc.c +++ b/libavformat/mpegenc.c @@ -364,12 +364,7 @@ static av_cold int mpeg_mux_init(AVFormatContext *ctx) stream->id = ac3_id++; } else if (st->codecpar->codec_id == AV_CODEC_ID_DTS) { stream->id = dts_id++; - } else if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE || - st->codecpar->codec_id == AV_CODEC_ID_PCM_DVD) { - if (st->codecpar->bits_per_coded_sample != 16) { - av_log(ctx, AV_LOG_ERROR, "Only 16 bit LPCM streams can be muxed.\n"); - goto fail; - } + } else if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE) { stream->id = lpcm_id++; for (j = 0; j < 4; j++) { if (lpcm_freq_tab[j] == st->codecpar->sample_rate) @@ -392,6 +387,26 @@ static av_cold int mpeg_mux_init(AVFormatContext *ctx) stream->lpcm_header[1] = (st->codecpar->channels - 1) | (j << 4); stream->lpcm_header[2] = 0x80; stream->lpcm_align = st->codecpar->channels * 2; + } else if (st->codecpar->codec_id == AV_CODEC_ID_PCM_DVD) { + int freq; + + switch (st->codecpar->sample_rate) { + case 48000: freq = 0; break; + case 96000: freq = 1; break; + case 44100: freq = 2; break; + case 32000: freq = 3; break; + default: + av_log(ctx, AV_LOG_ERROR, "Unsupported sample rate.\n"); + return AVERROR(EINVAL); + } + + stream->lpcm_header[0] = 0x0c; + stream->lpcm_header[1] = (freq << 4) | + (((st->codecpar->bits_per_coded_sample - 16) / 4) << 6) | + st->codecpar->channels - 1; + stream->lpcm_header[2] = 0x80; + stream->id = lpcm_id++; + stream->lpcm_align = st->codecpar->channels * st->codecpar->bits_per_coded_sample / 8; } else { stream->id = mpa_id++; } diff --git a/libavformat/version.h b/libavformat/version.h index 824b9e7cd6..30f2a84ddb 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -33,7 +33,7 @@ // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 58 #define LIBAVFORMAT_VERSION_MINOR 23 -#define LIBAVFORMAT_VERSION_MICRO 101 +#define LIBAVFORMAT_VERSION_MICRO 102 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \ |