1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * TAK common code 3cabdff1aSopenharmony_ci * Copyright (c) 2012 Paul B Mahol 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 23cabdff1aSopenharmony_ci#include "libavutil/crc.h" 24cabdff1aSopenharmony_ci#include "libavutil/intreadwrite.h" 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#define BITSTREAM_READER_LE 27cabdff1aSopenharmony_ci#include "tak.h" 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_cistatic const int64_t tak_channel_layouts[] = { 30cabdff1aSopenharmony_ci 0, 31cabdff1aSopenharmony_ci AV_CH_FRONT_LEFT, 32cabdff1aSopenharmony_ci AV_CH_FRONT_RIGHT, 33cabdff1aSopenharmony_ci AV_CH_FRONT_CENTER, 34cabdff1aSopenharmony_ci AV_CH_LOW_FREQUENCY, 35cabdff1aSopenharmony_ci AV_CH_BACK_LEFT, 36cabdff1aSopenharmony_ci AV_CH_BACK_RIGHT, 37cabdff1aSopenharmony_ci AV_CH_FRONT_LEFT_OF_CENTER, 38cabdff1aSopenharmony_ci AV_CH_FRONT_RIGHT_OF_CENTER, 39cabdff1aSopenharmony_ci AV_CH_BACK_CENTER, 40cabdff1aSopenharmony_ci AV_CH_SIDE_LEFT, 41cabdff1aSopenharmony_ci AV_CH_SIDE_RIGHT, 42cabdff1aSopenharmony_ci AV_CH_TOP_CENTER, 43cabdff1aSopenharmony_ci AV_CH_TOP_FRONT_LEFT, 44cabdff1aSopenharmony_ci AV_CH_TOP_FRONT_CENTER, 45cabdff1aSopenharmony_ci AV_CH_TOP_FRONT_RIGHT, 46cabdff1aSopenharmony_ci AV_CH_TOP_BACK_LEFT, 47cabdff1aSopenharmony_ci AV_CH_TOP_BACK_CENTER, 48cabdff1aSopenharmony_ci AV_CH_TOP_BACK_RIGHT, 49cabdff1aSopenharmony_ci}; 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_cistatic const uint16_t frame_duration_type_quants[] = { 52cabdff1aSopenharmony_ci 3, 4, 6, 8, 4096, 8192, 16384, 512, 1024, 2048, 53cabdff1aSopenharmony_ci}; 54cabdff1aSopenharmony_ci 55cabdff1aSopenharmony_cistatic int tak_get_nb_samples(int sample_rate, enum TAKFrameSizeType type) 56cabdff1aSopenharmony_ci{ 57cabdff1aSopenharmony_ci int nb_samples, max_nb_samples; 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_ci if (type <= TAK_FST_250ms) { 60cabdff1aSopenharmony_ci nb_samples = sample_rate * frame_duration_type_quants[type] >> 61cabdff1aSopenharmony_ci TAK_FRAME_DURATION_QUANT_SHIFT; 62cabdff1aSopenharmony_ci max_nb_samples = 16384; 63cabdff1aSopenharmony_ci } else if (type < FF_ARRAY_ELEMS(frame_duration_type_quants)) { 64cabdff1aSopenharmony_ci nb_samples = frame_duration_type_quants[type]; 65cabdff1aSopenharmony_ci max_nb_samples = sample_rate * 66cabdff1aSopenharmony_ci frame_duration_type_quants[TAK_FST_250ms] >> 67cabdff1aSopenharmony_ci TAK_FRAME_DURATION_QUANT_SHIFT; 68cabdff1aSopenharmony_ci } else { 69cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 70cabdff1aSopenharmony_ci } 71cabdff1aSopenharmony_ci 72cabdff1aSopenharmony_ci if (nb_samples <= 0 || nb_samples > max_nb_samples) 73cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 74cabdff1aSopenharmony_ci 75cabdff1aSopenharmony_ci return nb_samples; 76cabdff1aSopenharmony_ci} 77cabdff1aSopenharmony_ci 78cabdff1aSopenharmony_ciint ff_tak_check_crc(const uint8_t *buf, unsigned int buf_size) 79cabdff1aSopenharmony_ci{ 80cabdff1aSopenharmony_ci uint32_t crc, CRC; 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_ci if (buf_size < 4) 83cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 84cabdff1aSopenharmony_ci buf_size -= 3; 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci CRC = AV_RB24(buf + buf_size); 87cabdff1aSopenharmony_ci crc = av_crc(av_crc_get_table(AV_CRC_24_IEEE), 0xCE04B7U, buf, buf_size); 88cabdff1aSopenharmony_ci if (CRC != crc) 89cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 90cabdff1aSopenharmony_ci 91cabdff1aSopenharmony_ci return 0; 92cabdff1aSopenharmony_ci} 93cabdff1aSopenharmony_ci 94cabdff1aSopenharmony_civoid ff_tak_parse_streaminfo(TAKStreamInfo *s, GetBitContext *gb) 95cabdff1aSopenharmony_ci{ 96cabdff1aSopenharmony_ci uint64_t channel_mask = 0; 97cabdff1aSopenharmony_ci int frame_type, i; 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_ci s->codec = get_bits(gb, TAK_ENCODER_CODEC_BITS); 100cabdff1aSopenharmony_ci skip_bits(gb, TAK_ENCODER_PROFILE_BITS); 101cabdff1aSopenharmony_ci 102cabdff1aSopenharmony_ci frame_type = get_bits(gb, TAK_SIZE_FRAME_DURATION_BITS); 103cabdff1aSopenharmony_ci s->samples = get_bits64(gb, TAK_SIZE_SAMPLES_NUM_BITS); 104cabdff1aSopenharmony_ci 105cabdff1aSopenharmony_ci s->data_type = get_bits(gb, TAK_FORMAT_DATA_TYPE_BITS); 106cabdff1aSopenharmony_ci s->sample_rate = get_bits(gb, TAK_FORMAT_SAMPLE_RATE_BITS) + 107cabdff1aSopenharmony_ci TAK_SAMPLE_RATE_MIN; 108cabdff1aSopenharmony_ci s->bps = get_bits(gb, TAK_FORMAT_BPS_BITS) + 109cabdff1aSopenharmony_ci TAK_BPS_MIN; 110cabdff1aSopenharmony_ci s->channels = get_bits(gb, TAK_FORMAT_CHANNEL_BITS) + 111cabdff1aSopenharmony_ci TAK_CHANNELS_MIN; 112cabdff1aSopenharmony_ci 113cabdff1aSopenharmony_ci if (get_bits1(gb)) { 114cabdff1aSopenharmony_ci skip_bits(gb, TAK_FORMAT_VALID_BITS); 115cabdff1aSopenharmony_ci if (get_bits1(gb)) { 116cabdff1aSopenharmony_ci for (i = 0; i < s->channels; i++) { 117cabdff1aSopenharmony_ci int value = get_bits(gb, TAK_FORMAT_CH_LAYOUT_BITS); 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_ci if (value < FF_ARRAY_ELEMS(tak_channel_layouts)) 120cabdff1aSopenharmony_ci channel_mask |= tak_channel_layouts[value]; 121cabdff1aSopenharmony_ci } 122cabdff1aSopenharmony_ci } 123cabdff1aSopenharmony_ci } 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_ci s->ch_layout = channel_mask; 126cabdff1aSopenharmony_ci s->frame_samples = tak_get_nb_samples(s->sample_rate, frame_type); 127cabdff1aSopenharmony_ci} 128cabdff1aSopenharmony_ci 129cabdff1aSopenharmony_ciint avpriv_tak_parse_streaminfo(TAKStreamInfo *s, const uint8_t *buf, int size) 130cabdff1aSopenharmony_ci{ 131cabdff1aSopenharmony_ci GetBitContext gb; 132cabdff1aSopenharmony_ci int ret = init_get_bits8(&gb, buf, size); 133cabdff1aSopenharmony_ci 134cabdff1aSopenharmony_ci if (ret < 0) 135cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 136cabdff1aSopenharmony_ci 137cabdff1aSopenharmony_ci ff_tak_parse_streaminfo(s, &gb); 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci return 0; 140cabdff1aSopenharmony_ci} 141cabdff1aSopenharmony_ci 142cabdff1aSopenharmony_ciint ff_tak_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb, 143cabdff1aSopenharmony_ci TAKStreamInfo *ti, int log_level_offset) 144cabdff1aSopenharmony_ci{ 145cabdff1aSopenharmony_ci if (get_bits(gb, TAK_FRAME_HEADER_SYNC_ID_BITS) != TAK_FRAME_HEADER_SYNC_ID) { 146cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR + log_level_offset, "missing sync id\n"); 147cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 148cabdff1aSopenharmony_ci } 149cabdff1aSopenharmony_ci 150cabdff1aSopenharmony_ci ti->flags = get_bits(gb, TAK_FRAME_HEADER_FLAGS_BITS); 151cabdff1aSopenharmony_ci ti->frame_num = get_bits(gb, TAK_FRAME_HEADER_NO_BITS); 152cabdff1aSopenharmony_ci 153cabdff1aSopenharmony_ci if (ti->flags & TAK_FRAME_FLAG_IS_LAST) { 154cabdff1aSopenharmony_ci ti->last_frame_samples = get_bits(gb, TAK_FRAME_HEADER_SAMPLE_COUNT_BITS) + 1; 155cabdff1aSopenharmony_ci skip_bits(gb, 2); 156cabdff1aSopenharmony_ci } else { 157cabdff1aSopenharmony_ci ti->last_frame_samples = 0; 158cabdff1aSopenharmony_ci } 159cabdff1aSopenharmony_ci 160cabdff1aSopenharmony_ci if (ti->flags & TAK_FRAME_FLAG_HAS_INFO) { 161cabdff1aSopenharmony_ci ff_tak_parse_streaminfo(ti, gb); 162cabdff1aSopenharmony_ci 163cabdff1aSopenharmony_ci if (get_bits(gb, 6)) 164cabdff1aSopenharmony_ci skip_bits(gb, 25); 165cabdff1aSopenharmony_ci align_get_bits(gb); 166cabdff1aSopenharmony_ci } 167cabdff1aSopenharmony_ci 168cabdff1aSopenharmony_ci if (ti->flags & TAK_FRAME_FLAG_HAS_METADATA) 169cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 170cabdff1aSopenharmony_ci 171cabdff1aSopenharmony_ci if (get_bits_left(gb) < 24) 172cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 173cabdff1aSopenharmony_ci 174cabdff1aSopenharmony_ci skip_bits(gb, 24); 175cabdff1aSopenharmony_ci 176cabdff1aSopenharmony_ci return 0; 177cabdff1aSopenharmony_ci} 178