From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <ffmpeg-devel-bounces@ffmpeg.org>
Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100])
	by master.gitmailbox.com (Postfix) with ESMTP id 797DC400AB
	for <ffmpegdev@gitmailbox.com>; Sun, 15 Oct 2023 21:43:59 +0000 (UTC)
Received: from [127.0.1.1] (localhost [127.0.0.1])
	by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8B1B568C94E;
	Mon, 16 Oct 2023 00:43:57 +0300 (EEST)
Received: from mx.sdf.org (mx.sdf.org [205.166.94.24])
 by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CFA4768BEBF
 for <ffmpeg-devel@ffmpeg.org>; Mon, 16 Oct 2023 00:43:50 +0300 (EEST)
Received: from 5ebbcf559c764dc32ca691ab9068eacc ([1.145.159.57])
 (authenticated (0 bits))
 by mx.sdf.org (8.16.1/8.14.5) with ESMTPSA id 39FLhYZQ008256
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits) verified NO)
 for <ffmpeg-devel@ffmpeg.org>; Sun, 15 Oct 2023 21:43:47 GMT
Date: Mon, 16 Oct 2023 08:43:30 +1100
From: Peter Ross <pross@xvid.org>
To: ffmpeg-devel@ffmpeg.org
Message-ID: <9f40d2825652fe73734869b29255a0d75883f68d.1697406181.git.pross@xvid.org>
MIME-Version: 1.0
Subject: [FFmpeg-devel] [PATCHv2 1/2] avcodec: LEAD MCMP decoder
X-BeenThere: ffmpeg-devel@ffmpeg.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org>
List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>,
 <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe>
List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel>
List-Post: <mailto:ffmpeg-devel@ffmpeg.org>
List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help>
List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>,
 <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe>
Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Content-Type: multipart/mixed; boundary="===============1473940187269900008=="
Errors-To: ffmpeg-devel-bounces@ffmpeg.org
Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org>
Archived-At: <https://master.gitmailbox.com/ffmpegdev/9f40d2825652fe73734869b29255a0d75883f68d.1697406181.git.pross@xvid.org/>
List-Archive: <https://master.gitmailbox.com/ffmpegdev/>
List-Post: <mailto:ffmpegdev@gitmailbox.com>


--===============1473940187269900008==
Content-Type: multipart/signed; micalg=pgp-sha1;
	protocol="application/pgp-signature"; boundary="CTNWkyy0NCK0c6FL"
Content-Disposition: inline


--CTNWkyy0NCK0c6FL
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

Partially fixes ticket #798

Reviewed-by: James Almer <jamrial@gmail.com>
Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Peter Ross <pross@xvid.org>
---
 configure                 |   1 +
 doc/general_contents.texi |   1 +
 libavcodec/Makefile       |   1 +
 libavcodec/allcodecs.c    |   1 +
 libavcodec/codec_desc.c   |   7 +
 libavcodec/codec_id.h     |   1 +
 libavcodec/leaddata.h     |  62 +++++++++
 libavcodec/leaddec.c      | 270 ++++++++++++++++++++++++++++++++++++++
 libavformat/riff.c        |   1 +
 9 files changed, 345 insertions(+)
 create mode 100644 libavcodec/leaddata.h
 create mode 100644 libavcodec/leaddec.c

diff --git a/configure b/configure
index d203177a74..89ccace3d5 100755
--- a/configure
+++ b/configure
@@ -2888,6 +2888,7 @@ ipu_decoder_select=3D"mpegvideodec"
 jpegls_decoder_select=3D"mjpeg_decoder"
 jv_decoder_select=3D"blockdsp"
 lagarith_decoder_select=3D"llviddsp"
+lead_decoder_select=3D"idctdsp jpegtables"
 ljpeg_encoder_select=3D"jpegtables"
 lscr_decoder_select=3D"inflate_wrapper"
 magicyuv_decoder_select=3D"llviddsp"
diff --git a/doc/general_contents.texi b/doc/general_contents.texi
index c48c812a31..62ca4f7cb6 100644
--- a/doc/general_contents.texi
+++ b/doc/general_contents.texi
@@ -997,6 +997,7 @@ following image formats are supported:
 @item Lagarith               @tab     @tab  X
 @item LCL (LossLess Codec Library) MSZH  @tab     @tab  X
 @item LCL (LossLess Codec Library) ZLIB  @tab  E  @tab  E
+@item LEAD MCMP              @tab     @tab  X
 @item LOCO                   @tab     @tab  X
 @item LucasArts SANM/Smush   @tab     @tab  X
     @tab Used in LucasArts games / SMUSH animations.
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 580a8d6b54..f0872f9919 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -477,6 +477,7 @@ OBJS-$(CONFIG_JV_DECODER)              +=3D jvdec.o
 OBJS-$(CONFIG_KGV1_DECODER)            +=3D kgv1dec.o
 OBJS-$(CONFIG_KMVC_DECODER)            +=3D kmvc.o
 OBJS-$(CONFIG_LAGARITH_DECODER)        +=3D lagarith.o lagarithrac.o
+OBJS-$(CONFIG_LEAD_DECODER)            +=3D leaddec.o jpegquanttables.o
 OBJS-$(CONFIG_LJPEG_ENCODER)           +=3D ljpegenc.o mjpegenc_common.o
 OBJS-$(CONFIG_LOCO_DECODER)            +=3D loco.o
 OBJS-$(CONFIG_LSCR_DECODER)            +=3D lscrdec.o png.o pngdec.o pngds=
p.o
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 5136a566f1..2662adb754 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -188,6 +188,7 @@ extern const FFCodec ff_jv_decoder;
 extern const FFCodec ff_kgv1_decoder;
 extern const FFCodec ff_kmvc_decoder;
 extern const FFCodec ff_lagarith_decoder;
+extern const FFCodec ff_lead_decoder;
 extern const FFCodec ff_ljpeg_encoder;
 extern const FFCodec ff_loco_decoder;
 extern const FFCodec ff_lscr_decoder;
diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
index f556bb94d5..432a9c9ea6 100644
--- a/libavcodec/codec_desc.c
+++ b/libavcodec/codec_desc.c
@@ -1960,6 +1960,13 @@ static const AVCodecDescriptor codec_descriptors[] =
=3D {
         .long_name =3D NULL_IF_CONFIG_SMALL("vMix Video"),
         .props     =3D AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
+    {
+        .id        =3D AV_CODEC_ID_LEAD,
+        .type      =3D AVMEDIA_TYPE_VIDEO,
+        .name      =3D "lead",
+        .long_name =3D NULL_IF_CONFIG_SMALL("LEAD MCMP"),
+        .props     =3D AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+    },
=20
     /* various PCM "codecs" */
     {
diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h
index 29b410b8d3..84ce8e6aa9 100644
--- a/libavcodec/codec_id.h
+++ b/libavcodec/codec_id.h
@@ -324,6 +324,7 @@ enum AVCodecID {
     AV_CODEC_ID_EVC,
     AV_CODEC_ID_RTV1,
     AV_CODEC_ID_VMIX,
+    AV_CODEC_ID_LEAD,
=20
     /* various PCM "codecs" */
     AV_CODEC_ID_FIRST_AUDIO =3D 0x10000,     ///< A dummy id pointing at t=
he start of audio codecs
diff --git a/libavcodec/leaddata.h b/libavcodec/leaddata.h
new file mode 100644
index 0000000000..525b582cf7
--- /dev/null
+++ b/libavcodec/leaddata.h
@@ -0,0 +1,62 @@
+/*
+ * LEAD MCMP decoder tables
+ *
+ * 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-130=
1 USA
+ */
+
+#ifndef AVCODEC_LEADDATA_H
+#define AVCODEC_LEADDATA_H
+
+#include <stdint.h>
+
+static const uint8_t luma_dc_len[]=3D{
+    2, 3, 3, 3, 3, 3, 4, 5, 6, 7, 8, 9
+};
+
+static const uint8_t chroma_dc_len[]=3D{
+    2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
+};
+
+static const uint8_t luma_ac_len[]=3D{
+    2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 8,
+    8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11,
+    12, 12, 12, 12, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16
+};
+
+static const uint8_t chroma_ac_len[]=3D{
+    2, 2, 3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7,
+    8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10,
+    11, 11, 11, 11, 12, 12, 12, 12, 14, 15, 15, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16
+};
+
+#endif /* AVCODEC_LEADDATA_H */
diff --git a/libavcodec/leaddec.c b/libavcodec/leaddec.c
new file mode 100644
index 0000000000..ede52fba5a
--- /dev/null
+++ b/libavcodec/leaddec.c
@@ -0,0 +1,270 @@
+/*
+ * LEAD MCMP decoder
+ *
+ * Copyright (c) 2023 Peter Ross
+ *
+ * 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-130=
1 USA
+ */
+
+#include "avcodec.h"
+#include "blockdsp.h"
+#include "codec_internal.h"
+#include "copy_block.h"
+#include "decode.h"
+#include "get_bits.h"
+#include "idctdsp.h"
+#include "jpegquanttables.h"
+#include "jpegtables.h"
+#include "leaddata.h"
+#include "libavutil/mem_internal.h"
+#include "libavutil/thread.h"
+
+#define LUMA_DC_BITS 9
+#define CHROMA_DC_BITS 11
+#define LUMA_AC_BITS 10
+#define CHROMA_AC_BITS 10
+
+static VLC luma_dc_vlc;
+static VLC chroma_dc_vlc;
+static VLC luma_ac_vlc;
+static VLC chroma_ac_vlc;
+
+static av_cold void lead_init_static_data(void)
+{
+    VLC_INIT_STATIC_FROM_LENGTHS(&luma_dc_vlc, LUMA_DC_BITS, FF_ARRAY_ELEM=
S(luma_dc_len),
+                                 luma_dc_len, 1,
+                                 0, 0, 0,
+                                 0, 0, 1 << LUMA_DC_BITS);
+    VLC_INIT_STATIC_FROM_LENGTHS(&chroma_dc_vlc, CHROMA_DC_BITS, FF_ARRAY_=
ELEMS(chroma_dc_len),
+                                 chroma_dc_len, 1,
+                                 0, 0, 0,
+                                 0, 0, 1 << CHROMA_DC_BITS);
+    VLC_INIT_STATIC_FROM_LENGTHS(&luma_ac_vlc, LUMA_AC_BITS, FF_ARRAY_ELEM=
S(luma_ac_len),
+                                 luma_ac_len, 1,
+                                 ff_mjpeg_val_ac_luminance, 1, 1,
+                                 0, 0, 1160);
+    VLC_INIT_STATIC_FROM_LENGTHS(&chroma_ac_vlc, CHROMA_AC_BITS, FF_ARRAY_=
ELEMS(chroma_ac_len),
+                                 chroma_ac_len, 1,
+                                 ff_mjpeg_val_ac_chrominance, 1, 1,
+                                 0, 0, 1160);
+}
+
+typedef struct LeadContext {
+    uint8_t *bitstream_buf;
+    unsigned int bitstream_buf_size;
+    BlockDSPContext bdsp;
+    IDCTDSPContext idsp;
+    uint8_t permutated_scantable[64];
+} LeadContext;
+
+static av_cold int lead_decode_init(AVCodecContext * avctx)
+{
+    static AVOnce init_static_once =3D AV_ONCE_INIT;
+    LeadContext *s =3D avctx->priv_data;
+
+    if (avctx->extradata_size < 20)
+        return AVERROR_INVALIDDATA;
+
+    ff_blockdsp_init(&s->bdsp);
+    ff_idctdsp_init(&s->idsp, avctx);
+    ff_permute_scantable(s->permutated_scantable, ff_zigzag_direct, s->ids=
p.idct_permutation);
+
+    ff_thread_once(&init_static_once, lead_init_static_data);
+
+    return 0;
+}
+
+static void calc_dequant(uint16_t * dequant, const uint8_t * quant_tbl, in=
t q)
+{
+    for (int i =3D 0; i < 64; i++)
+        dequant[i] =3D av_clip(q * quant_tbl[ff_zigzag_direct[i]] / 50, 2,=
 32767);
+}
+
+static int decode_block(LeadContext * s, GetBitContext * gb,
+                        const VLCElem * dc_table, int dc_bits, const VLCEl=
em * ac_table, int ac_bits,
+                        int16_t * dc_pred, const uint16_t * dequant,
+                        uint8_t * dst, int stride)
+{
+    DECLARE_ALIGNED(32, int16_t, block)[64];
+    int size;
+
+    s->bdsp.clear_block(block);
+
+    size =3D get_vlc2(gb, dc_table, dc_bits, 1);
+    if (size < 0)
+        return AVERROR_INVALIDDATA;
+
+    if (size)
+        *dc_pred +=3D get_xbits(gb, size);
+
+    block[0] =3D (1 << 10) + *dc_pred * dequant[0];
+
+    for (int i =3D 1; i < 64; i++) {
+        int symbol =3D get_vlc2(gb, ac_table, ac_bits, 2);
+        if (symbol < 0)
+            return AVERROR_INVALIDDATA;
+
+        if (!symbol)
+            break;
+
+        i +=3D symbol >> 4;
+        if (i >=3D 64)
+            return AVERROR_INVALIDDATA;
+
+        size =3D symbol & 0xF;
+        if (size)
+            block[s->permutated_scantable[i]] =3D get_xbits(gb, size) * de=
quant[i];
+    }
+
+    s->idsp.idct_put(dst, stride, block);
+    return 0;
+}
+
+static int lead_decode_frame(AVCodecContext *avctx, AVFrame * frame,
+                             int * got_frame, AVPacket * avpkt)
+{
+    LeadContext *s =3D avctx->priv_data;
+    const uint8_t * buf =3D avpkt->data;
+    int ret, format, yuv20p_half =3D 0, fields =3D 1, q, size;
+    GetBitContext gb;
+    int16_t dc_pred[3] =3D {0, 0, 0};
+    uint16_t dequant[2][64];
+
+    if (avpkt->size < 8)
+        return AVERROR_INVALIDDATA;
+
+    format =3D AV_RL16(buf + 4);
+    switch(format) {
+    case 0x8000:
+        yuv20p_half =3D 1;
+        // fall-through
+    case 0x1000:
+        avctx->pix_fmt =3D AV_PIX_FMT_YUV420P;
+        break;
+    case 0x2000:
+        avctx->pix_fmt =3D AV_PIX_FMT_YUV444P;
+        break;
+    case 0x2006:
+        avctx->pix_fmt =3D AV_PIX_FMT_YUV444P;
+        fields =3D 2;
+        break;
+    default:
+        avpriv_request_sample(avctx, "unsupported format 0x%x", format);
+        return AVERROR_PATCHWELCOME;
+    }
+
+    q =3D AV_RL16(buf + 6);
+    calc_dequant(dequant[0], ff_mjpeg_std_luminance_quant_tbl, q);
+    calc_dequant(dequant[1], ff_mjpeg_std_chrominance_quant_tbl, q);
+
+    if ((ret =3D ff_get_buffer(avctx, frame, 0)) < 0)
+        return ret;
+
+    frame->flags |=3D AV_FRAME_FLAG_KEY;
+    frame->pict_type =3D AV_PICTURE_TYPE_I;
+
+    av_fast_padded_malloc(&s->bitstream_buf, &s->bitstream_buf_size, avpkt=
->size - 8);
+    if (!s->bitstream_buf)
+        return AVERROR(ENOMEM);
+
+    size =3D 0;
+    for (int i =3D 8; i < avpkt->size; i++) {
+        int src =3D buf[i] ^ 0x80;
+        s->bitstream_buf[size++] =3D src;
+        if (src =3D=3D 0xFF && i + 1 < avpkt->size && (buf[i + 1] ^ 0x80) =
=3D=3D 0x00)
+            i++;
+    }
+
+    init_get_bits8(&gb, s->bitstream_buf, size);
+
+    if (avctx->pix_fmt =3D=3D AV_PIX_FMT_YUV420P) {
+        for (int mb_y =3D 0; mb_y < avctx->height / 16; mb_y++)
+            for (int mb_x =3D 0; mb_x < avctx->width / 16; mb_x++)
+                for (int b =3D 0; b < (yuv20p_half ? 4 : 6); b++) {
+                    int luma_block =3D yuv20p_half ? 2 : 4;
+                    const VLCElem * dc_vlc =3D b < luma_block ? luma_dc_vl=
c.table : chroma_dc_vlc.table;
+                    int dc_bits            =3D b < luma_block ? LUMA_DC_BI=
TS : CHROMA_DC_BITS;
+                    const VLCElem * ac_vlc =3D b < luma_block ? luma_ac_vl=
c.table : chroma_ac_vlc.table;
+                    int ac_bits            =3D b < luma_block ? LUMA_AC_BI=
TS : CHROMA_AC_BITS;
+                    int plane              =3D b < luma_block ? 0 : b - (y=
uv20p_half ? 1 : 3);
+                    int x, y;
+
+                    if (b < luma_block) {
+                        y =3D 16*mb_y + 8*(b >> 1);
+                        x =3D 16*mb_x + 8*(b & 1);
+                    } else {
+                        y =3D 8*mb_y;
+                        x =3D 8*mb_x;
+                    }
+
+                    ret =3D decode_block(s, &gb, dc_vlc, dc_bits, ac_vlc, =
ac_bits,
+                        dc_pred + plane, dequant[!(b < 4)],
+                        frame->data[plane] + y*frame->linesize[plane] + x,
+                        (yuv20p_half && b < 2 ? 2 : 1) * frame->linesize[p=
lane]);
+                    if (ret < 0)
+                        return ret;
+
+                    if (yuv20p_half && b < 2)
+                        copy_block8(frame->data[plane] + (y + 1)*frame->li=
nesize[plane] + x,
+                                    frame->data[plane] + y*frame->linesize=
[plane] + x,
+                                    2*frame->linesize[plane], 2*frame->lin=
esize[plane], 8);
+                }
+    } else {
+        for (int f =3D 0; f < fields; f++)
+            for (int j =3D 0; j < avctx->height / fields / 8; j++)
+                for (int i =3D 0; i < avctx->width / 8; i++)
+                    for (int plane =3D 0; plane < 3; plane++) {
+                        const VLCElem * dc_vlc =3D !plane ? luma_dc_vlc.ta=
ble : chroma_dc_vlc.table;
+                        int dc_bits            =3D !plane ? LUMA_DC_BITS :=
 CHROMA_DC_BITS;
+                        const VLCElem * ac_vlc =3D !plane ? luma_ac_vlc.ta=
ble : chroma_ac_vlc.table;
+                        int ac_bits            =3D !plane ? LUMA_AC_BITS :=
 CHROMA_AC_BITS;
+
+                        ret =3D decode_block(s, &gb, dc_vlc, dc_bits, ac_v=
lc, ac_bits,
+                            dc_pred + plane, dequant[!!plane],
+                            frame->data[plane] + (f + 8*j*fields)*frame->l=
inesize[plane] + 8*i,
+                            fields * frame->linesize[plane]);
+                        if (ret < 0)
+                            return ret;
+                    }
+    }
+
+    *got_frame =3D 1;
+
+    return avpkt->size;
+}
+
+static av_cold int lead_decode_end(AVCodecContext * avctx)
+{
+    LeadContext *s =3D avctx->priv_data;
+
+    av_freep(&s->bitstream_buf);
+
+    return 0;
+}
+
+const FFCodec ff_lead_decoder =3D {
+    .p.name         =3D "lead",
+    CODEC_LONG_NAME("LEAD MCMP"),
+    .p.type         =3D AVMEDIA_TYPE_VIDEO,
+    .p.id           =3D AV_CODEC_ID_LEAD,
+    .priv_data_size =3D sizeof(LeadContext),
+    .init           =3D lead_decode_init,
+    .close          =3D lead_decode_end,
+    FF_CODEC_DECODE_CB(lead_decode_frame),
+    .p.capabilities =3D AV_CODEC_CAP_DR1,
+    .caps_internal  =3D FF_CODEC_CAP_INIT_CLEANUP,
+};
diff --git a/libavformat/riff.c b/libavformat/riff.c
index 51d23b290e..157976583c 100644
--- a/libavformat/riff.c
+++ b/libavformat/riff.c
@@ -505,6 +505,7 @@ const AVCodecTag ff_codec_bmp_tags[] =3D {
     { AV_CODEC_ID_VQC,          MKTAG('V', 'Q', 'C', '2') },
     { AV_CODEC_ID_RTV1,         MKTAG('R', 'T', 'V', '1') },
     { AV_CODEC_ID_VMIX,         MKTAG('V', 'M', 'X', '1') },
+    { AV_CODEC_ID_LEAD,         MKTAG('L', 'E', 'A', 'D') },
     { AV_CODEC_ID_NONE,         0 }
 };
=20
--=20
2.42.0

-- Peter
(A907 E02F A6E5 0CD2 34CD 20D2 6760 79C5 AC40 DD6B)

--CTNWkyy0NCK0c6FL
Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iF0EABECAB0WIQSpB+AvpuUM0jTNINJnYHnFrEDdawUCZSxc/gAKCRBnYHnFrEDd
a07NAJ9TKDE68V6gcAoWPFuaIRemI2Et2ACePhmKXp6mOYMvEoM5lD+lY4i8rJU=
=kLg1
-----END PGP SIGNATURE-----

--CTNWkyy0NCK0c6FL--

--===============1473940187269900008==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

--===============1473940187269900008==--