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
libavformat
img2enc.c
Go to the documentation of this file.
1
/*
2
* Image format
3
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard
4
* Copyright (c) 2004 Michael Niedermayer
5
*
6
* This file is part of FFmpeg.
7
*
8
* FFmpeg is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License as published by the Free Software Foundation; either
11
* version 2.1 of the License, or (at your option) any later version.
12
*
13
* FFmpeg is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
17
*
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with FFmpeg; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*/
22
23
#include "
libavutil/intreadwrite.h
"
24
#include "
libavutil/avassert.h
"
25
#include "
libavutil/avstring.h
"
26
#include "
libavutil/log.h
"
27
#include "
libavutil/opt.h
"
28
#include "
libavutil/pixdesc.h
"
29
#include "
avformat.h
"
30
#include "
avio_internal.h
"
31
#include "
internal.h
"
32
33
typedef
struct
{
34
const
AVClass
*
class
;
/**< Class for private options. */
35
int
img_number
;
36
int
is_pipe
;
37
int
split_planes
;
/**< use independent file for each Y, U, V plane */
38
char
path[1024];
39
int
update
;
40
int
use_strftime
;
41
const
char
*
muxer
;
42
}
VideoMuxData
;
43
44
static
int
write_header
(
AVFormatContext
*
s
)
45
{
46
VideoMuxData
*
img
= s->
priv_data
;
47
AVStream
*st = s->
streams
[0];
48
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(st->
codec
->
pix_fmt
);
49
50
av_strlcpy
(img->
path
, s->
filename
,
sizeof
(img->
path
));
51
52
/* find format */
53
if
(s->
oformat
->
flags
&
AVFMT_NOFILE
)
54
img->
is_pipe
= 0;
55
else
56
img->
is_pipe
= 1;
57
58
if
(st->
codec
->
codec_id
==
AV_CODEC_ID_GIF
) {
59
img->
muxer
=
"gif"
;
60
}
else
if
(st->
codec
->
codec_id
==
AV_CODEC_ID_RAWVIDEO
) {
61
const
char
*str = strrchr(img->
path
,
'.'
);
62
img->
split_planes
= str
63
&& !
av_strcasecmp
(str + 1,
"y"
)
64
&& s->
nb_streams
== 1
65
&& desc
66
&&(desc->
flags
&
AV_PIX_FMT_FLAG_PLANAR
)
67
&& desc->
nb_components
>= 3;
68
}
69
return
0;
70
}
71
72
static
int
write_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
73
{
74
VideoMuxData
*
img
= s->
priv_data
;
75
AVIOContext
*pb[4];
76
char
filename[1024];
77
AVCodecContext
*codec = s->
streams
[pkt->
stream_index
]->
codec
;
78
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(codec->
pix_fmt
);
79
int
i;
80
81
if
(!img->
is_pipe
) {
82
if
(img->
update
) {
83
av_strlcpy
(filename, img->
path
,
sizeof
(filename));
84
}
else
if
(img->
use_strftime
) {
85
time_t now0;
86
struct
tm *tm;
87
time(&now0);
88
tm = localtime(&now0);
89
if
(!strftime(filename,
sizeof
(filename), img->
path
, tm)) {
90
av_log
(s,
AV_LOG_ERROR
,
"Could not get frame filename with strftime\n"
);
91
return
AVERROR
(EINVAL);
92
}
93
}
else
if
(
av_get_frame_filename
(filename,
sizeof
(filename), img->
path
, img->
img_number
) < 0 &&
94
img->
img_number
> 1) {
95
av_log
(s,
AV_LOG_ERROR
,
96
"Could not get frame filename number %d from pattern '%s' (either set updatefirst or use a pattern like %%03d within the filename pattern)\n"
,
97
img->
img_number
, img->
path
);
98
return
AVERROR
(EINVAL);
99
}
100
for
(i = 0; i < 4; i++) {
101
if
(
avio_open2
(&pb[i], filename,
AVIO_FLAG_WRITE
,
102
&s->
interrupt_callback
, NULL) < 0) {
103
av_log
(s,
AV_LOG_ERROR
,
"Could not open file : %s\n"
, filename);
104
return
AVERROR
(EIO);
105
}
106
107
if
(!img->
split_planes
|| i+1 >= desc->
nb_components
)
108
break
;
109
filename[strlen(filename) - 1] =
"UVAx"
[i];
110
}
111
}
else
{
112
pb[0] = s->
pb
;
113
}
114
115
if
(img->
split_planes
) {
116
int
ysize = codec->
width
* codec->
height
;
117
int
usize =
FF_CEIL_RSHIFT
(codec->
width
, desc->
log2_chroma_w
) *
FF_CEIL_RSHIFT
(codec->
height
, desc->
log2_chroma_h
);
118
if
(desc->
comp
[0].
depth_minus1
>= 8) {
119
ysize *= 2;
120
usize *= 2;
121
}
122
avio_write
(pb[0], pkt->
data
, ysize);
123
avio_write
(pb[1], pkt->
data
+ ysize , usize);
124
avio_write
(pb[2], pkt->
data
+ ysize + usize, usize);
125
avio_close
(pb[1]);
126
avio_close
(pb[2]);
127
if
(desc->
nb_components
> 3) {
128
avio_write
(pb[3], pkt->
data
+ ysize + 2*usize, ysize);
129
avio_close
(pb[3]);
130
}
131
}
else
if
(img->
muxer
) {
132
int
ret
;
133
AVStream
*st;
134
AVPacket
pkt2 = {0};
135
AVFormatContext
*
fmt
= NULL;
136
137
av_assert0
(!img->
split_planes
);
138
139
ret =
avformat_alloc_output_context2
(&fmt, NULL, img->
muxer
, s->
filename
);
140
if
(ret < 0)
141
return
ret
;
142
st =
avformat_new_stream
(fmt, NULL);
143
if
(!st) {
144
avformat_free_context
(fmt);
145
return
AVERROR
(ENOMEM);
146
}
147
st->
id
= pkt->
stream_index
;
148
149
fmt->
pb
= pb[0];
150
if
((ret =
av_copy_packet
(&pkt2, pkt)) < 0 ||
151
(ret =
av_dup_packet
(&pkt2)) < 0 ||
152
(ret =
avcodec_copy_context
(st->
codec
, s->
streams
[0]->
codec
)) < 0 ||
153
(ret =
avformat_write_header
(fmt, NULL)) < 0 ||
154
(ret =
av_interleaved_write_frame
(fmt, &pkt2)) < 0 ||
155
(ret =
av_write_trailer
(fmt)) < 0) {
156
av_free_packet
(&pkt2);
157
avformat_free_context
(fmt);
158
return
ret
;
159
}
160
av_free_packet
(&pkt2);
161
avformat_free_context
(fmt);
162
}
else
{
163
avio_write
(pb[0], pkt->
data
, pkt->
size
);
164
}
165
avio_flush
(pb[0]);
166
if
(!img->
is_pipe
) {
167
avio_close
(pb[0]);
168
}
169
170
img->
img_number
++;
171
return
0;
172
}
173
174
#define OFFSET(x) offsetof(VideoMuxData, x)
175
#define ENC AV_OPT_FLAG_ENCODING_PARAM
176
static
const
AVOption
muxoptions
[] = {
177
{
"updatefirst"
,
"continuously overwrite one file"
,
OFFSET
(
update
),
AV_OPT_TYPE_INT
, { .i64 = 0 }, 0, 1,
ENC
},
178
{
"update"
,
"continuously overwrite one file"
,
OFFSET
(
update
),
AV_OPT_TYPE_INT
, { .i64 = 0 }, 0, 1,
ENC
},
179
{
"start_number"
,
"set first number in the sequence"
,
OFFSET
(img_number),
AV_OPT_TYPE_INT
, { .i64 = 1 }, 0, INT_MAX,
ENC
},
180
{
"strftime"
,
"use strftime for filename"
,
OFFSET
(use_strftime),
AV_OPT_TYPE_INT
, { .i64 = 0 }, 0, 1,
ENC
},
181
{ NULL },
182
};
183
184
#if CONFIG_IMAGE2_MUXER
185
static
const
AVClass
img2mux_class = {
186
.
class_name
=
"image2 muxer"
,
187
.item_name =
av_default_item_name
,
188
.option =
muxoptions
,
189
.version =
LIBAVUTIL_VERSION_INT
,
190
};
191
192
AVOutputFormat
ff_image2_muxer = {
193
.
name
=
"image2"
,
194
.long_name =
NULL_IF_CONFIG_SMALL
(
"image2 sequence"
),
195
.extensions =
"bmp,dpx,jls,jpeg,jpg,ljpg,pam,pbm,pcx,pgm,pgmyuv,png,"
196
"ppm,sgi,tga,tif,tiff,jp2,j2c,j2k,xwd,sun,ras,rs,im1,im8,im24,"
197
"sunras,webp,xbm,xface"
,
198
.priv_data_size =
sizeof
(
VideoMuxData
),
199
.video_codec =
AV_CODEC_ID_MJPEG
,
200
.
write_header
=
write_header
,
201
.
write_packet
=
write_packet
,
202
.
flags
=
AVFMT_NOTIMESTAMPS
|
AVFMT_NODIMENSIONS
|
AVFMT_NOFILE
,
203
.priv_class = &img2mux_class,
204
};
205
#endif
206
#if CONFIG_IMAGE2PIPE_MUXER
207
AVOutputFormat
ff_image2pipe_muxer = {
208
.
name
=
"image2pipe"
,
209
.long_name =
NULL_IF_CONFIG_SMALL
(
"piped image2 sequence"
),
210
.priv_data_size =
sizeof
(
VideoMuxData
),
211
.video_codec =
AV_CODEC_ID_MJPEG
,
212
.
write_header
=
write_header
,
213
.
write_packet
=
write_packet
,
214
.
flags
=
AVFMT_NOTIMESTAMPS
|
AVFMT_NODIMENSIONS
215
};
216
#endif
Generated on Sun Mar 23 2014 23:50:11 for FFmpeg by
1.8.2