Message ID | eb61cb4c-4908-94a8-d447-0b999122af2a@gmail.com |
---|---|
State | New |
Headers | show |
On Tue, Feb 13, 2018 at 12:33:56AM +0530, Gyan Doshi wrote: > > On 2/3/2018 4:02 AM, Michael Niedermayer wrote: > > >>--- a/libavformat/mpegenc.c > >>+++ b/libavformat/mpegenc.c > > >>+ > >>+ if (st->codecpar->codec_id == AV_CODEC_ID_PCM_DVD) { > >>+ /* Skip first 3 bytes of packet data, which comprise PCM header > >>+ and will be written fresh by this muxer. */ > >>+ buf += 3; > >>+ size -= 3; > > > >Can this be reached with size < 3 ? > >if so it would probably do something bad > > Possible if input file is badly muxed, but revised patch attached. > > FATE patch follows in next email. > > > Regards, > Gyan > mpegenc.c | 23 +++++++++++++++++++++-- > 1 file changed, 21 insertions(+), 2 deletions(-) > c00c6313b73eade4b2dc696df80824edd38f2c47 v3-0001-avformat-mpegenc-accept-PCM_DVD-streams.patch > From 75d6236f1964d014f615acf4dc48dec43cadf6a1 Mon Sep 17 00:00:00 2001 > From: Gyan Doshi <gyandoshi@gmail.com> > Date: Wed, 7 Feb 2018 18:05:08 +0530 > Subject: [PATCH v3] 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. > --- > libavformat/mpegenc.c | 23 +++++++++++++++++++++-- > 1 file changed, 21 insertions(+), 2 deletions(-) > > diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c > index 695de3f081..895873accd 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 -1; This should be a AVERROR code [...]
diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c index 695de3f081..895873accd 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 -1; + } + + /* 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)