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#include "avcodec.h" 33#include "get_bits.h" 34 35#define TAK_FORMAT_DATA_TYPE_BITS 3 36#define TAK_FORMAT_SAMPLE_RATE_BITS 18 37#define TAK_FORMAT_BPS_BITS 5 38#define TAK_FORMAT_CHANNEL_BITS 4 39#define TAK_FORMAT_VALID_BITS 5 40#define TAK_FORMAT_CH_LAYOUT_BITS 6 41#define TAK_SIZE_FRAME_DURATION_BITS 4 42#define TAK_SIZE_SAMPLES_NUM_BITS 35 43#define TAK_LAST_FRAME_POS_BITS 40 44#define TAK_LAST_FRAME_SIZE_BITS 24 45#define TAK_ENCODER_CODEC_BITS 6 46#define TAK_ENCODER_PROFILE_BITS 4 47#define TAK_SAMPLE_RATE_MIN 6000 48#define TAK_CHANNELS_MIN 1 49#define TAK_BPS_MIN 8 50#define TAK_FRAME_HEADER_FLAGS_BITS 3 51#define TAK_FRAME_HEADER_SYNC_ID 0xA0FF 52#define TAK_FRAME_HEADER_SYNC_ID_BITS 16 53#define TAK_FRAME_HEADER_SAMPLE_COUNT_BITS 14 54#define TAK_FRAME_HEADER_NO_BITS 21 55#define TAK_FRAME_DURATION_QUANT_SHIFT 5 56#define TAK_CRC24_BITS 24 57 58 59#define TAK_FRAME_FLAG_IS_LAST 0x1 60#define TAK_FRAME_FLAG_HAS_INFO 0x2 61#define TAK_FRAME_FLAG_HAS_METADATA 0x4 62 63#define TAK_MAX_CHANNELS (1 << TAK_FORMAT_CHANNEL_BITS) 64 65#define TAK_MIN_FRAME_HEADER_BITS (TAK_FRAME_HEADER_SYNC_ID_BITS + \ 66 TAK_FRAME_HEADER_FLAGS_BITS + \ 67 TAK_FRAME_HEADER_NO_BITS + \ 68 TAK_CRC24_BITS) 69 70#define TAK_MIN_FRAME_HEADER_LAST_BITS (TAK_MIN_FRAME_HEADER_BITS + 2 + \ 71 TAK_FRAME_HEADER_SAMPLE_COUNT_BITS) 72 73#define TAK_ENCODER_BITS (TAK_ENCODER_CODEC_BITS + \ 74 TAK_ENCODER_PROFILE_BITS) 75 76#define TAK_SIZE_BITS (TAK_SIZE_SAMPLES_NUM_BITS + \ 77 TAK_SIZE_FRAME_DURATION_BITS) 78 79#define TAK_FORMAT_BITS (TAK_FORMAT_DATA_TYPE_BITS + \ 80 TAK_FORMAT_SAMPLE_RATE_BITS + \ 81 TAK_FORMAT_BPS_BITS + \ 82 TAK_FORMAT_CHANNEL_BITS + 1 + \ 83 TAK_FORMAT_VALID_BITS + 1 + \ 84 TAK_FORMAT_CH_LAYOUT_BITS * \ 85 TAK_MAX_CHANNELS) 86 87#define TAK_STREAMINFO_BITS (TAK_ENCODER_BITS + \ 88 TAK_SIZE_BITS + \ 89 TAK_FORMAT_BITS) 90 91#define TAK_MAX_FRAME_HEADER_BITS (TAK_MIN_FRAME_HEADER_LAST_BITS + \ 92 TAK_STREAMINFO_BITS + 31) 93 94#define TAK_STREAMINFO_BYTES ((TAK_STREAMINFO_BITS + 7) / 8) 95#define TAK_MAX_FRAME_HEADER_BYTES ((TAK_MAX_FRAME_HEADER_BITS + 7) / 8) 96#define TAK_MIN_FRAME_HEADER_BYTES ((TAK_MIN_FRAME_HEADER_BITS + 7) / 8) 97 98enum TAKCodecType { 99 TAK_CODEC_MONO_STEREO = 2, 100 TAK_CODEC_MULTICHANNEL = 4, 101}; 102 103enum TAKMetaDataType { 104 TAK_METADATA_END = 0, 105 TAK_METADATA_STREAMINFO, 106 TAK_METADATA_SEEKTABLE, 107 TAK_METADATA_SIMPLE_WAVE_DATA, 108 TAK_METADATA_ENCODER, 109 TAK_METADATA_PADDING, 110 TAK_METADATA_MD5, 111 TAK_METADATA_LAST_FRAME, 112}; 113 114enum TAKFrameSizeType { 115 TAK_FST_94ms = 0, 116 TAK_FST_125ms, 117 TAK_FST_188ms, 118 TAK_FST_250ms, 119 TAK_FST_4096, 120 TAK_FST_8192, 121 TAK_FST_16384, 122 TAK_FST_512, 123 TAK_FST_1024, 124 TAK_FST_2048, 125}; 126 127typedef struct TAKStreamInfo { 128 int flags; 129 enum TAKCodecType codec; 130 int data_type; 131 int sample_rate; 132 int channels; 133 int bps; 134 int frame_num; 135 int frame_samples; 136 int last_frame_samples; 137 uint64_t ch_layout; 138 int64_t samples; 139} TAKStreamInfo; 140 141int ff_tak_check_crc(const uint8_t *buf, unsigned int buf_size); 142 143/** 144 * Parse the Streaminfo metadata block. 145 * @param[out] s storage for parsed information 146 * @param[in] buf input buffer 147 * @param[in] size size of input buffer in bytes 148 * @return non-zero on error, 0 if OK 149 */ 150int avpriv_tak_parse_streaminfo(TAKStreamInfo *s, const uint8_t *buf, int size); 151 152void ff_tak_parse_streaminfo(TAKStreamInfo *s, GetBitContext *gb); 153 154/** 155 * Validate and decode a frame header. 156 * @param avctx AVCodecContext to use as av_log() context 157 * @param[in] gb GetBitContext from which to read frame header 158 * @param[out] s frame information 159 * @param log_level_offset log level offset, can be used to silence 160 * error messages. 161 * @return non-zero on error, 0 if OK 162 */ 163int ff_tak_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb, 164 TAKStreamInfo *s, int log_level_offset); 165#endif /* AVCODEC_TAK_H */ 166