FFmpeg
Loading...
Searching...
No Matches
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 <time.h>
24#ifdef _WIN32
25#include <sys/utime.h>
26#else
27#include <sys/time.h>
28#endif
29
30#include "config_components.h"
31
32#include "libavutil/avutil.h"
34#include "libavutil/avstring.h"
35#include "libavutil/bprint.h"
36#include "libavutil/dict.h"
37#include "libavutil/log.h"
39#include "libavutil/mem.h"
40#include "libavutil/opt.h"
42#include "libavutil/pixdesc.h"
44#include "avformat.h"
45#include "avio_internal.h"
46#include "internal.h"
47#include "img2.h"
48#include "mux.h"
49
50typedef struct VideoMuxData {
51 const AVClass *class; /**< Class for private options. */
54 int split_planes; /**< use independent file for each Y, U, V plane */
55 int update;
58 const char *muxer;
62 int64_t creation_ts; /**< creation_time in microseconds since epoch */
64
65static void set_file_mtime(AVFormatContext *s, const char *path, int64_t ts_us)
66{
67 int64_t sec = ts_us / 1000000;
68 int64_t usec = ts_us % 1000000;
69
70 if (usec < 0) {
71 sec--;
72 usec += 1000000;
73 }
74
75#ifdef _WIN32
76 struct _utimbuf ut;
77 ut.actime = sec;
78 ut.modtime = sec;
79 if (_utime(path, &ut) < 0)
80#else
81 struct timeval times[2] = {
82 { .tv_sec = sec, .tv_usec = usec },
83 { .tv_sec = sec, .tv_usec = usec },
84 };
85 if (utimes(path, times) < 0)
86#endif
88 "Failed to set file modification time for %s\n", path);
89}
90
92{
93 VideoMuxData *img = s->priv_data;
94 AVStream *st = s->streams[0];
96
97 if (st->codecpar->codec_id == AV_CODEC_ID_GIF) {
98 img->muxer = "gif";
99 } else if (st->codecpar->codec_id == AV_CODEC_ID_FITS) {
100 img->muxer = "fits";
101 } else if (st->codecpar->codec_id == AV_CODEC_ID_AV1) {
102 img->muxer = "avif";
103 } else if (st->codecpar->codec_id == AV_CODEC_ID_RAWVIDEO) {
104 const char *str = strrchr(s->url, '.');
105 img->split_planes = str
106 && !av_strcasecmp(str + 1, "y")
107 && s->nb_streams == 1
108 && desc
109 &&(desc->flags & AV_PIX_FMT_FLAG_PLANAR)
110 && desc->nb_components >= 3;
111 }
112 img->img_number = img->start_img_number;
113
114 if (img->update_filemtime) {
115 const char *proto = avio_find_protocol_name(s->url);
117 int64_t parsed_ts;
118
119 if (!proto || strcmp(proto, "file")) {
121 "update_filemtime is only supported for local files, "
122 "it will be ignored\n");
123 img->update_filemtime = 0;
124 } else {
125 entry = av_dict_get(s->metadata, "creation_time", NULL, 0);
126 if (!entry || av_parse_time(&parsed_ts, entry->value, 0) < 0) {
128 "No valid creation_time metadata found, "
129 "update_filemtime will be ignored\n");
130 img->update_filemtime = 0;
131 } else {
132 img->creation_ts = parsed_ts;
133 }
134 }
135 }
136
137 return 0;
138}
139
141{
142 VideoMuxData *img = s->priv_data;
143 AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
144 AVStream *st;
145 AVPacket *const pkt2 = ffformatcontext(s)->pkt;
146 AVFormatContext *fmt = NULL;
147 int ret;
148
149 /* URL is not used directly as we are overriding the IO context later. */
150 ret = avformat_alloc_output_context2(&fmt, NULL, img->muxer, s->url);
151 if (ret < 0)
152 return ret;
153 st = avformat_new_stream(fmt, NULL);
154 if (!st) {
155 ret = AVERROR(ENOMEM);
156 goto out;
157 }
158 st->id = pkt->stream_index;
159
160 fmt->pb = pb;
161
162 ret = av_packet_ref(pkt2, pkt);
163 if (ret < 0)
164 goto out;
165 pkt2->stream_index = 0;
166
167 if ((ret = avcodec_parameters_copy(st->codecpar, par)) < 0 ||
168 (ret = avformat_write_header(fmt, NULL)) < 0 ||
169 (ret = av_interleaved_write_frame(fmt, pkt2)) < 0 ||
170 (ret = av_write_trailer(fmt))) {}
171
172 av_packet_unref(pkt2);
173out:
175 return ret;
176}
177
179{
180 VideoMuxData *img = s->priv_data;
181 if (img->muxer) {
182 int ret = write_muxed_file(s, s->pb, pkt);
183 if (ret < 0)
184 return ret;
185 } else {
186 avio_write(s->pb, pkt->data, pkt->size);
187 }
188 img->img_number++;
189 return 0;
190}
191
192static int write_and_close(AVFormatContext *s, AVIOContext **pb, const unsigned char *buf, int size)
193{
194 avio_write(*pb, buf, size);
195 avio_flush(*pb);
196 return ff_format_io_close(s, pb);
197}
198
200{
201 VideoMuxData *img = s->priv_data;
202 AVIOContext *pb[4] = {0};
203 char* target[4] = {0};
204 char* tmp[4] = {0};
205 char* filepaths[4] = {0};
206 AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
208 int ret, i;
210 AVBPrint filename;
212
213 if (img->update) {
214 av_bprintf(&filename, "%s", s->url);
215 } else if (img->use_strftime) {
216 time_t now0;
217 struct tm *tm, tmpbuf;
218 time(&now0);
219 tm = localtime_r(&now0, &tmpbuf);
220 av_bprint_strftime(&filename, s->url, tm);
221 } else if (img->frame_pts) {
222 if (ff_bprint_get_frame_filename(&filename, s->url, pkt->pts, AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) {
223 av_log(s, AV_LOG_ERROR, "Cannot write filename by pts of the frames.");
224 ret = AVERROR(EINVAL);
225 goto fail;
226 }
227 } else if (ff_bprint_get_frame_filename(&filename, s->url,
228 img->img_number,
230 if (img->img_number == img->start_img_number) {
231 av_log(s, AV_LOG_WARNING, "The specified filename '%s' does not contain an image sequence pattern or a pattern is invalid.\n", s->url);
233 "Use a pattern such as %%03d for an image sequence or "
234 "use the -update option (with -frames:v 1 if needed) to write a single image.\n");
235 av_bprint_clear(&filename);
236 av_bprintf(&filename, "%s", s->url);
237 } else {
238 av_log(s, AV_LOG_ERROR, "Cannot write more than one file with the same name. Are you missing the -update option or a sequence pattern?\n");
239 ret = AVERROR(EINVAL);
240 goto fail;
241 }
242 }
243 if (!av_bprint_is_complete(&filename)) {
244 ret = AVERROR(ENOMEM);
245 goto fail;
246 }
247 for (i = 0; i < 4; i++) {
248 av_dict_copy(&options, img->protocol_opts, 0);
249 if (img->use_rename) {
250 tmp[i] = av_asprintf("%s.tmp", filename.str);
251 target[i] = av_strdup(filename.str);
252 if (!tmp[i] || !target[i]) {
253 ret = AVERROR(ENOMEM);
254 goto fail;
255 }
256 }
257 if ((ret = s->io_open(s, &pb[i], tmp[i] ? tmp[i] : filename.str, AVIO_FLAG_WRITE, &options)) < 0) {
258 av_log(s, AV_LOG_ERROR, "Could not open file : %s\n", tmp[i] ? tmp[i] : filename.str);
259 goto fail;
260 }
261 if (options) {
262 av_log(s, AV_LOG_ERROR, "Could not recognize some protocol options\n");
263 ret = AVERROR(EINVAL);
264 goto fail;
265 }
266
267 if (img->update_filemtime) {
268 filepaths[i] = av_strdup(filename.str);
269 if (!filepaths[i]) {
270 ret = AVERROR(ENOMEM);
271 goto fail;
272 }
273 }
274
275 if (!img->split_planes || i+1 >= desc->nb_components)
276 break;
277 filename.str[filename.len - 1] = "UVAx"[i];
278 }
279 av_bprint_finalize(&filename, NULL);
280
281 if (img->split_planes) {
282 int ysize = par->width * par->height;
283 int usize = AV_CEIL_RSHIFT(par->width, desc->log2_chroma_w) * AV_CEIL_RSHIFT(par->height, desc->log2_chroma_h);
284 if (desc->comp[0].depth >= 9) {
285 ysize *= 2;
286 usize *= 2;
287 }
288 if (ysize + 2*usize + (desc->nb_components > 3) * ysize > pkt->size) {
289 ret = AVERROR(EINVAL);
290 goto fail;
291 }
292
293 if ((ret = write_and_close(s, &pb[0], pkt->data , ysize)) < 0 ||
294 (ret = write_and_close(s, &pb[1], pkt->data + ysize , usize)) < 0 ||
295 (ret = write_and_close(s, &pb[2], pkt->data + ysize + usize, usize)) < 0)
296 goto fail;
297 if (desc->nb_components > 3)
298 ret = write_and_close(s, &pb[3], pkt->data + ysize + 2*usize, ysize);
299 } else if (img->muxer) {
300 if ((ret = write_muxed_file(s, pb[0], pkt)) < 0)
301 goto fail;
302 ret = ff_format_io_close(s, &pb[0]);
303 } else {
304 ret = write_and_close(s, &pb[0], pkt->data, pkt->size);
305 }
306 if (ret < 0)
307 goto fail;
308
309 for (i = 0; i < 4 && tmp[i]; i++) {
310 int ret = ff_rename(tmp[i], target[i], s);
311 if (ret < 0)
312 goto fail;
313 av_freep(&tmp[i]);
314 av_freep(&target[i]);
315 }
316
317 if (img->update_filemtime) {
318 AVStream *st = s->streams[pkt->stream_index];
319 int64_t frame_ts = img->creation_ts;
320 int skip = 0;
321
322 if (pkt->pts != AV_NOPTS_VALUE) {
325 if (offset == INT64_MIN ||
326 (offset > 0 && img->creation_ts > INT64_MAX - offset) ||
327 (offset < 0 && img->creation_ts < INT64_MIN - offset)) {
329 "Integer overflow computing file mtime, skipping\n");
330 skip = 1;
331 } else {
332 frame_ts += offset;
333 }
334 }
335
336 if (!skip) {
337 for (i = 0; i < 4 && filepaths[i]; i++)
338 set_file_mtime(s, filepaths[i], frame_ts);
339 }
340 }
341
342 for (i = 0; i < FF_ARRAY_ELEMS(filepaths); i++)
343 av_freep(&filepaths[i]);
344
345 img->img_number++;
346 return 0;
347
348fail:
349 av_bprint_finalize(&filename, NULL);
351 for (i = 0; i < FF_ARRAY_ELEMS(pb); i++) {
352 av_freep(&tmp[i]);
353 av_freep(&target[i]);
354 av_freep(&filepaths[i]);
355 if (pb[i])
356 ff_format_io_close(s, &pb[i]);
357 }
358 return ret;
359}
360
361static int query_codec(enum AVCodecID id, int std_compliance)
362{
363 int i;
364 for (i = 0; ff_img_tags[i].id != AV_CODEC_ID_NONE; i++)
365 if (ff_img_tags[i].id == id)
366 return 1;
367
368 // Anything really can be stored in img2
369 return std_compliance < FF_COMPLIANCE_NORMAL;
370}
371
372#define OFFSET(x) offsetof(VideoMuxData, x)
373#define ENC AV_OPT_FLAG_ENCODING_PARAM
374static const AVOption muxoptions[] = {
375 { "update", "continuously overwrite one file", OFFSET(update), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
376 { "start_number", "set first number in the sequence", OFFSET(start_img_number), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, INT_MAX, ENC },
377 { "strftime", "use strftime for filename", OFFSET(use_strftime), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
378 { "frame_pts", "use current frame pts for filename", OFFSET(frame_pts), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
379 { "atomic_writing", "write files atomically (using temporary files and renames)", OFFSET(use_rename), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
380 { "protocol_opts", "specify protocol options for the opened files", OFFSET(protocol_opts), AV_OPT_TYPE_DICT, {0}, 0, 0, ENC },
381 { "update_filemtime", "set output file mtime from creation_time metadata plus frame offset", OFFSET(update_filemtime), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
382 { NULL },
383};
384
385#if CONFIG_IMAGE2_MUXER
386static const AVClass img2mux_class = {
387 .class_name = "image2 muxer",
388 .item_name = av_default_item_name,
389 .option = muxoptions,
390 .version = LIBAVUTIL_VERSION_INT,
391};
392
394 .p.name = "image2",
395 .p.long_name = NULL_IF_CONFIG_SMALL("image2 sequence"),
396 .p.extensions = "bmp,dpx,exr,jls,jpeg,jpg,jxs,jxl,ljpg,pam,pbm,pcx,pfm,pgm,pgmyuv,phm,"
397 "png,ppm,sgi,tga,tif,tiff,jp2,j2c,j2k,xwd,sun,ras,rs,im1,im8,"
398 "im24,sunras,vbn,xbm,xface,pix,y,avif,qoi,hdr,wbmp",
399 .priv_data_size = sizeof(VideoMuxData),
400 .p.video_codec = AV_CODEC_ID_MJPEG,
401 .write_header = write_header,
402 .write_packet = write_packet,
403 .query_codec = query_codec,
405 .p.priv_class = &img2mux_class,
406};
407#endif
408#if CONFIG_IMAGE2PIPE_MUXER
410 .p.name = "image2pipe",
411 .p.long_name = NULL_IF_CONFIG_SMALL("piped image2 sequence"),
412 .priv_data_size = sizeof(VideoMuxData),
413 .p.video_codec = AV_CODEC_ID_MJPEG,
414 .write_header = write_header,
415 .write_packet = write_packet_pipe,
416 .query_codec = query_codec,
418};
419#endif
static av_always_inline void update(AVFilterContext *ctx, AVFrame *insamples, int is_silence, int current_sample, int64_t nb_samples_notify, AVRational time_base)
const FFOutputFormat ff_image2pipe_muxer
const FFOutputFormat ff_image2_muxer
#define entry
int ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
Definition avformat.c:961
Main libavformat public API header.
#define AVFMT_NODIMENSIONS
Format does not need width/height.
Definition avformat.h:502
#define AVFMT_NOFILE
Demuxer will use avio_open, no opened file should be provided by the caller.
Definition avformat.h:488
#define AVFMT_NOTIMESTAMPS
Format does not need / have any timestamps.
Definition avformat.h:498
int avformat_alloc_output_context2(AVFormatContext **ctx, const AVOutputFormat *oformat, const char *format_name, const char *filename)
Allocate an AVFormatContext for an output format.
Definition mux.c:95
const char * avio_find_protocol_name(const char *url)
Return the name of the protocol that will handle the passed URL.
Definition avio.c:725
int ff_rename(const char *url_src, const char *url_dst, void *logctx)
Wrap ffurl_move() and log if error happens.
Definition avio.c:929
#define AVIO_FLAG_WRITE
write-only
Definition avio.h:618
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition aviobuf.c:206
void avio_flush(AVIOContext *s)
Force flushing of buffered data.
Definition aviobuf.c:228
char * av_asprintf(const char *fmt,...)
Definition avstring.c:115
Convenience header that includes libavutil's core.
static void BS_FUNC skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition bprint.c:122
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition bprint.c:69
AVBPrint public header.
#define AV_BPRINT_SIZE_UNLIMITED
#define ENC
Definition caca.c:198
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Definition codec_par.c:107
#define AV_CEIL_RSHIFT(a, b)
Definition common.h:60
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
#define FF_COMPLIANCE_NORMAL
Definition defs.h:60
static AVPacket * pkt
Public dictionary API.
static int write_packet(Muxer *mux, OutputStream *ost, AVPacket *pkt)
Definition ffmpeg_mux.c:204
static void write_header(FFV1Context *f)
Definition ffv1enc.c:384
#define fail
Definition test.h:479
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
@ AV_OPT_TYPE_DICT
Underlying C type is AVDictionary*.
Definition opt.h:289
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition opt.h:326
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition codec_id.h:47
@ AV_CODEC_ID_RAWVIDEO
Definition codec_id.h:63
@ AV_CODEC_ID_GIF
Definition codec_id.h:147
@ AV_CODEC_ID_NONE
Definition codec_id.h:48
@ AV_CODEC_ID_AV1
Definition codec_id.h:275
@ AV_CODEC_ID_FITS
Definition codec_id.h:281
@ AV_CODEC_ID_MJPEG
Definition codec_id.h:57
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition packet.c:434
int av_packet_ref(AVPacket *dst, const AVPacket *src)
Setup a new reference to the data described by a given packet.
Definition packet.c:442
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
void avformat_free_context(AVFormatContext *s)
Free an AVFormatContext and all its streams.
Definition avformat.c:150
av_warn_unused_result int avformat_write_header(AVFormatContext *s, AVDictionary **options)
Allocate the stream private data and write the stream header to an output media file.
Definition mux.c:467
int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt)
Write a packet to an output media file ensuring correct interleaving.
Definition mux.c:1223
int av_write_trailer(AVFormatContext *s)
Write the stream trailer to an output media file and free the file private data.
Definition mux.c:1238
#define AV_FRAME_FILENAME_FLAGS_MULTIPLE
Allow multiple d.
Definition avformat.h:3062
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
Definition bprint.h:218
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition bprint.c:235
void av_bprint_strftime(AVBPrint *buf, const char *fmt, const struct tm *tm)
Append a formatted date and time to a print buffer.
Definition bprint.c:166
void av_bprint_clear(AVBPrint *buf)
Reset the string to "" but keep internal allocated data.
Definition bprint.c:227
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition dict.c:233
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition dict.c:60
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
Definition dict.c:247
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
Definition avstring.c:208
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition avutil.h:247
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition avutil.h:263
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
const IdStrMap ff_img_tags[]
Definition img2.c:105
static const AVOption muxoptions[]
Definition img2enc.c:374
static int write_packet(AVFormatContext *s, AVPacket *pkt)
Definition img2enc.c:199
static int write_packet_pipe(AVFormatContext *s, AVPacket *pkt)
Definition img2enc.c:178
static int write_and_close(AVFormatContext *s, AVIOContext **pb, const unsigned char *buf, int size)
Definition img2enc.c:192
static int write_muxed_file(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
Definition img2enc.c:140
static int query_codec(enum AVCodecID id, int std_compliance)
Definition img2enc.c:361
static void set_file_mtime(AVFormatContext *s, const char *path, int64_t ts_us)
Definition img2enc.c:65
static int write_header(AVFormatContext *s)
Definition img2enc.c:91
#define OFFSET(x)
Definition img2enc.c:372
unsigned offset
Definition libaomenc.c:763
int ff_bprint_get_frame_filename(struct AVBPrint *buf, const char *path, int64_t number, int flags)
Return in 'buf' the path with 'd' replaced by a number.
Definition utils.c:293
static av_always_inline FFFormatContext * ffformatcontext(AVFormatContext *s)
Definition internal.h:130
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
const char * desc
Definition libsvtav1.c:83
Memory handling functions.
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
#define av_strdup(s)
Definition ops_static.c:55
AVOptions.
int av_parse_time(int64_t *timeval, const char *timestr, int duration)
Parse timestr and return in *time a corresponding number of microseconds.
Definition parseutils.c:592
misc parsing utilities
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
#define AV_PIX_FMT_FLAG_PLANAR
At least one pixel component is not in the first data plane.
Definition pixdesc.h:132
#define FF_ARRAY_ELEMS(a)
Describe the class of an AVClass context structure.
Definition log.h:76
This struct describes the properties of an encoded stream.
Definition codec_par.h:49
int height
The height of the video frame in pixels.
Definition codec_par.h:150
int width
The width of the video frame in pixels.
Definition codec_par.h:143
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition codec_par.h:57
Format I/O context.
Definition avformat.h:1333
AVIOContext * pb
I/O context.
Definition avformat.h:1375
Bytestream IO Context.
Definition avio.h:160
AVOption.
Definition opt.h:428
This structure stores compressed data.
Definition packet.h:580
int stream_index
Definition packet.h:605
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition pixdesc.h:69
Stream structure.
Definition avformat.h:766
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition avformat.h:789
int id
Format-specific stream ID.
Definition avformat.h:778
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition avformat.h:805
AVPacket * pkt
Used to hold temporary packets for the generic demuxing code.
Definition internal.h:111
const char * muxer
Definition img2enc.c:58
int frame_pts
Definition img2enc.c:57
int use_strftime
Definition img2enc.c:56
int64_t creation_ts
creation_time in microseconds since epoch
Definition img2enc.c:62
int use_rename
Definition img2enc.c:59
int update_filemtime
Definition img2enc.c:61
int start_img_number
Definition img2enc.c:52
AVDictionary * protocol_opts
Definition img2enc.c:60
int img_number
Definition img2enc.c:53
int split_planes
use independent file for each Y, U, V plane
Definition img2enc.c:54
#define av_freep(p)
#define av_log(a,...)
static uint8_t tmp[40]
Definition aes_ctr.c:52
static FILE * out
Definition movenc.c:55
#define localtime_r
int size
#define img