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