[FFmpeg-devel] [PATCH 1/2] avcodec: add HCOM decoder

Paul B Mahol onemda at gmail.com
Wed Jan 2 22:53:23 EET 2019


On 1/2/19, James Almer <jamrial at gmail.com> wrote:
> On 1/2/2019 3:53 PM, Paul B Mahol wrote:
>> Signed-off-by: Paul B Mahol <onemda at gmail.com>
>> ---
>>  libavcodec/Makefile     |   1 +
>>  libavcodec/allcodecs.c  |   1 +
>>  libavcodec/avcodec.h    |   1 +
>>  libavcodec/codec_desc.c |   7 ++
>>  libavcodec/hcom.c       | 137 ++++++++++++++++++++++++++++++++++++++++
>>  5 files changed, 147 insertions(+)
>>  create mode 100644 libavcodec/hcom.c
>>
>> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
>> index 99799ceed2..bf746c143d 100644
>> --- a/libavcodec/Makefile
>> +++ b/libavcodec/Makefile
>> @@ -362,6 +362,7 @@ OBJS-$(CONFIG_H264_V4L2M2M_DECODER)    +=
>> v4l2_m2m_dec.o
>>  OBJS-$(CONFIG_H264_V4L2M2M_ENCODER)    += v4l2_m2m_enc.o
>>  OBJS-$(CONFIG_HAP_DECODER)             += hapdec.o hap.o
>>  OBJS-$(CONFIG_HAP_ENCODER)             += hapenc.o hap.o
>> +OBJS-$(CONFIG_HCOM_DECODER)            += hcom.o
>>  OBJS-$(CONFIG_HEVC_DECODER)            += hevcdec.o hevc_mvs.o \
>>                                            hevc_cabac.o hevc_refs.o
>> hevcpred.o    \
>>                                            hevcdsp.o hevc_filter.o
>> hevc_data.o
>> diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
>> index 4755af71b2..fe0376e27e 100644
>> --- a/libavcodec/allcodecs.c
>> +++ b/libavcodec/allcodecs.c
>> @@ -424,6 +424,7 @@ extern AVCodec ff_g723_1_decoder;
>>  extern AVCodec ff_g729_decoder;
>>  extern AVCodec ff_gsm_decoder;
>>  extern AVCodec ff_gsm_ms_decoder;
>> +extern AVCodec ff_hcom_decoder;
>>  extern AVCodec ff_iac_decoder;
>>  extern AVCodec ff_ilbc_decoder;
>>  extern AVCodec ff_imc_decoder;
>> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
>> index 92567ec6d0..e92d7accf4 100644
>> --- a/libavcodec/avcodec.h
>> +++ b/libavcodec/avcodec.h
>> @@ -646,6 +646,7 @@ enum AVCodecID {
>>      AV_CODEC_ID_APTX_HD,
>>      AV_CODEC_ID_SBC,
>>      AV_CODEC_ID_ATRAC9,
>> +    AV_CODEC_ID_HCOM,
>>
>>      /* subtitle codecs */
>>      AV_CODEC_ID_FIRST_SUBTITLE = 0x17000,          ///< A dummy ID
>> pointing at the start of subtitle codecs.
>> diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
>> index 2363a53283..10a639101c 100644
>> --- a/libavcodec/codec_desc.c
>> +++ b/libavcodec/codec_desc.c
>> @@ -2943,6 +2943,13 @@ static const AVCodecDescriptor codec_descriptors[]
>> = {
>>          .long_name = NULL_IF_CONFIG_SMALL("ATRAC9 (Adaptive TRansform
>> Acoustic Coding 9)"),
>>          .props     = AV_CODEC_PROP_LOSSY,
>>      },
>> +    {
>> +        .id        = AV_CODEC_ID_HCOM,
>> +        .type      = AVMEDIA_TYPE_AUDIO,
>> +        .name      = "hcom",
>> +        .long_name = NULL_IF_CONFIG_SMALL("HCOM Audio"),
>> +        .props     = AV_CODEC_PROP_LOSSY,
>> +    },
>>
>>      /* subtitle codecs */
>>      {
>> diff --git a/libavcodec/hcom.c b/libavcodec/hcom.c
>> new file mode 100644
>> index 0000000000..e516d20a94
>> --- /dev/null
>> +++ b/libavcodec/hcom.c
>> @@ -0,0 +1,137 @@
>> +/*
>> + * HCOM audio decoder
>> + *
>> + * 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 "avcodec.h"
>> +#include "bytestream.h"
>> +#include "internal.h"
>> +
>> +typedef struct HEntry {
>> +    int16_t l, r;
>> +} HEntry;
>> +
>> +typedef struct HCOMContext {
>> +    AVCodecContext *avctx;
>> +
>> +    uint8_t first_sample;
>> +    uint8_t sample;
>> +    int dict_entries;
>> +    int dict_entry;
>> +    int delta_compression;
>> +
>> +    HEntry *dict;
>> +} HCOMContext;
>> +
>> +static av_cold int hcom_init(AVCodecContext *avctx)
>> +{
>> +    HCOMContext *s = avctx->priv_data;
>> +
>> +    if (avctx->channels != 1) {
>> +        av_log(avctx, AV_LOG_ERROR, "invalid number of channels\n");
>> +        return AVERROR_INVALIDDATA;
>> +    }
>> +
>> +    if (avctx->extradata_size <= 7)
>> +        return AVERROR_INVALIDDATA;
>> +    s->dict_entries = AV_RB16(avctx->extradata);
>> +    if (avctx->extradata_size < s->dict_entries * 4 + 7)
>> +        return AVERROR_INVALIDDATA;
>> +    s->delta_compression = AV_RB32(avctx->extradata + 2);
>> +    s->sample = s->first_sample = avctx->extradata[avctx->extradata_size
>> - 1];
>> +
>> +    s->dict = av_calloc(s->dict_entries, sizeof(*s->dict));
>
> You're never freeing this.
>

Fixed locally.


More information about the ffmpeg-devel mailing list