[FFmpeg-devel] [PATCH 3/4] avformat/mpegenc - accept PCM_DVD streams

Michael Niedermayer michael at niedermayer.cc
Thu Feb 15 05:27:13 EET 2018


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 at 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

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Avoid a single point of failure, be that a person or equipment.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20180215/8a188d74/attachment.sig>


More information about the ffmpeg-devel mailing list