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/avstring.h
"
25
#include "
libavutil/log.h
"
26
#include "
libavutil/opt.h
"
27
#include "
libavutil/pixdesc.h
"
28
#include "
avformat.h
"
29
#include "
avio_internal.h
"
30
#include "
internal.h
"
31
#include "
libavutil/opt.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
}
VideoMuxData
;
41
42
static
int
write_header
(
AVFormatContext
*
s
)
43
{
44
VideoMuxData
*
img
= s->
priv_data
;
45
AVStream
*st = s->
streams
[0];
46
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(st->
codec
->
pix_fmt
);
47
const
char
*str;
48
49
av_strlcpy
(img->
path
, s->
filename
,
sizeof
(img->
path
));
50
51
/* find format */
52
if
(s->
oformat
->
flags
&
AVFMT_NOFILE
)
53
img->
is_pipe
= 0;
54
else
55
img->
is_pipe
= 1;
56
57
str = strrchr(img->
path
,
'.'
);
58
img->
split_planes
= str
59
&& !
av_strcasecmp
(str + 1,
"y"
)
60
&& s->
nb_streams
== 1
61
&& st->
codec
->
codec_id
==
AV_CODEC_ID_RAWVIDEO
62
&& desc
63
&&(desc->
flags
&
AV_PIX_FMT_FLAG_PLANAR
)
64
&& desc->
nb_components
>= 3;
65
return
0;
66
}
67
68
static
int
write_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
69
{
70
VideoMuxData
*
img
= s->
priv_data
;
71
AVIOContext
*pb[4];
72
char
filename[1024];
73
AVCodecContext
*codec = s->
streams
[pkt->
stream_index
]->
codec
;
74
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(codec->
pix_fmt
);
75
int
i;
76
77
if
(!img->
is_pipe
) {
78
if
(img->
update
) {
79
av_strlcpy
(filename, img->
path
,
sizeof
(filename));
80
}
else
if
(
av_get_frame_filename
(filename,
sizeof
(filename), img->
path
, img->
img_number
) < 0 &&
81
img->
img_number
> 1) {
82
av_log
(s,
AV_LOG_ERROR
,
83
"Could not get frame filename number %d from pattern '%s' (either set updatefirst or use a pattern like %%03d within the filename pattern)\n"
,
84
img->
img_number
, img->
path
);
85
return
AVERROR
(EINVAL);
86
}
87
for
(i = 0; i < 4; i++) {
88
if
(
avio_open2
(&pb[i], filename,
AVIO_FLAG_WRITE
,
89
&s->
interrupt_callback
, NULL) < 0) {
90
av_log
(s,
AV_LOG_ERROR
,
"Could not open file : %s\n"
, filename);
91
return
AVERROR
(EIO);
92
}
93
94
if
(!img->
split_planes
|| i+1 >= desc->
nb_components
)
95
break
;
96
filename[strlen(filename) - 1] = ((
int
[]){
'U'
,
'V'
,
'A'
,
'x'
})[i];
97
}
98
}
else
{
99
pb[0] = s->
pb
;
100
}
101
102
if
(img->
split_planes
) {
103
int
ysize = codec->
width
* codec->
height
;
104
int
usize =
FF_CEIL_RSHIFT
(codec->
width
, desc->
log2_chroma_w
) *
FF_CEIL_RSHIFT
(codec->
height
, desc->
log2_chroma_h
);
105
if
(desc->
comp
[0].
depth_minus1
>= 8) {
106
ysize *= 2;
107
usize *= 2;
108
}
109
avio_write
(pb[0], pkt->
data
, ysize);
110
avio_write
(pb[1], pkt->
data
+ ysize , usize);
111
avio_write
(pb[2], pkt->
data
+ ysize + usize, usize);
112
avio_close
(pb[1]);
113
avio_close
(pb[2]);
114
if
(desc->
nb_components
> 3) {
115
avio_write
(pb[3], pkt->
data
+ ysize + 2*usize, ysize);
116
avio_close
(pb[3]);
117
}
118
}
else
{
119
avio_write
(pb[0], pkt->
data
, pkt->
size
);
120
}
121
avio_flush
(pb[0]);
122
if
(!img->
is_pipe
) {
123
avio_close
(pb[0]);
124
}
125
126
img->
img_number
++;
127
return
0;
128
}
129
130
#define OFFSET(x) offsetof(VideoMuxData, x)
131
#define ENC AV_OPT_FLAG_ENCODING_PARAM
132
static
const
AVOption
muxoptions
[] = {
133
{
"updatefirst"
,
"continuously overwrite one file"
,
OFFSET
(update),
AV_OPT_TYPE_INT
, { .i64 = 0 }, 0, 1,
ENC
},
134
{
"update"
,
"continuously overwrite one file"
,
OFFSET
(update),
AV_OPT_TYPE_INT
, { .i64 = 0 }, 0, 1,
ENC
},
135
{
"start_number"
,
"set first number in the sequence"
,
OFFSET
(img_number),
AV_OPT_TYPE_INT
, { .i64 = 1 }, 1, INT_MAX,
ENC
},
136
{ NULL },
137
};
138
139
#if CONFIG_IMAGE2_MUXER
140
static
const
AVClass
img2mux_class = {
141
.
class_name
=
"image2 muxer"
,
142
.item_name =
av_default_item_name
,
143
.option =
muxoptions
,
144
.version =
LIBAVUTIL_VERSION_INT
,
145
};
146
147
AVOutputFormat
ff_image2_muxer = {
148
.
name
=
"image2"
,
149
.long_name =
NULL_IF_CONFIG_SMALL
(
"image2 sequence"
),
150
.extensions =
"bmp,dpx,jls,jpeg,jpg,ljpg,pam,pbm,pcx,pgm,pgmyuv,png,"
151
"ppm,sgi,tga,tif,tiff,jp2,j2c,j2k,xwd,sun,ras,rs,im1,im8,im24,"
152
"sunras,xbm,xface"
,
153
.priv_data_size =
sizeof
(
VideoMuxData
),
154
.video_codec =
AV_CODEC_ID_MJPEG
,
155
.
write_header
=
write_header
,
156
.
write_packet
=
write_packet
,
157
.
flags
=
AVFMT_NOTIMESTAMPS
|
AVFMT_NODIMENSIONS
|
AVFMT_NOFILE
,
158
.priv_class = &img2mux_class,
159
};
160
#endif
161
#if CONFIG_IMAGE2PIPE_MUXER
162
AVOutputFormat
ff_image2pipe_muxer = {
163
.
name
=
"image2pipe"
,
164
.long_name =
NULL_IF_CONFIG_SMALL
(
"piped image2 sequence"
),
165
.priv_data_size =
sizeof
(
VideoMuxData
),
166
.video_codec =
AV_CODEC_ID_MJPEG
,
167
.
write_header
=
write_header
,
168
.
write_packet
=
write_packet
,
169
.
flags
=
AVFMT_NOTIMESTAMPS
|
AVFMT_NODIMENSIONS
170
};
171
#endif
Generated on Wed Jul 10 2013 23:48:12 for FFmpeg by
1.8.2