Libav
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
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 Libav.
7
*
8
* Libav 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
* Libav 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 Libav; 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 "
avformat.h
"
27
#include "
avio_internal.h
"
28
#include "
internal.h
"
29
#include "
libavutil/opt.h
"
30
31
typedef
struct
{
32
const
AVClass
*
class
;
33
int
img_number
;
34
int
is_pipe
;
35
char
path[1024];
36
int
update
;
37
}
VideoMuxData
;
38
39
static
int
write_header
(
AVFormatContext
*s)
40
{
41
VideoMuxData
*img = s->
priv_data
;
42
43
av_strlcpy
(img->
path
, s->
filename
,
sizeof
(img->
path
));
44
45
/* find format */
46
if
(s->
oformat
->
flags
&
AVFMT_NOFILE
)
47
img->
is_pipe
= 0;
48
else
49
img->
is_pipe
= 1;
50
51
return
0;
52
}
53
54
static
int
write_packet
(
AVFormatContext
*s,
AVPacket
*pkt)
55
{
56
VideoMuxData
*img = s->
priv_data
;
57
AVIOContext
*pb[3];
58
char
filename[1024];
59
AVCodecContext
*codec = s->
streams
[pkt->
stream_index
]->
codec
;
60
int
i;
61
62
if
(!img->
is_pipe
) {
63
if
(img->
update
) {
64
av_strlcpy
(filename, img->
path
,
sizeof
(filename));
65
}
else
if
(
av_get_frame_filename
(filename,
sizeof
(filename), img->
path
, img->
img_number
) < 0 &&
66
img->
img_number
> 1) {
67
av_log
(s,
AV_LOG_ERROR
,
68
"Could not get frame filename number %d from pattern '%s'\n"
,
69
img->
img_number
, img->
path
);
70
return
AVERROR
(EIO);
71
}
72
for
(i = 0; i < 3; i++) {
73
if
(
avio_open2
(&pb[i], filename,
AVIO_FLAG_WRITE
,
74
&s->
interrupt_callback
,
NULL
) < 0) {
75
av_log
(s,
AV_LOG_ERROR
,
"Could not open file : %s\n"
, filename);
76
return
AVERROR
(EIO);
77
}
78
79
if
(codec->
codec_id
!=
AV_CODEC_ID_RAWVIDEO
)
80
break
;
81
filename[strlen(filename) - 1] =
'U'
+ i;
82
}
83
}
else
{
84
pb[0] = s->
pb
;
85
}
86
87
if
(codec->
codec_id
==
AV_CODEC_ID_RAWVIDEO
) {
88
int
ysize = codec->
width
* codec->
height
;
89
avio_write
(pb[0], pkt->
data
, ysize);
90
avio_write
(pb[1], pkt->
data
+ ysize, (pkt->
size
- ysize) / 2);
91
avio_write
(pb[2], pkt->
data
+ ysize + (pkt->
size
- ysize) / 2, (pkt->
size
- ysize) / 2);
92
avio_close
(pb[1]);
93
avio_close
(pb[2]);
94
}
else
{
95
if
(
ff_guess_image2_codec
(s->
filename
) ==
AV_CODEC_ID_JPEG2000
) {
96
AVStream
*st = s->
streams
[0];
97
if
(st->
codec
->
extradata_size
> 8 &&
98
AV_RL32
(st->
codec
->
extradata
+ 4) ==
MKTAG
(
'j'
,
'p'
,
'2'
,
'h'
)) {
99
if
(pkt->
size
< 8 ||
100
AV_RL32
(pkt->
data
+ 4) !=
MKTAG
(
'j'
,
'p'
,
'2'
,
'c'
))
101
goto
error;
102
avio_wb32
(pb[0], 12);
103
ffio_wfourcc
(pb[0],
"jP "
);
104
avio_wb32
(pb[0], 0x0D0A870A);
// signature
105
avio_wb32
(pb[0], 20);
106
ffio_wfourcc
(pb[0],
"ftyp"
);
107
ffio_wfourcc
(pb[0],
"jp2 "
);
108
avio_wb32
(pb[0], 0);
109
ffio_wfourcc
(pb[0],
"jp2 "
);
110
avio_write
(pb[0], st->
codec
->
extradata
, st->
codec
->
extradata_size
);
111
}
else
if
(pkt->
size
< 8 ||
112
(!st->
codec
->
extradata_size
&&
113
AV_RL32
(pkt->
data
+ 4) !=
MKTAG
(
'j'
,
'P'
,
' '
,
' '
))) {
// signature
114
error:
115
av_log
(s,
AV_LOG_ERROR
,
"malformed JPEG 2000 codestream\n"
);
116
return
-1;
117
}
118
}
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
{
"start_number"
,
"first number in the sequence"
,
OFFSET
(img_number),
AV_OPT_TYPE_INT
, { .i64 = 1 }, 1, INT_MAX,
ENC
},
134
{
"update"
,
"continuously overwrite one file"
,
OFFSET
(update),
AV_OPT_TYPE_INT
, { .i64 = 0 }, 0, 1,
ENC
},
135
{
NULL
},
136
};
137
138
#if CONFIG_IMAGE2_MUXER
139
static
const
AVClass
img2mux_class = {
140
.
class_name
=
"image2 muxer"
,
141
.item_name =
av_default_item_name
,
142
.option =
muxoptions
,
143
.version =
LIBAVUTIL_VERSION_INT
,
144
};
145
146
AVOutputFormat
ff_image2_muxer = {
147
.
name
=
"image2"
,
148
.long_name =
NULL_IF_CONFIG_SMALL
(
"image2 sequence"
),
149
.extensions =
"bmp,dpx,jpeg,jpg,ljpg,pam,pbm,pcx,pgm,pgmyuv,png,"
150
"ppm,sgi,tga,tif,tiff,jp2,xwd,sun,ras,rs,im1,im8,im24,"
151
"sunras,webp,xbm"
,
152
.priv_data_size =
sizeof
(
VideoMuxData
),
153
.video_codec =
AV_CODEC_ID_MJPEG
,
154
.
write_header
=
write_header
,
155
.
write_packet
=
write_packet
,
156
.
flags
=
AVFMT_NOTIMESTAMPS
|
AVFMT_NODIMENSIONS
|
AVFMT_NOFILE
,
157
.priv_class = &img2mux_class,
158
};
159
#endif
160
#if CONFIG_IMAGE2PIPE_MUXER
161
AVOutputFormat
ff_image2pipe_muxer = {
162
.
name
=
"image2pipe"
,
163
.long_name =
NULL_IF_CONFIG_SMALL
(
"piped image2 sequence"
),
164
.priv_data_size =
sizeof
(
VideoMuxData
),
165
.video_codec =
AV_CODEC_ID_MJPEG
,
166
.
write_header
=
write_header
,
167
.
write_packet
=
write_packet
,
168
.
flags
=
AVFMT_NOTIMESTAMPS
|
AVFMT_NODIMENSIONS
169
};
170
#endif
Generated on Thu Sep 30 2021 23:03:19 for Libav by
1.8.1.2