summaryrefslogtreecommitdiff
path: root/libavformat/mpegenc.c
diff options
context:
space:
mode:
authorGyan Doshi <gyandoshi@gmail.com>2018-02-07 18:05:08 +0530
committerMichael Niedermayer <michael@niedermayer.cc>2018-02-16 21:53:22 +0100
commitf0809bc0fa634afe8b7c3f2682b8e51e87d0861e (patch)
treee36a7c55f7da6742a38aa7fe62d791e8890d0a7c /libavformat/mpegenc.c
parent8a8d0b319a9f941e1fcfda65f3a77c607cb05af2 (diff)
avformat/mpegenc - accept PCM_DVD streams
PCM_S16BE stream packets in MPEG-PS have a 3-byte header and are recognized as PCM_DVD by the demuxer which prevents their correct remuxing in MPEG-1/2 PS. Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavformat/mpegenc.c')
-rw-r--r--libavformat/mpegenc.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c
index 695de3f081..c84dc52eb9 100644
--- a/libavformat/mpegenc.c
+++ b/libavformat/mpegenc.c
@@ -353,7 +353,8 @@ static av_cold int mpeg_mux_init(AVFormatContext *ctx)
if (!s->is_mpeg2 &&
(st->codecpar->codec_id == AV_CODEC_ID_AC3 ||
st->codecpar->codec_id == AV_CODEC_ID_DTS ||
- st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE))
+ st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE ||
+ st->codecpar->codec_id == AV_CODEC_ID_PCM_DVD))
av_log(ctx, AV_LOG_WARNING,
"%s in MPEG-1 system streams is not widely supported, "
"consider using the vob or the dvd muxer "
@@ -363,7 +364,12 @@ 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) {
+ } 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;
+ }
stream->id = lpcm_id++;
for (j = 0; j < 4; j++) {
if (lpcm_freq_tab[j] == st->codecpar->sample_rate)
@@ -1150,6 +1156,19 @@ static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
return AVERROR(ENOMEM);
pkt_desc->pts = pts;
pkt_desc->dts = dts;
+
+ if (st->codecpar->codec_id == AV_CODEC_ID_PCM_DVD) {
+ if (size < 3) {
+ av_log(ctx, AV_LOG_ERROR, "Invalid packet size %d\n", size);
+ return AVERROR(EINVAL);
+ }
+
+ /* Skip first 3 bytes of packet data, which comprise PCM header
+ and will be written fresh by this muxer. */
+ buf += 3;
+ size -= 3;
+ }
+
pkt_desc->unwritten_size =
pkt_desc->size = size;
if (!stream->predecode_packet)