[FFmpeg-devel] lavc/g729dec: Support decoding ACELP.KELVIN

Submitted by Carl Eugen Hoyos on Aug. 20, 2019, 5:25 p.m.

Details

Message ID CAB0OVGow4W5PQ3H9RBC=grxdy13=mXMf0UrY5y9GNDEDt8AGOQ@mail.gmail.com
State New
Headers show

Commit Message

Carl Eugen Hoyos Aug. 20, 2019, 5:25 p.m.
Am Di., 20. Aug. 2019 um 10:30 Uhr schrieb Paul B Mahol <onemda@gmail.com>:
>
> Do not use full caps name for short name.

New patch attached.

Thank you, Carl Eugen

Comments

Paul B Mahol Aug. 21, 2019, 8:41 a.m.
The configure line is not needed. Where is Makefile change?
Changlelog one does not apply.

On Tue, Aug 20, 2019 at 7:25 PM Carl Eugen Hoyos <ceffmpeg@gmail.com> wrote:

> Am Di., 20. Aug. 2019 um 10:30 Uhr schrieb Paul B Mahol <onemda@gmail.com
> >:
> >
> > Do not use full caps name for short name.
>
> New patch attached.
>
> Thank you, Carl Eugen
> _______________________________________________
> 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".
Carl Eugen Hoyos Aug. 21, 2019, 8:44 a.m.
Am Mi., 21. Aug. 2019 um 10:40 Uhr schrieb Paul B Mahol <onemda@gmail.com>:
>
> The configure line is not needed. Where is Makefile change?

This line makes no sense.

Carl Eugen
Paul B Mahol Aug. 21, 2019, 8:48 a.m.
On Wed, Aug 21, 2019 at 10:44 AM Carl Eugen Hoyos <ceffmpeg@gmail.com>
wrote:

> Am Mi., 21. Aug. 2019 um 10:40 Uhr schrieb Paul B Mahol <onemda@gmail.com
> >:
> >
> > The configure line is not needed. Where is Makefile change?
>
> This line makes no sense.
>

Nope, you do not make sense. Configure line is completely bollocks.
Makefile change is mandatory and in your case it is missing completely.



>
> Carl Eugen
> _______________________________________________
> 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".
Carl Eugen Hoyos Aug. 21, 2019, 9:11 a.m.
Am Mi., 21. Aug. 2019 um 10:54 Uhr schrieb Paul B Mahol <onemda@gmail.com>:
>
> On Wed, Aug 21, 2019 at 10:44 AM Carl Eugen Hoyos <ceffmpeg@gmail.com>
> wrote:
>
> > Am Mi., 21. Aug. 2019 um 10:40 Uhr schrieb Paul B Mahol <onemda@gmail.com
> > >
> > > The configure line is not needed. Where is Makefile change?
> >
> > This line makes no sense.
>
> Nope, you do not make sense.

I hope you agree it is difficult to "make sense" in an answer to
something that makes no sense.

> Configure line is completely bollocks.

Works fine here.

> Makefile change is mandatory and in your case it is missing completely.

Mandatory?
I seem to remember a time when I tried to keep the whole magic in the
Makefiles. Somebody said "no, the maintenance burden is too high,
we do some of the magic in configure and some in the Makefile to make
our lifes easier". What is it now? Should we move all the changes back
in the Makefiles?

Carl Eugen
Paul B Mahol Aug. 21, 2019, 9:35 a.m.
On Wed, Aug 21, 2019 at 11:12 AM Carl Eugen Hoyos <ceffmpeg@gmail.com>
wrote:

> Am Mi., 21. Aug. 2019 um 10:54 Uhr schrieb Paul B Mahol <onemda@gmail.com
> >:
> >
> > On Wed, Aug 21, 2019 at 10:44 AM Carl Eugen Hoyos <ceffmpeg@gmail.com>
> > wrote:
> >
> > > Am Mi., 21. Aug. 2019 um 10:40 Uhr schrieb Paul B Mahol <
> onemda@gmail.com
> > > >
> > > > The configure line is not needed. Where is Makefile change?
> > >
> > > This line makes no sense.
> >
> > Nope, you do not make sense.
>
> I hope you agree it is difficult to "make sense" in an answer to
> something that makes no sense.
>

Please consult doctors.


>
> > Configure line is completely bollocks.
>
> Works fine here.
>

Remove it, its is not relevant.


>
> > Makefile change is mandatory and in your case it is missing completely.
>
> Mandatory?
> I seem to remember a time when I tried to keep the whole magic in the
> Makefiles. Somebody said "no, the maintenance burden is too high,
> we do some of the magic in configure and some in the Makefile to make
> our lifes easier". What is it now? Should we move all the changes back
> in the Makefiles?
>

Are you trolling now? libavcodec/Makefile change is missing.

Also you need to use #ifdef for decoders in g729 file as user may enable
only one of decoders at time.


>
> Carl Eugen
> _______________________________________________
> 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".
Jean-Baptiste Kempf Aug. 21, 2019, 10:54 a.m.
On Wed, Aug 21, 2019, at 11:35, Paul B Mahol wrote:
> > > > > The configure line is not needed. Where is Makefile change?
> > > >
> > > > This line makes no sense.
> > >
> > > Nope, you do not make sense.
> >
> > I hope you agree it is difficult to "make sense" in an answer to
> > something that makes no sense.
> 
> Please consult doctors.

Those kind of remarks are not OK.

Patch hide | download patch | download mbox

From 8af0b279ad0c25425d075498f60b0770528687a2 Mon Sep 17 00:00:00 2001
From: Carl Eugen Hoyos <ceffmpeg@gmail.com>
Date: Mon, 19 Aug 2019 23:34:37 +0200
Subject: [PATCH] lavc/g729dec: Support decoding Sipro ACELP.KELVIN.

Fixes ticket #4799.
Analyzed-by: Aleksandr Ustinov
---
 Changelog                |  3 +++
 configure                |  1 +
 doc/general.texi         |  1 +
 libavcodec/allcodecs.c   |  1 +
 libavcodec/avcodec.h     |  1 +
 libavcodec/codec_desc.c  |  6 ++++++
 libavcodec/g729_parser.c |  5 +++--
 libavcodec/g729dec.c     | 21 +++++++++++++++++++--
 libavcodec/version.h     |  2 +-
 libavformat/riff.c       |  1 +
 10 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/Changelog b/Changelog
index 389ca6c4db..42c1d16207 100644
--- a/Changelog
+++ b/Changelog
@@ -1,6 +1,9 @@ 
 Entries are sorted chronologically from oldest to youngest within each release,
 releases are sorted from youngest to oldest.
 
+version <next>:
+- support Sipro ACELP.KELVIN decoding
+
 version 4.2:
 - tpad filter
 - AV1 decoding support through libdav1d
diff --git a/configure b/configure
index c09c842809..fc073967b3 100755
--- a/configure
+++ b/configure
@@ -2635,6 +2635,7 @@  ac3_decoder_select="ac3_parser ac3dsp bswapdsp fmtconvert mdct"
 ac3_fixed_decoder_select="ac3_parser ac3dsp bswapdsp mdct"
 ac3_encoder_select="ac3dsp audiodsp mdct me_cmp"
 ac3_fixed_encoder_select="ac3dsp audiodsp mdct me_cmp"
+acelp_kelvin_decoder_select="g729_decoder"
 adpcm_g722_decoder_select="g722dsp"
 adpcm_g722_encoder_select="g722dsp"
 aic_decoder_select="golomb idctdsp"
diff --git a/doc/general.texi b/doc/general.texi
index 3c0c803449..d90588c63a 100644
--- a/doc/general.texi
+++ b/doc/general.texi
@@ -1057,6 +1057,7 @@  following image formats are supported:
 @item AAC+                   @tab  E  @tab  IX
     @tab encoding supported through external library libfdk-aac
 @item AC-3                   @tab IX  @tab  IX
+@item ACELP.KELVIN           @tab     @tab  X
 @item ADPCM 4X Movie         @tab     @tab  X
 @item APDCM Yamaha AICA      @tab     @tab  X
 @item ADPCM CDROM XA         @tab     @tab  X
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index d2f9a39ce5..5936cdc467 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -32,6 +32,7 @@ 
 extern AVCodec ff_a64multi_encoder;
 extern AVCodec ff_a64multi5_encoder;
 extern AVCodec ff_aasc_decoder;
+extern AVCodec ff_acelp_kelvin_decoder;
 extern AVCodec ff_aic_decoder;
 extern AVCodec ff_alias_pix_encoder;
 extern AVCodec ff_alias_pix_decoder;
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index d234271c5b..7ec4014d8b 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -629,6 +629,7 @@  enum AVCodecID {
     AV_CODEC_ID_ON2AVC,
     AV_CODEC_ID_DSS_SP,
     AV_CODEC_ID_CODEC2,
+    AV_CODEC_ID_ACELP_KELVIN,
 
     AV_CODEC_ID_FFWAVESYNTH = 0x15800,
     AV_CODEC_ID_SONIC,
diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
index 4d033c20ff..716e278b93 100644
--- a/libavcodec/codec_desc.c
+++ b/libavcodec/codec_desc.c
@@ -2834,6 +2834,12 @@  static const AVCodecDescriptor codec_descriptors[] = {
         .long_name = NULL_IF_CONFIG_SMALL("codec2 (very low bitrate speech codec)"),
         .props     = AV_CODEC_PROP_LOSSY,
     },
+    {
+        .id        = AV_CODEC_ID_ACELP_KELVIN,
+        .name      = "acelp.kelvin",
+        .long_name = NULL_IF_CONFIG_SMALL("Sipro ACELP.KELVIN"),
+        .props     = AV_CODEC_PROP_LOSSY,
+    },
     {
         .id        = AV_CODEC_ID_FFWAVESYNTH,
         .type      = AVMEDIA_TYPE_AUDIO,
diff --git a/libavcodec/g729_parser.c b/libavcodec/g729_parser.c
index 9982dbfffc..5a57025d62 100644
--- a/libavcodec/g729_parser.c
+++ b/libavcodec/g729_parser.c
@@ -45,9 +45,10 @@  static int g729_parse(AVCodecParserContext *s1, AVCodecContext *avctx,
     int next;
 
     if (!s->block_size) {
-        av_assert1(avctx->codec_id == AV_CODEC_ID_G729);
         /* FIXME: replace this heuristic block_size with more precise estimate */
         s->block_size = (avctx->bit_rate < 8000) ? G729D_6K4_BLOCK_SIZE : G729_8K_BLOCK_SIZE;
+        if (avctx->codec_id == AV_CODEC_ID_ACELP_KELVIN)
+            s->block_size++;
         s->block_size *= avctx->channels;
         s->duration   = avctx->frame_size;
     }
@@ -76,7 +77,7 @@  static int g729_parse(AVCodecParserContext *s1, AVCodecContext *avctx,
 }
 
 AVCodecParser ff_g729_parser = {
-    .codec_ids      = { AV_CODEC_ID_G729 },
+    .codec_ids      = { AV_CODEC_ID_G729, AV_CODEC_ID_ACELP_KELVIN },
     .priv_data_size = sizeof(G729ParseContext),
     .parser_parse   = g729_parse,
     .parser_close   = ff_parse_close,
diff --git a/libavcodec/g729dec.c b/libavcodec/g729dec.c
index 2e4756b805..5a5da5b03c 100644
--- a/libavcodec/g729dec.c
+++ b/libavcodec/g729dec.c
@@ -424,7 +424,7 @@  static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr,
     if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
         return ret;
 
-    if (buf_size % (G729_8K_BLOCK_SIZE * avctx->channels) == 0) {
+    if (buf_size % ((G729_8K_BLOCK_SIZE + (avctx->codec_id == AV_CODEC_ID_ACELP_KELVIN)) * avctx->channels) == 0) {
         packet_type = FORMAT_G729_8K;
         format = &format_g729_8k;
         //Reset voice decision
@@ -445,6 +445,11 @@  static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr,
         int bad_pitch = 0;     ///< parity check failed
         int is_periodic = 0;   ///< whether one of the subframes is declared as periodic or not
         out_frame = (int16_t*)frame->data[c];
+        if (avctx->codec_id == AV_CODEC_ID_ACELP_KELVIN) {
+            if (*buf != ((avctx->channels - 1 - c) * 0x80 | 2))
+                avpriv_request_sample(avctx, "First byte value %x for channel %d", *buf, c);
+            buf++;
+        }
 
         for (i = 0; i < buf_size; i++)
             frame_erasure |= buf[i];
@@ -727,7 +732,7 @@  static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr,
     }
 
     *got_frame_ptr = 1;
-    return packet_type == FORMAT_G729_8K ? G729_8K_BLOCK_SIZE * avctx->channels : G729D_6K4_BLOCK_SIZE * avctx->channels;
+    return packet_type == FORMAT_G729_8K ? (G729_8K_BLOCK_SIZE + (avctx->codec_id == AV_CODEC_ID_ACELP_KELVIN)) * avctx->channels : G729D_6K4_BLOCK_SIZE * avctx->channels;
 }
 
 static av_cold int decode_close(AVCodecContext *avctx)
@@ -749,3 +754,15 @@  AVCodec ff_g729_decoder = {
     .close          = decode_close,
     .capabilities   = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1,
 };
+
+AVCodec ff_acelp_kelvin_decoder = {
+    .name           = "acelp.kelvin",
+    .long_name      = NULL_IF_CONFIG_SMALL("Sipro ACELP.KELVIN"),
+    .type           = AVMEDIA_TYPE_AUDIO,
+    .id             = AV_CODEC_ID_ACELP_KELVIN,
+    .priv_data_size = sizeof(G729Context),
+    .init           = decoder_init,
+    .decode         = decode_frame,
+    .close          = decode_close,
+    .capabilities   = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1,
+};
diff --git a/libavcodec/version.h b/libavcodec/version.h
index 43c8cdb59f..ed767c8867 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -28,7 +28,7 @@ 
 #include "libavutil/version.h"
 
 #define LIBAVCODEC_VERSION_MAJOR  58
-#define LIBAVCODEC_VERSION_MINOR  55
+#define LIBAVCODEC_VERSION_MINOR  56
 #define LIBAVCODEC_VERSION_MICRO 100
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
diff --git a/libavformat/riff.c b/libavformat/riff.c
index e755ad8d5f..27518216a6 100644
--- a/libavformat/riff.c
+++ b/libavformat/riff.c
@@ -534,6 +534,7 @@  const AVCodecTag ff_codec_wav_tags[] = {
     { AV_CODEC_ID_AAC,             0x00ff },
     { AV_CODEC_ID_G723_1,          0x0111 },
     { AV_CODEC_ID_SIPR,            0x0130 },
+    { AV_CODEC_ID_ACELP_KELVIN,    0x0135 },
     { AV_CODEC_ID_WMAV1,           0x0160 },
     { AV_CODEC_ID_WMAV2,           0x0161 },
     { AV_CODEC_ID_WMAPRO,          0x0162 },
-- 
2.22.0