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