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
libavformat
nut.c
Go to the documentation of this file.
1
/*
2
* nut
3
* Copyright (c) 2004-2007 Michael Niedermayer
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/mathematics.h
"
23
#include "
libavutil/tree.h
"
24
#include "
nut.h
"
25
#include "
riff.h
"
26
#include "
internal.h
"
27
28
const
AVCodecTag
ff_nut_subtitle_tags
[] = {
29
{
AV_CODEC_ID_TEXT
,
MKTAG
(
'U'
,
'T'
,
'F'
,
'8'
) },
30
{
AV_CODEC_ID_SSA
,
MKTAG
(
'S'
,
'S'
,
'A'
, 0 ) },
31
{
AV_CODEC_ID_DVD_SUBTITLE
,
MKTAG
(
'D'
,
'V'
,
'D'
,
'S'
) },
32
{
AV_CODEC_ID_DVB_SUBTITLE
,
MKTAG
(
'D'
,
'V'
,
'B'
,
'S'
) },
33
{
AV_CODEC_ID_DVB_TELETEXT
,
MKTAG
(
'D'
,
'V'
,
'B'
,
'T'
) },
34
{
AV_CODEC_ID_NONE
, 0 }
35
};
36
37
const
AVCodecTag
ff_nut_data_tags
[] = {
38
{
AV_CODEC_ID_TEXT
,
MKTAG
(
'U'
,
'T'
,
'F'
,
'8'
) },
39
{
AV_CODEC_ID_NONE
, 0 }
40
};
41
42
const
AVCodecTag
ff_nut_video_tags
[] = {
43
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
, 15 ) },
44
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
, 15 ) },
45
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
, 16 ) },
46
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
, 16 ) },
47
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(15 ,
'B'
,
'G'
,
'R'
) },
48
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(15 ,
'R'
,
'G'
,
'B'
) },
49
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(16 ,
'B'
,
'G'
,
'R'
) },
50
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(16 ,
'R'
,
'G'
,
'B'
) },
51
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
, 12 ) },
52
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
, 12 ) },
53
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(12 ,
'B'
,
'G'
,
'R'
) },
54
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(12 ,
'R'
,
'G'
,
'B'
) },
55
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
,
'A'
) },
56
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
, 0 ) },
57
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
,
'A'
) },
58
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
, 0 ) },
59
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'A'
,
'B'
,
'G'
,
'R'
) },
60
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
( 0 ,
'B'
,
'G'
,
'R'
) },
61
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'A'
,
'R'
,
'G'
,
'B'
) },
62
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
( 0 ,
'R'
,
'G'
,
'B'
) },
63
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
, 24 ) },
64
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
, 24 ) },
65
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'4'
,
'1'
,
'1'
,
'P'
) },
66
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'4'
,
'2'
,
'2'
,
'P'
) },
67
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'4'
,
'2'
,
'2'
,
'P'
) },
68
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'4'
,
'4'
,
'0'
,
'P'
) },
69
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'4'
,
'4'
,
'0'
,
'P'
) },
70
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'4'
,
'4'
,
'4'
,
'P'
) },
71
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'4'
,
'4'
,
'4'
,
'P'
) },
72
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'1'
,
'W'
,
'0'
) },
73
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'0'
,
'W'
,
'1'
) },
74
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
, 8 ) },
75
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
, 8 ) },
76
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
, 4 ) },
77
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
, 4 ) },
78
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'4'
,
'B'
,
'Y'
) },
79
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'4'
,
'B'
,
'Y'
) },
80
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
, 48 ) },
81
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
, 48 ) },
82
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(48 ,
'B'
,
'G'
,
'R'
) },
83
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(48 ,
'R'
,
'G'
,
'B'
) },
84
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'R'
,
'A'
, 64 ) },
85
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'B'
,
'A'
, 64 ) },
86
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(64 ,
'B'
,
'R'
,
'A'
) },
87
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(64 ,
'R'
,
'B'
,
'A'
) },
88
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 11 , 10 ) },
89
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(10 , 11 ,
'3'
,
'Y'
) },
90
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 10 , 10 ) },
91
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(10 , 10 ,
'3'
,
'Y'
) },
92
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 0 , 10 ) },
93
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(10 , 0 ,
'3'
,
'Y'
) },
94
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 11 , 12 ) },
95
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(12 , 11 ,
'3'
,
'Y'
) },
96
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 10 , 12 ) },
97
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(12 , 10 ,
'3'
,
'Y'
) },
98
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 0 , 12 ) },
99
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(12 , 0 ,
'3'
,
'Y'
) },
100
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 11 , 14 ) },
101
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(14 , 11 ,
'3'
,
'Y'
) },
102
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 10 , 14 ) },
103
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(14 , 10 ,
'3'
,
'Y'
) },
104
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 0 , 14 ) },
105
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(14 , 0 ,
'3'
,
'Y'
) },
106
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'1'
, 0 , 16 ) },
107
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(16 , 0 ,
'1'
,
'Y'
) },
108
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 11 , 16 ) },
109
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(16 , 11 ,
'3'
,
'Y'
) },
110
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 10 , 16 ) },
111
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(16 , 10 ,
'3'
,
'Y'
) },
112
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 0 , 16 ) },
113
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(16 , 0 ,
'3'
,
'Y'
) },
114
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'4'
, 11 , 8 ) },
115
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'4'
, 10 , 8 ) },
116
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'4'
, 0 , 8 ) },
117
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'2'
, 0 , 8 ) },
118
119
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'1'
, 0 , 9 ) },
120
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
( 9 , 0 ,
'1'
,
'Y'
) },
121
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'4'
, 11 , 9 ) },
122
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
( 9 , 11 ,
'4'
,
'Y'
) },
123
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'4'
, 10 , 9 ) },
124
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
( 9 , 10 ,
'4'
,
'Y'
) },
125
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'4'
, 0 , 9 ) },
126
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
( 9 , 0 ,
'4'
,
'Y'
) },
127
128
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'1'
, 0 , 10 ) },
129
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(10 , 0 ,
'1'
,
'Y'
) },
130
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'4'
, 11 , 10 ) },
131
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(10 , 11 ,
'4'
,
'Y'
) },
132
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'4'
, 10 , 10 ) },
133
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(10 , 10 ,
'4'
,
'Y'
) },
134
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'4'
, 0 , 10 ) },
135
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(10 , 0 ,
'4'
,
'Y'
) },
136
137
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'1'
, 0 , 16 ) },
138
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(16 , 0 ,
'1'
,
'Y'
) },
139
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'4'
, 11 , 16 ) },
140
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(16 , 11 ,
'4'
,
'Y'
) },
141
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'4'
, 10 , 16 ) },
142
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(16 , 10 ,
'4'
,
'Y'
) },
143
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'4'
, 0 , 16 ) },
144
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(16 , 0 ,
'4'
,
'Y'
) },
145
146
{
AV_CODEC_ID_NONE
, 0 }
147
};
148
149
static
const
AVCodecTag
nut_audio_extra_tags
[] = {
150
{
AV_CODEC_ID_PCM_ALAW
,
MKTAG
(
'A'
,
'L'
,
'A'
,
'W'
) },
151
{
AV_CODEC_ID_PCM_MULAW
,
MKTAG
(
'U'
,
'L'
,
'A'
,
'W'
) },
152
{
AV_CODEC_ID_MP3
,
MKTAG
(
'M'
,
'P'
,
'3'
,
' '
) },
153
{
AV_CODEC_ID_NONE
, 0 }
154
};
155
156
const
AVCodecTag
ff_nut_audio_tags
[] = {
157
{
AV_CODEC_ID_PCM_F32BE
,
MKTAG
(32 ,
'D'
,
'F'
,
'P'
) },
158
{
AV_CODEC_ID_PCM_F32LE
,
MKTAG
(
'P'
,
'F'
,
'D'
, 32 ) },
159
{
AV_CODEC_ID_PCM_F64BE
,
MKTAG
(64 ,
'D'
,
'F'
,
'P'
) },
160
{
AV_CODEC_ID_PCM_F64LE
,
MKTAG
(
'P'
,
'F'
,
'D'
, 64 ) },
161
{
AV_CODEC_ID_PCM_S16BE
,
MKTAG
(16 ,
'D'
,
'S'
,
'P'
) },
162
{
AV_CODEC_ID_PCM_S16LE
,
MKTAG
(
'P'
,
'S'
,
'D'
, 16 ) },
163
{
AV_CODEC_ID_PCM_S24BE
,
MKTAG
(24 ,
'D'
,
'S'
,
'P'
) },
164
{
AV_CODEC_ID_PCM_S24LE
,
MKTAG
(
'P'
,
'S'
,
'D'
, 24 ) },
165
{
AV_CODEC_ID_PCM_S32BE
,
MKTAG
(32 ,
'D'
,
'S'
,
'P'
) },
166
{
AV_CODEC_ID_PCM_S32LE
,
MKTAG
(
'P'
,
'S'
,
'D'
, 32 ) },
167
{
AV_CODEC_ID_PCM_S8
,
MKTAG
(
'P'
,
'S'
,
'D'
, 8 ) },
168
{
AV_CODEC_ID_PCM_U16BE
,
MKTAG
(16 ,
'D'
,
'U'
,
'P'
) },
169
{
AV_CODEC_ID_PCM_U16LE
,
MKTAG
(
'P'
,
'U'
,
'D'
, 16 ) },
170
{
AV_CODEC_ID_PCM_U24BE
,
MKTAG
(24 ,
'D'
,
'U'
,
'P'
) },
171
{
AV_CODEC_ID_PCM_U24LE
,
MKTAG
(
'P'
,
'U'
,
'D'
, 24 ) },
172
{
AV_CODEC_ID_PCM_U32BE
,
MKTAG
(32 ,
'D'
,
'U'
,
'P'
) },
173
{
AV_CODEC_ID_PCM_U32LE
,
MKTAG
(
'P'
,
'U'
,
'D'
, 32 ) },
174
{
AV_CODEC_ID_PCM_U8
,
MKTAG
(
'P'
,
'U'
,
'D'
, 8 ) },
175
{
AV_CODEC_ID_PCM_S8_PLANAR
,
MKTAG
(
'P'
,
'S'
,
'P'
, 8 ) },
176
{
AV_CODEC_ID_PCM_S16BE_PLANAR
,
MKTAG
(16 ,
'P'
,
'S'
,
'P'
) },
177
{
AV_CODEC_ID_PCM_S16LE_PLANAR
,
MKTAG
(
'P'
,
'S'
,
'P'
, 16 ) },
178
{
AV_CODEC_ID_PCM_S24LE_PLANAR
,
MKTAG
(
'P'
,
'S'
,
'P'
, 24 ) },
179
{
AV_CODEC_ID_PCM_S32LE_PLANAR
,
MKTAG
(
'P'
,
'S'
,
'P'
, 32 ) },
180
{
AV_CODEC_ID_NONE
, 0 }
181
};
182
183
const
AVCodecTag
*
const
ff_nut_codec_tags
[] = {
184
ff_nut_video_tags
,
ff_nut_audio_tags
,
ff_nut_subtitle_tags
,
185
ff_codec_bmp_tags
,
ff_codec_wav_tags
,
nut_audio_extra_tags
,
ff_nut_data_tags
, 0
186
};
187
188
void
ff_nut_reset_ts
(
NUTContext
*nut,
AVRational
time_base, int64_t val){
189
int
i;
190
for
(i=0; i<nut->
avf
->
nb_streams
; i++){
191
nut->
stream
[i].
last_pts
=
av_rescale_rnd
(
192
val,
193
time_base.
num
* (int64_t)nut->
stream
[i].
time_base
->
den
,
194
time_base.
den
* (int64_t)nut->
stream
[i].
time_base
->
num
,
195
AV_ROUND_DOWN
);
196
}
197
}
198
199
int64_t
ff_lsb2full
(
StreamContext
*stream, int64_t lsb){
200
int64_t
mask
= (1ULL<<stream->
msb_pts_shift
)-1;
201
int64_t
delta
= stream->
last_pts
- mask/2;
202
return
((lsb - delta)&
mask
) + delta;
203
}
204
205
int
ff_nut_sp_pos_cmp
(
const
Syncpoint
*
a
,
const
Syncpoint
*
b
){
206
return
((a->
pos
- b->
pos
) >> 32) - ((b->
pos
- a->
pos
) >> 32);
207
}
208
209
int
ff_nut_sp_pts_cmp
(
const
Syncpoint
*
a
,
const
Syncpoint
*
b
){
210
return
((a->
ts
- b->
ts
) >> 32) - ((b->
ts
- a->
ts
) >> 32);
211
}
212
213
void
ff_nut_add_sp
(
NUTContext
*nut, int64_t pos, int64_t back_ptr, int64_t ts){
214
Syncpoint
*
sp
=
av_mallocz
(
sizeof
(
Syncpoint
));
215
struct
AVTreeNode
*node =
av_tree_node_alloc
();
216
217
nut->
sp_count
++;
218
219
sp->
pos
= pos;
220
sp->
back_ptr
= back_ptr;
221
sp->
ts
= ts;
222
av_tree_insert
(&nut->
syncpoints
, sp, (
void
*)
ff_nut_sp_pos_cmp
, &node);
223
if
(node){
224
av_free
(sp);
225
av_free
(node);
226
}
227
}
228
229
static
int
enu_free
(
void
*opaque,
void
*
elem
)
230
{
231
av_free
(elem);
232
return
0;
233
}
234
235
void
ff_nut_free_sp
(
NUTContext
*nut)
236
{
237
av_tree_enumerate
(nut->
syncpoints
,
NULL
,
NULL
,
enu_free
);
238
av_tree_destroy
(nut->
syncpoints
);
239
}
240
241
const
Dispositions
ff_nut_dispositions
[] = {
242
{
"default"
,
AV_DISPOSITION_DEFAULT
},
243
{
"dub"
,
AV_DISPOSITION_DUB
},
244
{
"original"
,
AV_DISPOSITION_ORIGINAL
},
245
{
"comment"
,
AV_DISPOSITION_COMMENT
},
246
{
"lyrics"
,
AV_DISPOSITION_LYRICS
},
247
{
"karaoke"
,
AV_DISPOSITION_KARAOKE
},
248
{
""
, 0}
249
};
250
251
const
AVMetadataConv
ff_nut_metadata_conv
[] = {
252
{
"Author"
,
"artist"
},
253
{
"X-CreationTime"
,
"date"
},
254
{
"CreationTime"
,
"date"
},
255
{
"SourceFilename"
,
"filename"
},
256
{
"X-Language"
,
"language"
},
257
{
"X-Disposition"
,
"disposition"
},
258
{
"X-Replaces"
,
"replaces"
},
259
{
"X-Depends"
,
"depends"
},
260
{
"X-Uses"
,
"uses"
},
261
{
"X-UsesFont"
,
"usesfont"
},
262
{ 0 },
263
};
Generated on Sat May 25 2013 03:58:48 for FFmpeg by
1.8.2