1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * TTA (The Lossless True Audio) encoder 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * This file is part of FFmpeg. 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14cabdff1aSopenharmony_ci * Lesser General Public License for more details. 15cabdff1aSopenharmony_ci * 16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19cabdff1aSopenharmony_ci */ 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci#define BITSTREAM_WRITER_LE 22cabdff1aSopenharmony_ci#include "ttadata.h" 23cabdff1aSopenharmony_ci#include "ttaencdsp.h" 24cabdff1aSopenharmony_ci#include "avcodec.h" 25cabdff1aSopenharmony_ci#include "codec_internal.h" 26cabdff1aSopenharmony_ci#include "encode.h" 27cabdff1aSopenharmony_ci#include "put_bits.h" 28cabdff1aSopenharmony_ci#include "internal.h" 29cabdff1aSopenharmony_ci#include "libavutil/crc.h" 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_citypedef struct TTAEncContext { 32cabdff1aSopenharmony_ci const AVCRC *crc_table; 33cabdff1aSopenharmony_ci int bps; 34cabdff1aSopenharmony_ci TTAChannel *ch_ctx; 35cabdff1aSopenharmony_ci TTAEncDSPContext dsp; 36cabdff1aSopenharmony_ci} TTAEncContext; 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_cistatic av_cold int tta_encode_init(AVCodecContext *avctx) 39cabdff1aSopenharmony_ci{ 40cabdff1aSopenharmony_ci TTAEncContext *s = avctx->priv_data; 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci s->crc_table = av_crc_get_table(AV_CRC_32_IEEE_LE); 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci switch (avctx->sample_fmt) { 45cabdff1aSopenharmony_ci case AV_SAMPLE_FMT_U8: 46cabdff1aSopenharmony_ci avctx->bits_per_raw_sample = 8; 47cabdff1aSopenharmony_ci break; 48cabdff1aSopenharmony_ci case AV_SAMPLE_FMT_S16: 49cabdff1aSopenharmony_ci avctx->bits_per_raw_sample = 16; 50cabdff1aSopenharmony_ci break; 51cabdff1aSopenharmony_ci case AV_SAMPLE_FMT_S32: 52cabdff1aSopenharmony_ci if (avctx->bits_per_raw_sample > 24) 53cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, "encoding as 24 bits-per-sample\n"); 54cabdff1aSopenharmony_ci avctx->bits_per_raw_sample = 24; 55cabdff1aSopenharmony_ci } 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_ci s->bps = avctx->bits_per_raw_sample >> 3; 58cabdff1aSopenharmony_ci avctx->frame_size = 256 * avctx->sample_rate / 245; 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ci s->ch_ctx = av_malloc_array(avctx->ch_layout.nb_channels, sizeof(*s->ch_ctx)); 61cabdff1aSopenharmony_ci if (!s->ch_ctx) 62cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci ff_ttaencdsp_init(&s->dsp); 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_ci return 0; 67cabdff1aSopenharmony_ci} 68cabdff1aSopenharmony_ci 69cabdff1aSopenharmony_cistatic int32_t get_sample(const AVFrame *frame, int sample, 70cabdff1aSopenharmony_ci enum AVSampleFormat format) 71cabdff1aSopenharmony_ci{ 72cabdff1aSopenharmony_ci int32_t ret; 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci if (format == AV_SAMPLE_FMT_U8) { 75cabdff1aSopenharmony_ci ret = frame->data[0][sample] - 0x80; 76cabdff1aSopenharmony_ci } else if (format == AV_SAMPLE_FMT_S16) { 77cabdff1aSopenharmony_ci const int16_t *ptr = (const int16_t *)frame->data[0]; 78cabdff1aSopenharmony_ci ret = ptr[sample]; 79cabdff1aSopenharmony_ci } else { 80cabdff1aSopenharmony_ci const int32_t *ptr = (const int32_t *)frame->data[0]; 81cabdff1aSopenharmony_ci ret = ptr[sample] >> 8; 82cabdff1aSopenharmony_ci } 83cabdff1aSopenharmony_ci 84cabdff1aSopenharmony_ci return ret; 85cabdff1aSopenharmony_ci} 86cabdff1aSopenharmony_ci 87cabdff1aSopenharmony_cistatic int tta_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, 88cabdff1aSopenharmony_ci const AVFrame *frame, int *got_packet_ptr) 89cabdff1aSopenharmony_ci{ 90cabdff1aSopenharmony_ci TTAEncContext *s = avctx->priv_data; 91cabdff1aSopenharmony_ci PutBitContext pb; 92cabdff1aSopenharmony_ci int ret, i, out_bytes, cur_chan, res, samples; 93cabdff1aSopenharmony_ci int64_t pkt_size = frame->nb_samples * 2LL * avctx->ch_layout.nb_channels * s->bps; 94cabdff1aSopenharmony_ci 95cabdff1aSopenharmony_cipkt_alloc: 96cabdff1aSopenharmony_ci cur_chan = 0, res = 0, samples = 0; 97cabdff1aSopenharmony_ci if ((ret = ff_alloc_packet(avctx, avpkt, pkt_size)) < 0) 98cabdff1aSopenharmony_ci return ret; 99cabdff1aSopenharmony_ci init_put_bits(&pb, avpkt->data, avpkt->size); 100cabdff1aSopenharmony_ci 101cabdff1aSopenharmony_ci // init per channel states 102cabdff1aSopenharmony_ci for (i = 0; i < avctx->ch_layout.nb_channels; i++) { 103cabdff1aSopenharmony_ci s->ch_ctx[i].predictor = 0; 104cabdff1aSopenharmony_ci ff_tta_filter_init(&s->ch_ctx[i].filter, ff_tta_filter_configs[s->bps - 1]); 105cabdff1aSopenharmony_ci ff_tta_rice_init(&s->ch_ctx[i].rice, 10, 10); 106cabdff1aSopenharmony_ci } 107cabdff1aSopenharmony_ci 108cabdff1aSopenharmony_ci for (i = 0; i < frame->nb_samples * avctx->ch_layout.nb_channels; i++) { 109cabdff1aSopenharmony_ci TTAChannel *c = &s->ch_ctx[cur_chan]; 110cabdff1aSopenharmony_ci TTAFilter *filter = &c->filter; 111cabdff1aSopenharmony_ci TTARice *rice = &c->rice; 112cabdff1aSopenharmony_ci uint32_t k, unary, outval; 113cabdff1aSopenharmony_ci int32_t value, temp; 114cabdff1aSopenharmony_ci 115cabdff1aSopenharmony_ci value = get_sample(frame, samples++, avctx->sample_fmt); 116cabdff1aSopenharmony_ci 117cabdff1aSopenharmony_ci if (avctx->ch_layout.nb_channels > 1) { 118cabdff1aSopenharmony_ci if (cur_chan < avctx->ch_layout.nb_channels - 1) 119cabdff1aSopenharmony_ci value = res = get_sample(frame, samples, avctx->sample_fmt) - value; 120cabdff1aSopenharmony_ci else 121cabdff1aSopenharmony_ci value -= res / 2; 122cabdff1aSopenharmony_ci } 123cabdff1aSopenharmony_ci 124cabdff1aSopenharmony_ci temp = value; 125cabdff1aSopenharmony_ci#define PRED(x, k) (int32_t)((((uint64_t)(x) << (k)) - (x)) >> (k)) 126cabdff1aSopenharmony_ci switch (s->bps) { 127cabdff1aSopenharmony_ci case 1: value -= PRED(c->predictor, 4); break; 128cabdff1aSopenharmony_ci case 2: 129cabdff1aSopenharmony_ci case 3: value -= PRED(c->predictor, 5); break; 130cabdff1aSopenharmony_ci } 131cabdff1aSopenharmony_ci c->predictor = temp; 132cabdff1aSopenharmony_ci 133cabdff1aSopenharmony_ci s->dsp.filter_process(filter->qm, filter->dx, filter->dl, &filter->error, &value, 134cabdff1aSopenharmony_ci filter->shift, filter->round); 135cabdff1aSopenharmony_ci outval = (value > 0) ? (value << 1) - 1: -value << 1; 136cabdff1aSopenharmony_ci 137cabdff1aSopenharmony_ci k = rice->k0; 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci rice->sum0 += outval - (rice->sum0 >> 4); 140cabdff1aSopenharmony_ci if (rice->k0 > 0 && rice->sum0 < ff_tta_shift_16[rice->k0]) 141cabdff1aSopenharmony_ci rice->k0--; 142cabdff1aSopenharmony_ci else if (rice->sum0 > ff_tta_shift_16[rice->k0 + 1]) 143cabdff1aSopenharmony_ci rice->k0++; 144cabdff1aSopenharmony_ci 145cabdff1aSopenharmony_ci if (outval >= ff_tta_shift_1[k]) { 146cabdff1aSopenharmony_ci outval -= ff_tta_shift_1[k]; 147cabdff1aSopenharmony_ci k = rice->k1; 148cabdff1aSopenharmony_ci 149cabdff1aSopenharmony_ci rice->sum1 += outval - (rice->sum1 >> 4); 150cabdff1aSopenharmony_ci if (rice->k1 > 0 && rice->sum1 < ff_tta_shift_16[rice->k1]) 151cabdff1aSopenharmony_ci rice->k1--; 152cabdff1aSopenharmony_ci else if (rice->sum1 > ff_tta_shift_16[rice->k1 + 1]) 153cabdff1aSopenharmony_ci rice->k1++; 154cabdff1aSopenharmony_ci 155cabdff1aSopenharmony_ci unary = 1 + (outval >> k); 156cabdff1aSopenharmony_ci if (unary + 100LL > put_bits_left(&pb)) { 157cabdff1aSopenharmony_ci if (pkt_size < INT_MAX/2) { 158cabdff1aSopenharmony_ci pkt_size *= 2; 159cabdff1aSopenharmony_ci av_packet_unref(avpkt); 160cabdff1aSopenharmony_ci goto pkt_alloc; 161cabdff1aSopenharmony_ci } else 162cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 163cabdff1aSopenharmony_ci } 164cabdff1aSopenharmony_ci do { 165cabdff1aSopenharmony_ci if (unary > 31) { 166cabdff1aSopenharmony_ci put_bits(&pb, 31, 0x7FFFFFFF); 167cabdff1aSopenharmony_ci unary -= 31; 168cabdff1aSopenharmony_ci } else { 169cabdff1aSopenharmony_ci put_bits(&pb, unary, (1U << unary) - 1); 170cabdff1aSopenharmony_ci unary = 0; 171cabdff1aSopenharmony_ci } 172cabdff1aSopenharmony_ci } while (unary); 173cabdff1aSopenharmony_ci } 174cabdff1aSopenharmony_ci 175cabdff1aSopenharmony_ci put_bits(&pb, 1, 0); 176cabdff1aSopenharmony_ci 177cabdff1aSopenharmony_ci if (k) 178cabdff1aSopenharmony_ci put_bits(&pb, k, outval & (ff_tta_shift_1[k] - 1)); 179cabdff1aSopenharmony_ci 180cabdff1aSopenharmony_ci if (cur_chan < avctx->ch_layout.nb_channels - 1) 181cabdff1aSopenharmony_ci cur_chan++; 182cabdff1aSopenharmony_ci else 183cabdff1aSopenharmony_ci cur_chan = 0; 184cabdff1aSopenharmony_ci } 185cabdff1aSopenharmony_ci 186cabdff1aSopenharmony_ci flush_put_bits(&pb); 187cabdff1aSopenharmony_ci out_bytes = put_bytes_output(&pb); 188cabdff1aSopenharmony_ci put_bits32(&pb, av_crc(s->crc_table, UINT32_MAX, avpkt->data, out_bytes) ^ UINT32_MAX); 189cabdff1aSopenharmony_ci flush_put_bits(&pb); 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_ci avpkt->pts = frame->pts; 192cabdff1aSopenharmony_ci avpkt->size = out_bytes + 4; 193cabdff1aSopenharmony_ci avpkt->duration = ff_samples_to_time_base(avctx, frame->nb_samples); 194cabdff1aSopenharmony_ci *got_packet_ptr = 1; 195cabdff1aSopenharmony_ci return 0; 196cabdff1aSopenharmony_ci} 197cabdff1aSopenharmony_ci 198cabdff1aSopenharmony_cistatic av_cold int tta_encode_close(AVCodecContext *avctx) 199cabdff1aSopenharmony_ci{ 200cabdff1aSopenharmony_ci TTAEncContext *s = avctx->priv_data; 201cabdff1aSopenharmony_ci av_freep(&s->ch_ctx); 202cabdff1aSopenharmony_ci return 0; 203cabdff1aSopenharmony_ci} 204cabdff1aSopenharmony_ci 205cabdff1aSopenharmony_ciconst FFCodec ff_tta_encoder = { 206cabdff1aSopenharmony_ci .p.name = "tta", 207cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("TTA (True Audio)"), 208cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 209cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_TTA, 210cabdff1aSopenharmony_ci .priv_data_size = sizeof(TTAEncContext), 211cabdff1aSopenharmony_ci .init = tta_encode_init, 212cabdff1aSopenharmony_ci .close = tta_encode_close, 213cabdff1aSopenharmony_ci FF_CODEC_ENCODE_CB(tta_encode_frame), 214cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_SMALL_LAST_FRAME, 215cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_U8, 216cabdff1aSopenharmony_ci AV_SAMPLE_FMT_S16, 217cabdff1aSopenharmony_ci AV_SAMPLE_FMT_S32, 218cabdff1aSopenharmony_ci AV_SAMPLE_FMT_NONE }, 219cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 220cabdff1aSopenharmony_ci}; 221