blob: 4fa1239093bc9da3cc604914f8a29f08e738e9e0
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[in] gb pointer to GetBitContext |
147 | * @param[out] s storage for parsed information |
148 | */ |
149 | void avpriv_tak_parse_streaminfo(GetBitContext *gb, TAKStreamInfo *s); |
150 | |
151 | /** |
152 | * Validate and decode a frame header. |
153 | * @param avctx AVCodecContext to use as av_log() context |
154 | * @param[in] gb GetBitContext from which to read frame header |
155 | * @param[out] s frame information |
156 | * @param log_level_offset log level offset, can be used to silence |
157 | * error messages. |
158 | * @return non-zero on error, 0 if OK |
159 | */ |
160 | int ff_tak_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb, |
161 | TAKStreamInfo *s, int log_level_offset); |
162 | #endif /* AVCODEC_TAK_H */ |
163 |