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