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