3 * Copyright (c) 2000-2011 The libav developers.
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/dict.h"
43 #include "libavutil/mathematics.h"
44 #include "libavutil/pixdesc.h"
45 #include "libavutil/avstring.h"
46 #include "libavutil/libm.h"
47 #include "libavutil/imgutils.h"
48 #include "libavformat/os_support.h"
51 # include "libavfilter/avfilter.h"
52 # include "libavfilter/avfiltergraph.h"
53 # include "libavfilter/buffersrc.h"
54 # include "libavfilter/vsrc_buffer.h"
57 #if HAVE_SYS_RESOURCE_H
58 #include <sys/types.h>
60 #include <sys/resource.h>
61 #elif HAVE_GETPROCESSTIMES
64 #if HAVE_GETPROCESSMEMORYINFO
70 #include <sys/select.h>
77 #include "libavutil/avassert.h"
80 #define VSYNC_PASSTHROUGH 0
84 const char program_name[] = "avconv";
85 const int program_birth_year = 2000;
87 /* select an input stream for an output stream */
88 typedef struct StreamMap {
89 int disabled; /** 1 is this mapping is disabled by a negative map */
93 int sync_stream_index;
97 * select an input file for an output file
99 typedef struct MetadataMap {
100 int file; ///< file index
101 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
102 int index; ///< stream/chapter/program number
105 static const OptionDef options[];
107 static int video_discard = 0;
108 static int same_quant = 0;
109 static int do_deinterlace = 0;
110 static int intra_dc_precision = 8;
111 static int qp_hist = 0;
113 static int file_overwrite = 0;
114 static int do_benchmark = 0;
115 static int do_hex_dump = 0;
116 static int do_pkt_dump = 0;
117 static int do_pass = 0;
118 static char *pass_logfilename_prefix = NULL;
119 static int video_sync_method = VSYNC_AUTO;
120 static int audio_sync_method = 0;
121 static float audio_drift_threshold = 0.1;
122 static int copy_ts = 0;
123 static int copy_tb = 1;
124 static int opt_shortest = 0;
125 static char *vstats_filename;
126 static FILE *vstats_file;
128 static int audio_volume = 256;
130 static int exit_on_error = 0;
131 static int using_stdin = 0;
132 static int64_t video_size = 0;
133 static int64_t audio_size = 0;
134 static int64_t extra_size = 0;
135 static int nb_frames_dup = 0;
136 static int nb_frames_drop = 0;
137 static int input_sync;
139 static float dts_delta_threshold = 10;
141 static int print_stats = 1;
143 static uint8_t *audio_buf;
144 static unsigned int allocated_audio_buf_size;
146 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
148 typedef struct FrameBuffer {
154 enum PixelFormat pix_fmt;
157 struct InputStream *ist;
158 struct FrameBuffer *next;
161 typedef struct InputStream {
164 int discard; /* true if stream data should be discarded */
165 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
167 AVFrame *decoded_frame;
168 AVFrame *filtered_frame;
170 int64_t start; /* time when read started */
171 /* predicted dts of the next packet read for this stream or (when there are
172 * several frames in a packet) of the next frame in current packet */
174 /* dts of the last packet read for this stream */
176 PtsCorrectionContext pts_ctx;
178 int is_start; /* is 1 at the start and after a discontinuity */
179 int showed_multi_packet_warning;
182 /* a pool of free buffers for decoded data */
183 FrameBuffer *buffer_pool;
186 typedef struct InputFile {
187 AVFormatContext *ctx;
188 int eof_reached; /* true if eof reached */
189 int ist_index; /* index of first stream in ist_table */
190 int buffer_size; /* current total buffer size */
192 int nb_streams; /* number of stream that avconv is aware of; may be different
193 from ctx.nb_streams if new streams appear during av_read_frame() */
197 typedef struct OutputStream {
198 int file_index; /* file index */
199 int index; /* stream index in the output file */
200 int source_index; /* InputStream index */
201 AVStream *st; /* stream in the output file */
202 int encoding_needed; /* true if encoding needed for this stream */
204 /* input pts and corresponding output pts
206 // double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
207 struct InputStream *sync_ist; /* input stream to sync against */
208 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
209 /* pts of the first frame encoded for this stream, used for limiting
212 AVBitStreamFilterContext *bitstream_filters;
215 AVFrame *output_frame;
219 AVFrame pict_tmp; /* temporary image for resampling */
220 struct SwsContext *img_resample_ctx; /* for image resampling */
223 int resample_pix_fmt;
224 AVRational frame_rate;
228 float frame_aspect_ratio;
230 /* forced key frames */
231 int64_t *forced_kf_pts;
237 ReSampleContext *resample; /* for audio resampling */
238 int resample_sample_fmt;
239 int resample_channels;
240 int resample_sample_rate;
242 AVAudioConvert *reformat_ctx;
243 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
247 AVFilterContext *output_video_filter;
248 AVFilterContext *input_video_filter;
249 AVFilterBufferRef *picref;
251 AVFilterGraph *graph;
256 int is_past_recording_time;
258 const char *attachment_filename;
259 int copy_initial_nonkeyframes;
263 typedef struct OutputFile {
264 AVFormatContext *ctx;
266 int ost_index; /* index of the first stream in output_streams */
267 int64_t recording_time; /* desired length of the resulting file in microseconds */
268 int64_t start_time; /* start time in microseconds */
269 uint64_t limit_filesize;
272 static InputStream *input_streams = NULL;
273 static int nb_input_streams = 0;
274 static InputFile *input_files = NULL;
275 static int nb_input_files = 0;
277 static OutputStream *output_streams = NULL;
278 static int nb_output_streams = 0;
279 static OutputFile *output_files = NULL;
280 static int nb_output_files = 0;
282 typedef struct OptionsContext {
283 /* input/output options */
287 SpecifierOpt *codec_names;
289 SpecifierOpt *audio_channels;
290 int nb_audio_channels;
291 SpecifierOpt *audio_sample_rate;
292 int nb_audio_sample_rate;
293 SpecifierOpt *frame_rates;
295 SpecifierOpt *frame_sizes;
297 SpecifierOpt *frame_pix_fmts;
298 int nb_frame_pix_fmts;
301 int64_t input_ts_offset;
304 SpecifierOpt *ts_scale;
306 SpecifierOpt *dump_attachment;
307 int nb_dump_attachment;
310 StreamMap *stream_maps;
312 /* first item specifies output metadata, second is input */
313 MetadataMap (*meta_data_maps)[2];
314 int nb_meta_data_maps;
315 int metadata_global_manual;
316 int metadata_streams_manual;
317 int metadata_chapters_manual;
318 const char **attachments;
321 int chapters_input_file;
323 int64_t recording_time;
324 uint64_t limit_filesize;
330 int subtitle_disable;
333 /* indexed by output file stream index */
337 SpecifierOpt *metadata;
339 SpecifierOpt *max_frames;
341 SpecifierOpt *bitstream_filters;
342 int nb_bitstream_filters;
343 SpecifierOpt *codec_tags;
345 SpecifierOpt *sample_fmts;
347 SpecifierOpt *qscale;
349 SpecifierOpt *forced_key_frames;
350 int nb_forced_key_frames;
351 SpecifierOpt *force_fps;
353 SpecifierOpt *frame_aspect_ratios;
354 int nb_frame_aspect_ratios;
355 SpecifierOpt *rc_overrides;
357 SpecifierOpt *intra_matrices;
358 int nb_intra_matrices;
359 SpecifierOpt *inter_matrices;
360 int nb_inter_matrices;
361 SpecifierOpt *top_field_first;
362 int nb_top_field_first;
363 SpecifierOpt *metadata_map;
365 SpecifierOpt *presets;
367 SpecifierOpt *copy_initial_nonkeyframes;
368 int nb_copy_initial_nonkeyframes;
370 SpecifierOpt *filters;
375 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
378 for (i = 0; i < o->nb_ ## name; i++) {\
379 char *spec = o->name[i].specifier;\
380 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
381 outvar = o->name[i].u.type;\
387 static void reset_options(OptionsContext *o)
389 const OptionDef *po = options;
391 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
393 void *dst = (uint8_t*)o + po->u.off;
395 if (po->flags & OPT_SPEC) {
396 SpecifierOpt **so = dst;
397 int i, *count = (int*)(so + 1);
398 for (i = 0; i < *count; i++) {
399 av_freep(&(*so)[i].specifier);
400 if (po->flags & OPT_STRING)
401 av_freep(&(*so)[i].u.str);
405 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
410 av_freep(&o->stream_maps);
411 av_freep(&o->meta_data_maps);
412 av_freep(&o->streamid_map);
414 memset(o, 0, sizeof(*o));
416 o->mux_max_delay = 0.7;
417 o->recording_time = INT64_MAX;
418 o->limit_filesize = UINT64_MAX;
419 o->chapters_input_file = INT_MAX;
425 static int alloc_buffer(InputStream *ist, FrameBuffer **pbuf)
427 AVCodecContext *s = ist->st->codec;
428 FrameBuffer *buf = av_mallocz(sizeof(*buf));
430 const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1;
431 int h_chroma_shift, v_chroma_shift;
432 int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
433 int w = s->width, h = s->height;
436 return AVERROR(ENOMEM);
438 if (!(s->flags & CODEC_FLAG_EMU_EDGE)) {
443 avcodec_align_dimensions(s, &w, &h);
444 if ((ret = av_image_alloc(buf->base, buf->linesize, w, h,
445 s->pix_fmt, 32)) < 0) {
449 /* XXX this shouldn't be needed, but some tests break without this line
450 * those decoders are buggy and need to be fixed.
451 * the following tests fail:
452 * cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
454 memset(buf->base[0], 128, ret);
456 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
457 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
458 const int h_shift = i==0 ? 0 : h_chroma_shift;
459 const int v_shift = i==0 ? 0 : v_chroma_shift;
460 if (s->flags & CODEC_FLAG_EMU_EDGE)
461 buf->data[i] = buf->base[i];
463 buf->data[i] = buf->base[i] +
464 FFALIGN((buf->linesize[i]*edge >> v_shift) +
465 (pixel_size*edge >> h_shift), 32);
469 buf->pix_fmt = s->pix_fmt;
476 static void free_buffer_pool(InputStream *ist)
478 FrameBuffer *buf = ist->buffer_pool;
480 ist->buffer_pool = buf->next;
481 av_freep(&buf->base[0]);
483 buf = ist->buffer_pool;
487 static void unref_buffer(InputStream *ist, FrameBuffer *buf)
489 av_assert0(buf->refcount);
491 if (!buf->refcount) {
492 buf->next = ist->buffer_pool;
493 ist->buffer_pool = buf;
497 static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
499 InputStream *ist = s->opaque;
503 if (!ist->buffer_pool && (ret = alloc_buffer(ist, &ist->buffer_pool)) < 0)
506 buf = ist->buffer_pool;
507 ist->buffer_pool = buf->next;
509 if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) {
510 av_freep(&buf->base[0]);
512 if ((ret = alloc_buffer(ist, &buf)) < 0)
518 frame->type = FF_BUFFER_TYPE_USER;
519 frame->extended_data = frame->data;
520 frame->pkt_pts = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE;
522 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
523 frame->base[i] = buf->base[i]; // XXX h264.c uses base though it shouldn't
524 frame->data[i] = buf->data[i];
525 frame->linesize[i] = buf->linesize[i];
531 static void codec_release_buffer(AVCodecContext *s, AVFrame *frame)
533 InputStream *ist = s->opaque;
534 FrameBuffer *buf = frame->opaque;
537 for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++)
538 frame->data[i] = NULL;
540 unref_buffer(ist, buf);
543 static void filter_release_buffer(AVFilterBuffer *fb)
545 FrameBuffer *buf = fb->priv;
547 unref_buffer(buf->ist, buf);
552 static int configure_video_filters(InputStream *ist, OutputStream *ost)
554 AVFilterContext *last_filter, *filter;
555 /** filter graph containing all filters including input & output */
556 AVCodecContext *codec = ost->st->codec;
557 AVCodecContext *icodec = ist->st->codec;
558 SinkContext sink_ctx = { .pix_fmt = codec->pix_fmt };
559 AVRational sample_aspect_ratio;
563 ost->graph = avfilter_graph_alloc();
565 if (ist->st->sample_aspect_ratio.num) {
566 sample_aspect_ratio = ist->st->sample_aspect_ratio;
568 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
570 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
571 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
572 sample_aspect_ratio.num, sample_aspect_ratio.den);
574 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
575 "src", args, NULL, ost->graph);
578 ret = avfilter_graph_create_filter(&ost->output_video_filter, &sink,
579 "out", NULL, &sink_ctx, ost->graph);
582 last_filter = ost->input_video_filter;
584 if (codec->width != icodec->width || codec->height != icodec->height) {
585 snprintf(args, 255, "%d:%d:flags=0x%X",
588 (unsigned)ost->sws_flags);
589 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
590 NULL, args, NULL, ost->graph)) < 0)
592 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
594 last_filter = filter;
597 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
598 ost->graph->scale_sws_opts = av_strdup(args);
601 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
602 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
604 outputs->name = av_strdup("in");
605 outputs->filter_ctx = last_filter;
606 outputs->pad_idx = 0;
607 outputs->next = NULL;
609 inputs->name = av_strdup("out");
610 inputs->filter_ctx = ost->output_video_filter;
614 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
617 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
621 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
624 codec->width = ost->output_video_filter->inputs[0]->w;
625 codec->height = ost->output_video_filter->inputs[0]->h;
626 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
627 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
628 av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
629 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
633 #endif /* CONFIG_AVFILTER */
635 static void term_exit(void)
637 av_log(NULL, AV_LOG_QUIET, "");
640 static volatile int received_sigterm = 0;
641 static volatile int received_nb_signals = 0;
644 sigterm_handler(int sig)
646 received_sigterm = sig;
647 received_nb_signals++;
651 static void term_init(void)
653 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
654 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
656 signal(SIGXCPU, sigterm_handler);
660 static int decode_interrupt_cb(void *ctx)
662 return received_nb_signals > 1;
665 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
667 void exit_program(int ret)
672 for (i = 0; i < nb_output_files; i++) {
673 AVFormatContext *s = output_files[i].ctx;
674 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
676 avformat_free_context(s);
677 av_dict_free(&output_files[i].opts);
679 for (i = 0; i < nb_output_streams; i++) {
680 AVBitStreamFilterContext *bsfc = output_streams[i].bitstream_filters;
682 AVBitStreamFilterContext *next = bsfc->next;
683 av_bitstream_filter_close(bsfc);
686 output_streams[i].bitstream_filters = NULL;
688 if (output_streams[i].output_frame) {
689 AVFrame *frame = output_streams[i].output_frame;
690 if (frame->extended_data != frame->data)
691 av_freep(&frame->extended_data);
696 av_freep(&output_streams[i].avfilter);
699 for (i = 0; i < nb_input_files; i++) {
700 avformat_close_input(&input_files[i].ctx);
702 for (i = 0; i < nb_input_streams; i++) {
703 av_freep(&input_streams[i].decoded_frame);
704 av_freep(&input_streams[i].filtered_frame);
705 av_dict_free(&input_streams[i].opts);
706 free_buffer_pool(&input_streams[i]);
711 av_free(vstats_filename);
713 av_freep(&input_streams);
714 av_freep(&input_files);
715 av_freep(&output_streams);
716 av_freep(&output_files);
720 allocated_audio_buf_size = 0;
725 avformat_network_deinit();
727 if (received_sigterm) {
728 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
729 (int) received_sigterm);
736 static void assert_avoptions(AVDictionary *m)
738 AVDictionaryEntry *t;
739 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
740 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
745 static void assert_codec_experimental(AVCodecContext *c, int encoder)
747 const char *codec_string = encoder ? "encoder" : "decoder";
749 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
750 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
751 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
752 "results.\nAdd '-strict experimental' if you want to use it.\n",
753 codec_string, c->codec->name);
754 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
755 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
756 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
757 codec_string, codec->name);
762 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
764 if (codec && codec->sample_fmts) {
765 const enum AVSampleFormat *p = codec->sample_fmts;
766 for (; *p != -1; p++) {
767 if (*p == st->codec->sample_fmt)
771 av_log(NULL, AV_LOG_WARNING,
772 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
773 av_get_sample_fmt_name(st->codec->sample_fmt),
775 av_get_sample_fmt_name(codec->sample_fmts[0]));
776 st->codec->sample_fmt = codec->sample_fmts[0];
782 * Update the requested input sample format based on the output sample format.
783 * This is currently only used to request float output from decoders which
784 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
785 * Ideally this will be removed in the future when decoders do not do format
786 * conversion and only output in their native format.
788 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
791 /* if sample formats match or a decoder sample format has already been
792 requested, just return */
793 if (enc->sample_fmt == dec->sample_fmt ||
794 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
797 /* if decoder supports more than one output format */
798 if (dec_codec && dec_codec->sample_fmts &&
799 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
800 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
801 const enum AVSampleFormat *p;
802 int min_dec = -1, min_inc = -1;
804 /* find a matching sample format in the encoder */
805 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
806 if (*p == enc->sample_fmt) {
807 dec->request_sample_fmt = *p;
809 } else if (*p > enc->sample_fmt) {
810 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
812 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
815 /* if none match, provide the one that matches quality closest */
816 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
817 enc->sample_fmt - min_dec;
821 static void choose_sample_rate(AVStream *st, AVCodec *codec)
823 if (codec && codec->supported_samplerates) {
824 const int *p = codec->supported_samplerates;
826 int best_dist = INT_MAX;
828 int dist = abs(st->codec->sample_rate - *p);
829 if (dist < best_dist) {
835 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
837 st->codec->sample_rate = best;
841 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
843 if (codec && codec->pix_fmts) {
844 const enum PixelFormat *p = codec->pix_fmts;
845 if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
846 if (st->codec->codec_id == CODEC_ID_MJPEG) {
847 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
848 } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
849 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
850 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
853 for (; *p != PIX_FMT_NONE; p++) {
854 if (*p == st->codec->pix_fmt)
857 if (*p == PIX_FMT_NONE) {
858 if (st->codec->pix_fmt != PIX_FMT_NONE)
859 av_log(NULL, AV_LOG_WARNING,
860 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
861 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
863 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
864 st->codec->pix_fmt = codec->pix_fmts[0];
870 get_sync_ipts(const OutputStream *ost, int64_t pts)
872 OutputFile *of = &output_files[ost->file_index];
873 return (double)(pts - of->start_time) / AV_TIME_BASE;
876 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
878 AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
879 AVCodecContext *avctx = ost->st->codec;
883 * Audio encoders may split the packets -- #frames in != #packets out.
884 * But there is no reordering, so we can limit the number of output packets
885 * by simply dropping them here.
886 * Counting encoded video frames needs to be done separately because of
887 * reordering, see do_video_out()
889 if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) {
890 if (ost->frame_number >= ost->max_frames) {
898 AVPacket new_pkt = *pkt;
899 int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
900 &new_pkt.data, &new_pkt.size,
901 pkt->data, pkt->size,
902 pkt->flags & AV_PKT_FLAG_KEY);
905 new_pkt.destruct = av_destruct_packet;
907 av_log(NULL, AV_LOG_ERROR, "%s failed for stream %d, codec %s",
908 bsfc->filter->name, pkt->stream_index,
909 avctx->codec ? avctx->codec->name : "copy");
919 pkt->stream_index = ost->index;
920 ret = av_interleaved_write_frame(s, pkt);
922 print_error("av_interleaved_write_frame()", ret);
927 static int check_recording_time(OutputStream *ost)
929 OutputFile *of = &output_files[ost->file_index];
931 if (of->recording_time != INT64_MAX &&
932 av_compare_ts(ost->sync_opts - ost->first_pts, ost->st->codec->time_base, of->recording_time,
933 AV_TIME_BASE_Q) >= 0) {
934 ost->is_past_recording_time = 1;
940 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
942 int fill_char = 0x00;
943 if (sample_fmt == AV_SAMPLE_FMT_U8)
945 memset(buf, fill_char, size);
948 static int encode_audio_frame(AVFormatContext *s, OutputStream *ost,
949 const uint8_t *buf, int buf_size)
951 AVCodecContext *enc = ost->st->codec;
952 AVFrame *frame = NULL;
956 av_init_packet(&pkt);
961 if (!ost->output_frame) {
962 ost->output_frame = avcodec_alloc_frame();
963 if (!ost->output_frame) {
964 av_log(NULL, AV_LOG_FATAL, "out-of-memory in encode_audio_frame()\n");
968 frame = ost->output_frame;
969 if (frame->extended_data != frame->data)
970 av_freep(&frame->extended_data);
971 avcodec_get_frame_defaults(frame);
973 frame->nb_samples = buf_size /
974 (enc->channels * av_get_bytes_per_sample(enc->sample_fmt));
975 if ((ret = avcodec_fill_audio_frame(frame, enc->channels, enc->sample_fmt,
976 buf, buf_size, 1)) < 0) {
977 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
981 if (!check_recording_time(ost))
984 frame->pts = ost->sync_opts;
985 ost->sync_opts += frame->nb_samples;
989 if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
990 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
995 if (pkt.pts != AV_NOPTS_VALUE)
996 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
997 if (pkt.dts != AV_NOPTS_VALUE)
998 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
999 if (pkt.duration > 0)
1000 pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
1002 write_frame(s, &pkt, ost);
1004 audio_size += pkt.size;
1010 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
1011 InputStream *ist, AVFrame *decoded_frame)
1014 int64_t audio_buf_size;
1016 int size_out, frame_bytes, resample_changed;
1017 AVCodecContext *enc = ost->st->codec;
1018 AVCodecContext *dec = ist->st->codec;
1019 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1020 int isize = av_get_bytes_per_sample(dec->sample_fmt);
1021 uint8_t *buf = decoded_frame->data[0];
1022 int size = decoded_frame->nb_samples * dec->channels * isize;
1023 int64_t allocated_for_size = size;
1026 audio_buf_size = (allocated_for_size + isize * dec->channels - 1) / (isize * dec->channels);
1027 audio_buf_size = (audio_buf_size * enc->sample_rate + dec->sample_rate) / dec->sample_rate;
1028 audio_buf_size = audio_buf_size * 2 + 10000; // safety factors for the deprecated resampling API
1029 audio_buf_size = FFMAX(audio_buf_size, enc->frame_size);
1030 audio_buf_size *= osize * enc->channels;
1032 if (audio_buf_size > INT_MAX) {
1033 av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n");
1037 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
1039 av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
1043 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
1044 ost->audio_resample = 1;
1046 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
1047 ost->resample_channels != dec->channels ||
1048 ost->resample_sample_rate != dec->sample_rate;
1050 if ((ost->audio_resample && !ost->resample) || resample_changed) {
1051 if (resample_changed) {
1052 av_log(NULL, AV_LOG_INFO, "Input stream #%d:%d frame changed from rate:%d fmt:%s ch:%d to rate:%d fmt:%s ch:%d\n",
1053 ist->file_index, ist->st->index,
1054 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
1055 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
1056 ost->resample_sample_fmt = dec->sample_fmt;
1057 ost->resample_channels = dec->channels;
1058 ost->resample_sample_rate = dec->sample_rate;
1060 audio_resample_close(ost->resample);
1062 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
1063 if (audio_sync_method <= 1 &&
1064 ost->resample_sample_fmt == enc->sample_fmt &&
1065 ost->resample_channels == enc->channels &&
1066 ost->resample_sample_rate == enc->sample_rate) {
1067 ost->resample = NULL;
1068 ost->audio_resample = 0;
1069 } else if (ost->audio_resample) {
1070 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
1071 av_log(NULL, AV_LOG_WARNING, "Using s16 intermediate sample format for resampling\n");
1072 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
1073 enc->sample_rate, dec->sample_rate,
1074 enc->sample_fmt, dec->sample_fmt,
1076 if (!ost->resample) {
1077 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
1078 dec->channels, dec->sample_rate,
1079 enc->channels, enc->sample_rate);
1085 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
1086 if (!ost->audio_resample && dec->sample_fmt != enc->sample_fmt &&
1087 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt) != ost->reformat_pair) {
1088 if (ost->reformat_ctx)
1089 av_audio_convert_free(ost->reformat_ctx);
1090 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
1091 dec->sample_fmt, 1, NULL, 0);
1092 if (!ost->reformat_ctx) {
1093 av_log(NULL, AV_LOG_FATAL, "Cannot convert %s sample format to %s sample format\n",
1094 av_get_sample_fmt_name(dec->sample_fmt),
1095 av_get_sample_fmt_name(enc->sample_fmt));
1098 ost->reformat_pair = MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
1101 if (audio_sync_method) {
1102 double delta = get_sync_ipts(ost, ist->last_dts) * enc->sample_rate - ost->sync_opts -
1103 av_fifo_size(ost->fifo) / (enc->channels * osize);
1104 int idelta = delta * dec->sample_rate / enc->sample_rate;
1105 int byte_delta = idelta * isize * dec->channels;
1107 // FIXME resample delay
1108 if (fabs(delta) > 50) {
1109 if (ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate) {
1110 if (byte_delta < 0) {
1111 byte_delta = FFMAX(byte_delta, -size);
1114 av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n",
1115 -byte_delta / (isize * dec->channels));
1120 static uint8_t *input_tmp = NULL;
1121 input_tmp = av_realloc(input_tmp, byte_delta + size);
1123 if (byte_delta > allocated_for_size - size) {
1124 allocated_for_size = byte_delta + (int64_t)size;
1129 generate_silence(input_tmp, dec->sample_fmt, byte_delta);
1130 memcpy(input_tmp + byte_delta, buf, size);
1133 av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
1135 } else if (audio_sync_method > 1) {
1136 int comp = av_clip(delta, -audio_sync_method, audio_sync_method);
1137 av_assert0(ost->audio_resample);
1138 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
1139 delta, comp, enc->sample_rate);
1140 // fprintf(stderr, "drift:%f len:%d opts:%"PRId64" ipts:%"PRId64" fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(get_sync_ipts(ost) * enc->sample_rate), av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2));
1141 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
1145 ost->sync_opts = lrintf(get_sync_ipts(ost, ist->last_dts) * enc->sample_rate) -
1146 av_fifo_size(ost->fifo) / (enc->channels * osize); // FIXME wrong
1148 if (ost->audio_resample) {
1150 size_out = audio_resample(ost->resample,
1151 (short *)buftmp, (short *)buf,
1152 size / (dec->channels * isize));
1153 size_out = size_out * enc->channels * osize;
1159 if (!ost->audio_resample && dec->sample_fmt != enc->sample_fmt) {
1160 const void *ibuf[6] = { buftmp };
1161 void *obuf[6] = { audio_buf };
1162 int istride[6] = { isize };
1163 int ostride[6] = { osize };
1164 int len = size_out / istride[0];
1165 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len) < 0) {
1166 printf("av_audio_convert() failed\n");
1172 size_out = len * osize;
1175 /* now encode as many frames as possible */
1176 if (!(enc->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)) {
1177 /* output resampled raw samples */
1178 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
1179 av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
1182 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
1184 frame_bytes = enc->frame_size * osize * enc->channels;
1186 while (av_fifo_size(ost->fifo) >= frame_bytes) {
1187 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
1188 encode_audio_frame(s, ost, audio_buf, frame_bytes);
1191 encode_audio_frame(s, ost, buftmp, size_out);
1195 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1197 AVCodecContext *dec;
1198 AVPicture *picture2;
1199 AVPicture picture_tmp;
1202 dec = ist->st->codec;
1204 /* deinterlace : must be done before any resize */
1205 if (do_deinterlace) {
1208 /* create temporary picture */
1209 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1210 buf = av_malloc(size);
1214 picture2 = &picture_tmp;
1215 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1217 if (avpicture_deinterlace(picture2, picture,
1218 dec->pix_fmt, dec->width, dec->height) < 0) {
1219 /* if error, do not deinterlace */
1220 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1229 if (picture != picture2)
1230 *picture = *picture2;
1234 static void do_subtitle_out(AVFormatContext *s,
1240 static uint8_t *subtitle_out = NULL;
1241 int subtitle_out_max_size = 1024 * 1024;
1242 int subtitle_out_size, nb, i;
1243 AVCodecContext *enc;
1246 if (pts == AV_NOPTS_VALUE) {
1247 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1253 enc = ost->st->codec;
1255 if (!subtitle_out) {
1256 subtitle_out = av_malloc(subtitle_out_max_size);
1259 /* Note: DVB subtitle need one packet to draw them and one other
1260 packet to clear them */
1261 /* XXX: signal it in the codec context ? */
1262 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1267 for (i = 0; i < nb; i++) {
1268 ost->sync_opts = av_rescale_q(pts, ist->st->time_base, enc->time_base);
1269 if (!check_recording_time(ost))
1272 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1273 // start_display_time is required to be 0
1274 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1275 sub->end_display_time -= sub->start_display_time;
1276 sub->start_display_time = 0;
1277 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1278 subtitle_out_max_size, sub);
1279 if (subtitle_out_size < 0) {
1280 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1284 av_init_packet(&pkt);
1285 pkt.data = subtitle_out;
1286 pkt.size = subtitle_out_size;
1287 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1288 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1289 /* XXX: the pts correction is handled here. Maybe handling
1290 it in the codec would be better */
1292 pkt.pts += 90 * sub->start_display_time;
1294 pkt.pts += 90 * sub->end_display_time;
1296 write_frame(s, &pkt, ost);
1300 #if !CONFIG_AVFILTER
1301 static void do_video_resample(OutputStream *ost,
1303 AVFrame *in_picture,
1304 AVFrame **out_picture)
1306 int resample_changed = 0;
1307 *out_picture = in_picture;
1309 resample_changed = ost->resample_width != in_picture->width ||
1310 ost->resample_height != in_picture->height ||
1311 ost->resample_pix_fmt != in_picture->format;
1313 if (resample_changed) {
1314 av_log(NULL, AV_LOG_INFO,
1315 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1316 ist->file_index, ist->st->index,
1317 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1318 in_picture->width, in_picture->height, av_get_pix_fmt_name(in_picture->format));
1319 if (!ost->video_resample)
1320 ost->video_resample = 1;
1323 if (ost->video_resample) {
1324 *out_picture = &ost->pict_tmp;
1325 if (resample_changed) {
1326 /* initialize a new scaler context */
1327 sws_freeContext(ost->img_resample_ctx);
1328 ost->img_resample_ctx = sws_getContext(
1329 ist->st->codec->width,
1330 ist->st->codec->height,
1331 ist->st->codec->pix_fmt,
1332 ost->st->codec->width,
1333 ost->st->codec->height,
1334 ost->st->codec->pix_fmt,
1335 ost->sws_flags, NULL, NULL, NULL);
1336 if (ost->img_resample_ctx == NULL) {
1337 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1341 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1342 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1344 if (resample_changed) {
1345 ost->resample_width = in_picture->width;
1346 ost->resample_height = in_picture->height;
1347 ost->resample_pix_fmt = in_picture->format;
1353 static void do_video_out(AVFormatContext *s,
1356 AVFrame *in_picture,
1357 int *frame_size, float quality)
1359 int nb_frames, i, ret, format_video_sync;
1360 AVFrame *final_picture;
1361 AVCodecContext *enc;
1362 double sync_ipts, delta;
1364 enc = ost->st->codec;
1366 sync_ipts = get_sync_ipts(ost, in_picture->pts) / av_q2d(enc->time_base);
1367 delta = sync_ipts - ost->sync_opts;
1369 /* by default, we output a single frame */
1374 format_video_sync = video_sync_method;
1375 if (format_video_sync == VSYNC_AUTO)
1376 format_video_sync = (s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH :
1377 (s->oformat->flags & AVFMT_VARIABLE_FPS) ? VSYNC_VFR : VSYNC_CFR;
1379 switch (format_video_sync) {
1381 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1384 else if (delta > 1.1)
1385 nb_frames = lrintf(delta);
1390 else if (delta > 0.6)
1391 ost->sync_opts = lrintf(sync_ipts);
1393 case VSYNC_PASSTHROUGH:
1394 ost->sync_opts = lrintf(sync_ipts);
1400 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1401 if (nb_frames == 0) {
1403 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1405 } else if (nb_frames > 1) {
1406 nb_frames_dup += nb_frames - 1;
1407 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1410 #if !CONFIG_AVFILTER
1411 do_video_resample(ost, ist, in_picture, &final_picture);
1413 final_picture = in_picture;
1416 if (!ost->frame_number)
1417 ost->first_pts = ost->sync_opts;
1419 /* duplicates frame if needed */
1420 for (i = 0; i < nb_frames; i++) {
1422 av_init_packet(&pkt);
1426 if (!check_recording_time(ost))
1429 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1430 enc->codec->id == CODEC_ID_RAWVIDEO) {
1431 /* raw pictures are written as AVPicture structure to
1432 avoid any copies. We support temporarily the older
1434 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1435 enc->coded_frame->top_field_first = in_picture->top_field_first;
1436 pkt.data = (uint8_t *)final_picture;
1437 pkt.size = sizeof(AVPicture);
1438 pkt.pts = av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1439 pkt.flags |= AV_PKT_FLAG_KEY;
1441 write_frame(s, &pkt, ost);
1444 AVFrame big_picture;
1446 big_picture = *final_picture;
1447 /* better than nothing: use input picture interlaced
1449 big_picture.interlaced_frame = in_picture->interlaced_frame;
1450 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1451 if (ost->top_field_first == -1)
1452 big_picture.top_field_first = in_picture->top_field_first;
1454 big_picture.top_field_first = !!ost->top_field_first;
1457 /* handles same_quant here. This is not correct because it may
1458 not be a global option */
1459 big_picture.quality = quality;
1460 if (!enc->me_threshold)
1461 big_picture.pict_type = 0;
1462 big_picture.pts = ost->sync_opts;
1463 if (ost->forced_kf_index < ost->forced_kf_count &&
1464 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1465 big_picture.pict_type = AV_PICTURE_TYPE_I;
1466 ost->forced_kf_index++;
1468 ret = avcodec_encode_video2(enc, &pkt, &big_picture, &got_packet);
1470 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1475 if (pkt.pts != AV_NOPTS_VALUE)
1476 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1477 if (pkt.dts != AV_NOPTS_VALUE)
1478 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1480 write_frame(s, &pkt, ost);
1481 *frame_size = pkt.size;
1482 video_size += pkt.size;
1484 /* if two pass, output log */
1485 if (ost->logfile && enc->stats_out) {
1486 fprintf(ost->logfile, "%s", enc->stats_out);
1492 * For video, number of frames in == number of packets out.
1493 * But there may be reordering, so we can't throw away frames on encoder
1494 * flush, we need to limit them here, before they go into encoder.
1496 ost->frame_number++;
1500 static double psnr(double d)
1502 return -10.0 * log(d) / log(10.0);
1505 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1508 AVCodecContext *enc;
1510 double ti1, bitrate, avg_bitrate;
1512 /* this is executed just the first time do_video_stats is called */
1514 vstats_file = fopen(vstats_filename, "w");
1521 enc = ost->st->codec;
1522 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1523 frame_number = ost->frame_number;
1524 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1525 if (enc->flags&CODEC_FLAG_PSNR)
1526 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1528 fprintf(vstats_file,"f_size= %6d ", frame_size);
1529 /* compute pts value */
1530 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1534 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1535 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1536 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1537 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1538 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1542 static void print_report(OutputFile *output_files,
1543 OutputStream *ost_table, int nb_ostreams,
1544 int is_last_report, int64_t timer_start)
1548 AVFormatContext *oc;
1550 AVCodecContext *enc;
1551 int frame_number, vid, i;
1552 double bitrate, ti1, pts;
1553 static int64_t last_time = -1;
1554 static int qp_histogram[52];
1556 if (!print_stats && !is_last_report)
1559 if (!is_last_report) {
1561 /* display the report every 0.5 seconds */
1562 cur_time = av_gettime();
1563 if (last_time == -1) {
1564 last_time = cur_time;
1567 if ((cur_time - last_time) < 500000)
1569 last_time = cur_time;
1573 oc = output_files[0].ctx;
1575 total_size = avio_size(oc->pb);
1576 if (total_size < 0) // FIXME improve avio_size() so it works with non seekable output too
1577 total_size = avio_tell(oc->pb);
1582 for (i = 0; i < nb_ostreams; i++) {
1584 ost = &ost_table[i];
1585 enc = ost->st->codec;
1586 if (!ost->stream_copy && enc->coded_frame)
1587 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
1588 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1589 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1591 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1592 float t = (av_gettime() - timer_start) / 1000000.0;
1594 frame_number = ost->frame_number;
1595 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1596 frame_number, (t > 1) ? (int)(frame_number / t + 0.5) : 0, q);
1598 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1602 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
1604 for (j = 0; j < 32; j++)
1605 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
1607 if (enc->flags&CODEC_FLAG_PSNR) {
1609 double error, error_sum = 0;
1610 double scale, scale_sum = 0;
1611 char type[3] = { 'Y','U','V' };
1612 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1613 for (j = 0; j < 3; j++) {
1614 if (is_last_report) {
1615 error = enc->error[j];
1616 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
1618 error = enc->coded_frame->error[j];
1619 scale = enc->width * enc->height * 255.0 * 255.0;
1625 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error / scale));
1627 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
1631 /* compute min output value */
1632 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1633 if ((pts < ti1) && (pts > 0))
1639 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1641 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1642 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1643 (double)total_size / 1024, ti1, bitrate);
1645 if (nb_frames_dup || nb_frames_drop)
1646 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1647 nb_frames_dup, nb_frames_drop);
1649 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
1653 if (is_last_report) {
1654 int64_t raw= audio_size + video_size + extra_size;
1655 av_log(NULL, AV_LOG_INFO, "\n");
1656 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1657 video_size / 1024.0,
1658 audio_size / 1024.0,
1659 extra_size / 1024.0,
1660 100.0 * (total_size - raw) / raw
1665 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1669 for (i = 0; i < nb_ostreams; i++) {
1670 OutputStream *ost = &ost_table[i];
1671 AVCodecContext *enc = ost->st->codec;
1672 AVFormatContext *os = output_files[ost->file_index].ctx;
1673 int stop_encoding = 0;
1675 if (!ost->encoding_needed)
1678 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
1680 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
1685 int fifo_bytes, got_packet;
1686 av_init_packet(&pkt);
1690 switch (ost->st->codec->codec_type) {
1691 case AVMEDIA_TYPE_AUDIO:
1692 fifo_bytes = av_fifo_size(ost->fifo);
1693 if (fifo_bytes > 0) {
1694 /* encode any samples remaining in fifo */
1695 int frame_bytes = fifo_bytes;
1697 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1699 /* pad last frame with silence if needed */
1700 if (!(enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME)) {
1701 frame_bytes = enc->frame_size * enc->channels *
1702 av_get_bytes_per_sample(enc->sample_fmt);
1703 if (allocated_audio_buf_size < frame_bytes)
1705 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1707 encode_audio_frame(os, ost, audio_buf, frame_bytes);
1709 /* flush encoder with NULL frames until it is done
1710 returning packets */
1711 if (encode_audio_frame(os, ost, NULL, 0) == 0) {
1717 case AVMEDIA_TYPE_VIDEO:
1718 ret = avcodec_encode_video2(enc, &pkt, NULL, &got_packet);
1720 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1724 if (ost->logfile && enc->stats_out) {
1725 fprintf(ost->logfile, "%s", enc->stats_out);
1731 if (pkt.pts != AV_NOPTS_VALUE)
1732 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1733 if (pkt.dts != AV_NOPTS_VALUE)
1734 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1735 write_frame(os, &pkt, ost);
1747 * Check whether a packet from ist should be written into ost at this time
1749 static int check_output_constraints(InputStream *ist, OutputStream *ost)
1751 OutputFile *of = &output_files[ost->file_index];
1752 int ist_index = ist - input_streams;
1754 if (ost->source_index != ist_index)
1757 if (of->start_time && ist->last_dts < of->start_time)
1763 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
1765 OutputFile *of = &output_files[ost->file_index];
1766 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1769 av_init_packet(&opkt);
1771 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
1772 !ost->copy_initial_nonkeyframes)
1775 if (of->recording_time != INT64_MAX &&
1776 ist->last_dts >= of->recording_time + of->start_time) {
1777 ost->is_past_recording_time = 1;
1781 /* force the input stream PTS */
1782 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1783 audio_size += pkt->size;
1784 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1785 video_size += pkt->size;
1789 if (pkt->pts != AV_NOPTS_VALUE)
1790 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1792 opkt.pts = AV_NOPTS_VALUE;
1794 if (pkt->dts == AV_NOPTS_VALUE)
1795 opkt.dts = av_rescale_q(ist->last_dts, AV_TIME_BASE_Q, ost->st->time_base);
1797 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1798 opkt.dts -= ost_tb_start_time;
1800 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1801 opkt.flags = pkt->flags;
1803 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1804 if ( ost->st->codec->codec_id != CODEC_ID_H264
1805 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1806 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1807 && ost->st->codec->codec_id != CODEC_ID_VC1
1809 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
1810 opkt.destruct = av_destruct_packet;
1812 opkt.data = pkt->data;
1813 opkt.size = pkt->size;
1816 write_frame(of->ctx, &opkt, ost);
1817 ost->st->codec->frame_number++;
1818 av_free_packet(&opkt);
1821 static void rate_emu_sleep(InputStream *ist)
1823 if (input_files[ist->file_index].rate_emu) {
1824 int64_t pts = av_rescale(ist->last_dts, 1000000, AV_TIME_BASE);
1825 int64_t now = av_gettime() - ist->start;
1831 static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
1833 AVFrame *decoded_frame;
1834 AVCodecContext *avctx = ist->st->codec;
1835 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1838 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
1839 return AVERROR(ENOMEM);
1841 avcodec_get_frame_defaults(ist->decoded_frame);
1842 decoded_frame = ist->decoded_frame;
1844 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
1850 /* no audio frame */
1854 /* if the decoder provides a pts, use it instead of the last packet pts.
1855 the decoder could be delaying output by a packet or more. */
1856 if (decoded_frame->pts != AV_NOPTS_VALUE)
1857 ist->next_dts = decoded_frame->pts;
1859 /* increment next_dts to use for the case where the input stream does not
1860 have timestamps or there are multiple frames in the packet */
1861 ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
1864 // preprocess audio (volume)
1865 if (audio_volume != 256) {
1866 int decoded_data_size = decoded_frame->nb_samples * avctx->channels * bps;
1867 void *samples = decoded_frame->data[0];
1868 switch (avctx->sample_fmt) {
1869 case AV_SAMPLE_FMT_U8:
1871 uint8_t *volp = samples;
1872 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1873 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
1874 *volp++ = av_clip_uint8(v);
1878 case AV_SAMPLE_FMT_S16:
1880 int16_t *volp = samples;
1881 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1882 int v = ((*volp) * audio_volume + 128) >> 8;
1883 *volp++ = av_clip_int16(v);
1887 case AV_SAMPLE_FMT_S32:
1889 int32_t *volp = samples;
1890 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1891 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
1892 *volp++ = av_clipl_int32(v);
1896 case AV_SAMPLE_FMT_FLT:
1898 float *volp = samples;
1899 float scale = audio_volume / 256.f;
1900 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1905 case AV_SAMPLE_FMT_DBL:
1907 double *volp = samples;
1908 double scale = audio_volume / 256.;
1909 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1915 av_log(NULL, AV_LOG_FATAL,
1916 "Audio volume adjustment on sample format %s is not supported.\n",
1917 av_get_sample_fmt_name(ist->st->codec->sample_fmt));
1922 rate_emu_sleep(ist);
1924 for (i = 0; i < nb_output_streams; i++) {
1925 OutputStream *ost = &output_streams[i];
1927 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1929 do_audio_out(output_files[ost->file_index].ctx, ost, ist, decoded_frame);
1935 static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *pkt_pts)
1937 AVFrame *decoded_frame, *filtered_frame = NULL;
1938 void *buffer_to_free = NULL;
1942 int frame_available = 1;
1945 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
1946 return AVERROR(ENOMEM);
1948 avcodec_get_frame_defaults(ist->decoded_frame);
1949 decoded_frame = ist->decoded_frame;
1950 pkt->pts = *pkt_pts;
1951 pkt->dts = ist->last_dts;
1952 *pkt_pts = AV_NOPTS_VALUE;
1954 ret = avcodec_decode_video2(ist->st->codec,
1955 decoded_frame, got_output, pkt);
1959 quality = same_quant ? decoded_frame->quality : 0;
1961 /* no picture yet */
1964 decoded_frame->pts = guess_correct_pts(&ist->pts_ctx, decoded_frame->pkt_pts,
1965 decoded_frame->pkt_dts);
1967 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
1969 rate_emu_sleep(ist);
1971 for (i = 0; i < nb_output_streams; i++) {
1972 OutputStream *ost = &output_streams[i];
1973 int frame_size, resample_changed;
1975 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1979 resample_changed = ost->resample_width != decoded_frame->width ||
1980 ost->resample_height != decoded_frame->height ||
1981 ost->resample_pix_fmt != decoded_frame->format;
1982 if (resample_changed) {
1983 av_log(NULL, AV_LOG_INFO,
1984 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1985 ist->file_index, ist->st->index,
1986 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1987 decoded_frame->width, decoded_frame->height, av_get_pix_fmt_name(decoded_frame->format));
1989 avfilter_graph_free(&ost->graph);
1990 if (configure_video_filters(ist, ost)) {
1991 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
1995 ost->resample_width = decoded_frame->width;
1996 ost->resample_height = decoded_frame->height;
1997 ost->resample_pix_fmt = decoded_frame->format;
2000 if (ist->st->sample_aspect_ratio.num)
2001 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
2002 if (ist->st->codec->codec->capabilities & CODEC_CAP_DR1) {
2003 FrameBuffer *buf = decoded_frame->opaque;
2004 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2005 decoded_frame->data, decoded_frame->linesize,
2006 AV_PERM_READ | AV_PERM_PRESERVE,
2007 ist->st->codec->width, ist->st->codec->height,
2008 ist->st->codec->pix_fmt);
2010 avfilter_copy_frame_props(fb, decoded_frame);
2011 fb->buf->priv = buf;
2012 fb->buf->free = filter_release_buffer;
2015 av_buffersrc_buffer(ost->input_video_filter, fb);
2017 av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame,
2018 decoded_frame->pts, decoded_frame->sample_aspect_ratio);
2020 if (!ist->filtered_frame && !(ist->filtered_frame = avcodec_alloc_frame())) {
2021 ret = AVERROR(ENOMEM);
2024 avcodec_get_frame_defaults(ist->filtered_frame);
2025 filtered_frame = ist->filtered_frame;
2027 frame_available = avfilter_poll_frame(ost->output_video_filter->inputs[0]);
2028 while (frame_available) {
2029 AVRational ist_pts_tb;
2030 if ((ret = get_filtered_video_frame(ost->output_video_filter,
2031 filtered_frame, &ost->picref,
2034 filtered_frame->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
2035 if (!ost->frame_aspect_ratio)
2036 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
2038 filtered_frame = decoded_frame;
2041 do_video_out(output_files[ost->file_index].ctx, ost, ist, filtered_frame, &frame_size,
2042 same_quant ? quality : ost->st->codec->global_quality);
2043 if (vstats_filename && frame_size)
2044 do_video_stats(output_files[ost->file_index].ctx, ost, frame_size);
2046 frame_available = ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
2047 avfilter_unref_buffer(ost->picref);
2053 av_free(buffer_to_free);
2057 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2059 AVSubtitle subtitle;
2060 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2061 &subtitle, got_output, pkt);
2067 rate_emu_sleep(ist);
2069 for (i = 0; i < nb_output_streams; i++) {
2070 OutputStream *ost = &output_streams[i];
2072 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2075 do_subtitle_out(output_files[ost->file_index].ctx, ost, ist, &subtitle, pkt->pts);
2078 avsubtitle_free(&subtitle);
2082 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2083 static int output_packet(InputStream *ist,
2084 OutputStream *ost_table, int nb_ostreams,
2085 const AVPacket *pkt)
2089 int64_t pkt_pts = AV_NOPTS_VALUE;
2092 if (ist->next_dts == AV_NOPTS_VALUE)
2093 ist->next_dts = ist->last_dts;
2097 av_init_packet(&avpkt);
2105 if (pkt->dts != AV_NOPTS_VALUE)
2106 ist->next_dts = ist->last_dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2107 if (pkt->pts != AV_NOPTS_VALUE)
2108 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2110 // while we have more to decode or while the decoder did output something on EOF
2111 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2115 ist->last_dts = ist->next_dts;
2117 if (avpkt.size && avpkt.size != pkt->size) {
2118 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2119 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2120 ist->showed_multi_packet_warning = 1;
2123 switch (ist->st->codec->codec_type) {
2124 case AVMEDIA_TYPE_AUDIO:
2125 ret = transcode_audio (ist, &avpkt, &got_output);
2127 case AVMEDIA_TYPE_VIDEO:
2128 ret = transcode_video (ist, &avpkt, &got_output, &pkt_pts);
2130 ist->next_dts += av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
2131 else if (ist->st->r_frame_rate.num)
2132 ist->next_dts += av_rescale_q(1, (AVRational){ist->st->r_frame_rate.den,
2133 ist->st->r_frame_rate.num},
2135 else if (ist->st->codec->time_base.num != 0) {
2136 int ticks = ist->st->parser ? ist->st->parser->repeat_pict + 1 :
2137 ist->st->codec->ticks_per_frame;
2138 ist->next_dts += av_rescale_q(ticks, ist->st->codec->time_base, AV_TIME_BASE_Q);
2141 case AVMEDIA_TYPE_SUBTITLE:
2142 ret = transcode_subtitles(ist, &avpkt, &got_output);
2150 // touch data and size only if not EOF
2160 /* handle stream copy */
2161 if (!ist->decoding_needed) {
2162 rate_emu_sleep(ist);
2163 ist->last_dts = ist->next_dts;
2164 switch (ist->st->codec->codec_type) {
2165 case AVMEDIA_TYPE_AUDIO:
2166 ist->next_dts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2167 ist->st->codec->sample_rate;
2169 case AVMEDIA_TYPE_VIDEO:
2170 if (ist->st->codec->time_base.num != 0) {
2171 int ticks = ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2172 ist->next_dts += ((int64_t)AV_TIME_BASE *
2173 ist->st->codec->time_base.num * ticks) /
2174 ist->st->codec->time_base.den;
2179 for (i = 0; pkt && i < nb_ostreams; i++) {
2180 OutputStream *ost = &ost_table[i];
2182 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2185 do_streamcopy(ist, ost, pkt);
2191 static void print_sdp(OutputFile *output_files, int n)
2195 AVFormatContext **avc = av_malloc(sizeof(*avc) * n);
2199 for (i = 0; i < n; i++)
2200 avc[i] = output_files[i].ctx;
2202 av_sdp_create(avc, n, sdp, sizeof(sdp));
2203 printf("SDP:\n%s\n", sdp);
2208 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
2209 char *error, int error_len)
2212 InputStream *ist = &input_streams[ist_index];
2213 if (ist->decoding_needed) {
2214 AVCodec *codec = ist->dec;
2216 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d:%d",
2217 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2218 return AVERROR(EINVAL);
2221 /* update requested sample format for the decoder based on the
2222 corresponding encoder sample format */
2223 for (i = 0; i < nb_output_streams; i++) {
2224 OutputStream *ost = &output_streams[i];
2225 if (ost->source_index == ist_index) {
2226 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
2231 if (codec->type == AVMEDIA_TYPE_VIDEO && codec->capabilities & CODEC_CAP_DR1) {
2232 ist->st->codec->get_buffer = codec_get_buffer;
2233 ist->st->codec->release_buffer = codec_release_buffer;
2234 ist->st->codec->opaque = ist;
2237 if (!av_dict_get(ist->opts, "threads", NULL, 0))
2238 av_dict_set(&ist->opts, "threads", "auto", 0);
2239 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2240 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2241 ist->file_index, ist->st->index);
2242 return AVERROR(EINVAL);
2244 assert_codec_experimental(ist->st->codec, 0);
2245 assert_avoptions(ist->opts);
2248 ist->last_dts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames * AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
2249 ist->next_dts = AV_NOPTS_VALUE;
2250 init_pts_correction(&ist->pts_ctx);
2256 static int transcode_init(OutputFile *output_files,
2257 int nb_output_files,
2258 InputFile *input_files,
2261 int ret = 0, i, j, k;
2262 AVFormatContext *oc;
2263 AVCodecContext *codec, *icodec;
2269 /* init framerate emulation */
2270 for (i = 0; i < nb_input_files; i++) {
2271 InputFile *ifile = &input_files[i];
2272 if (ifile->rate_emu)
2273 for (j = 0; j < ifile->nb_streams; j++)
2274 input_streams[j + ifile->ist_index].start = av_gettime();
2277 /* output stream init */
2278 for (i = 0; i < nb_output_files; i++) {
2279 oc = output_files[i].ctx;
2280 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2281 av_dump_format(oc, i, oc->filename, 1);
2282 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2283 return AVERROR(EINVAL);
2287 /* for each output stream, we compute the right encoding parameters */
2288 for (i = 0; i < nb_output_streams; i++) {
2289 ost = &output_streams[i];
2290 oc = output_files[ost->file_index].ctx;
2291 ist = &input_streams[ost->source_index];
2293 if (ost->attachment_filename)
2296 codec = ost->st->codec;
2297 icodec = ist->st->codec;
2299 ost->st->disposition = ist->st->disposition;
2300 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2301 codec->chroma_sample_location = icodec->chroma_sample_location;
2303 if (ost->stream_copy) {
2304 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2306 if (extra_size > INT_MAX) {
2307 return AVERROR(EINVAL);
2310 /* if stream_copy is selected, no need to decode or encode */
2311 codec->codec_id = icodec->codec_id;
2312 codec->codec_type = icodec->codec_type;
2314 if (!codec->codec_tag) {
2315 if (!oc->oformat->codec_tag ||
2316 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2317 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2318 codec->codec_tag = icodec->codec_tag;
2321 codec->bit_rate = icodec->bit_rate;
2322 codec->rc_max_rate = icodec->rc_max_rate;
2323 codec->rc_buffer_size = icodec->rc_buffer_size;
2324 codec->field_order = icodec->field_order;
2325 codec->extradata = av_mallocz(extra_size);
2326 if (!codec->extradata) {
2327 return AVERROR(ENOMEM);
2329 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2330 codec->extradata_size = icodec->extradata_size;
2332 codec->time_base = icodec->time_base;
2333 codec->time_base.num *= icodec->ticks_per_frame;
2334 av_reduce(&codec->time_base.num, &codec->time_base.den,
2335 codec->time_base.num, codec->time_base.den, INT_MAX);
2337 codec->time_base = ist->st->time_base;
2339 switch (codec->codec_type) {
2340 case AVMEDIA_TYPE_AUDIO:
2341 if (audio_volume != 256) {
2342 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2345 codec->channel_layout = icodec->channel_layout;
2346 codec->sample_rate = icodec->sample_rate;
2347 codec->channels = icodec->channels;
2348 codec->frame_size = icodec->frame_size;
2349 codec->audio_service_type = icodec->audio_service_type;
2350 codec->block_align = icodec->block_align;
2352 case AVMEDIA_TYPE_VIDEO:
2353 codec->pix_fmt = icodec->pix_fmt;
2354 codec->width = icodec->width;
2355 codec->height = icodec->height;
2356 codec->has_b_frames = icodec->has_b_frames;
2357 if (!codec->sample_aspect_ratio.num) {
2358 codec->sample_aspect_ratio =
2359 ost->st->sample_aspect_ratio =
2360 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2361 ist->st->codec->sample_aspect_ratio.num ?
2362 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2365 case AVMEDIA_TYPE_SUBTITLE:
2366 codec->width = icodec->width;
2367 codec->height = icodec->height;
2369 case AVMEDIA_TYPE_DATA:
2370 case AVMEDIA_TYPE_ATTACHMENT:
2377 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2379 ist->decoding_needed = 1;
2380 ost->encoding_needed = 1;
2382 switch (codec->codec_type) {
2383 case AVMEDIA_TYPE_AUDIO:
2384 ost->fifo = av_fifo_alloc(1024);
2386 return AVERROR(ENOMEM);
2388 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2390 if (!codec->sample_rate)
2391 codec->sample_rate = icodec->sample_rate;
2392 choose_sample_rate(ost->st, ost->enc);
2393 codec->time_base = (AVRational){ 1, codec->sample_rate };
2395 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2396 codec->sample_fmt = icodec->sample_fmt;
2397 choose_sample_fmt(ost->st, ost->enc);
2399 if (!codec->channels)
2400 codec->channels = icodec->channels;
2401 codec->channel_layout = icodec->channel_layout;
2402 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2403 codec->channel_layout = 0;
2405 ost->audio_resample = codec-> sample_rate != icodec->sample_rate || audio_sync_method > 1;
2406 icodec->request_channels = codec-> channels;
2407 ost->resample_sample_fmt = icodec->sample_fmt;
2408 ost->resample_sample_rate = icodec->sample_rate;
2409 ost->resample_channels = icodec->channels;
2411 case AVMEDIA_TYPE_VIDEO:
2412 if (codec->pix_fmt == PIX_FMT_NONE)
2413 codec->pix_fmt = icodec->pix_fmt;
2414 choose_pixel_fmt(ost->st, ost->enc);
2416 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2417 av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2421 if (!codec->width || !codec->height) {
2422 codec->width = icodec->width;
2423 codec->height = icodec->height;
2426 ost->video_resample = codec->width != icodec->width ||
2427 codec->height != icodec->height ||
2428 codec->pix_fmt != icodec->pix_fmt;
2429 if (ost->video_resample) {
2430 #if !CONFIG_AVFILTER
2431 avcodec_get_frame_defaults(&ost->pict_tmp);
2432 if (avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2433 codec->width, codec->height)) {
2434 av_log(NULL, AV_LOG_FATAL, "Cannot allocate temp picture, check pix fmt\n");
2437 ost->img_resample_ctx = sws_getContext(
2444 ost->sws_flags, NULL, NULL, NULL);
2445 if (ost->img_resample_ctx == NULL) {
2446 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
2450 codec->bits_per_raw_sample = 0;
2453 ost->resample_height = icodec->height;
2454 ost->resample_width = icodec->width;
2455 ost->resample_pix_fmt = icodec->pix_fmt;
2458 * We want CFR output if and only if one of those is true:
2459 * 1) user specified output framerate with -r
2460 * 2) user specified -vsync cfr
2461 * 3) output format is CFR and the user didn't force vsync to
2462 * something else than CFR
2464 * in such a case, set ost->frame_rate
2466 if (!ost->frame_rate.num &&
2467 (video_sync_method == VSYNC_CFR ||
2468 (video_sync_method == VSYNC_AUTO &&
2469 !(oc->oformat->flags & (AVFMT_NOTIMESTAMPS | AVFMT_VARIABLE_FPS))))) {
2470 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25, 1};
2471 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2472 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2473 ost->frame_rate = ost->enc->supported_framerates[idx];
2476 if (ost->frame_rate.num) {
2477 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2478 video_sync_method = VSYNC_CFR;
2480 codec->time_base = ist->st->time_base;
2483 if (configure_video_filters(ist, ost)) {
2484 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2489 case AVMEDIA_TYPE_SUBTITLE:
2490 codec->time_base = (AVRational){1, 1000};
2497 if ((codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2498 char logfilename[1024];
2501 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2502 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2504 if (!strcmp(ost->enc->name, "libx264")) {
2505 av_dict_set(&ost->opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
2507 if (codec->flags & CODEC_FLAG_PASS1) {
2508 f = fopen(logfilename, "wb");
2510 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2511 logfilename, strerror(errno));
2517 size_t logbuffer_size;
2518 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2519 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2523 codec->stats_in = logbuffer;
2530 /* open each encoder */
2531 for (i = 0; i < nb_output_streams; i++) {
2532 ost = &output_streams[i];
2533 if (ost->encoding_needed) {
2534 AVCodec *codec = ost->enc;
2535 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2537 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d:%d",
2538 ost->st->codec->codec_id, ost->file_index, ost->index);
2539 ret = AVERROR(EINVAL);
2542 if (dec->subtitle_header) {
2543 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2544 if (!ost->st->codec->subtitle_header) {
2545 ret = AVERROR(ENOMEM);
2548 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2549 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2551 if (!av_dict_get(ost->opts, "threads", NULL, 0))
2552 av_dict_set(&ost->opts, "threads", "auto", 0);
2553 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2554 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2555 ost->file_index, ost->index);
2556 ret = AVERROR(EINVAL);
2559 assert_codec_experimental(ost->st->codec, 1);
2560 assert_avoptions(ost->opts);
2561 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2562 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2563 "It takes bits/s as argument, not kbits/s\n");
2564 extra_size += ost->st->codec->extradata_size;
2566 if (ost->st->codec->me_threshold)
2567 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2571 /* init input streams */
2572 for (i = 0; i < nb_input_streams; i++)
2573 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2576 /* discard unused programs */
2577 for (i = 0; i < nb_input_files; i++) {
2578 InputFile *ifile = &input_files[i];
2579 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2580 AVProgram *p = ifile->ctx->programs[j];
2581 int discard = AVDISCARD_ALL;
2583 for (k = 0; k < p->nb_stream_indexes; k++)
2584 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2585 discard = AVDISCARD_DEFAULT;
2588 p->discard = discard;
2592 /* open files and write file headers */
2593 for (i = 0; i < nb_output_files; i++) {
2594 oc = output_files[i].ctx;
2595 oc->interrupt_callback = int_cb;
2596 if (avformat_write_header(oc, &output_files[i].opts) < 0) {
2597 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2598 ret = AVERROR(EINVAL);
2601 assert_avoptions(output_files[i].opts);
2602 if (strcmp(oc->oformat->name, "rtp")) {
2608 /* dump the file output parameters - cannot be done before in case
2610 for (i = 0; i < nb_output_files; i++) {
2611 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2614 /* dump the stream mapping */
2615 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2616 for (i = 0; i < nb_output_streams; i++) {
2617 ost = &output_streams[i];
2619 if (ost->attachment_filename) {
2620 /* an attached file */
2621 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
2622 ost->attachment_filename, ost->file_index, ost->index);
2625 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
2626 input_streams[ost->source_index].file_index,
2627 input_streams[ost->source_index].st->index,
2630 if (ost->sync_ist != &input_streams[ost->source_index])
2631 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2632 ost->sync_ist->file_index,
2633 ost->sync_ist->st->index);
2634 if (ost->stream_copy)
2635 av_log(NULL, AV_LOG_INFO, " (copy)");
2637 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2638 input_streams[ost->source_index].dec->name : "?",
2639 ost->enc ? ost->enc->name : "?");
2640 av_log(NULL, AV_LOG_INFO, "\n");
2644 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2649 print_sdp(output_files, nb_output_files);
2656 * The following code is the main loop of the file converter
2658 static int transcode(OutputFile *output_files,
2659 int nb_output_files,
2660 InputFile *input_files,
2664 AVFormatContext *is, *os;
2668 int no_packet_count = 0;
2669 int64_t timer_start;
2671 if (!(no_packet = av_mallocz(nb_input_files)))
2674 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2678 av_log(NULL, AV_LOG_INFO, "Press ctrl-c to stop encoding\n");
2681 timer_start = av_gettime();
2683 for (; received_sigterm == 0;) {
2684 int file_index, ist_index;
2689 ipts_min = INT64_MAX;
2692 /* select the stream that we must read now by looking at the
2693 smallest output pts */
2695 for (i = 0; i < nb_output_streams; i++) {
2699 ost = &output_streams[i];
2700 of = &output_files[ost->file_index];
2701 os = output_files[ost->file_index].ctx;
2702 ist = &input_streams[ost->source_index];
2703 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2704 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2706 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2707 ipts = ist->last_dts;
2708 if (!input_files[ist->file_index].eof_reached) {
2709 if (ipts < ipts_min) {
2712 file_index = ist->file_index;
2714 if (opts < opts_min) {
2716 if (!input_sync) file_index = ist->file_index;
2719 if (ost->frame_number >= ost->max_frames) {
2721 for (j = 0; j < of->ctx->nb_streams; j++)
2722 output_streams[of->ost_index + j].is_past_recording_time = 1;
2726 /* if none, if is finished */
2727 if (file_index < 0) {
2728 if (no_packet_count) {
2729 no_packet_count = 0;
2730 memset(no_packet, 0, nb_input_files);
2737 /* read a frame from it and output it in the fifo */
2738 is = input_files[file_index].ctx;
2739 ret = av_read_frame(is, &pkt);
2740 if (ret == AVERROR(EAGAIN)) {
2741 no_packet[file_index] = 1;
2746 input_files[file_index].eof_reached = 1;
2753 no_packet_count = 0;
2754 memset(no_packet, 0, nb_input_files);
2757 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2758 is->streams[pkt.stream_index]);
2760 /* the following test is needed in case new streams appear
2761 dynamically in stream : we ignore them */
2762 if (pkt.stream_index >= input_files[file_index].nb_streams)
2763 goto discard_packet;
2764 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2765 ist = &input_streams[ist_index];
2767 goto discard_packet;
2769 if (pkt.dts != AV_NOPTS_VALUE)
2770 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2771 if (pkt.pts != AV_NOPTS_VALUE)
2772 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2774 if (pkt.pts != AV_NOPTS_VALUE)
2775 pkt.pts *= ist->ts_scale;
2776 if (pkt.dts != AV_NOPTS_VALUE)
2777 pkt.dts *= ist->ts_scale;
2779 //fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n",
2781 // pkt.dts, input_files[ist->file_index].ts_offset,
2782 // ist->st->codec->codec_type);
2783 if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE
2784 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2785 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2786 int64_t delta = pkt_dts - ist->next_dts;
2787 if ((FFABS(delta) > 1LL * dts_delta_threshold * AV_TIME_BASE || pkt_dts + 1 < ist->last_dts) && !copy_ts) {
2788 input_files[ist->file_index].ts_offset -= delta;
2789 av_log(NULL, AV_LOG_DEBUG,
2790 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2791 delta, input_files[ist->file_index].ts_offset);
2792 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2793 if (pkt.pts != AV_NOPTS_VALUE)
2794 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2798 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2799 if (output_packet(ist, output_streams, nb_output_streams, &pkt) < 0) {
2801 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
2802 ist->file_index, ist->st->index);
2805 av_free_packet(&pkt);
2810 av_free_packet(&pkt);
2812 /* dump report by using the output first video and audio streams */
2813 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2816 /* at the end of stream, we must flush the decoder buffers */
2817 for (i = 0; i < nb_input_streams; i++) {
2818 ist = &input_streams[i];
2819 if (ist->decoding_needed) {
2820 output_packet(ist, output_streams, nb_output_streams, NULL);
2823 flush_encoders(output_streams, nb_output_streams);
2827 /* write the trailer if needed and close file */
2828 for (i = 0; i < nb_output_files; i++) {
2829 os = output_files[i].ctx;
2830 av_write_trailer(os);
2833 /* dump report by using the first video and audio streams */
2834 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2836 /* close each encoder */
2837 for (i = 0; i < nb_output_streams; i++) {
2838 ost = &output_streams[i];
2839 if (ost->encoding_needed) {
2840 av_freep(&ost->st->codec->stats_in);
2841 avcodec_close(ost->st->codec);
2844 avfilter_graph_free(&ost->graph);
2848 /* close each decoder */
2849 for (i = 0; i < nb_input_streams; i++) {
2850 ist = &input_streams[i];
2851 if (ist->decoding_needed) {
2852 avcodec_close(ist->st->codec);
2860 av_freep(&no_packet);
2862 if (output_streams) {
2863 for (i = 0; i < nb_output_streams; i++) {
2864 ost = &output_streams[i];
2866 if (ost->stream_copy)
2867 av_freep(&ost->st->codec->extradata);
2869 fclose(ost->logfile);
2870 ost->logfile = NULL;
2872 av_fifo_free(ost->fifo); /* works even if fifo is not
2873 initialized but set to zero */
2874 av_freep(&ost->st->codec->subtitle_header);
2875 av_free(ost->pict_tmp.data[0]);
2876 av_free(ost->forced_kf_pts);
2877 if (ost->video_resample)
2878 sws_freeContext(ost->img_resample_ctx);
2880 audio_resample_close(ost->resample);
2881 if (ost->reformat_ctx)
2882 av_audio_convert_free(ost->reformat_ctx);
2883 av_dict_free(&ost->opts);
2890 static double parse_frame_aspect_ratio(const char *arg)
2897 p = strchr(arg, ':');
2899 x = strtol(arg, &end, 10);
2901 y = strtol(end + 1, &end, 10);
2903 ar = (double)x / (double)y;
2905 ar = strtod(arg, NULL);
2908 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
2914 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2916 return parse_option(o, "codec:a", arg, options);
2919 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2921 return parse_option(o, "codec:v", arg, options);
2924 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2926 return parse_option(o, "codec:s", arg, options);
2929 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2931 return parse_option(o, "codec:d", arg, options);
2934 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2936 StreamMap *m = NULL;
2937 int i, negative = 0, file_idx;
2938 int sync_file_idx = -1, sync_stream_idx;
2946 map = av_strdup(arg);
2948 /* parse sync stream first, just pick first matching stream */
2949 if (sync = strchr(map, ',')) {
2951 sync_file_idx = strtol(sync + 1, &sync, 0);
2952 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2953 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
2958 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2959 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2960 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2961 sync_stream_idx = i;
2964 if (i == input_files[sync_file_idx].nb_streams) {
2965 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
2966 "match any streams.\n", arg);
2972 file_idx = strtol(map, &p, 0);
2973 if (file_idx >= nb_input_files || file_idx < 0) {
2974 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
2978 /* disable some already defined maps */
2979 for (i = 0; i < o->nb_stream_maps; i++) {
2980 m = &o->stream_maps[i];
2981 if (file_idx == m->file_index &&
2982 check_stream_specifier(input_files[m->file_index].ctx,
2983 input_files[m->file_index].ctx->streams[m->stream_index],
2984 *p == ':' ? p + 1 : p) > 0)
2988 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2989 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2990 *p == ':' ? p + 1 : p) <= 0)
2992 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2993 &o->nb_stream_maps, o->nb_stream_maps + 1);
2994 m = &o->stream_maps[o->nb_stream_maps - 1];
2996 m->file_index = file_idx;
2997 m->stream_index = i;
2999 if (sync_file_idx >= 0) {
3000 m->sync_file_index = sync_file_idx;
3001 m->sync_stream_index = sync_stream_idx;
3003 m->sync_file_index = file_idx;
3004 m->sync_stream_index = i;
3009 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3017 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3019 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3020 &o->nb_attachments, o->nb_attachments + 1);
3021 o->attachments[o->nb_attachments - 1] = arg;
3026 * Parse a metadata specifier in arg.
3027 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
3028 * @param index for type c/p, chapter/program index is written here
3029 * @param stream_spec for type s, the stream specifier is written here
3031 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
3039 if (*(++arg) && *arg != ':') {
3040 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
3043 *stream_spec = *arg == ':' ? arg + 1 : "";
3047 if (*(++arg) == ':')
3048 *index = strtol(++arg, NULL, 0);
3051 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
3058 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
3060 AVDictionary **meta_in = NULL;
3061 AVDictionary **meta_out;
3063 char type_in, type_out;
3064 const char *istream_spec = NULL, *ostream_spec = NULL;
3065 int idx_in = 0, idx_out = 0;
3067 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
3068 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
3070 if (type_in == 'g' || type_out == 'g')
3071 o->metadata_global_manual = 1;
3072 if (type_in == 's' || type_out == 's')
3073 o->metadata_streams_manual = 1;
3074 if (type_in == 'c' || type_out == 'c')
3075 o->metadata_chapters_manual = 1;
3077 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3078 if ((index) < 0 || (index) >= (nb_elems)) {\
3079 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
3084 #define SET_DICT(type, meta, context, index)\
3087 meta = &context->metadata;\
3090 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
3091 meta = &context->chapters[index]->metadata;\
3094 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
3095 meta = &context->programs[index]->metadata;\
3099 SET_DICT(type_in, meta_in, ic, idx_in);
3100 SET_DICT(type_out, meta_out, oc, idx_out);
3102 /* for input streams choose first matching stream */
3103 if (type_in == 's') {
3104 for (i = 0; i < ic->nb_streams; i++) {
3105 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
3106 meta_in = &ic->streams[i]->metadata;
3112 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
3117 if (type_out == 's') {
3118 for (i = 0; i < oc->nb_streams; i++) {
3119 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
3120 meta_out = &oc->streams[i]->metadata;
3121 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3126 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3131 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
3133 const char *codec_string = encoder ? "encoder" : "decoder";
3137 avcodec_find_encoder_by_name(name) :
3138 avcodec_find_decoder_by_name(name);
3140 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
3143 if (codec->type != type) {
3144 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
3150 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
3152 char *codec_name = NULL;
3154 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
3156 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
3157 st->codec->codec_id = codec->id;
3160 return avcodec_find_decoder(st->codec->codec_id);
3164 * Add all the streams from the given input file to the global
3165 * list of input streams.
3167 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
3171 for (i = 0; i < ic->nb_streams; i++) {
3172 AVStream *st = ic->streams[i];
3173 AVCodecContext *dec = st->codec;
3176 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3177 ist = &input_streams[nb_input_streams - 1];
3179 ist->file_index = nb_input_files;
3181 st->discard = AVDISCARD_ALL;
3182 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
3184 ist->ts_scale = 1.0;
3185 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
3187 ist->dec = choose_decoder(o, ic, st);
3189 switch (dec->codec_type) {
3190 case AVMEDIA_TYPE_VIDEO:
3192 dec->flags |= CODEC_FLAG_EMU_EDGE;
3193 dec->height >>= dec->lowres;
3194 dec->width >>= dec->lowres;
3198 case AVMEDIA_TYPE_AUDIO:
3199 case AVMEDIA_TYPE_DATA:
3200 case AVMEDIA_TYPE_SUBTITLE:
3201 case AVMEDIA_TYPE_ATTACHMENT:
3202 case AVMEDIA_TYPE_UNKNOWN:
3210 static void assert_file_overwrite(const char *filename)
3212 if (!file_overwrite &&
3213 (strchr(filename, ':') == NULL || filename[1] == ':' ||
3214 av_strstart(filename, "file:", NULL))) {
3215 if (avio_check(filename, 0) == 0) {
3217 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3219 if (!read_yesno()) {
3220 fprintf(stderr, "Not overwriting - exiting\n");
3225 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3232 static void dump_attachment(AVStream *st, const char *filename)
3235 AVIOContext *out = NULL;
3236 AVDictionaryEntry *e;
3238 if (!st->codec->extradata_size) {
3239 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
3240 nb_input_files - 1, st->index);
3243 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
3244 filename = e->value;
3246 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
3247 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
3251 assert_file_overwrite(filename);
3253 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
3254 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
3259 avio_write(out, st->codec->extradata, st->codec->extradata_size);
3264 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
3266 AVFormatContext *ic;
3267 AVInputFormat *file_iformat = NULL;
3271 AVDictionary **opts;
3272 int orig_nb_streams; // number of streams before avformat_find_stream_info
3275 if (!(file_iformat = av_find_input_format(o->format))) {
3276 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
3281 if (!strcmp(filename, "-"))
3284 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3285 !strcmp(filename, "/dev/stdin");
3287 /* get default parameters from command line */
3288 ic = avformat_alloc_context();
3290 print_error(filename, AVERROR(ENOMEM));
3293 if (o->nb_audio_sample_rate) {
3294 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
3295 av_dict_set(&format_opts, "sample_rate", buf, 0);
3297 if (o->nb_audio_channels) {
3298 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
3299 av_dict_set(&format_opts, "channels", buf, 0);
3301 if (o->nb_frame_rates) {
3302 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
3304 if (o->nb_frame_sizes) {
3305 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
3307 if (o->nb_frame_pix_fmts)
3308 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
3310 ic->flags |= AVFMT_FLAG_NONBLOCK;
3311 ic->interrupt_callback = int_cb;
3313 /* open the input file with generic libav function */
3314 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3316 print_error(filename, err);
3319 assert_avoptions(format_opts);
3321 /* apply forced codec ids */
3322 for (i = 0; i < ic->nb_streams; i++)
3323 choose_decoder(o, ic, ic->streams[i]);
3325 /* Set AVCodecContext options for avformat_find_stream_info */
3326 opts = setup_find_stream_info_opts(ic, codec_opts);
3327 orig_nb_streams = ic->nb_streams;
3329 /* If not enough info to get the stream parameters, we decode the
3330 first frames to get it. (used in mpeg case for example) */
3331 ret = avformat_find_stream_info(ic, opts);
3333 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
3334 avformat_close_input(&ic);
3338 timestamp = o->start_time;
3339 /* add the stream start time */
3340 if (ic->start_time != AV_NOPTS_VALUE)
3341 timestamp += ic->start_time;
3343 /* if seeking requested, we execute it */
3344 if (o->start_time != 0) {
3345 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3347 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
3348 filename, (double)timestamp / AV_TIME_BASE);
3352 /* update the current parameters so that they match the one of the input stream */
3353 add_input_streams(o, ic);
3355 /* dump the file content */
3356 av_dump_format(ic, nb_input_files, filename, 0);
3358 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3359 input_files[nb_input_files - 1].ctx = ic;
3360 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3361 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3362 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3363 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
3365 for (i = 0; i < o->nb_dump_attachment; i++) {
3368 for (j = 0; j < ic->nb_streams; j++) {
3369 AVStream *st = ic->streams[j];
3371 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
3372 dump_attachment(st, o->dump_attachment[i].u.str);
3376 for (i = 0; i < orig_nb_streams; i++)
3377 av_dict_free(&opts[i]);
3384 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3385 AVCodecContext *avctx)
3391 for (p = kf; *p; p++)
3394 ost->forced_kf_count = n;
3395 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3396 if (!ost->forced_kf_pts) {
3397 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3400 for (i = 0; i < n; i++) {
3401 p = i ? strchr(p, ',') + 1 : kf;
3402 t = parse_time_or_die("force_key_frames", p, 1);
3403 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3407 static uint8_t *get_line(AVIOContext *s)
3413 if (avio_open_dyn_buf(&line) < 0) {
3414 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
3418 while ((c = avio_r8(s)) && c != '\n')
3421 avio_close_dyn_buf(line, &buf);
3426 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
3429 char filename[1000];
3430 const char *base[3] = { getenv("AVCONV_DATADIR"),
3435 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
3439 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
3440 i != 1 ? "" : "/.avconv", codec_name, preset_name);
3441 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3444 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
3445 i != 1 ? "" : "/.avconv", preset_name);
3446 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3452 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
3454 char *codec_name = NULL;
3456 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
3458 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
3459 NULL, ost->st->codec->codec_type);
3460 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
3461 } else if (!strcmp(codec_name, "copy"))
3462 ost->stream_copy = 1;
3464 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
3465 ost->st->codec->codec_id = ost->enc->id;
3469 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3472 AVStream *st = avformat_new_stream(oc, NULL);
3473 int idx = oc->nb_streams - 1, ret = 0;
3474 char *bsf = NULL, *next, *codec_tag = NULL;
3475 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3477 char *buf = NULL, *arg = NULL, *preset = NULL;
3478 AVIOContext *s = NULL;
3481 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3485 if (oc->nb_streams - 1 < o->nb_streamid_map)
3486 st->id = o->streamid_map[oc->nb_streams - 1];
3488 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3489 nb_output_streams + 1);
3490 ost = &output_streams[nb_output_streams - 1];
3491 ost->file_index = nb_output_files;
3494 st->codec->codec_type = type;
3495 choose_encoder(o, oc, ost);
3497 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3500 avcodec_get_context_defaults3(st->codec, ost->enc);
3501 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3503 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
3504 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
3507 if (!buf[0] || buf[0] == '#') {
3511 if (!(arg = strchr(buf, '='))) {
3512 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
3516 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
3518 } while (!s->eof_reached);
3522 av_log(NULL, AV_LOG_FATAL,
3523 "Preset %s specified for stream %d:%d, but could not be opened.\n",
3524 preset, ost->file_index, ost->index);
3528 ost->max_frames = INT64_MAX;
3529 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
3531 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3533 if (next = strchr(bsf, ','))
3535 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3536 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3540 bsfc_prev->next = bsfc;
3542 ost->bitstream_filters = bsfc;
3548 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3550 uint32_t tag = strtol(codec_tag, &next, 0);
3552 tag = AV_RL32(codec_tag);
3553 st->codec->codec_tag = tag;
3556 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3557 if (qscale >= 0 || same_quant) {
3558 st->codec->flags |= CODEC_FLAG_QSCALE;
3559 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3562 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
3563 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3565 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3569 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3572 const char *p = str;
3579 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3586 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3590 AVCodecContext *video_enc;
3592 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3594 video_enc = st->codec;
3596 if (!ost->stream_copy) {
3597 const char *p = NULL;
3598 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3599 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3600 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3603 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3604 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3605 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3609 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3610 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3611 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3615 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3616 if (frame_aspect_ratio)
3617 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3619 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3620 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3621 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3624 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3626 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3628 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3629 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
3632 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3634 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3636 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3637 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
3640 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
3643 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
3644 for (i = 0; p; i++) {
3646 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
3648 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
3651 video_enc->rc_override =
3652 av_realloc(video_enc->rc_override,
3653 sizeof(RcOverride) * (i + 1));
3654 video_enc->rc_override[i].start_frame = start;
3655 video_enc->rc_override[i].end_frame = end;
3657 video_enc->rc_override[i].qscale = q;
3658 video_enc->rc_override[i].quality_factor = 1.0;
3661 video_enc->rc_override[i].qscale = 0;
3662 video_enc->rc_override[i].quality_factor = -q/100.0;
3667 video_enc->rc_override_count = i;
3668 if (!video_enc->rc_initial_buffer_occupancy)
3669 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
3670 video_enc->intra_dc_precision = intra_dc_precision - 8;
3675 video_enc->flags |= CODEC_FLAG_PASS1;
3677 video_enc->flags |= CODEC_FLAG_PASS2;
3681 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
3682 if (forced_key_frames)
3683 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3685 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
3687 ost->top_field_first = -1;
3688 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
3691 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
3693 ost->avfilter = av_strdup(filters);
3696 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
3702 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3706 AVCodecContext *audio_enc;
3708 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3711 audio_enc = st->codec;
3712 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3714 if (!ost->stream_copy) {
3715 char *sample_fmt = NULL;
3717 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3719 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
3721 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
3722 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
3726 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
3732 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3736 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3737 if (!ost->stream_copy) {
3738 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
3745 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
3747 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
3748 ost->stream_copy = 1;
3752 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3756 AVCodecContext *subtitle_enc;
3758 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3760 subtitle_enc = st->codec;
3762 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3767 /* arg format is "output-stream-index:streamid-value". */
3768 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
3774 av_strlcpy(idx_str, arg, sizeof(idx_str));
3775 p = strchr(idx_str, ':');
3777 av_log(NULL, AV_LOG_FATAL,
3778 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3783 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3784 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
3785 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3789 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3791 AVFormatContext *is = ifile->ctx;
3792 AVFormatContext *os = ofile->ctx;
3795 for (i = 0; i < is->nb_chapters; i++) {
3796 AVChapter *in_ch = is->chapters[i], *out_ch;
3797 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3798 AV_TIME_BASE_Q, in_ch->time_base);
3799 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3800 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3803 if (in_ch->end < ts_off)
3805 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3808 out_ch = av_mallocz(sizeof(AVChapter));
3810 return AVERROR(ENOMEM);
3812 out_ch->id = in_ch->id;
3813 out_ch->time_base = in_ch->time_base;
3814 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3815 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3818 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3821 os->chapters = av_realloc(os->chapters, sizeof(AVChapter) * os->nb_chapters);
3823 return AVERROR(ENOMEM);
3824 os->chapters[os->nb_chapters - 1] = out_ch;
3829 static void opt_output_file(void *optctx, const char *filename)
3831 OptionsContext *o = optctx;
3832 AVFormatContext *oc;
3834 AVOutputFormat *file_oformat;
3838 if (!strcmp(filename, "-"))
3841 oc = avformat_alloc_context();
3843 print_error(filename, AVERROR(ENOMEM));
3848 file_oformat = av_guess_format(o->format, NULL, NULL);
3849 if (!file_oformat) {
3850 av_log(NULL, AV_LOG_FATAL, "Requested output format '%s' is not a suitable output format\n", o->format);
3854 file_oformat = av_guess_format(NULL, filename, NULL);
3855 if (!file_oformat) {
3856 av_log(NULL, AV_LOG_FATAL, "Unable to find a suitable output format for '%s'\n",
3862 oc->oformat = file_oformat;
3863 oc->interrupt_callback = int_cb;
3864 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3866 if (!o->nb_stream_maps) {
3867 /* pick the "best" stream of each type */
3868 #define NEW_STREAM(type, index)\
3870 ost = new_ ## type ## _stream(o, oc);\
3871 ost->source_index = index;\
3872 ost->sync_ist = &input_streams[index];\
3873 input_streams[index].discard = 0;\
3874 input_streams[index].st->discard = AVDISCARD_NONE;\
3877 /* video: highest resolution */
3878 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3879 int area = 0, idx = -1;
3880 for (i = 0; i < nb_input_streams; i++) {
3881 ist = &input_streams[i];
3882 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3883 ist->st->codec->width * ist->st->codec->height > area) {
3884 area = ist->st->codec->width * ist->st->codec->height;
3888 NEW_STREAM(video, idx);
3891 /* audio: most channels */
3892 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3893 int channels = 0, idx = -1;
3894 for (i = 0; i < nb_input_streams; i++) {
3895 ist = &input_streams[i];
3896 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3897 ist->st->codec->channels > channels) {
3898 channels = ist->st->codec->channels;
3902 NEW_STREAM(audio, idx);
3905 /* subtitles: pick first */
3906 if (!o->subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3907 for (i = 0; i < nb_input_streams; i++)
3908 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3909 NEW_STREAM(subtitle, i);
3913 /* do something with data? */
3915 for (i = 0; i < o->nb_stream_maps; i++) {
3916 StreamMap *map = &o->stream_maps[i];
3921 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3922 switch (ist->st->codec->codec_type) {
3923 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3924 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3925 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3926 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3927 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
3929 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
3930 map->file_index, map->stream_index);
3934 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3935 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3936 map->sync_stream_index];
3938 ist->st->discard = AVDISCARD_NONE;
3942 /* handle attached files */
3943 for (i = 0; i < o->nb_attachments; i++) {
3945 uint8_t *attachment;
3949 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
3950 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
3954 if ((len = avio_size(pb)) <= 0) {
3955 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
3959 if (!(attachment = av_malloc(len))) {
3960 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
3964 avio_read(pb, attachment, len);
3966 ost = new_attachment_stream(o, oc);
3967 ost->stream_copy = 0;
3968 ost->source_index = -1;
3969 ost->attachment_filename = o->attachments[i];
3970 ost->st->codec->extradata = attachment;
3971 ost->st->codec->extradata_size = len;
3973 p = strrchr(o->attachments[i], '/');
3974 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
3978 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3979 output_files[nb_output_files - 1].ctx = oc;
3980 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3981 output_files[nb_output_files - 1].recording_time = o->recording_time;
3982 if (o->recording_time != INT64_MAX)
3983 oc->duration = o->recording_time;
3984 output_files[nb_output_files - 1].start_time = o->start_time;
3985 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3986 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3988 /* check filename in case of an image number is expected */
3989 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3990 if (!av_filename_number_test(oc->filename)) {
3991 print_error(oc->filename, AVERROR(EINVAL));
3996 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3997 /* test if it already exists to avoid losing precious files */
3998 assert_file_overwrite(filename);
4001 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
4002 &oc->interrupt_callback,
4003 &output_files[nb_output_files - 1].opts)) < 0) {
4004 print_error(filename, err);
4009 if (o->mux_preload) {
4011 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
4012 av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
4014 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
4015 oc->flags |= AVFMT_FLAG_NONBLOCK;
4018 for (i = 0; i < o->nb_metadata_map; i++) {
4020 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
4022 if (in_file_index < 0)
4024 if (in_file_index >= nb_input_files) {
4025 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
4028 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, input_files[in_file_index].ctx, o);
4032 if (o->chapters_input_file >= nb_input_files) {
4033 if (o->chapters_input_file == INT_MAX) {
4034 /* copy chapters from the first input file that has them*/
4035 o->chapters_input_file = -1;
4036 for (i = 0; i < nb_input_files; i++)
4037 if (input_files[i].ctx->nb_chapters) {
4038 o->chapters_input_file = i;
4042 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
4043 o->chapters_input_file);
4047 if (o->chapters_input_file >= 0)
4048 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
4049 !o->metadata_chapters_manual);
4051 /* copy global metadata by default */
4052 if (!o->metadata_global_manual && nb_input_files)
4053 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
4054 AV_DICT_DONT_OVERWRITE);
4055 if (!o->metadata_streams_manual)
4056 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
4058 if (output_streams[i].source_index < 0) /* this is true e.g. for attached files */
4060 ist = &input_streams[output_streams[i].source_index];
4061 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
4064 /* process manually set metadata */
4065 for (i = 0; i < o->nb_metadata; i++) {
4068 const char *stream_spec;
4069 int index = 0, j, ret;
4071 val = strchr(o->metadata[i].u.str, '=');
4073 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
4074 o->metadata[i].u.str);
4079 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
4081 for (j = 0; j < oc->nb_streams; j++) {
4082 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
4083 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
4087 printf("ret %d, stream_spec %s\n", ret, stream_spec);
4095 if (index < 0 || index >= oc->nb_chapters) {
4096 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
4099 m = &oc->chapters[index]->metadata;
4102 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
4105 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
4112 /* same option as mencoder */
4113 static int opt_pass(const char *opt, const char *arg)
4115 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
4119 static int64_t getutime(void)
4122 struct rusage rusage;
4124 getrusage(RUSAGE_SELF, &rusage);
4125 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4126 #elif HAVE_GETPROCESSTIMES
4128 FILETIME c, e, k, u;
4129 proc = GetCurrentProcess();
4130 GetProcessTimes(proc, &c, &e, &k, &u);
4131 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4133 return av_gettime();
4137 static int64_t getmaxrss(void)
4139 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4140 struct rusage rusage;
4141 getrusage(RUSAGE_SELF, &rusage);
4142 return (int64_t)rusage.ru_maxrss * 1024;
4143 #elif HAVE_GETPROCESSMEMORYINFO
4145 PROCESS_MEMORY_COUNTERS memcounters;
4146 proc = GetCurrentProcess();
4147 memcounters.cb = sizeof(memcounters);
4148 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4149 return memcounters.PeakPagefileUsage;
4155 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
4157 return parse_option(o, "q:a", arg, options);
4160 static void show_usage(void)
4162 printf("Hyper fast Audio and Video encoder\n");
4163 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
4167 static void show_help(void)
4169 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
4170 av_log_set_callback(log_callback_help);
4172 show_help_options(options, "Main options:\n",
4173 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4174 show_help_options(options, "\nAdvanced options:\n",
4175 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4177 show_help_options(options, "\nVideo options:\n",
4178 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4180 show_help_options(options, "\nAdvanced Video options:\n",
4181 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4182 OPT_VIDEO | OPT_EXPERT);
4183 show_help_options(options, "\nAudio options:\n",
4184 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4186 show_help_options(options, "\nAdvanced Audio options:\n",
4187 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4188 OPT_AUDIO | OPT_EXPERT);
4189 show_help_options(options, "\nSubtitle options:\n",
4190 OPT_SUBTITLE | OPT_GRAB,
4192 show_help_options(options, "\nAudio/Video grab options:\n",
4196 show_help_children(avcodec_get_class(), flags);
4197 show_help_children(avformat_get_class(), flags);
4198 show_help_children(sws_get_class(), flags);
4201 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
4203 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4204 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
4206 if (!strncmp(arg, "pal-", 4)) {
4209 } else if (!strncmp(arg, "ntsc-", 5)) {
4212 } else if (!strncmp(arg, "film-", 5)) {
4216 /* Try to determine PAL/NTSC by peeking in the input files */
4217 if (nb_input_files) {
4219 for (j = 0; j < nb_input_files; j++) {
4220 for (i = 0; i < input_files[j].nb_streams; i++) {
4221 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4222 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
4224 fr = c->time_base.den * 1000 / c->time_base.num;
4228 } else if ((fr == 29970) || (fr == 23976)) {
4233 if (norm != UNKNOWN)
4237 if (norm != UNKNOWN)
4238 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4241 if (norm == UNKNOWN) {
4242 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4243 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4244 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
4248 if (!strcmp(arg, "vcd")) {
4249 opt_video_codec(o, "c:v", "mpeg1video");
4250 opt_audio_codec(o, "c:a", "mp2");
4251 parse_option(o, "f", "vcd", options);
4253 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
4254 parse_option(o, "r", frame_rates[norm], options);
4255 opt_default("g", norm == PAL ? "15" : "18");
4257 opt_default("b", "1150000");
4258 opt_default("maxrate", "1150000");
4259 opt_default("minrate", "1150000");
4260 opt_default("bufsize", "327680"); // 40*1024*8;
4262 opt_default("b:a", "224000");
4263 parse_option(o, "ar", "44100", options);
4264 parse_option(o, "ac", "2", options);
4266 opt_default("packetsize", "2324");
4267 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4269 /* We have to offset the PTS, so that it is consistent with the SCR.
4270 SCR starts at 36000, but the first two packs contain only padding
4271 and the first pack from the other stream, respectively, may also have
4272 been written before.
4273 So the real data starts at SCR 36000+3*1200. */
4274 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
4275 } else if (!strcmp(arg, "svcd")) {
4277 opt_video_codec(o, "c:v", "mpeg2video");
4278 opt_audio_codec(o, "c:a", "mp2");
4279 parse_option(o, "f", "svcd", options);
4281 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
4282 parse_option(o, "r", frame_rates[norm], options);
4283 opt_default("g", norm == PAL ? "15" : "18");
4285 opt_default("b", "2040000");
4286 opt_default("maxrate", "2516000");
4287 opt_default("minrate", "0"); // 1145000;
4288 opt_default("bufsize", "1835008"); // 224*1024*8;
4289 opt_default("flags", "+scan_offset");
4292 opt_default("b:a", "224000");
4293 parse_option(o, "ar", "44100", options);
4295 opt_default("packetsize", "2324");
4297 } else if (!strcmp(arg, "dvd")) {
4299 opt_video_codec(o, "c:v", "mpeg2video");
4300 opt_audio_codec(o, "c:a", "ac3");
4301 parse_option(o, "f", "dvd", options);
4303 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4304 parse_option(o, "r", frame_rates[norm], options);
4305 opt_default("g", norm == PAL ? "15" : "18");
4307 opt_default("b", "6000000");
4308 opt_default("maxrate", "9000000");
4309 opt_default("minrate", "0"); // 1500000;
4310 opt_default("bufsize", "1835008"); // 224*1024*8;
4312 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4313 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4315 opt_default("b:a", "448000");
4316 parse_option(o, "ar", "48000", options);
4318 } else if (!strncmp(arg, "dv", 2)) {
4320 parse_option(o, "f", "dv", options);
4322 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4323 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4324 norm == PAL ? "yuv420p" : "yuv411p", options);
4325 parse_option(o, "r", frame_rates[norm], options);
4327 parse_option(o, "ar", "48000", options);
4328 parse_option(o, "ac", "2", options);
4331 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
4332 return AVERROR(EINVAL);
4337 static int opt_vstats_file(const char *opt, const char *arg)
4339 av_free (vstats_filename);
4340 vstats_filename = av_strdup (arg);
4344 static int opt_vstats(const char *opt, const char *arg)
4347 time_t today2 = time(NULL);
4348 struct tm *today = localtime(&today2);
4350 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4352 return opt_vstats_file(opt, filename);
4355 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4357 return parse_option(o, "frames:v", arg, options);
4360 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4362 return parse_option(o, "frames:a", arg, options);
4365 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4367 return parse_option(o, "frames:d", arg, options);
4370 static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg)
4372 return parse_option(o, "tag:v", arg, options);
4375 static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg)
4377 return parse_option(o, "tag:a", arg, options);
4380 static int opt_subtitle_tag(OptionsContext *o, const char *opt, const char *arg)
4382 return parse_option(o, "tag:s", arg, options);
4385 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4387 return parse_option(o, "filter:v", arg, options);
4390 static int opt_vsync(const char *opt, const char *arg)
4392 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
4393 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
4394 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
4396 if (video_sync_method == VSYNC_AUTO)
4397 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
4401 static int opt_deinterlace(const char *opt, const char *arg)
4403 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
4408 static int opt_cpuflags(const char *opt, const char *arg)
4410 #define CPUFLAG_MMX2 (AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMX2)
4411 #define CPUFLAG_3DNOW (AV_CPU_FLAG_3DNOW | AV_CPU_FLAG_MMX)
4412 #define CPUFLAG_3DNOWEXT (AV_CPU_FLAG_3DNOWEXT | CPUFLAG_3DNOW)
4413 #define CPUFLAG_SSE (AV_CPU_FLAG_SSE | CPUFLAG_MMX2)
4414 #define CPUFLAG_SSE2 (AV_CPU_FLAG_SSE2 | CPUFLAG_SSE)
4415 #define CPUFLAG_SSE2SLOW (AV_CPU_FLAG_SSE2SLOW | CPUFLAG_SSE2)
4416 #define CPUFLAG_SSE3 (AV_CPU_FLAG_SSE3 | CPUFLAG_SSE2)
4417 #define CPUFLAG_SSE3SLOW (AV_CPU_FLAG_SSE3SLOW | CPUFLAG_SSE3)
4418 #define CPUFLAG_SSSE3 (AV_CPU_FLAG_SSSE3 | CPUFLAG_SSE3)
4419 #define CPUFLAG_SSE4 (AV_CPU_FLAG_SSE4 | CPUFLAG_SSSE3)
4420 #define CPUFLAG_SSE42 (AV_CPU_FLAG_SSE42 | CPUFLAG_SSE4)
4421 #define CPUFLAG_AVX (AV_CPU_FLAG_AVX | CPUFLAG_SSE42)
4422 #define CPUFLAG_XOP (AV_CPU_FLAG_XOP | CPUFLAG_AVX)
4423 #define CPUFLAG_FMA4 (AV_CPU_FLAG_FMA4 | CPUFLAG_AVX)
4424 static const AVOption cpuflags_opts[] = {
4425 { "flags" , NULL, 0, AV_OPT_TYPE_FLAGS, { 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
4426 { "altivec" , NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_ALTIVEC }, .unit = "flags" },
4427 { "mmx" , NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_MMX }, .unit = "flags" },
4428 { "mmx2" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_MMX2 }, .unit = "flags" },
4429 { "sse" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE }, .unit = "flags" },
4430 { "sse2" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE2 }, .unit = "flags" },
4431 { "sse2slow", NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE2SLOW }, .unit = "flags" },
4432 { "sse3" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE3 }, .unit = "flags" },
4433 { "sse3slow", NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE3SLOW }, .unit = "flags" },
4434 { "ssse3" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSSE3 }, .unit = "flags" },
4435 { "atom" , NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_ATOM }, .unit = "flags" },
4436 { "sse4.1" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE4 }, .unit = "flags" },
4437 { "sse4.2" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE42 }, .unit = "flags" },
4438 { "avx" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_AVX }, .unit = "flags" },
4439 { "xop" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_XOP }, .unit = "flags" },
4440 { "fma4" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_FMA4 }, .unit = "flags" },
4441 { "3dnow" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_3DNOW }, .unit = "flags" },
4442 { "3dnowext", NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_3DNOWEXT }, .unit = "flags" },
4445 static const AVClass class = {
4446 .class_name = "cpuflags",
4447 .item_name = av_default_item_name,
4448 .option = cpuflags_opts,
4449 .version = LIBAVUTIL_VERSION_INT,
4453 const AVClass *pclass = &class;
4455 if ((ret = av_opt_eval_flags(&pclass, &cpuflags_opts[0], arg, &flags)) < 0)
4458 av_set_cpu_flags_mask(flags);
4462 static void parse_cpuflags(int argc, char **argv, const OptionDef *options)
4464 int idx = locate_option(argc, argv, options, "cpuflags");
4465 if (idx && argv[idx + 1])
4466 opt_cpuflags("cpuflags", argv[idx + 1]);
4469 #define OFFSET(x) offsetof(OptionsContext, x)
4470 static const OptionDef options[] = {
4472 #include "cmdutils_common_opts.h"
4473 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4474 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4475 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4476 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4477 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4478 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
4479 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
4480 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
4481 "outfile[,metadata]:infile[,metadata]" },
4482 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4483 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4484 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4485 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4486 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4487 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4488 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4489 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4490 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4491 "add timings for benchmarking" },
4492 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4493 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4494 "dump each input packet" },
4495 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4496 "when dumping packets, also dump the payload" },
4497 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4498 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4499 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
4500 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4501 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4502 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4503 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4504 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4505 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4506 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4507 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
4508 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4509 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4510 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4511 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4513 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4515 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
4516 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
4517 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
4518 { "cpuflags", HAS_ARG | OPT_EXPERT, {(void*)opt_cpuflags}, "set CPU flags mask", "mask" },
4521 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4522 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4523 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4524 { "aspect", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_aspect_ratios)}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4525 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4526 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4527 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4528 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4529 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4530 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4531 "use same quantizer as source (implies VBR)" },
4532 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4533 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4534 { "deinterlace", OPT_EXPERT | OPT_VIDEO, {(void*)opt_deinterlace},
4535 "this option is deprecated, use the yadif filter instead" },
4536 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4537 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4539 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
4541 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
4542 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
4543 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
4544 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4545 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4546 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4547 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
4548 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4549 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(forced_key_frames)}, "force key frames at specified timestamps", "timestamps" },
4552 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4553 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
4554 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
4555 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
4556 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
4557 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4558 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4559 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4560 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
4562 /* subtitle options */
4563 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
4564 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4565 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4568 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4571 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4572 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4574 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4576 /* data codec support */
4577 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4579 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4583 int main(int argc, char **argv)
4585 OptionsContext o = { 0 };
4590 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4591 parse_loglevel(argc, argv, options);
4593 avcodec_register_all();
4595 avdevice_register_all();
4598 avfilter_register_all();
4601 avformat_network_init();
4605 parse_cpuflags(argc, argv, options);
4608 parse_options(&o, argc, argv, options, opt_output_file);
4610 if (nb_output_files <= 0 && nb_input_files == 0) {
4612 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4616 /* file converter / grab */
4617 if (nb_output_files <= 0) {
4618 fprintf(stderr, "At least one output file must be specified\n");
4622 if (nb_input_files == 0) {
4623 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
4628 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4630 ti = getutime() - ti;
4632 int maxrss = getmaxrss() / 1024;
4633 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);