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 /* Semi-planar formats such as NV12 keep several
110 * components in one plane, so splitting per
111 * component needs one plane per component.
112 */
114 == desc->nb_components
115 && desc->nb_components >= 3;
116 }
117 img->img_number = img->start_img_number;
118
119 if (img->update_filemtime) {
120 const char *proto = avio_find_protocol_name(s->url);
122 int64_t parsed_ts;
123
124 if (!proto || strcmp(proto, "file")) {
126 "update_filemtime is only supported for local files, "
127 "it will be ignored\n");
128 img->update_filemtime = 0;
129 } else {
130 entry = av_dict_get(s->metadata, "creation_time", NULL, 0);
131 if (!entry || av_parse_time(&parsed_ts, entry->value, 0) < 0) {
133 "No valid creation_time metadata found, "
134 "update_filemtime will be ignored\n");
135 img->update_filemtime = 0;
136 } else {
137 img->creation_ts = parsed_ts;
138 }
139 }
140 }
141
142 return 0;
143}
144
146{
147 VideoMuxData *img = s->priv_data;
148 AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
149 AVStream *st;
150 AVPacket *const pkt2 = ffformatcontext(s)->pkt;
151 AVFormatContext *fmt = NULL;
152 int ret;
153
154 /* URL is not used directly as we are overriding the IO context later. */
155 ret = avformat_alloc_output_context2(&fmt, NULL, img->muxer, s->url);
156 if (ret < 0)
157 return ret;
158 st = avformat_new_stream(fmt, NULL);
159 if (!st) {
160 ret = AVERROR(ENOMEM);
161 goto out;
162 }
163 st->id = pkt->stream_index;
164
165 fmt->pb = pb;
166
167 ret = av_packet_ref(pkt2, pkt);
168 if (ret < 0)
169 goto out;
170 pkt2->stream_index = 0;
171
172 if ((ret = avcodec_parameters_copy(st->codecpar, par)) < 0 ||
173 (ret = avformat_write_header(fmt, NULL)) < 0 ||
174 (ret = av_interleaved_write_frame(fmt, pkt2)) < 0 ||
175 (ret = av_write_trailer(fmt))) {}
176
177 av_packet_unref(pkt2);
178out:
180 return ret;
181}
182
184{
185 VideoMuxData *img = s->priv_data;
186 if (img->muxer) {
187 int ret = write_muxed_file(s, s->pb, pkt);
188 if (ret < 0)
189 return ret;
190 } else {
191 avio_write(s->pb, pkt->data, pkt->size);
192 }
193 img->img_number++;
194 return 0;
195}
196
197static int write_and_close(AVFormatContext *s, AVIOContext **pb, const unsigned char *buf, int size)
198{
199 avio_write(*pb, buf, size);
200 avio_flush(*pb);
201 return ff_format_io_close(s, pb);
202}
203
205{
206 VideoMuxData *img = s->priv_data;
207 AVIOContext *pb[4] = {0};
208 char* target[4] = {0};
209 char* tmp[4] = {0};
210 char* filepaths[4] = {0};
211 AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
213 int ret, i;
215 AVBPrint filename;
217
218 if (img->update) {
219 av_bprintf(&filename, "%s", s->url);
220 } else if (img->use_strftime) {
221 time_t now0;
222 struct tm *tm, tmpbuf;
223 time(&now0);
224 tm = localtime_r(&now0, &tmpbuf);
225 av_bprint_strftime(&filename, s->url, tm);
226 } else if (img->frame_pts) {
227 if (ff_bprint_get_frame_filename(&filename, s->url, pkt->pts, AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) {
228 av_log(s, AV_LOG_ERROR, "Cannot write filename by pts of the frames.");
229 ret = AVERROR(EINVAL);
230 goto fail;
231 }
232 } else if (ff_bprint_get_frame_filename(&filename, s->url,
233 img->img_number,
235 if (img->img_number == img->start_img_number) {
236 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);
238 "Use a pattern such as %%03d for an image sequence or "
239 "use the -update option (with -frames:v 1 if needed) to write a single image.\n");
240 av_bprint_clear(&filename);
241 av_bprintf(&filename, "%s", s->url);
242 } else {
243 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");
244 ret = AVERROR(EINVAL);
245 goto fail;
246 }
247 }
248 if (!av_bprint_is_complete(&filename)) {
249 ret = AVERROR(ENOMEM);
250 goto fail;
251 }
252 for (i = 0; i < 4; i++) {
253 av_dict_copy(&options, img->protocol_opts, 0);
254 if (img->use_rename) {
255 tmp[i] = av_asprintf("%s.tmp", filename.str);
256 target[i] = av_strdup(filename.str);
257 if (!tmp[i] || !target[i]) {
258 ret = AVERROR(ENOMEM);
259 goto fail;
260 }
261 }
262 if ((ret = s->io_open(s, &pb[i], tmp[i] ? tmp[i] : filename.str, AVIO_FLAG_WRITE, &options)) < 0) {
263 av_log(s, AV_LOG_ERROR, "Could not open file : %s\n", tmp[i] ? tmp[i] : filename.str);
264 goto fail;
265 }
266 if (options) {
267 av_log(s, AV_LOG_ERROR, "Could not recognize some protocol options\n");
268 ret = AVERROR(EINVAL);
269 goto fail;
270 }
271
272 if (img->update_filemtime) {
273 filepaths[i] = av_strdup(filename.str);
274 if (!filepaths[i]) {
275 ret = AVERROR(ENOMEM);
276 goto fail;
277 }
278 }
279
280 if (!img->split_planes || i+1 >= desc->nb_components)
281 break;
282 filename.str[filename.len - 1] = "UVAx"[i];
283 }
284 av_bprint_finalize(&filename, NULL);
285
286 if (img->split_planes) {
287 int64_t ysize = (int64_t)par->width * par->height;
288 int64_t usize = (int64_t)AV_CEIL_RSHIFT(par->width, desc->log2_chroma_w) * AV_CEIL_RSHIFT(par->height, desc->log2_chroma_h);
289 if (desc->comp[0].depth >= 9) {
290 ysize *= 2;
291 usize *= 2;
292 }
293 if (par->width <= 0 || par->height <= 0 ||
294 ysize > pkt->size ||
295 ysize + 2*usize + (desc->nb_components > 3) * ysize > pkt->size) {
296 ret = AVERROR(EINVAL);
297 goto fail;
298 }
299
300 if ((ret = write_and_close(s, &pb[0], pkt->data , ysize)) < 0 ||
301 (ret = write_and_close(s, &pb[1], pkt->data + ysize , usize)) < 0 ||
302 (ret = write_and_close(s, &pb[2], pkt->data + ysize + usize, usize)) < 0)
303 goto fail;
304 if (desc->nb_components > 3)
305 ret = write_and_close(s, &pb[3], pkt->data + ysize + 2*usize, ysize);
306 } else if (img->muxer) {
307 if ((ret = write_muxed_file(s, pb[0], pkt)) < 0)
308 goto fail;
309 ret = ff_format_io_close(s, &pb[0]);
310 } else {
311 ret = write_and_close(s, &pb[0], pkt->data, pkt->size);
312 }
313 if (ret < 0)
314 goto fail;
315
316 for (i = 0; i < 4 && tmp[i]; i++) {
317 int ret = ff_rename(tmp[i], target[i], s);
318 if (ret < 0)
319 goto fail;
320 av_freep(&tmp[i]);
321 av_freep(&target[i]);
322 }
323
324 if (img->update_filemtime) {
325 AVStream *st = s->streams[pkt->stream_index];
326 int64_t frame_ts = img->creation_ts;
327 int skip = 0;
328
329 if (pkt->pts != AV_NOPTS_VALUE) {
332 if (offset == INT64_MIN ||
333 (offset > 0 && img->creation_ts > INT64_MAX - offset) ||
334 (offset < 0 && img->creation_ts < INT64_MIN - offset)) {
336 "Integer overflow computing file mtime, skipping\n");
337 skip = 1;
338 } else {
339 frame_ts += offset;
340 }
341 }
342
343 if (!skip) {
344 for (i = 0; i < 4 && filepaths[i]; i++)
345 set_file_mtime(s, filepaths[i], frame_ts);
346 }
347 }
348
349 for (i = 0; i < FF_ARRAY_ELEMS(filepaths); i++)
350 av_freep(&filepaths[i]);
351
352 img->img_number++;
353 return 0;
354
355fail:
356 av_bprint_finalize(&filename, NULL);
358 for (i = 0; i < FF_ARRAY_ELEMS(pb); i++) {
359 av_freep(&tmp[i]);
360 av_freep(&target[i]);
361 av_freep(&filepaths[i]);
362 if (pb[i])
363 ff_format_io_close(s, &pb[i]);
364 }
365 return ret;
366}
367
368static int query_codec(enum AVCodecID id, int std_compliance)
369{
370 int i;
371 for (i = 0; ff_img_tags[i].id != AV_CODEC_ID_NONE; i++)
372 if (ff_img_tags[i].id == id)
373 return 1;
374
375 // Anything really can be stored in img2
376 return std_compliance < FF_COMPLIANCE_NORMAL;
377}
378
379#define OFFSET(x) offsetof(VideoMuxData, x)
380#define ENC AV_OPT_FLAG_ENCODING_PARAM
381static const AVOption muxoptions[] = {
382 { "update", "continuously overwrite one file", OFFSET(update), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
383 { "start_number", "set first number in the sequence", OFFSET(start_img_number), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, INT_MAX, ENC },
384 { "strftime", "use strftime for filename", OFFSET(use_strftime), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
385 { "frame_pts", "use current frame pts for filename", OFFSET(frame_pts), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
386 { "atomic_writing", "write files atomically (using temporary files and renames)", OFFSET(use_rename), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
387 { "protocol_opts", "specify protocol options for the opened files", OFFSET(protocol_opts), AV_OPT_TYPE_DICT, {0}, 0, 0, ENC },
388 { "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 },
389 { NULL },
390};
391
392#if CONFIG_IMAGE2_MUXER
393static const AVClass img2mux_class = {
394 .class_name = "image2 muxer",
395 .item_name = av_default_item_name,
396 .option = muxoptions,
397 .version = LIBAVUTIL_VERSION_INT,
398};
399
401 .p.name = "image2",
402 .p.long_name = NULL_IF_CONFIG_SMALL("image2 sequence"),
403 .p.extensions = "bmp,dpx,exr,jls,jpeg,jpg,jxs,jxl,ljpg,pam,pbm,pcx,pfm,pgm,pgmyuv,phm,"
404 "png,ppm,sgi,tga,tif,tiff,jp2,j2c,j2k,xwd,sun,ras,rs,im1,im8,"
405 "im24,sunras,vbn,xbm,xface,pix,y,avif,qoi,hdr,wbmp",
406 .priv_data_size = sizeof(VideoMuxData),
407 .p.video_codec = AV_CODEC_ID_MJPEG,
408 .write_header = write_header,
409 .write_packet = write_packet,
410 .query_codec = query_codec,
412 .p.priv_class = &img2mux_class,
413};
414#endif
415#if CONFIG_IMAGE2PIPE_MUXER
417 .p.name = "image2pipe",
418 .p.long_name = NULL_IF_CONFIG_SMALL("piped image2 sequence"),
419 .priv_data_size = sizeof(VideoMuxData),
420 .p.video_codec = AV_CODEC_ID_MJPEG,
421 .write_header = write_header,
422 .write_packet = write_packet_pipe,
423 .query_codec = query_codec,
425};
426#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
static FILE * out
int ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
Definition avformat.c:992
Main libavformat public API header.
#define AVFMT_NODIMENSIONS
Format does not need width/height.
Definition avformat.h:504
#define AVFMT_NOFILE
Demuxer will use avio_open, no opened file should be provided by the caller.
Definition avformat.h:490
#define AVFMT_NOTIMESTAMPS
Format does not need / have any timestamps.
Definition avformat.h:500
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:733
int ff_rename(const char *url_src, const char *url_dst, void *logctx)
Wrap ffurl_move() and log if error happens.
Definition avio.c:942
#define AVIO_FLAG_WRITE
write-only
Definition avio.h:631
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:121
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition bprint.c:68
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:203
char * path
Definition ffplay.c:385
int ret
Definition ffplay.c:391
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:435
int av_packet_ref(AVPacket *dst, const AVPacket *src)
Setup a new reference to the data described by a given packet.
Definition packet.c:443
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:165
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:512
int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt)
Write a packet to an output media file ensuring correct interleaving.
Definition mux.c:1268
int av_write_trailer(AVFormatContext *s)
Write the stream trailer to an output media file and free the file private data.
Definition mux.c:1283
#define AV_FRAME_FILENAME_FLAGS_MULTIPLE
Allow multiple d.
Definition avformat.h:3182
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:234
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:165
void av_bprint_clear(AVBPrint *buf)
Reset the string to "" but keep internal allocated data.
Definition bprint.c:226
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition dict.c:236
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:61
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
Definition dict.c:250
#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:247
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:106
static const AVOption muxoptions[]
Definition img2enc.c:381
static int write_packet(AVFormatContext *s, AVPacket *pkt)
Definition img2enc.c:204
static int write_packet_pipe(AVFormatContext *s, AVPacket *pkt)
Definition img2enc.c:183
static int write_and_close(AVFormatContext *s, AVIOContext **pb, const unsigned char *buf, int size)
Definition img2enc.c:197
static int write_muxed_file(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
Definition img2enc.c:145
static int query_codec(enum AVCodecID id, int std_compliance)
Definition img2enc.c:368
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:379
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:135
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:97
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
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3524
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3484
#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:1401
AVIOContext * pb
I/O context.
Definition avformat.h:1443
Bytestream IO Context.
Definition avio.h:160
AVOption.
Definition opt.h:428
This structure stores compressed data.
Definition packet.h:587
int stream_index
Definition packet.h:612
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:768
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition avformat.h:791
int id
Format-specific stream ID.
Definition avformat.h:780
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition avformat.h:807
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
#define localtime_r
int size
#define img