FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
tak.c
Go to the documentation of this file.
1
/*
2
* TAK 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
#include "
libavutil/crc.h
"
23
#include "
libavutil/intreadwrite.h
"
24
#include "
tak.h
"
25
26
static
const
int64_t
tak_channel_layouts
[] = {
27
0,
28
AV_CH_FRONT_LEFT
,
29
AV_CH_FRONT_RIGHT
,
30
AV_CH_FRONT_CENTER
,
31
AV_CH_LOW_FREQUENCY
,
32
AV_CH_BACK_LEFT
,
33
AV_CH_BACK_RIGHT
,
34
AV_CH_FRONT_LEFT_OF_CENTER
,
35
AV_CH_FRONT_RIGHT_OF_CENTER
,
36
AV_CH_BACK_CENTER
,
37
AV_CH_SIDE_LEFT
,
38
AV_CH_SIDE_RIGHT
,
39
AV_CH_TOP_CENTER
,
40
AV_CH_TOP_FRONT_LEFT
,
41
AV_CH_TOP_FRONT_CENTER
,
42
AV_CH_TOP_FRONT_RIGHT
,
43
AV_CH_TOP_BACK_LEFT
,
44
AV_CH_TOP_BACK_CENTER
,
45
AV_CH_TOP_BACK_RIGHT
,
46
};
47
48
static
const
uint16_t
frame_duration_type_quants
[] = {
49
3, 4, 6, 8, 4096, 8192, 16384, 512, 1024, 2048,
50
};
51
52
static
int
tak_get_nb_samples
(
int
sample_rate
,
enum
TAKFrameSizeType
type)
53
{
54
int
nb_samples, max_nb_samples;
55
56
if
(type <=
TAK_FST_250ms
) {
57
nb_samples = sample_rate *
frame_duration_type_quants
[type] >>
58
TAK_FRAME_DURATION_QUANT_SHIFT
;
59
max_nb_samples = 16384;
60
}
else
if
(type <
FF_ARRAY_ELEMS
(
frame_duration_type_quants
)) {
61
nb_samples =
frame_duration_type_quants
[type];
62
max_nb_samples = sample_rate *
63
frame_duration_type_quants
[
TAK_FST_250ms
] >>
64
TAK_FRAME_DURATION_QUANT_SHIFT
;
65
}
else
{
66
return
AVERROR_INVALIDDATA
;
67
}
68
69
if
(nb_samples <= 0 || nb_samples > max_nb_samples)
70
return
AVERROR_INVALIDDATA
;
71
72
return
nb_samples;
73
}
74
75
static
int
crc_init
= 0;
76
#if CONFIG_SMALL
77
#define CRC_TABLE_SIZE 257
78
#else
79
#define CRC_TABLE_SIZE 1024
80
#endif
81
static
AVCRC
crc_24
[
CRC_TABLE_SIZE
];
82
83
av_cold
void
ff_tak_init_crc
(
void
)
84
{
85
if
(!
crc_init
) {
86
av_crc_init
(
crc_24
, 0, 24, 0x864CFBU,
sizeof
(
crc_24
));
87
crc_init
= 1;
88
}
89
}
90
91
int
ff_tak_check_crc
(
const
uint8_t
*
buf
,
unsigned
int
buf_size)
92
{
93
uint32_t crc, CRC;
94
95
if
(buf_size < 4)
96
return
AVERROR_INVALIDDATA
;
97
buf_size -= 3;
98
99
CRC =
AV_RB24
(buf + buf_size);
100
crc =
av_crc
(
crc_24
, 0xCE04B7U, buf, buf_size);
101
if
(CRC != crc)
102
return
AVERROR_INVALIDDATA
;
103
104
return
0;
105
}
106
107
void
avpriv_tak_parse_streaminfo
(
GetBitContext
*gb,
TAKStreamInfo
*
s
)
108
{
109
uint64_t channel_mask = 0;
110
int
frame_type, i;
111
112
s->
codec
=
get_bits
(gb,
TAK_ENCODER_CODEC_BITS
);
113
skip_bits
(gb,
TAK_ENCODER_PROFILE_BITS
);
114
115
frame_type =
get_bits
(gb,
TAK_SIZE_FRAME_DURATION_BITS
);
116
s->
samples
=
get_bits64
(gb,
TAK_SIZE_SAMPLES_NUM_BITS
);
117
118
s->
data_type
=
get_bits
(gb,
TAK_FORMAT_DATA_TYPE_BITS
);
119
s->
sample_rate
=
get_bits
(gb,
TAK_FORMAT_SAMPLE_RATE_BITS
) +
120
TAK_SAMPLE_RATE_MIN
;
121
s->
bps
=
get_bits
(gb,
TAK_FORMAT_BPS_BITS
) +
122
TAK_BPS_MIN
;
123
s->
channels
=
get_bits
(gb,
TAK_FORMAT_CHANNEL_BITS
) +
124
TAK_CHANNELS_MIN
;
125
126
if
(
get_bits1
(gb)) {
127
skip_bits
(gb,
TAK_FORMAT_VALID_BITS
);
128
if
(
get_bits1
(gb)) {
129
for
(i = 0; i < s->
channels
; i++) {
130
int
value
=
get_bits
(gb,
TAK_FORMAT_CH_LAYOUT_BITS
);
131
132
if
(value <
FF_ARRAY_ELEMS
(
tak_channel_layouts
))
133
channel_mask |=
tak_channel_layouts
[
value
];
134
}
135
}
136
}
137
138
s->
ch_layout
= channel_mask;
139
s->
frame_samples
=
tak_get_nb_samples
(s->
sample_rate
, frame_type);
140
}
141
142
int
ff_tak_decode_frame_header
(
AVCodecContext
*avctx,
GetBitContext
*gb,
143
TAKStreamInfo
*ti,
int
log_level_offset)
144
{
145
if
(
get_bits
(gb,
TAK_FRAME_HEADER_SYNC_ID_BITS
) !=
TAK_FRAME_HEADER_SYNC_ID
) {
146
av_log
(avctx,
AV_LOG_ERROR
+ log_level_offset,
"missing sync id\n"
);
147
return
AVERROR_INVALIDDATA
;
148
}
149
150
ti->
flags
=
get_bits
(gb,
TAK_FRAME_HEADER_FLAGS_BITS
);
151
ti->
frame_num
=
get_bits
(gb,
TAK_FRAME_HEADER_NO_BITS
);
152
153
if
(ti->
flags
&
TAK_FRAME_FLAG_IS_LAST
) {
154
ti->
last_frame_samples
=
get_bits
(gb,
TAK_FRAME_HEADER_SAMPLE_COUNT_BITS
) + 1;
155
skip_bits
(gb, 2);
156
}
else
{
157
ti->
last_frame_samples
= 0;
158
}
159
160
if
(ti->
flags
&
TAK_FRAME_FLAG_HAS_INFO
) {
161
avpriv_tak_parse_streaminfo
(gb, ti);
162
163
if
(
get_bits
(gb, 6))
164
skip_bits
(gb, 25);
165
align_get_bits
(gb);
166
}
167
168
if
(ti->
flags
&
TAK_FRAME_FLAG_HAS_METADATA
)
169
return
AVERROR_INVALIDDATA
;
170
171
skip_bits
(gb, 24);
172
173
return
0;
174
}
Generated on Wed Jul 10 2013 23:48:05 for FFmpeg by
1.8.2