From patchwork Sun Mar 15 18:22:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 18202 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 0625C44B9E5 for ; Sun, 15 Mar 2020 20:22:39 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D7F3568A9BB; Sun, 15 Mar 2020 20:22:38 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D2BCE68A9BB for ; Sun, 15 Mar 2020 20:22:31 +0200 (EET) Received: by mail-wm1-f54.google.com with SMTP id x3so11711616wmj.1 for ; Sun, 15 Mar 2020 11:22:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=psY0TzfmpHl6xm2gXM+tKugjqosr4Spn/4OpOREtuYk=; b=aktSG9o+9jrWl4HTR2AstQnALUSrLRqwCUl50EQxx3zhchdN4A8cnbBFt30eFGpeZi SN47gv7LT8D/MUtuZxCXaS3rFf0wV4YNbQIAZVDTB1AVhEWLIVCejxEgtLsR6Ss8YDkP I2AM5ugoPQf04HJVWbGnzSVEs5cvNZWsWRhkHO5xnNDfNnrB2/Ilzcd4Wz8PKcpRK+14 BWZRDSYDJbj2iayjGN4gflXZ6zqP/vPys0jXQAG59lbVJVWEiEvxr45alFU64b+4qYg6 uJJT330Wf9RGXIzDvNnacxscSLB+2pEdwSuMSJUcdmhiNF5QwrG9UNRYSM0bXe12NThL kMrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=psY0TzfmpHl6xm2gXM+tKugjqosr4Spn/4OpOREtuYk=; b=QjVrJz2TlXTTbLa8x2byJnIPmj6EKZppUf7aw8mNQ3oosp68Udw10ffuoW7GAiX674 SwfElr49A8B6ltnCyqN4HV0//l2e/8NNAH3bEBehxUGQoTdqtGZ3woIKv8fp0m9nlJfG rSTzGfAYMmaQCrmTGRsWWCImhHSf+M24uzcljVNpbvYBPUuyeWaDTcrrZLZZ/gZidN9S 5QjOYrHhIwg+u4hbhm2gYi2YJGEGsI7UCJqrkjzhReiS6eJt/DiaKOD48+3RVMyqw1gq twLJ9ZhtGb7DQOmKqv8Isc6lnlUHeB4dNfdWlGkhANjrntqDbYpWlnTOEfFmPhp8GcBB LnnA== X-Gm-Message-State: ANhLgQ2QJv8liOucwsdU1B6gN4R1nJTIKYWboqYjY+0O/ZKuoOkxJyck 59Az4CImvZnrRU383QhINK4ETwu2 X-Google-Smtp-Source: ADFU+vspXsxjoyLYS/5/FPVMV3OQsdhrNvZHA9q32sMF+k0mMWAJQIP8gt0JVpJo8f6WP9DpZj/WIQ== X-Received: by 2002:a7b:c5cd:: with SMTP id n13mr22971275wmk.172.1584296550845; Sun, 15 Mar 2020 11:22:30 -0700 (PDT) Received: from localhost.localdomain ([37.244.255.176]) by smtp.gmail.com with ESMTPSA id b203sm27363164wmc.45.2020.03.15.11.22.28 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 15 Mar 2020 11:22:30 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Sun, 15 Mar 2020 19:22:00 +0100 Message-Id: <20200315182206.20851-1-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH 1/7] avcodec: add ADPCM IMA MTF decoder X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- libavcodec/Makefile | 1 + libavcodec/adpcm.c | 33 +++++++++++++++++++++++++++++++++ libavcodec/allcodecs.c | 1 + libavcodec/avcodec.h | 1 + libavcodec/codec_desc.c | 7 +++++++ 5 files changed, 43 insertions(+) diff --git a/libavcodec/Makefile b/libavcodec/Makefile index a3326a45e7..b50a26907f 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -843,6 +843,7 @@ OBJS-$(CONFIG_ADPCM_IMA_DK4_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_EA_EACS_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_EA_SEAD_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_ISS_DECODER) += adpcm.o adpcm_data.o +OBJS-$(CONFIG_ADPCM_IMA_MTF_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_OKI_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_QT_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_QT_ENCODER) += adpcmenc.o adpcm_data.o diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c index 4f5980f7d5..e9abddc43c 100644 --- a/libavcodec/adpcm.c +++ b/libavcodec/adpcm.c @@ -89,6 +89,11 @@ static const int8_t zork_index_table[8] = { -1, -1, -1, 1, 4, 7, 10, 12, }; +static const int8_t mtf_index_table[16] = { + 8, 6, 4, 2, -1, -1, -1, -1, + -1, -1, -1, -1, 2, 4, 6, 8, +}; + /* end of tables */ typedef struct ADPCMDecodeContext { @@ -304,6 +309,22 @@ static inline int16_t adpcm_ima_alp_expand_nibble(ADPCMChannelStatus *c, int8_t return (int16_t)c->predictor; } +static inline int16_t adpcm_ima_mtf_expand_nibble(ADPCMChannelStatus *c, int nibble) +{ + int step_index, step, delta, predictor; + + step = ff_adpcm_step_table[c->step_index]; + + delta = step * (2 * nibble - 15); + predictor = c->predictor + delta; + + step_index = c->step_index + mtf_index_table[(unsigned)nibble]; + c->predictor = av_clip_int16(predictor >> 4); + c->step_index = av_clip(step_index, 0, 88); + + return (int16_t)c->predictor; +} + static inline int16_t adpcm_ima_wav_expand_nibble(ADPCMChannelStatus *c, GetBitContext *gb, int bps) { int nibble, step_index, predictor, sign, delta, diff, step, shift; @@ -700,6 +721,7 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb, case AV_CODEC_ID_ADPCM_IMA_SSI: case AV_CODEC_ID_ADPCM_IMA_APM: case AV_CODEC_ID_ADPCM_IMA_ALP: + case AV_CODEC_ID_ADPCM_IMA_MTF: nb_samples = buf_size * 2 / ch; break; } @@ -1956,6 +1978,16 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, *samples++ = adpcm_zork_expand_nibble(&c->status[n % avctx->channels], v); } break; + case AV_CODEC_ID_ADPCM_IMA_MTF: + for (n = nb_samples / 2; n > 0; n--) { + for (channel = 0; channel < avctx->channels; channel++) { + int v = bytestream2_get_byteu(&gb); + *samples++ = adpcm_ima_mtf_expand_nibble(&c->status[channel], v >> 4); + samples[st] = adpcm_ima_mtf_expand_nibble(&c->status[channel], v & 0x0F); + } + samples += avctx->channels; + } + break; default: av_assert0(0); // unsupported codec_id should not happen } @@ -2027,6 +2059,7 @@ ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DK4, sample_fmts_s16, adpcm_ima_dk4, ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_EA_EACS, sample_fmts_s16, adpcm_ima_ea_eacs, "ADPCM IMA Electronic Arts EACS"); ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_EA_SEAD, sample_fmts_s16, adpcm_ima_ea_sead, "ADPCM IMA Electronic Arts SEAD"); ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_ISS, sample_fmts_s16, adpcm_ima_iss, "ADPCM IMA Funcom ISS"); +ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_MTF, sample_fmts_s16, adpcm_ima_mtf, "ADPCM IMA Capcom's MT Framework"); ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_OKI, sample_fmts_s16, adpcm_ima_oki, "ADPCM IMA Dialogic OKI"); ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_QT, sample_fmts_s16p, adpcm_ima_qt, "ADPCM IMA QuickTime"); ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_RAD, sample_fmts_s16, adpcm_ima_rad, "ADPCM IMA Radical"); diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index f4cf180716..379c5f7b81 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -608,6 +608,7 @@ extern AVCodec ff_adpcm_ima_dk4_decoder; extern AVCodec ff_adpcm_ima_ea_eacs_decoder; extern AVCodec ff_adpcm_ima_ea_sead_decoder; extern AVCodec ff_adpcm_ima_iss_decoder; +extern AVCodec ff_adpcm_ima_mtf_decoder; extern AVCodec ff_adpcm_ima_oki_decoder; extern AVCodec ff_adpcm_ima_qt_encoder; extern AVCodec ff_adpcm_ima_qt_decoder; diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index aca3825fd3..9ac97a122b 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -553,6 +553,7 @@ enum AVCodecID { AV_CODEC_ID_ADPCM_ZORK, AV_CODEC_ID_ADPCM_IMA_APM, AV_CODEC_ID_ADPCM_IMA_ALP, + AV_CODEC_ID_ADPCM_IMA_MTF, /* AMR */ AV_CODEC_ID_AMR_NB = 0x12000, diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c index 0f5ddd9a9f..df3671765a 100644 --- a/libavcodec/codec_desc.c +++ b/libavcodec/codec_desc.c @@ -2332,6 +2332,13 @@ static const AVCodecDescriptor codec_descriptors[] = { .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA High Voltage Software ALP"), .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, }, + { + .id = AV_CODEC_ID_ADPCM_IMA_MTF, + .type = AVMEDIA_TYPE_AUDIO, + .name = "adpcm_ima_mtf", + .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Capcom's MT Framework"), + .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, + }, /* AMR */ { From patchwork Sun Mar 15 18:22:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 18203 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id D750244B9E5 for ; Sun, 15 Mar 2020 20:22:39 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C35A768AEE4; Sun, 15 Mar 2020 20:22:39 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2A59E689DC8 for ; Sun, 15 Mar 2020 20:22:33 +0200 (EET) Received: by mail-wm1-f66.google.com with SMTP id 25so15255081wmk.3 for ; Sun, 15 Mar 2020 11:22:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=zf0SOEFT08l2beb8euvRRe85nee9eR0TSQ+Wx4EqHBQ=; b=vHV5a2z0AI3DYhC6RDXljfY5XbynIlWQXOLfS9G/el8GZ6GzOXWOCpy3YDDCphX8Ca z26pNS+HA2fmwpHHkUTt0MydGF8bStPAHNYo1jkE4kFyB+HAVkixAQMk2A6UjuD4KezP tId1RURoj7IQXTny3KazAMwMqTFtynjW4zQY8qKiMfRIUFTWvQGC8OUXPTz5x1YOIcdd MmVHI5pCUiBZhOFC/iVqlsg2B3qw4qDfOBoIiOyvMK6CcUlcWiyItHcjxhC6U2YrQNZ2 c9dhbzzsDzamHyWQijJev1n2bstz0PqOJr4HlBJUT4ZOYXo8lFa9EXfQ69tpWJI6gt/F jjRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=zf0SOEFT08l2beb8euvRRe85nee9eR0TSQ+Wx4EqHBQ=; b=JZ/1eV/uvZZ/GiEGYt4Y5FqANZu74bxoDcW61NcKnJie+rlQPHeAoaOe8BrBXxpcc1 xsG5uz2Hy/DFFXihO2Hp3M+LuuZcvl7adSmj3aVpk+gbjad9X9/JZZQ4EJFema/uK3jc qAra3NRSXreglRK//XFWipGXc+rFPbt+kpP3D3sTuoedqMk76rxmJpp8Cu+AThf4S3yB p0Il9utPoj95f8iLR54sCAO+0tjgD45jHRLd8WVHQYGsDDWnj9xot24mQaPhnvvSG3ee x3EZtvrGfBxLvH33GYNkJiOeocmfWBpO5SxHsGNkTfxzcD3UjGmmMMWzYcnP0sDUBAbO mTJg== X-Gm-Message-State: ANhLgQ0fpOA2DXExrRwtwGyUhr3vyFsXthoU/Q9AI6LmhjPVaE1dHADZ qYLojb0wOaPQwGNFuoyageOCwX7i X-Google-Smtp-Source: ADFU+vs+8wV6yWYDY940NuEgCOnux/tBIik/zVIsjLEWbtVHryHgA4WeuzQIvvafvYfEsIS1iiTzMQ== X-Received: by 2002:a1c:ba04:: with SMTP id k4mr9590705wmf.165.1584296552296; Sun, 15 Mar 2020 11:22:32 -0700 (PDT) Received: from localhost.localdomain ([37.244.255.176]) by smtp.gmail.com with ESMTPSA id b203sm27363164wmc.45.2020.03.15.11.22.30 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 15 Mar 2020 11:22:31 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Sun, 15 Mar 2020 19:22:01 +0100 Message-Id: <20200315182206.20851-2-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200315182206.20851-1-onemda@gmail.com> References: <20200315182206.20851-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/7] avformat: add fwse demuxer X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- libavformat/Makefile | 1 + libavformat/allformats.c | 1 + libavformat/fwse.c | 88 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 libavformat/fwse.c diff --git a/libavformat/Makefile b/libavformat/Makefile index f84becd30a..cd3e9163f5 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -198,6 +198,7 @@ OBJS-$(CONFIG_FRAMEHASH_MUXER) += hashenc.o framehash.o OBJS-$(CONFIG_FRAMEMD5_MUXER) += hashenc.o framehash.o OBJS-$(CONFIG_FRM_DEMUXER) += frmdec.o OBJS-$(CONFIG_FSB_DEMUXER) += fsb.o +OBJS-$(CONFIG_FWSE_DEMUXER) += fwse.o OBJS-$(CONFIG_GIF_MUXER) += gif.o OBJS-$(CONFIG_GIF_DEMUXER) += gifdec.o OBJS-$(CONFIG_GSM_DEMUXER) += gsmdec.o diff --git a/libavformat/allformats.c b/libavformat/allformats.c index 08012ea208..d275c1017b 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -156,6 +156,7 @@ extern AVOutputFormat ff_framehash_muxer; extern AVOutputFormat ff_framemd5_muxer; extern AVInputFormat ff_frm_demuxer; extern AVInputFormat ff_fsb_demuxer; +extern AVInputFormat ff_fwse_demuxer; extern AVInputFormat ff_g722_demuxer; extern AVOutputFormat ff_g722_muxer; extern AVInputFormat ff_g723_1_demuxer; diff --git a/libavformat/fwse.c b/libavformat/fwse.c new file mode 100644 index 0000000000..00e2e13b11 --- /dev/null +++ b/libavformat/fwse.c @@ -0,0 +1,88 @@ +/* + * FWSE demuxer + * Copyright (c) 2020 Paul B Mahol + * + * 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 "internal.h" +#include "pcm.h" + +static int fwse_probe(const AVProbeData *p) +{ + if (AV_RL32(p->buf) != MKTAG('F','W','S','E')) + return 0; + if (AV_RL32(p->buf+4) != 2 && AV_RL32(p->buf+4) != 3) + return 0; + if (AV_RL32(p->buf+16) != 1 && AV_RL32(p->buf+16) != 2) + return 0; + + return AVPROBE_SCORE_MAX / 4 * 3; +} + +static int fwse_read_header(AVFormatContext *s) +{ + unsigned start_offset, version; + AVIOContext *pb = s->pb; + AVCodecParameters *par; + AVStream *st; + + avio_skip(pb, 4); + version = avio_rl32(pb); + if (version != 2 && version != 3) + return AVERROR_INVALIDDATA; + avio_skip(pb, 4); + start_offset = avio_rl32(pb); + + st = avformat_new_stream(s, NULL); + if (!st) + return AVERROR(ENOMEM); + + par = st->codecpar; + par->codec_type = AVMEDIA_TYPE_AUDIO; + par->codec_id = AV_CODEC_ID_ADPCM_IMA_MTF; + par->format = AV_SAMPLE_FMT_S16; + par->channels = avio_rl32(pb); + if (par->channels != 1 && par->channels != 2) + return AVERROR_INVALIDDATA; + if (par->channels == 1) + par->channel_layout = AV_CH_LAYOUT_MONO; + else if (par->channels == 2) + par->channel_layout = AV_CH_LAYOUT_STEREO; + st->duration = avio_rl32(pb); + par->sample_rate = avio_rl32(pb); + if (par->sample_rate <= 0 || par->sample_rate > INT_MAX) + return AVERROR_INVALIDDATA; + + par->block_align = 1; + avio_skip(pb, start_offset - avio_tell(pb)); + + avpriv_set_pts_info(st, 64, 1, par->sample_rate); + + return 0; +} + +AVInputFormat ff_fwse_demuxer = { + .name = "fwse", + .long_name = NULL_IF_CONFIG_SMALL("Capcom's MT Framework sound"), + .read_probe = fwse_probe, + .read_header = fwse_read_header, + .read_packet = ff_pcm_read_packet, + .extensions = "fwse", +}; From patchwork Sun Mar 15 18:22:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 18204 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id B8ABD44B9E5 for ; Sun, 15 Mar 2020 20:22:41 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A2F3D68B037; Sun, 15 Mar 2020 20:22:41 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 31E53689DC8 for ; Sun, 15 Mar 2020 20:22:35 +0200 (EET) Received: by mail-wm1-f47.google.com with SMTP id 6so15246240wmi.5 for ; Sun, 15 Mar 2020 11:22:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=r/U83AFPxH1brU0Y+iot7lPewroX4bDANvLTOiucj9o=; b=XSRegT1ZOu9mO2j0lWS3kEDtjCtJN5k/JSCZEM8Pm1NZaotyaBTzNqrBCCjMkFYKnM /Vinxxk0msIx+k8500JRWGKVUe/zh98P4WA3ONJAQeD2jje9L98txhUp19PA5YPTXsub 6cuFaMAJGEMKrdUQkoFIe7WN6ELw36FfX0wPNncKqdbdLUKDX+QBIWx8R9cCrLdM5Pxk bpOVqB9o26/aFRRZuTp3aAbTj9XHDiGCK4/TMlvEELIeM77ZRSMx10odzDvskIrc3qwp CwfQtSZ1ZYyCh8yT6lLCKJWGwuQWvoWHgw+RZVRFEZZvfy4gqOtQONVmgdSJ91WarH+e biog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=r/U83AFPxH1brU0Y+iot7lPewroX4bDANvLTOiucj9o=; b=ZmFL/tlg24Lfw4LlOb3CaMZvunSYNHr7yA40g4UUaucxZBKhvOjtk48s9dnKo1WclZ 0EX9DafbXdYafwNWjFHnhK3Ku8Dp8zlUhiu6k4dO3agploBsbyeX2/yyztOwnXJyviu1 YFm2sgq1sCNeGF7do+w7/xPwn19C7huqzx74NLbuH6N8N/ELUVZziGSVacjho/CCVlz+ 2C+zx5eMhqsZj1ReyfaalK8dH5mnuenJOOYnN7vq5iJPTEPB+3B7RtCCExbiH9IXhTqB fh4Oa9CPa9sNx0/gD8HAwoA+zWVdXK2oZvI7AbSXoSlAHGeWjWdstAQz6gyKYWn2KGo/ B5AQ== X-Gm-Message-State: ANhLgQ0gTw624rqwrkxhCcfFDOsY3cl2pYGZeB6ux3oHGB7l0Jo35jba f9Ug3OEpfJ17YL8rQ3ymcxvm3Eeu X-Google-Smtp-Source: ADFU+vuiHG0dcB1YJJeuG+5eHDfcaK+JIHZ3tYo573PmmBzS2NNjkpGF14qRJlsGCLE0/b9TrVk3pA== X-Received: by 2002:a1c:b686:: with SMTP id g128mr18157364wmf.75.1584296554130; Sun, 15 Mar 2020 11:22:34 -0700 (PDT) Received: from localhost.localdomain ([37.244.255.176]) by smtp.gmail.com with ESMTPSA id b203sm27363164wmc.45.2020.03.15.11.22.32 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 15 Mar 2020 11:22:33 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Sun, 15 Mar 2020 19:22:02 +0100 Message-Id: <20200315182206.20851-3-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200315182206.20851-1-onemda@gmail.com> References: <20200315182206.20851-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 3/7] avcodec: add derf dpcm decoder X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/avcodec.h | 1 + libavcodec/codec_desc.c | 7 +++++++ libavcodec/dpcm.c | 32 ++++++++++++++++++++++++++++++++ libavcodec/utils.c | 1 + 6 files changed, 43 insertions(+) diff --git a/libavcodec/Makefile b/libavcodec/Makefile index b50a26907f..a88643b7d2 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -265,6 +265,7 @@ OBJS-$(CONFIG_DCA_DECODER) += dcadec.o dca.o dcadata.o dcahuff.o \ OBJS-$(CONFIG_DCA_ENCODER) += dcaenc.o dca.o dcadata.o dcahuff.o \ dcaadpcm.o OBJS-$(CONFIG_DDS_DECODER) += dds.o +OBJS-$(CONFIG_DERF_DPCM_DECODER) += dpcm.o OBJS-$(CONFIG_DIRAC_DECODER) += diracdec.o dirac.o diracdsp.o diractab.o \ dirac_arith.o dirac_dwt.o dirac_vlc.o OBJS-$(CONFIG_DFA_DECODER) += dfa.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 379c5f7b81..6046b15164 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -569,6 +569,7 @@ extern AVCodec ff_pcm_vidc_encoder; extern AVCodec ff_pcm_vidc_decoder; /* DPCM codecs */ +extern AVCodec ff_derf_dpcm_decoder; extern AVCodec ff_gremlin_dpcm_decoder; extern AVCodec ff_interplay_dpcm_decoder; extern AVCodec ff_roq_dpcm_encoder; diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 9ac97a122b..e9c658fddc 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -571,6 +571,7 @@ enum AVCodecID { AV_CODEC_ID_SDX2_DPCM = 0x14800, AV_CODEC_ID_GREMLIN_DPCM, + AV_CODEC_ID_DERF_DPCM, /* audio codecs */ AV_CODEC_ID_MP2 = 0x15000, diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c index df3671765a..130e08c1f2 100644 --- a/libavcodec/codec_desc.c +++ b/libavcodec/codec_desc.c @@ -2415,6 +2415,13 @@ static const AVCodecDescriptor codec_descriptors[] = { .long_name = NULL_IF_CONFIG_SMALL("DPCM Gremlin"), .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, }, + { + .id = AV_CODEC_ID_DERF_DPCM, + .type = AVMEDIA_TYPE_AUDIO, + .name = "derf_dpcm", + .long_name = NULL_IF_CONFIG_SMALL("DPCM Xilam DERF"), + .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, + }, /* audio codecs */ { diff --git a/libavcodec/dpcm.c b/libavcodec/dpcm.c index 5958081b66..069bf1dcd8 100644 --- a/libavcodec/dpcm.c +++ b/libavcodec/dpcm.c @@ -49,6 +49,21 @@ typedef struct DPCMContext { const int8_t *sol_table; ///< delta table for SOL_DPCM } DPCMContext; +static const int32_t derf_steps[96] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 16, + 17, 19, 21, 23, 25, 28, 31, 34, + 37, 41, 45, 50, 55, 60, 66, 73, + 80, 88, 97, 107, 118, 130, 143, 157, + 173, 190, 209, 230, 253, 279, 307, 337, + 371, 408, 449, 494, 544, 598, 658, 724, + 796, 876, 963, 1060, 1166, 1282, 1411, 1552, + 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, + 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, + 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, + 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767, +}; + static const int16_t interplay_delta_table[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, @@ -225,6 +240,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, else out = buf_size; break; + case AV_CODEC_ID_DERF_DPCM: case AV_CODEC_ID_GREMLIN_DPCM: case AV_CODEC_ID_SDX2_DPCM: out = buf_size; @@ -372,6 +388,21 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, } } break; + + case AV_CODEC_ID_DERF_DPCM: { + int idx = 0; + + while (output_samples < samples_end) { + uint8_t n = bytestream2_get_byteu(&gb); + int index = FFMIN(n & 0x7f, 95); + + s->sample[idx] += (n & 0x80 ? -1: 1) * derf_steps[index]; + s->sample[idx] = av_clip_int16(s->sample[idx]); + *output_samples++ = s->sample[idx]; + idx ^= stereo; + } + } + break; } *got_frame_ptr = 1; @@ -391,6 +422,7 @@ AVCodec ff_ ## name_ ## _decoder = { \ .capabilities = AV_CODEC_CAP_DR1, \ } +DPCM_DECODER(AV_CODEC_ID_DERF_DPCM, derf_dpcm, "DPCM Xilam DERF"); DPCM_DECODER(AV_CODEC_ID_GREMLIN_DPCM, gremlin_dpcm, "DPCM Gremlin"); DPCM_DECODER(AV_CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "DPCM Interplay"); DPCM_DECODER(AV_CODEC_ID_ROQ_DPCM, roq_dpcm, "DPCM id RoQ"); diff --git a/libavcodec/utils.c b/libavcodec/utils.c index c4dc136d3c..66bfdaf4f8 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -1478,6 +1478,7 @@ int av_get_exact_bits_per_sample(enum AVCodecID codec_id) case AV_CODEC_ID_PCM_S8_PLANAR: case AV_CODEC_ID_PCM_U8: case AV_CODEC_ID_SDX2_DPCM: + case AV_CODEC_ID_DERF_DPCM: return 8; case AV_CODEC_ID_PCM_S16BE: case AV_CODEC_ID_PCM_S16BE_PLANAR: From patchwork Sun Mar 15 18:22:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 18205 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id B9C2044B9E5 for ; Sun, 15 Mar 2020 20:22:43 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9C61068B0E6; Sun, 15 Mar 2020 20:22:43 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8CD1968B0D7 for ; Sun, 15 Mar 2020 20:22:37 +0200 (EET) Received: by mail-wm1-f65.google.com with SMTP id f7so15595602wml.4 for ; Sun, 15 Mar 2020 11:22:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=cHzYVhSdRTq6LAlaTwonRvIMmt+UVxKfD/USh/QS9W8=; b=kTdxz+2TmUOFb+iytcDPtRpq58PcG3XgAGydEU67r34QcgwlQ0spZcKRvU9jAwlZO7 GjdMCzs3qePTB+SHf3q1hzQc0VFLalBAgf6pGvwn8N5Ym2Lh3EQ6HiZAo6H92Fm24Cur yiREeb/POBe+Gl+Kl1nLVGmrt1Sl3j2pyntxXzf5MhQjeMwLLwqKaptWlSCrz9mLCm01 xC60fbxI2aEEbra1uM2MSgC4nlE2paWtUiBeYBUjZUGNR5flwmqHql0u4BtCSCj5HESB bdNzVweK7MOYhKyvNVgCe5RH6dr4eiZGsCxrMR4v089v8NrjCgFuw3jFJCJBi5Ud/J0d kD0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=cHzYVhSdRTq6LAlaTwonRvIMmt+UVxKfD/USh/QS9W8=; b=cdcGxhQwKDaeENt2AVVhKEp97V+yS4K69G+UK3Cw/iL5WOKhNLuJESoaU71m3uF8FC bmhIPbS62cUXeTIfOrYpUxGl5RE5Wi9LaELiARdlwWYzKrddSmWDMkO8xWfW17MgkCM6 L41MADiII8mv4FnYhiQaq1YWGL1WeKu+Y7uw85+K5Rh18kjHzPsp5nmhqB8KEju0y3Z7 lxK+X6b0QqfjjuiICznFR8IPCds4Ie3O11XAugVtSiUaR+DYCjSeH78uQo+1XITTpWot mXcBfBYS4MEnc5KRWQE/vj1y4C42LcLTDfimYOCO/Tl4SltYvmj1NIFeYOePBBDc+BAP GyyQ== X-Gm-Message-State: ANhLgQ0VFJ3/TnyMJw/se+KQU4PMJVusJD1S1a1qYv6YK/lbfem7BR+U DW7SkRTIOBkSd6ae1VQ550I87SmV X-Google-Smtp-Source: ADFU+vt65XKl4p0SJmTMNXY2kE0MJdYVWJXS6iJsb4d0GQtly5FUa5hdYUjMHkYyHNoFpdlV3LS9lQ== X-Received: by 2002:a1c:9a88:: with SMTP id c130mr24128182wme.73.1584296556560; Sun, 15 Mar 2020 11:22:36 -0700 (PDT) Received: from localhost.localdomain ([37.244.255.176]) by smtp.gmail.com with ESMTPSA id b203sm27363164wmc.45.2020.03.15.11.22.35 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 15 Mar 2020 11:22:36 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Sun, 15 Mar 2020 19:22:03 +0100 Message-Id: <20200315182206.20851-4-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200315182206.20851-1-onemda@gmail.com> References: <20200315182206.20851-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 4/7] avformat: add derf demuxer X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- libavformat/Makefile | 1 + libavformat/allformats.c | 1 + libavformat/derf.c | 79 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 libavformat/derf.c diff --git a/libavformat/Makefile b/libavformat/Makefile index cd3e9163f5..27615cd746 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -151,6 +151,7 @@ OBJS-$(CONFIG_DASH_DEMUXER) += dash.o dashdec.o OBJS-$(CONFIG_DAUD_DEMUXER) += dauddec.o OBJS-$(CONFIG_DAUD_MUXER) += daudenc.o OBJS-$(CONFIG_DCSTR_DEMUXER) += dcstr.o +OBJS-$(CONFIG_DERF_DEMUXER) += derf.o OBJS-$(CONFIG_DFA_DEMUXER) += dfa.o OBJS-$(CONFIG_DHAV_DEMUXER) += dhav.o OBJS-$(CONFIG_DIRAC_DEMUXER) += diracdec.o rawdec.o diff --git a/libavformat/allformats.c b/libavformat/allformats.c index d275c1017b..af10def88b 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -113,6 +113,7 @@ extern AVOutputFormat ff_data_muxer; extern AVInputFormat ff_daud_demuxer; extern AVOutputFormat ff_daud_muxer; extern AVInputFormat ff_dcstr_demuxer; +extern AVInputFormat ff_derf_demuxer; extern AVInputFormat ff_dfa_demuxer; extern AVInputFormat ff_dhav_demuxer; extern AVInputFormat ff_dirac_demuxer; diff --git a/libavformat/derf.c b/libavformat/derf.c new file mode 100644 index 0000000000..58bbf5b791 --- /dev/null +++ b/libavformat/derf.c @@ -0,0 +1,79 @@ +/* + * DERF demuxer + * Copyright (c) 2020 Paul B Mahol + * + * 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 "internal.h" +#include "pcm.h" + +static int derf_probe(const AVProbeData *p) +{ + if (AV_RL32(p->buf) != MKTAG('D','E','R','F')) + return 0; + if (AV_RL32(p->buf+4) != 1 && AV_RL32(p->buf+4) != 2) + return 0; + + return AVPROBE_SCORE_MAX / 3 * 2; +} + +static int derf_read_header(AVFormatContext *s) +{ + unsigned data_size; + AVIOContext *pb = s->pb; + AVCodecParameters *par; + AVStream *st; + + avio_skip(pb, 4); + + st = avformat_new_stream(s, NULL); + if (!st) + return AVERROR(ENOMEM); + + par = st->codecpar; + par->codec_type = AVMEDIA_TYPE_AUDIO; + par->codec_id = AV_CODEC_ID_DERF_DPCM; + par->format = AV_SAMPLE_FMT_S16; + par->channels = avio_rl32(pb); + if (par->channels != 1 && par->channels != 2) + return AVERROR_INVALIDDATA; + if (par->channels == 1) + par->channel_layout = AV_CH_LAYOUT_MONO; + else if (par->channels == 2) + par->channel_layout = AV_CH_LAYOUT_STEREO; + data_size = avio_rl32(pb); + st->duration = data_size / par->channels; + par->sample_rate = 22050; + par->block_align = 1; + + avpriv_set_pts_info(st, 64, 1, par->sample_rate); + + return 0; +} + +AVInputFormat ff_derf_demuxer = { + .name = "derf", + .long_name = NULL_IF_CONFIG_SMALL("Xilam DERF"), + .read_probe = derf_probe, + .read_header = derf_read_header, + .read_packet = ff_pcm_read_packet, + .read_seek = ff_pcm_read_seek, + .extensions = "adp", +}; From patchwork Sun Mar 15 18:22:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 18206 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 9D06F44B9E5 for ; Sun, 15 Mar 2020 20:22:46 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 82CF668B3F8; Sun, 15 Mar 2020 20:22:46 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2903B68A79B for ; Sun, 15 Mar 2020 20:22:40 +0200 (EET) Received: by mail-wr1-f66.google.com with SMTP id b2so12200261wrj.10 for ; Sun, 15 Mar 2020 11:22:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=mEcknqcLmGFt5RuJwuTHXDBg/6QkzpycFwH26IxS4bA=; b=m4OANN3bPknGHt8Gdody6L/+3RoEOTONXKlEWVhjU+oaQ7bZ24qRsOJ6G1dp0ujn46 1SvAYvqMZQUIWABYKnrPVILMsphfmOB+tfz7QShzoJRwT+91XDkNMHksn3n0Fjf/oMCY P+K1DpHqP3VLOn8vjWAQbd6Kt7xydA/L7YGKSQSGFw3m2I31O4aMwZnrqaxHHs2jSdYu dwWW1XTBZ4fVu+P4oiZL37jhOmeVobMuQsh/BLZ9PZhl2lkKK5d4iOGtEuoDQFpYmkjR P3PM/LLo8ovdO20cVIg/TzbmCZCC/RjzNkd2kFTlb1i7UpYmHgPE3dN2nEs7gMZWJjRF LTIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=mEcknqcLmGFt5RuJwuTHXDBg/6QkzpycFwH26IxS4bA=; b=d0kc1SvkfrFsDlciB6yQOqyMSm7dskVWCnx2UCtYDWF7jNHNEFJ7URzWaqgtSjIJYF Y0YoNOPyaBqQqAqxUMc+qbQCdUBMJeKeLukkktnkdewj0IBZvoGKSYzHnn13oQiKoP8Y I73ja5c9CRgTaRIloyqN2gldYMUUdlTk2UpllaalrlQwWZwCWcbweC3hml/MktUONKZ2 lcyEP45J0cJoeKr/yvBEY1wwueWvxC+XaqsbuaDgDZnNTCtRY3f5QkJOyt5keGuz7IzN /wb4xovdMK5ZxzMPEMiXVdP1SthiHJVIfveQNPNA9HW9C2sfEyxsJQOmwsEIFpe7p9EO fTOQ== X-Gm-Message-State: ANhLgQ0O9E9FlXGFizA8oGaJO6xD5zf4JFBxApMLQY32Hci7qwCCc5q5 K3ag1N5UeYDrbGkCKiiePCshZETI X-Google-Smtp-Source: ADFU+vulBtmGpLfvMwGxzdR7sHSOGJP3DCxq3wihaGcJDtH0TA9LHRrf4aAx7l7Fu2PlBpsIgUxsIA== X-Received: by 2002:a5d:6748:: with SMTP id l8mr22082454wrw.265.1584296559385; Sun, 15 Mar 2020 11:22:39 -0700 (PDT) Received: from localhost.localdomain ([37.244.255.176]) by smtp.gmail.com with ESMTPSA id b203sm27363164wmc.45.2020.03.15.11.22.36 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 15 Mar 2020 11:22:38 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Sun, 15 Mar 2020 19:22:04 +0100 Message-Id: <20200315182206.20851-5-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200315182206.20851-1-onemda@gmail.com> References: <20200315182206.20851-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 5/7] avcodec/allcodecs: move sdx2 to correct place X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- libavcodec/allcodecs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 6046b15164..71e14c73e3 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -275,7 +275,6 @@ extern AVCodec ff_s302m_decoder; extern AVCodec ff_sanm_decoder; extern AVCodec ff_scpr_decoder; extern AVCodec ff_screenpresso_decoder; -extern AVCodec ff_sdx2_dpcm_decoder; extern AVCodec ff_sgi_encoder; extern AVCodec ff_sgi_decoder; extern AVCodec ff_sgirle_decoder; @@ -574,6 +573,7 @@ extern AVCodec ff_gremlin_dpcm_decoder; extern AVCodec ff_interplay_dpcm_decoder; extern AVCodec ff_roq_dpcm_encoder; extern AVCodec ff_roq_dpcm_decoder; +extern AVCodec ff_sdx2_dpcm_decoder; extern AVCodec ff_sol_dpcm_decoder; extern AVCodec ff_xan_dpcm_decoder; From patchwork Sun Mar 15 18:22:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 18208 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 5B11244B9E5 for ; Sun, 15 Mar 2020 20:22:51 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 47D7368B440; Sun, 15 Mar 2020 20:22:51 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 54F7C68A9CE for ; Sun, 15 Mar 2020 20:22:44 +0200 (EET) Received: by mail-wr1-f46.google.com with SMTP id x11so13700011wrv.5 for ; Sun, 15 Mar 2020 11:22:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=Pfm37YLcxFguddy2/9E4oK/NkG+9zn4AOyiHHEUtGk0=; b=WaQtCz8hZuR77nYm3tb1nxfBeOPFcngUsTGaFUcerEapoAdCvvAgYdqwQHY7X/4SZC qKlZKkctoZzp99vPwa2oyZNZazzS+4S16oXZ5IbWQBxvSXN64f3KVVRfC81p+dB3VMxs XkbmyB7ywQMDVzPnCYbz1+Omlu2Mgi2W+mNWeWktCkay+MysoiayarN+nbwVegPv8zDY g2X0QL1fP6gq9NG/l3fminX0+BP5zQKzMURzxQzO0+TsEN/ZxHhNMPiu+OQPNQSNX3Ui XjsWWYLJbvcV6MK5s9JneTw6CL8SDD6Krh5apBrdHMDjXz0wdjs8VNM2mJS1l9bhNK+U 2DlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=Pfm37YLcxFguddy2/9E4oK/NkG+9zn4AOyiHHEUtGk0=; b=jbNdkI6QjXN/9NQAST+6BPAWSdpjLp7Ta06qID6S9MAgwfXLCjyq0BlQPZZypZH7O8 aXkL0/0iAfKN122niH3JBsquYY9cQvwhRnXcBFqQ0aUxjHpabMhpBKWkpDmz5G5wSRZI T9Iml3cSALL7HxQUu+5B0d844rwYjPBRQ/jFES8StTAXjiHvXCU2/9abfA9cwgArVSq4 A6hCjDq1wUhgRsQcfnLh3ZFCvmzl3UnxRwtKH7D/unLWswBE6g06ACYKlHHN1WTBlZUs VScF37zI8f+H9WneFg3ZEIaDRyhCpKOQIP5LsJe8fhxcmpYqd1zgZ1c4L27uApGuXoU/ OdEA== X-Gm-Message-State: ANhLgQ09Huy6lT+juWuUp5Q8R9lahYVlOvVjV4lj7j5fdwhFSezZhe1l PIgeDVi/aRkePRkBAAfqGjUAvoay X-Google-Smtp-Source: ADFU+vuyAVdItK1fkN2/Tg7suAm6sswXC2kqYvoUv5URzZBsoM9ZSLy575P+0h0PraKwjEpWFOkUEg== X-Received: by 2002:a5d:4d07:: with SMTP id z7mr24572088wrt.89.1584296562919; Sun, 15 Mar 2020 11:22:42 -0700 (PDT) Received: from localhost.localdomain ([37.244.255.176]) by smtp.gmail.com with ESMTPSA id b203sm27363164wmc.45.2020.03.15.11.22.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 15 Mar 2020 11:22:42 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Sun, 15 Mar 2020 19:22:05 +0100 Message-Id: <20200315182206.20851-6-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200315182206.20851-1-onemda@gmail.com> References: <20200315182206.20851-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 6/7] avcodec: add CRI HCA decoder X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/avcodec.h | 1 + libavcodec/codec_desc.c | 7 + libavcodec/hca_data.h | 128 ++++++++++++++ libavcodec/hcadec.c | 373 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 511 insertions(+) create mode 100644 libavcodec/hca_data.h create mode 100644 libavcodec/hcadec.c diff --git a/libavcodec/Makefile b/libavcodec/Makefile index a88643b7d2..c1c9a44f2b 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -367,6 +367,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_HCA_DECODER) += hcadec.o OBJS-$(CONFIG_HCOM_DECODER) += hcom.o OBJS-$(CONFIG_HEVC_DECODER) += hevcdec.o hevc_mvs.o \ hevc_cabac.o hevc_refs.o hevcpred.o \ diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 71e14c73e3..b3184af954 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -432,6 +432,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_hca_decoder; extern AVCodec ff_hcom_decoder; extern AVCodec ff_iac_decoder; extern AVCodec ff_ilbc_decoder; diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index e9c658fddc..6e03cb5902 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -668,6 +668,7 @@ enum AVCodecID { AV_CODEC_ID_ACELP_KELVIN, AV_CODEC_ID_MPEGH_3D_AUDIO, AV_CODEC_ID_SIREN, + AV_CODEC_ID_HCA, /* 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 130e08c1f2..ece6eadae4 100644 --- a/libavcodec/codec_desc.c +++ b/libavcodec/codec_desc.c @@ -3079,6 +3079,13 @@ static const AVCodecDescriptor codec_descriptors[] = { .long_name = NULL_IF_CONFIG_SMALL("Siren"), .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, }, + { + .id = AV_CODEC_ID_HCA, + .type = AVMEDIA_TYPE_AUDIO, + .name = "hca", + .long_name = NULL_IF_CONFIG_SMALL("CRI HCA"), + .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, + }, /* subtitle codecs */ { diff --git a/libavcodec/hca_data.h b/libavcodec/hca_data.h new file mode 100644 index 0000000000..a2831381b9 --- /dev/null +++ b/libavcodec/hca_data.h @@ -0,0 +1,128 @@ +/* + * 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 + */ + + +#ifndef AVCODEC_HCA_DATA_H +#define AVCODEC_HCA_DATA_H + +#include + +static const uint8_t max_bits_table[] = { + 0, 2, 3, 3, 4, 4, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, +}; + +static const uint8_t quant_spectrum_bits[] = +{ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,3,3,0,0,0,0,0,0,0,0, + 2,2,3,3,3,3,3,3,0,0,0,0,0,0,0,0, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4, + 3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4, + 3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4, + 3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +}; + +static const int8_t quant_spectrum_value[] = +{ + +0,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0, + +0,+0,+1,-1,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0, + +0,+0,+1,+1,-1,-1,+2,-2,+0,+0,+0,+0,+0,+0,+0,+0, + +0,+0,+1,-1,+2,-2,+3,-3,+0,+0,+0,+0,+0,+0,+0,+0, + +0,+0,+1,+1,-1,-1,+2,+2,-2,-2,+3,+3,-3,-3,+4,-4, + +0,+0,+1,+1,-1,-1,+2,+2,-2,-2,+3,-3,+4,-4,+5,-5, + +0,+0,+1,+1,-1,-1,+2,-2,+3,-3,+4,-4,+5,-5,+6,-6, + +0,+0,+1,-1,+2,-2,+3,-3,+4,-4,+5,-5,+6,-6,+7,-7, +}; + +static const uint8_t scale_table[] = +{ + 14, 14, 14, 14, 14, 14, 13, 13, + 13, 13, 13, 13, 12, 12, 12, 12, + 12, 12, 11, 11, 11, 11, 11, 11, + 10, 10, 10, 10, 10, 10, 10, 9, + 9, 9, 9, 9, 9, 8, 8, 8, + 8, 8, 8, 7, 6, 6, 5, 4, + 4, 4, 3, 3, 3, 2, 2, 2, + 2, 0, 0, 0, 0, 0, 0, 0, +}; + +static const uint32_t window[128] = +{ + 0x3A3504F0,0x3B0183B8,0x3B70C538,0x3BBB9268,0x3C04A809,0x3C308200,0x3C61284C,0x3C8B3F17, + 0x3CA83992,0x3CC77FBD,0x3CE91110,0x3D0677CD,0x3D198FC4,0x3D2DD35C,0x3D434643,0x3D59ECC1, + 0x3D71CBA8,0x3D85741E,0x3D92A413,0x3DA078B4,0x3DAEF522,0x3DBE1C9E,0x3DCDF27B,0x3DDE7A1D, + 0x3DEFB6ED,0x3E00D62B,0x3E0A2EDA,0x3E13E72A,0x3E1E00B1,0x3E287CF2,0x3E335D55,0x3E3EA321, + 0x3E4A4F75,0x3E56633F,0x3E62DF37,0x3E6FC3D1,0x3E7D1138,0x3E8563A2,0x3E8C72B7,0x3E93B561, + 0x3E9B2AEF,0x3EA2D26F,0x3EAAAAAB,0x3EB2B222,0x3EBAE706,0x3EC34737,0x3ECBD03D,0x3ED47F46, + 0x3EDD5128,0x3EE6425C,0x3EEF4EFF,0x3EF872D7,0x3F00D4A9,0x3F0576CA,0x3F0A1D3B,0x3F0EC548, + 0x3F136C25,0x3F180EF2,0x3F1CAAC2,0x3F213CA2,0x3F25C1A5,0x3F2A36E7,0x3F2E9998,0x3F32E705, + 0xBF371C9E,0xBF3B37FE,0xBF3F36F2,0xBF431780,0xBF46D7E6,0xBF4A76A4,0xBF4DF27C,0xBF514A6F, + 0xBF547DC5,0xBF578C03,0xBF5A74EE,0xBF5D3887,0xBF5FD707,0xBF6250DA,0xBF64A699,0xBF66D908, + 0xBF68E90E,0xBF6AD7B1,0xBF6CA611,0xBF6E5562,0xBF6FE6E7,0xBF715BEF,0xBF72B5D1,0xBF73F5E6, + 0xBF751D89,0xBF762E13,0xBF7728D7,0xBF780F20,0xBF78E234,0xBF79A34C,0xBF7A5397,0xBF7AF439, + 0xBF7B8648,0xBF7C0ACE,0xBF7C82C8,0xBF7CEF26,0xBF7D50CB,0xBF7DA88E,0xBF7DF737,0xBF7E3D86, + 0xBF7E7C2A,0xBF7EB3CC,0xBF7EE507,0xBF7F106C,0xBF7F3683,0xBF7F57CA,0xBF7F74B6,0xBF7F8DB6, + 0xBF7FA32E,0xBF7FB57B,0xBF7FC4F6,0xBF7FD1ED,0xBF7FDCAD,0xBF7FE579,0xBF7FEC90,0xBF7FF22E, + 0xBF7FF688,0xBF7FF9D0,0xBF7FFC32,0xBF7FFDDA,0xBF7FFEED,0xBF7FFF8F,0xBF7FFFDF,0xBF7FFFFC, +}; + +static const uint32_t intensity_ratio_table[] = +{ + 0x40000000,0x3FEDB6DB,0x3FDB6DB7,0x3FC92492,0x3FB6DB6E,0x3FA49249,0x3F924925,0x3F800000, + 0x3F5B6DB7,0x3F36DB6E,0x3F124925,0x3EDB6DB7,0x3E924925,0x3E124925,0x00000000,0x00000000, + 0x00000000,0x32A0B051,0x32D61B5E,0x330EA43A,0x333E0F68,0x337D3E0C,0x33A8B6D5,0x33E0CCDF, + 0x3415C3FF,0x34478D75,0x3484F1F6,0x34B123F6,0x34EC0719,0x351D3EDA,0x355184DF,0x358B95C2, + 0x35B9FCD2,0x35F7D0DF,0x36251958,0x365BFBB8,0x36928E72,0x36C346CD,0x370218AF,0x372D583F, + 0x3766F85B,0x3799E046,0x37CD078C,0x3808980F,0x38360094,0x38728177,0x38A18FAF,0x38D744FD, + 0x390F6A81,0x393F179A,0x397E9E11,0x39A9A15B,0x39E2055B,0x3A16942D,0x3A48A2D8,0x3A85AAC3, + 0x3AB21A32,0x3AED4F30,0x3B1E196E,0x3B52A81E,0x3B8C57CA,0x3BBAFF5B,0x3BF9295A,0x3C25FED7, + 0x3C5D2D82,0x3C935A2B,0x3CC4563F,0x3D02CD87,0x3D2E4934,0x3D68396A,0x3D9AB62B,0x3DCE248C, + 0x3E0955EE,0x3E36FD92,0x3E73D290,0x3EA27043,0x3ED87039,0x3F1031DC,0x3F40213B,0x00000000, +}; + +static const uint32_t scale_conversion_table[] = +{ + 0x3F800000,0x3FAA8D26,0x3FE33F89,0x4017657D,0x4049B9BE,0x40866491,0x40B311C4,0x40EE9910, + 0x411EF532,0x4153CCF1,0x418D1ADF,0x41BC034A,0x41FA83B3,0x4226E595,0x425E60F5,0x429426FF, + 0x42C5672A,0x43038359,0x432F3B79,0x43697C38,0x439B8D3A,0x43CF4319,0x440A14D5,0x4437FBF0, + 0x4475257D,0x44A3520F,0x44D99D16,0x4510FA4D,0x45412C4D,0x4580B1ED,0x45AB7A3A,0x45E47B6D, + 0x461837F0,0x464AD226,0x46871F62,0x46B40AAF,0x46EFE4BA,0x471FD228,0x4754F35B,0x478DDF04, + 0x47BD08A4,0x47FBDFED,0x4827CD94,0x485F9613,0x4894F4F0,0x48C67991,0x49043A29,0x49302F0E, + 0x496AC0C7,0x499C6573,0x49D06334,0x4A0AD4C6,0x4A38FBAF,0x4A767A41,0x4AA43516,0x4ADACB94, + 0x4B11C3D3,0x4B4238D2,0x4B8164D2,0x4BAC6897,0x4BE5B907,0x4C190B88,0x4C4BEC15,0x00000000, +}; + +static const uint32_t dequantizer_scaling_table[] = +{ + 0x342A8D26,0x34633F89,0x3497657D,0x34C9B9BE,0x35066491,0x353311C4,0x356E9910,0x359EF532, + 0x35D3CCF1,0x360D1ADF,0x363C034A,0x367A83B3,0x36A6E595,0x36DE60F5,0x371426FF,0x3745672A, + 0x37838359,0x37AF3B79,0x37E97C38,0x381B8D3A,0x384F4319,0x388A14D5,0x38B7FBF0,0x38F5257D, + 0x3923520F,0x39599D16,0x3990FA4D,0x39C12C4D,0x3A00B1ED,0x3A2B7A3A,0x3A647B6D,0x3A9837F0, + 0x3ACAD226,0x3B071F62,0x3B340AAF,0x3B6FE4BA,0x3B9FD228,0x3BD4F35B,0x3C0DDF04,0x3C3D08A4, + 0x3C7BDFED,0x3CA7CD94,0x3CDF9613,0x3D14F4F0,0x3D467991,0x3D843A29,0x3DB02F0E,0x3DEAC0C7, + 0x3E1C6573,0x3E506334,0x3E8AD4C6,0x3EB8FBAF,0x3EF67A41,0x3F243516,0x3F5ACB94,0x3F91C3D3, + 0x3FC238D2,0x400164D2,0x402C6897,0x4065B907,0x40990B88,0x40CBEC15,0x4107DB35,0x413504F3, +}; +static const uint32_t quant_step_size[] = +{ + 0x00000000,0x3F2AAAAB,0x3ECCCCCD,0x3E924925,0x3E638E39,0x3E3A2E8C,0x3E1D89D9,0x3E088889, + 0x3D842108,0x3D020821,0x3C810204,0x3C008081,0x3B804020,0x3B002008,0x3A801002,0x3A000801, +}; + +#endif /* AVCODEC_HCA_DATA_H */ diff --git a/libavcodec/hcadec.c b/libavcodec/hcadec.c new file mode 100644 index 0000000000..4163943a6e --- /dev/null +++ b/libavcodec/hcadec.c @@ -0,0 +1,373 @@ +/* + * 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/avassert.h" +#include "libavutil/crc.h" +#include "libavutil/float_dsp.h" +#include "libavutil/intreadwrite.h" +#include "libavutil/tx.h" + +#include "avcodec.h" +#include "get_bits.h" +#include "internal.h" +#include "hca_data.h" + +typedef struct ChannelContext { + float base[128]; + int8_t scale_factors[128]; + uint8_t scale[128]; + int8_t intensity[8]; + int8_t *hfr_scale; + float imdct_in[128]; + float imdct_out[128]; + float wav2[128]; + float wav3[128]; + unsigned count; + int chan_type; +} ChannelContext; + +typedef struct HCAContext { + GetBitContext gb; + + const AVCRC *crc_table; + + ChannelContext ch[16]; + + uint8_t ath[128]; + + int hfr_group_count; + uint8_t track_count; + uint8_t channel_config; + uint8_t total_band_count; + uint8_t base_band_count; + uint8_t stereo_band_count; + uint8_t bands_per_hfr_group; + + av_tx_fn tx_fn; + AVTXContext *tx_ctx; + AVFloatDSPContext *fdsp; +} HCAContext; + +static inline unsigned ceil2(unsigned a, unsigned b) +{ + return (b > 0) ? (a / b + ((a % b) ? 1 : 0)) : 0; +} + +static av_cold int decode_init(AVCodecContext *avctx) +{ + HCAContext *c = avctx->priv_data; + int8_t r[0x10] = { 0 }; + float scale = 1.f / 8.f; + unsigned b; + + avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; + c->crc_table = av_crc_get_table(AV_CRC_16_ANSI); + + if (avctx->extradata_size < 12) + return AVERROR(EINVAL); + + if (avctx->channels < 0 || avctx->channels > 16) + return AVERROR(EINVAL); + + if (avctx->extradata[0] != 1 || avctx->extradata[1] != 15 || !avctx->extradata[2]) + return AVERROR(EINVAL); + + c->track_count = avctx->extradata[2]; + c->channel_config = avctx->extradata[3]; + c->total_band_count = avctx->extradata[4]; + c->base_band_count = avctx->extradata[5]; + c->stereo_band_count = avctx->extradata[6]; + c->bands_per_hfr_group = avctx->extradata[7]; + + b = avctx->channels / c->track_count; + if (c->stereo_band_count && b > 1) { + int8_t *x = r; + + for (int i = 0; i < c->track_count; i++, x+=b) { + switch (b) { + case 2: + case 3: + x[0] = 1; + x[1] = 2; + break; + case 4: + x[0]=1; x[1] = 2; + if (c->channel_config == 0) { + x[2]=1; + x[3]=2; + } + break; + case 5: + x[0]=1; x[1] = 2; + if (c->channel_config <= 2) { + x[3]=1; + x[4]=2; + } + break; + case 6: + case 7: + x[0] = 1; x[1] = 2; x[4] = 1; x[5] = 2; + break; + case 8: + x[0] = 1; x[1] = 2; x[4] = 1; x[5] = 2; x[6] = 1; x[7] = 2; + break; + } + } + } + + for (int i = 0; i < avctx->channels; i++) { + c->ch[i].chan_type = r[i]; + c->ch[i].count = c->base_band_count + ((r[i] != 2) ? c->stereo_band_count : 0); + c->ch[i].hfr_scale = &c->ch[i].scale_factors[c->base_band_count + c->stereo_band_count]; + } + + c->hfr_group_count = ceil2(c->total_band_count - (c->base_band_count + c->stereo_band_count), c->bands_per_hfr_group); + + c->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT); + if (!c->fdsp) + return AVERROR(ENOMEM); + + return av_tx_init(&c->tx_ctx, &c->tx_fn, AV_TX_FLOAT_MDCT, 1, 128, &scale, 0); +} + +static void run_imdct(HCAContext *c, ChannelContext *ch, int index, float *out) +{ + float *s, *d, *s1, *s2; + + c->tx_fn(c->tx_ctx, ch->imdct_out, ch->imdct_in, sizeof(float)); + + d = ch->wav2; + for (int i = 0; i < 128; i++) + *(d++) = ch->imdct_out[127 - i]; + + s = (float *)window; + d = out; + s1 = &ch->wav2[64]; + s2 = ch->wav3; + for (int i = 0; i < 64; i++) + *(d++) = *(s1++) * *(s++) + *(s2++); + for (int i = 0; i < 64; i++) + *(d++) = *(s++) * *(--s1) - *(s2++); + + s1 = &ch->wav2[64-1]; + s2 = ch->wav3; + for (int i = 0; i < 64; i++) + *(s2++) = *(s1--) * *(--s); + for (int i = 0; i < 64; i++) + *(s2++) = *(--s) * *(++s1); +} + +static void apply_intensity_stereo(HCAContext *s, ChannelContext *ch, ChannelContext *ch2, + int index, unsigned band_count, unsigned base_band_count, + unsigned stereo_band_count) +{ + float ratio_l = ((float *)intensity_ratio_table)[ch->intensity[index]]; + float ratio_r = ratio_l - 2.0f; + float *c1 = &ch->imdct_in[base_band_count]; + float *c2 = &ch2->imdct_in[base_band_count]; + + if (ch->chan_type != 1 || !stereo_band_count) + return; + + for (int i = 0; i < band_count; i++) { + *(c2++) = *c1 * ratio_r; + *(c1++) *= ratio_l; + } +} + +static void reconstruct_hfr(HCAContext *s, ChannelContext *ch, + unsigned hfr_group_count, + unsigned bands_per_hfr_group, + unsigned start_band, unsigned total_band_count) +{ + static float *listFloat = (float *)scale_conversion_table; + + if (ch->chan_type == 2 || !bands_per_hfr_group) + return; + + for (int i = 0, k = start_band, l = start_band - 1; i < hfr_group_count; i++){ + for (int j = 0; j < bands_per_hfr_group && k < total_band_count; j++, k++, l--){ + ch->imdct_in[k] = listFloat[ch->hfr_scale[i] - ch->scale_factors[l]] * ch->imdct_in[l]; + } + } + + ch->imdct_in[127] = 0; +} + +static void dequantize_coefficients(HCAContext *c, ChannelContext *ch) +{ + GetBitContext *gb = &c->gb; + + for (int i = 0; i < ch->count; i++) { + unsigned scale = ch->scale[i]; + int nb_bits = max_bits_table[scale]; + int value = get_bitsz(gb, nb_bits); + float factor; + + if (scale > 7) { + value = (1 - ((value & 1) << 1)) * (value >> 1); + if (!value) + skip_bits_long(gb, -1); + factor = value; + } else { + value += scale << 4; + skip_bits_long(gb, quant_spectrum_bits[value] - nb_bits); + factor = quant_spectrum_value[value]; + } + ch->imdct_in[i] = factor * ch->base[i]; + } + + memset(ch->imdct_in + ch->count, 0, sizeof(ch->imdct_in) - ch->count * sizeof(ch->imdct_in[0])); +} + +static void unpack(HCAContext *c, ChannelContext *ch, + unsigned hfr_group_count, int packed_noise_level, const uint8_t *ath) +{ + GetBitContext *gb = &c->gb; + + static float *valueFloat=(float *)dequantizer_scaling_table; + static float *scaleFloat=(float *)quant_step_size; + int delta_bits = get_bits(gb, 3); + + if (delta_bits > 5) { + for (int i = 0; i < ch->count; i++) + ch->scale_factors[i] = get_bits(gb, 6); + } else if (delta_bits) { + int factor = get_bits(gb, 6); + int max_value = (1 << delta_bits) - 1; + int half_max = max_value >> 1; + + ch->scale_factors[0] = factor; + for (int i = 1; i < ch->count; i++){ + int delta = get_bits(gb, delta_bits); + + if (delta == max_value) { + factor = get_bits(gb, 6); + } else { + factor += delta - half_max; + } + + ch->scale_factors[i] = factor; + } + } else { + memset(ch->scale_factors, 0, 128); + } + + if (ch->chan_type == 2){ + ch->intensity[0] = get_bits(gb, 4); + if (ch->intensity[0] < 15) { + for (int i = 1; i < 8; i++) + ch->intensity[i] = get_bits(gb, 4); + } + } else { + for (int i = 0; i < hfr_group_count; i++) + ch->hfr_scale[i] = get_bits(gb, 6); + } + + for (int i = 0; i < ch->count; i++) { + int scale = ch->scale_factors[i]; + + if (scale) { + scale = c->ath[i] + ((packed_noise_level + i) >> 8) - ((scale * 5) >> 1) + 1; + if (scale < 0) { + scale = 15; + } else if (scale > 56) { + scale = 1; + } else { + scale = scale_table[scale]; + } + } + ch->scale[i] = scale; + } + + memset(ch->scale + ch->count, 0, sizeof(ch->scale) - ch->count); + + for (int i = 0; i < ch->count; i++) + ch->base[i] = valueFloat[ch->scale_factors[i]] * scaleFloat[ch->scale[i]]; +} + +static int decode_frame(AVCodecContext *avctx, void *data, + int *got_frame_ptr, AVPacket *avpkt) +{ + AVFrame *frame = data; + HCAContext *c = avctx->priv_data; + int ch, ret, packed_noise_level; + GetBitContext *gb = &c->gb; + float **samples; + + if (av_crc(c->crc_table, 0, avpkt->data, avpkt->size)) + return AVERROR_INVALIDDATA; + + frame->nb_samples = 1024; + if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) + return ret; + samples = (float **)frame->extended_data; + + if ((ret = init_get_bits8(gb, avpkt->data, avpkt->size)) < 0) + return ret; + + if (get_bits(gb, 16) != 0xFFFF) + return AVERROR_INVALIDDATA; + + packed_noise_level = (get_bits(gb, 9) << 8) - get_bits(gb, 7); + + for (ch = 0; ch < avctx->channels; ch++) + unpack(c, &c->ch[ch], c->hfr_group_count, packed_noise_level, c->ath); + + for (int i = 0; i < 8; i++) { + for (ch = 0; ch < avctx->channels; ch++) + dequantize_coefficients(c, &c->ch[ch]); + for (ch = 0; ch < avctx->channels; ch++) + reconstruct_hfr(c, &c->ch[ch], c->hfr_group_count, c->bands_per_hfr_group, + c->stereo_band_count + c->base_band_count, c->total_band_count); + for (ch = 0; ch < avctx->channels - 1; ch++) + apply_intensity_stereo(c, &c->ch[ch], &c->ch[ch+1], i, + c->total_band_count - c->base_band_count, + c->base_band_count, c->stereo_band_count); + for (ch = 0; ch < avctx->channels; ch++) + run_imdct(c, &c->ch[ch], i, samples[ch] + i * 128); + } + + *got_frame_ptr = 1; + + return avpkt->size; +} + +static av_cold int decode_close(AVCodecContext *avctx) +{ + HCAContext *c = avctx->priv_data; + + av_freep(&c->fdsp); + av_tx_uninit(&c->tx_ctx); + + return 0; +} + +AVCodec ff_hca_decoder = { + .name = "hca", + .long_name = NULL_IF_CONFIG_SMALL("CRI HCA"), + .type = AVMEDIA_TYPE_AUDIO, + .id = AV_CODEC_ID_HCA, + .priv_data_size = sizeof(HCAContext), + .init = decode_init, + .decode = decode_frame, + .close = decode_close, + .capabilities = AV_CODEC_CAP_DR1, + .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, + AV_SAMPLE_FMT_NONE }, +}; From patchwork Sun Mar 15 18:22:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 18207 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 87EA144B9E5 for ; Sun, 15 Mar 2020 20:22:50 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 73C4868B42B; Sun, 15 Mar 2020 20:22:50 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4191D68B3F8 for ; Sun, 15 Mar 2020 20:22:46 +0200 (EET) Received: by mail-wr1-f67.google.com with SMTP id t2so8380971wrx.12 for ; Sun, 15 Mar 2020 11:22:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=0nsCcugc2D8wahcVH5yeTq8HJq/+OMMR52yWJzTviJA=; b=vW6c2HU5Oc/jo1EGjr55SeS5wCwbtLMUHNljcjeo3wKTeu0t7Qmt9iffGf01RY0QXf WQtUvQuPXs3YZ5aqcIKMK8ZPrk423vw694o0FcllaUoub2+6FBPDlkrtlgb0R1QlS7Xc mDFeU+vnf6U36HvNmguGAcfjqCfvs83b6gY43Col4KPv8ztAD/2UKf9V27Yit2YyOoof xHyWclWm5oLI4xUHSLcaHFaSL0T6oYsssw2zGcyfwaEgGNWBl7E7xkvJNoKZk+WnN8R4 zGTIcYnXQfYvSqj96xj6+fqJPgvYmEFCOFAKFGu4dTAtaV8eE13hf4pFKAUvtG4Nryvn 2+XQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=0nsCcugc2D8wahcVH5yeTq8HJq/+OMMR52yWJzTviJA=; b=pkMhGGXG8GqAjdshIFSU56opnHLo1USST1ZTXafpbDNfHiYxUPJNFXD6FfxgTVXoN+ 0t49AbbNmoxZ0XegxezqvLQ1ueq9ylKqdzoq1TUWVH4h9SrJk022WF9ChZGGx84t39Bd +CPScs9ObuuHogaxUJV/l4hOGoGvQLu3H5Z9wjCu5mO7ujqcOSsA26R6yRDl1h1yXdhL x6raKYmfZhuzwvWTiC14M7lDkORRivCxkr/lHKWaR9MUUKv6yZiK5gCcSw1L0nNto+kX VGn6SClAx2irGDfsEOdCxVgnUVu+vHap77IOD4oegpNtthPXnMmJLgpKemRIap8QQj1C pLKQ== X-Gm-Message-State: ANhLgQ0Muv0XaPOVmphI8RyhicGwtqmK+T/1Bg3Jowk6vxSKMit5ignL +1CV6mSw4UXHpEyl+3IN2bh+nymR X-Google-Smtp-Source: ADFU+vvIqHBiP1O2jfKPH1kWhoy2N+oZAcEBHkb5R+gBNtku5i8UWTD2T7RFFaRnNdWzDLZkAJmr7w== X-Received: by 2002:adf:afcb:: with SMTP id y11mr29426915wrd.141.1584296565163; Sun, 15 Mar 2020 11:22:45 -0700 (PDT) Received: from localhost.localdomain ([37.244.255.176]) by smtp.gmail.com with ESMTPSA id b203sm27363164wmc.45.2020.03.15.11.22.43 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 15 Mar 2020 11:22:44 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Sun, 15 Mar 2020 19:22:06 +0100 Message-Id: <20200315182206.20851-7-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200315182206.20851-1-onemda@gmail.com> References: <20200315182206.20851-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 7/7] avformat: add hca demuxer X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- libavformat/Makefile | 1 + libavformat/allformats.c | 1 + libavformat/hca.c | 144 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 libavformat/hca.c diff --git a/libavformat/Makefile b/libavformat/Makefile index 27615cd746..5196f998ed 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -224,6 +224,7 @@ OBJS-$(CONFIG_H263_MUXER) += rawenc.o OBJS-$(CONFIG_H264_DEMUXER) += h264dec.o rawdec.o OBJS-$(CONFIG_H264_MUXER) += rawenc.o OBJS-$(CONFIG_HASH_MUXER) += hashenc.o +OBJS-$(CONFIG_HCA_DEMUXER) += hca.o OBJS-$(CONFIG_HCOM_DEMUXER) += hcom.o pcm.o OBJS-$(CONFIG_HDS_MUXER) += hdsenc.o OBJS-$(CONFIG_HEVC_DEMUXER) += hevcdec.o rawdec.o diff --git a/libavformat/allformats.c b/libavformat/allformats.c index af10def88b..39d2c352f5 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -182,6 +182,7 @@ extern AVOutputFormat ff_h263_muxer; extern AVInputFormat ff_h264_demuxer; extern AVOutputFormat ff_h264_muxer; extern AVOutputFormat ff_hash_muxer; +extern AVInputFormat ff_hca_demuxer; extern AVInputFormat ff_hcom_demuxer; extern AVOutputFormat ff_hds_muxer; extern AVInputFormat ff_hevc_demuxer; diff --git a/libavformat/hca.c b/libavformat/hca.c new file mode 100644 index 0000000000..000833f55d --- /dev/null +++ b/libavformat/hca.c @@ -0,0 +1,144 @@ +/* + * HCA demuxer + * Copyright (c) 2016 Paul B Mahol + * + * 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 "internal.h" + +static int hca_probe(const AVProbeData *p) +{ + if (AV_RL32(p->buf) != MKTAG('H', 'C', 'A', 0)) + return 0; + + return AVPROBE_SCORE_MAX / 3; +} + +static int hca_read_header(AVFormatContext *s) +{ + AVCodecParameters *par; + AVIOContext *pb = s->pb; + AVStream *st; + uint32_t chunk; + uint16_t version; + uint32_t block_count; + uint16_t block_size; + int ath_type; + + avio_skip(pb, 4); + version = avio_rb16(pb); + ath_type = version < 0x200 ? 1 : 0; + s->internal->data_offset = avio_rb16(pb); + + if (avio_rl32(pb) != MKTAG('f', 'm', 't', 0)) + return AVERROR_INVALIDDATA; + + st = avformat_new_stream(s, NULL); + if (!st) + return AVERROR(ENOMEM); + + par = st->codecpar; + par->codec_type = AVMEDIA_TYPE_AUDIO; + par->codec_id = AV_CODEC_ID_HCA; + par->codec_tag = 0; + par->channels = avio_r8(pb); + par->sample_rate = avio_rb24(pb); + block_count = avio_rb32(pb); + avio_skip(pb, 4); + if (ff_alloc_extradata(par, 12) < 0) + return AVERROR(ENOMEM); + memset(par->extradata, 0, 12); + + chunk = avio_rl32(pb); + if (chunk == MKTAG('c', 'o', 'm', 'p')) { + block_size = avio_rb16(pb); + avio_read(pb, par->extradata, 8); + avio_skip(pb, 2); + } else if (chunk == MKTAG('d', 'e', 'c', 0)) { + int count1, count2, count3, enable; + + block_size = avio_rb16(pb); + par->extradata[0] = avio_r8(pb); + par->extradata[1] = avio_r8(pb); + count1 = avio_r8(pb); + count2 = avio_r8(pb); + count3 = avio_r8(pb); + enable = avio_r8(pb); + par->extradata[2] = FFMAX(count3 >> 4, 1); + par->extradata[3] = count3 & 0xf; + par->extradata[4] = count1 + 1; + par->extradata[5] = (enable ? count2 : count1) + 1; + par->extradata[6] = par->extradata[4] - par->extradata[5]; + } else { + return AVERROR_INVALIDDATA; + } + + if (block_size < 8) { + return AVERROR_INVALIDDATA; + } + par->block_align = block_size; + st->duration = 1024 * block_count; + + while (avio_tell(pb) < s->internal->data_offset && !avio_feof(pb)) { + chunk = avio_rl32(pb) & 0x7f7f7f7f; + + if (chunk == MKTAG('v', 'b', 'r', 0)) { + avio_skip(pb, 4); + } else if (chunk == MKTAG('a', 't', 'h', 0)) { + ath_type = avio_rb16(pb); + } else if (chunk == MKTAG('l', 'o', 'o', 'p')) { + avio_skip(pb, 12); + } else if (chunk == MKTAG('c', 'i', 'p', 'h')) { + par->extradata[8] = avio_r8(pb); + par->extradata[9] = avio_r8(pb); + } else if (chunk == MKTAG('r', 'v', 'a', 0)) { + avio_skip(pb, 4); + } else if (chunk == MKTAG('c', 'o', 'm', 'm')) { + avio_skip(pb, avio_r8(pb)); + } else if (chunk == MKTAG('p', 'a', 'd', 0)) { + break; + } + } + + avio_seek(pb, s->internal->data_offset, SEEK_SET); + avpriv_set_pts_info(st, 64, 1, par->sample_rate); + + return 0; +} + +static int hca_read_packet(AVFormatContext *s, AVPacket *pkt) +{ + AVCodecContext *codec = s->streams[0]->codec; + int ret; + + ret = av_get_packet(s->pb, pkt, codec->block_align); + pkt->duration = 1024; + return ret; +} + +AVInputFormat ff_hca_demuxer = { + .name = "hca", + .long_name = NULL_IF_CONFIG_SMALL("CRI HCA"), + .read_probe = hca_probe, + .read_header = hca_read_header, + .read_packet = hca_read_packet, + .extensions = "hca", + .flags = AVFMT_GENERIC_INDEX, +};