[FFmpeg-devel] [PATCH] libavf: Auto-detect mjpeg 2000 in mpeg-ts

Michael Niedermayer michael at niedermayer.cc
Tue Oct 11 17:27:12 EEST 2016


On Tue, Oct 11, 2016 at 03:52:33PM +0200, Ståle kristoffersen wrote:
> Hi,
> I have some transport streams with only one pid, containing MJPEG 2000
> video. Since the PMT/PAT is missing ffmpeg is unable to decode it.
> 
> The attached patch makes ffmpeg able to guess that it does contain a
> stream of jpeg 2000, but I am not sure if this is the correct approach.
> 

> Also, should LIBAVFORMAT_VERSION_MICRO and the Changelog be updated?

if a new demuxer needs to be added then, yes


> 
> -- 
> Ståle Kristoffersen

>  Makefile     |    1 
>  allformats.c |    1 
>  mj2kdec.c    |   62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  utils.c      |    1 
>  4 files changed, 65 insertions(+)
> 26d9e6512a4c62e17df622cb4cb0dac7eadfa790  0001-libavf-Auto-detect-mjpeg-2000-in-mpeg-ts.patch
> From 0d5594d4dfd1a9608ef55e90fb6a770b0f54cdaa Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?St=C3=A5le=20Kristoffersen?= <staalebk at ifi.uio.no>
> Date: Tue, 11 Oct 2016 15:36:40 +0200
> Subject: [PATCH] libavf: Auto-detect mjpeg 2000 in mpeg-ts
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
> 
> This makes it possible to decode motion jpeg 2000
> encoded in a transport stream without a correct PMT/PAT.
> 
> Signed-off-by: Ståle Kristoffersen <staalebk at ifi.uio.no>
> ---
>  libavformat/Makefile     |  1 +
>  libavformat/allformats.c |  1 +
>  libavformat/mj2kdec.c    | 62 ++++++++++++++++++++++++++++++++++++++++++++++++
>  libavformat/utils.c      |  1 +
>  4 files changed, 65 insertions(+)
>  create mode 100644 libavformat/mj2kdec.c
> 
> diff --git a/libavformat/Makefile b/libavformat/Makefile
> index 5d827d31..4020b8d 100644
> --- a/libavformat/Makefile
> +++ b/libavformat/Makefile
> @@ -273,6 +273,7 @@ OBJS-$(CONFIG_MD5_MUXER)                 += hashenc.o
>  OBJS-$(CONFIG_MGSTS_DEMUXER)             += mgsts.o
>  OBJS-$(CONFIG_MICRODVD_DEMUXER)          += microdvddec.o subtitles.o
>  OBJS-$(CONFIG_MICRODVD_MUXER)            += microdvdenc.o
> +OBJS-$(CONFIG_MJPEG_2000_DEMUXER)        += rawdec.o mj2kdec.o
>  OBJS-$(CONFIG_MJPEG_DEMUXER)             += rawdec.o
>  OBJS-$(CONFIG_MJPEG_MUXER)               += rawenc.o
>  OBJS-$(CONFIG_MLP_DEMUXER)               += rawdec.o mlpdec.o
> diff --git a/libavformat/allformats.c b/libavformat/allformats.c
> index 6a216ef..7db6c52 100644
> --- a/libavformat/allformats.c
> +++ b/libavformat/allformats.c
> @@ -183,6 +183,7 @@ void av_register_all(void)
>      REGISTER_DEMUXER (MGSTS,            mgsts);
>      REGISTER_MUXDEMUX(MICRODVD,         microdvd);
>      REGISTER_MUXDEMUX(MJPEG,            mjpeg);
> +    REGISTER_DEMUXER (MJPEG_2000,       mjpeg_2000);
>      REGISTER_MUXDEMUX(MLP,              mlp);
>      REGISTER_DEMUXER (MLV,              mlv);
>      REGISTER_DEMUXER (MM,               mm);
> diff --git a/libavformat/mj2kdec.c b/libavformat/mj2kdec.c
> new file mode 100644
> index 0000000..cf9e575
> --- /dev/null
> +++ b/libavformat/mj2kdec.c
> @@ -0,0 +1,62 @@
> +/*
> + * VC-1 demuxer
> + * Copyright (c) 2016 Ståle Kristoffersen
> + *
> + * This file is part of FFmpeg.
> + *
> + * FFmpeg is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * FFmpeg is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with FFmpeg; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> + */
> +
> +#include "libavutil/intreadwrite.h"
> +#include "avformat.h"
> +#include "rawdec.h"
> +#include "libavcodec/jpeg2000.h"
> +
> +
> +#if CONFIG_MJPEG_2000_DEMUXER
> +static int mjpeg2000_probe(AVProbeData *p)
> +{
> +    int i;
> +    int invalid = 0;
> +    int frames = 0;
> +    uint16_t soc, marker, marker_size;
> +    uint8_t marker_marker;
> +
> +    for (i=0; i<p->buf_size-5; i++) {
> +        soc = AV_RB16(p->buf + i);
> +        if (soc == JPEG2000_SOC ) {
> +            marker = AV_RB16(p->buf + i + 2);
> +            marker_size = AV_RB16(p->buf + i + 4);
> +            if (marker == JPEG2000_SIZ) {
> +                i += marker_size + 2;
> +                marker_marker = AV_RB8(p->buf + i + 2);

missing overflow and out of array checks

also the img2 demuxer for mjpeg2000 from img2dec.c does not work
for this ?

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

During times of universal deceit, telling the truth becomes a
revolutionary act. -- George Orwell
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20161011/cd33ad7b/attachment.sig>


More information about the ffmpeg-devel mailing list