1/* 2 * TAK decoder/demuxer common code 3 * Copyright (c) 2012 Paul B Mahol 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22/** 23 * @file 24 * TAK (Tom's lossless Audio Kompressor) decoder/demuxer common functions 25 */ 26 27#ifndef AVCODEC_TAK_H 28#define AVCODEC_TAK_H 29 30#include <stdint.h> 31 32#define BITSTREAM_READER_LE 33#include "get_bits.h" 34#include "avcodec.h" 35 36#define TAK_FORMAT_DATA_TYPE_BITS 3 37#define TAK_FORMAT_SAMPLE_RATE_BITS 18 38#define TAK_FORMAT_BPS_BITS 5 39#define TAK_FORMAT_CHANNEL_BITS 4 40#define TAK_FORMAT_VALID_BITS 5 41#define TAK_FORMAT_CH_LAYOUT_BITS 6 42#define TAK_SIZE_FRAME_DURATION_BITS 4 43#define TAK_SIZE_SAMPLES_NUM_BITS 35 44#define TAK_LAST_FRAME_POS_BITS 40 45#define TAK_LAST_FRAME_SIZE_BITS 24 46#define TAK_ENCODER_CODEC_BITS 6 47#define TAK_ENCODER_PROFILE_BITS 4 48#define TAK_ENCODER_VERSION_BITS 24 49#define TAK_SAMPLE_RATE_MIN 6000 50#define TAK_CHANNELS_MIN 1 51#define TAK_BPS_MIN 8 52#define TAK_FRAME_HEADER_FLAGS_BITS 3 53#define TAK_FRAME_HEADER_SYNC_ID 0xA0FF 54#define TAK_FRAME_HEADER_SYNC_ID_BITS 16 55#define TAK_FRAME_HEADER_SAMPLE_COUNT_BITS 14 56#define TAK_FRAME_HEADER_NO_BITS 21 57#define TAK_FRAME_DURATION_QUANT_SHIFT 5 58#define TAK_CRC24_BITS 24 59 60 61#define TAK_FRAME_FLAG_IS_LAST 0x1 62#define TAK_FRAME_FLAG_HAS_INFO 0x2 63#define TAK_FRAME_FLAG_HAS_METADATA 0x4 64 65#define TAK_MAX_CHANNELS (1 << TAK_FORMAT_CHANNEL_BITS) 66 67#define TAK_MIN_FRAME_HEADER_BITS (TAK_FRAME_HEADER_SYNC_ID_BITS + \ 68 TAK_FRAME_HEADER_FLAGS_BITS + \ 69 TAK_FRAME_HEADER_NO_BITS + \ 70 TAK_CRC24_BITS) 71 72#define TAK_MIN_FRAME_HEADER_LAST_BITS (TAK_MIN_FRAME_HEADER_BITS + 2 + \ 73 TAK_FRAME_HEADER_SAMPLE_COUNT_BITS) 74 75#define TAK_ENCODER_BITS (TAK_ENCODER_CODEC_BITS + \ 76 TAK_ENCODER_PROFILE_BITS) 77 78#define TAK_SIZE_BITS (TAK_SIZE_SAMPLES_NUM_BITS + \ 79 TAK_SIZE_FRAME_DURATION_BITS) 80 81#define TAK_FORMAT_BITS (TAK_FORMAT_DATA_TYPE_BITS + \ 82 TAK_FORMAT_SAMPLE_RATE_BITS + \ 83 TAK_FORMAT_BPS_BITS + \ 84 TAK_FORMAT_CHANNEL_BITS + 1 + \ 85 TAK_FORMAT_VALID_BITS + 1 + \ 86 TAK_FORMAT_CH_LAYOUT_BITS * \ 87 TAK_MAX_CHANNELS) 88 89#define TAK_STREAMINFO_BITS (TAK_ENCODER_BITS + \ 90 TAK_SIZE_BITS + \ 91 TAK_FORMAT_BITS) 92 93#define TAK_MAX_FRAME_HEADER_BITS (TAK_MIN_FRAME_HEADER_LAST_BITS + \ 94 TAK_STREAMINFO_BITS + 31) 95 96#define TAK_STREAMINFO_BYTES ((TAK_STREAMINFO_BITS + 7) / 8) 97#define TAK_MAX_FRAME_HEADER_BYTES ((TAK_MAX_FRAME_HEADER_BITS + 7) / 8) 98#define TAK_MIN_FRAME_HEADER_BYTES ((TAK_MIN_FRAME_HEADER_BITS + 7) / 8) 99 100enum TAKCodecType { 101 TAK_CODEC_MONO_STEREO = 2, 102 TAK_CODEC_MULTICHANNEL = 4, 103}; 104 105enum TAKMetaDataType { 106 TAK_METADATA_END = 0, 107 TAK_METADATA_STREAMINFO, 108 TAK_METADATA_SEEKTABLE, 109 TAK_METADATA_SIMPLE_WAVE_DATA, 110 TAK_METADATA_ENCODER, 111 TAK_METADATA_PADDING, 112 TAK_METADATA_MD5, 113 TAK_METADATA_LAST_FRAME, 114}; 115 116enum TAKFrameSizeType { 117 TAK_FST_94ms = 0, 118 TAK_FST_125ms, 119 TAK_FST_188ms, 120 TAK_FST_250ms, 121 TAK_FST_4096, 122 TAK_FST_8192, 123 TAK_FST_16384, 124 TAK_FST_512, 125 TAK_FST_1024, 126 TAK_FST_2048, 127}; 128 129typedef struct TAKStreamInfo { 130 int flags; 131 enum TAKCodecType codec; 132 int data_type; 133 int sample_rate; 134 int channels; 135 int bps; 136 int frame_num; 137 int frame_samples; 138 int last_frame_samples; 139 uint64_t ch_layout; 140 int64_t samples; 141} TAKStreamInfo; 142 143int ff_tak_check_crc(const uint8_t *buf, unsigned int buf_size); 144 145/** 146 * Parse the Streaminfo metadata block. 147 * @param[in] gb pointer to GetBitContext 148 * @param[out] s storage for parsed information 149 */ 150void avpriv_tak_parse_streaminfo(GetBitContext *gb, TAKStreamInfo *s); 151 152/** 153 * Validate and decode a frame header. 154 * @param avctx AVCodecContext to use as av_log() context 155 * @param[in] gb GetBitContext from which to read frame header 156 * @param[out] s frame information 157 * @param log_level_offset log level offset, can be used to silence 158 * error messages. 159 * @return non-zero on error, 0 if OK 160 */ 161int ff_tak_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb, 162 TAKStreamInfo *s, int log_level_offset); 163#endif /* AVCODEC_TAK_H */ 164