Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
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 Libav.
6
*
7
* Libav 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
* Libav 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 Libav; 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 "
internal.h
"
26
27
const
AVCodecTag
ff_nut_subtitle_tags
[] = {
28
{
CODEC_ID_TEXT
,
MKTAG
(
'U'
,
'T'
,
'F'
,
'8'
) },
29
{
CODEC_ID_SSA
,
MKTAG
(
'S'
,
'S'
,
'A'
, 0 ) },
30
{
CODEC_ID_DVD_SUBTITLE
,
MKTAG
(
'D'
,
'V'
,
'D'
,
'S'
) },
31
{
CODEC_ID_DVB_SUBTITLE
,
MKTAG
(
'D'
,
'V'
,
'B'
,
'S'
) },
32
{
CODEC_ID_NONE
, 0 }
33
};
34
35
const
AVCodecTag
ff_nut_video_tags
[] = {
36
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
, 15 ) },
37
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
, 15 ) },
38
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
, 16 ) },
39
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
, 16 ) },
40
{
CODEC_ID_RAWVIDEO
,
MKTAG
(15 ,
'B'
,
'G'
,
'R'
) },
41
{
CODEC_ID_RAWVIDEO
,
MKTAG
(15 ,
'R'
,
'G'
,
'B'
) },
42
{
CODEC_ID_RAWVIDEO
,
MKTAG
(16 ,
'B'
,
'G'
,
'R'
) },
43
{
CODEC_ID_RAWVIDEO
,
MKTAG
(16 ,
'R'
,
'G'
,
'B'
) },
44
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
, 12 ) },
45
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
, 12 ) },
46
{
CODEC_ID_RAWVIDEO
,
MKTAG
(12 ,
'B'
,
'G'
,
'R'
) },
47
{
CODEC_ID_RAWVIDEO
,
MKTAG
(12 ,
'R'
,
'G'
,
'B'
) },
48
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
,
'A'
) },
49
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
,
'A'
) },
50
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'A'
,
'B'
,
'G'
,
'R'
) },
51
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'A'
,
'R'
,
'G'
,
'B'
) },
52
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
, 24 ) },
53
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
, 24 ) },
54
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'4'
,
'1'
,
'1'
,
'P'
) },
55
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'4'
,
'2'
,
'2'
,
'P'
) },
56
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'4'
,
'2'
,
'2'
,
'P'
) },
57
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'4'
,
'4'
,
'0'
,
'P'
) },
58
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'4'
,
'4'
,
'0'
,
'P'
) },
59
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'4'
,
'4'
,
'4'
,
'P'
) },
60
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'4'
,
'4'
,
'4'
,
'P'
) },
61
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'1'
,
'W'
,
'0'
) },
62
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'0'
,
'W'
,
'1'
) },
63
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
, 8 ) },
64
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
, 8 ) },
65
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
, 4 ) },
66
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
, 4 ) },
67
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'4'
,
'B'
,
'Y'
) },
68
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'4'
,
'B'
,
'Y'
) },
69
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
, 48 ) },
70
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
, 48 ) },
71
{
CODEC_ID_RAWVIDEO
,
MKTAG
(48 ,
'B'
,
'G'
,
'R'
) },
72
{
CODEC_ID_RAWVIDEO
,
MKTAG
(48 ,
'R'
,
'G'
,
'B'
) },
73
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 11 , 10 ) },
74
{
CODEC_ID_RAWVIDEO
,
MKTAG
(10 , 11 ,
'3'
,
'Y'
) },
75
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 10 , 10 ) },
76
{
CODEC_ID_RAWVIDEO
,
MKTAG
(10 , 10 ,
'3'
,
'Y'
) },
77
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 0 , 10 ) },
78
{
CODEC_ID_RAWVIDEO
,
MKTAG
(10 , 0 ,
'3'
,
'Y'
) },
79
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'1'
, 0 , 16 ) },
80
{
CODEC_ID_RAWVIDEO
,
MKTAG
(16 , 0 ,
'1'
,
'Y'
) },
81
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 11 , 16 ) },
82
{
CODEC_ID_RAWVIDEO
,
MKTAG
(16 , 11 ,
'3'
,
'Y'
) },
83
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 10 , 16 ) },
84
{
CODEC_ID_RAWVIDEO
,
MKTAG
(16 , 10 ,
'3'
,
'Y'
) },
85
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'3'
, 0 , 16 ) },
86
{
CODEC_ID_RAWVIDEO
,
MKTAG
(16 , 0 ,
'3'
,
'Y'
) },
87
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'4'
, 11 , 8 ) },
88
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'Y'
,
'2'
, 0 , 8 ) },
89
{
CODEC_ID_NONE
, 0 }
90
};
91
92
void
ff_nut_reset_ts
(
NUTContext
*nut,
AVRational
time_base, int64_t val){
93
int
i;
94
for
(i=0; i<nut->
avf
->
nb_streams
; i++){
95
nut->
stream
[i].
last_pts
=
av_rescale_rnd
(
96
val,
97
time_base.
num
* (int64_t)nut->
stream
[i].
time_base
->
den
,
98
time_base.
den
* (int64_t)nut->
stream
[i].
time_base
->
num
,
99
AV_ROUND_DOWN
);
100
}
101
}
102
103
int64_t
ff_lsb2full
(
StreamContext
*stream, int64_t lsb){
104
int64_t
mask
= (1<<stream->
msb_pts_shift
)-1;
105
int64_t
delta
= stream->
last_pts
- mask/2;
106
return
((lsb - delta)&
mask
) + delta;
107
}
108
109
int
ff_nut_sp_pos_cmp
(
const
Syncpoint
*a,
const
Syncpoint
*
b
){
110
return
((a->
pos
- b->
pos
) >> 32) - ((b->
pos
- a->
pos
) >> 32);
111
}
112
113
int
ff_nut_sp_pts_cmp
(
const
Syncpoint
*a,
const
Syncpoint
*
b
){
114
return
((a->
ts
- b->
ts
) >> 32) - ((b->
ts
- a->
ts
) >> 32);
115
}
116
117
void
ff_nut_add_sp
(
NUTContext
*nut, int64_t pos, int64_t back_ptr, int64_t ts){
118
Syncpoint
*
sp
=
av_mallocz
(
sizeof
(
Syncpoint
));
119
struct
AVTreeNode
*node=
av_mallocz
(
av_tree_node_size
);
120
121
sp->
pos
= pos;
122
sp->
back_ptr
= back_ptr;
123
sp->
ts
= ts;
124
av_tree_insert
(&nut->
syncpoints
, sp, (
void
*)
ff_nut_sp_pos_cmp
, &node);
125
if
(node){
126
av_free
(sp);
127
av_free
(node);
128
}
129
}
130
131
static
int
enu_free
(
void
*opaque,
void
*
elem
)
132
{
133
av_free
(elem);
134
return
0;
135
}
136
137
void
ff_nut_free_sp
(
NUTContext
*nut)
138
{
139
av_tree_enumerate
(nut->
syncpoints
,
NULL
,
NULL
,
enu_free
);
140
av_tree_destroy
(nut->
syncpoints
);
141
}
142
143
const
Dispositions
ff_nut_dispositions
[] = {
144
{
"default"
,
AV_DISPOSITION_DEFAULT
},
145
{
"dub"
,
AV_DISPOSITION_DUB
},
146
{
"original"
,
AV_DISPOSITION_ORIGINAL
},
147
{
"comment"
,
AV_DISPOSITION_COMMENT
},
148
{
"lyrics"
,
AV_DISPOSITION_LYRICS
},
149
{
"karaoke"
,
AV_DISPOSITION_KARAOKE
},
150
{
""
, 0}
151
};
152
153
const
AVMetadataConv
ff_nut_metadata_conv
[] = {
154
{
"Author"
,
"artist"
},
155
{
"X-CreationTime"
,
"date"
},
156
{
"CreationTime"
,
"date"
},
157
{
"SourceFilename"
,
"filename"
},
158
{
"X-Language"
,
"language"
},
159
{
"X-Disposition"
,
"disposition"
},
160
{
"X-Replaces"
,
"replaces"
},
161
{
"X-Depends"
,
"depends"
},
162
{
"X-Uses"
,
"uses"
},
163
{
"X-UsesFont"
,
"usesfont"
},
164
{ 0 },
165
};