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"
50 # include "libavfilter/avfilter.h"
51 # include "libavfilter/avfiltergraph.h"
52 # include "libavfilter/buffersrc.h"
53 # include "libavfilter/vsrc_buffer.h"
55 #if HAVE_SYS_RESOURCE_H
56 #include <sys/types.h>
58 #include <sys/resource.h>
59 #elif HAVE_GETPROCESSTIMES
62 #if HAVE_GETPROCESSMEMORYINFO
68 #include <sys/select.h>
75 #include "libavutil/avassert.h"
78 #define VSYNC_PASSTHROUGH 0
82 const char program_name[] = "avconv";
83 const int program_birth_year = 2000;
85 /* select an input stream for an output stream */
86 typedef struct StreamMap {
87 int disabled; /** 1 is this mapping is disabled by a negative map */
91 int sync_stream_index;
95 * select an input file for an output file
97 typedef struct MetadataMap {
98 int file; ///< file index
99 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
100 int index; ///< stream/chapter/program number
103 static const OptionDef options[];
105 static int video_discard = 0;
106 static int same_quant = 0;
107 static int do_deinterlace = 0;
108 static int intra_dc_precision = 8;
109 static int qp_hist = 0;
111 static int file_overwrite = 0;
112 static int do_benchmark = 0;
113 static int do_hex_dump = 0;
114 static int do_pkt_dump = 0;
115 static int do_pass = 0;
116 static char *pass_logfilename_prefix = NULL;
117 static int video_sync_method = VSYNC_AUTO;
118 static int audio_sync_method = 0;
119 static float audio_drift_threshold = 0.1;
120 static int copy_ts = 0;
121 static int copy_tb = 1;
122 static int opt_shortest = 0;
123 static char *vstats_filename;
124 static FILE *vstats_file;
126 static int audio_volume = 256;
128 static int exit_on_error = 0;
129 static int using_stdin = 0;
130 static int64_t video_size = 0;
131 static int64_t audio_size = 0;
132 static int64_t extra_size = 0;
133 static int nb_frames_dup = 0;
134 static int nb_frames_drop = 0;
135 static int input_sync;
137 static float dts_delta_threshold = 10;
139 static int print_stats = 1;
141 static uint8_t *audio_buf;
142 static unsigned int allocated_audio_buf_size;
143 static uint8_t *async_buf;
144 static unsigned int allocated_async_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;
221 int resample_pix_fmt;
222 AVRational frame_rate;
226 float frame_aspect_ratio;
228 /* forced key frames */
229 int64_t *forced_kf_pts;
235 ReSampleContext *resample; /* for audio resampling */
236 int resample_sample_fmt;
237 int resample_channels;
238 int resample_sample_rate;
240 AVAudioConvert *reformat_ctx;
241 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
244 AVFilterContext *output_video_filter;
245 AVFilterContext *input_video_filter;
246 AVFilterBufferRef *picref;
248 AVFilterGraph *graph;
252 int is_past_recording_time;
254 const char *attachment_filename;
255 int copy_initial_nonkeyframes;
259 typedef struct OutputFile {
260 AVFormatContext *ctx;
262 int ost_index; /* index of the first stream in output_streams */
263 int64_t recording_time; /* desired length of the resulting file in microseconds */
264 int64_t start_time; /* start time in microseconds */
265 uint64_t limit_filesize;
268 static InputStream *input_streams = NULL;
269 static int nb_input_streams = 0;
270 static InputFile *input_files = NULL;
271 static int nb_input_files = 0;
273 static OutputStream *output_streams = NULL;
274 static int nb_output_streams = 0;
275 static OutputFile *output_files = NULL;
276 static int nb_output_files = 0;
278 typedef struct OptionsContext {
279 /* input/output options */
283 SpecifierOpt *codec_names;
285 SpecifierOpt *audio_channels;
286 int nb_audio_channels;
287 SpecifierOpt *audio_sample_rate;
288 int nb_audio_sample_rate;
289 SpecifierOpt *frame_rates;
291 SpecifierOpt *frame_sizes;
293 SpecifierOpt *frame_pix_fmts;
294 int nb_frame_pix_fmts;
297 int64_t input_ts_offset;
300 SpecifierOpt *ts_scale;
302 SpecifierOpt *dump_attachment;
303 int nb_dump_attachment;
306 StreamMap *stream_maps;
308 /* first item specifies output metadata, second is input */
309 MetadataMap (*meta_data_maps)[2];
310 int nb_meta_data_maps;
311 int metadata_global_manual;
312 int metadata_streams_manual;
313 int metadata_chapters_manual;
314 const char **attachments;
317 int chapters_input_file;
319 int64_t recording_time;
320 uint64_t limit_filesize;
326 int subtitle_disable;
329 /* indexed by output file stream index */
333 SpecifierOpt *metadata;
335 SpecifierOpt *max_frames;
337 SpecifierOpt *bitstream_filters;
338 int nb_bitstream_filters;
339 SpecifierOpt *codec_tags;
341 SpecifierOpt *sample_fmts;
343 SpecifierOpt *qscale;
345 SpecifierOpt *forced_key_frames;
346 int nb_forced_key_frames;
347 SpecifierOpt *force_fps;
349 SpecifierOpt *frame_aspect_ratios;
350 int nb_frame_aspect_ratios;
351 SpecifierOpt *rc_overrides;
353 SpecifierOpt *intra_matrices;
354 int nb_intra_matrices;
355 SpecifierOpt *inter_matrices;
356 int nb_inter_matrices;
357 SpecifierOpt *top_field_first;
358 int nb_top_field_first;
359 SpecifierOpt *metadata_map;
361 SpecifierOpt *presets;
363 SpecifierOpt *copy_initial_nonkeyframes;
364 int nb_copy_initial_nonkeyframes;
365 SpecifierOpt *filters;
369 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
372 for (i = 0; i < o->nb_ ## name; i++) {\
373 char *spec = o->name[i].specifier;\
374 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
375 outvar = o->name[i].u.type;\
381 static void reset_options(OptionsContext *o)
383 const OptionDef *po = options;
385 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
387 void *dst = (uint8_t*)o + po->u.off;
389 if (po->flags & OPT_SPEC) {
390 SpecifierOpt **so = dst;
391 int i, *count = (int*)(so + 1);
392 for (i = 0; i < *count; i++) {
393 av_freep(&(*so)[i].specifier);
394 if (po->flags & OPT_STRING)
395 av_freep(&(*so)[i].u.str);
399 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
404 av_freep(&o->stream_maps);
405 av_freep(&o->meta_data_maps);
406 av_freep(&o->streamid_map);
408 memset(o, 0, sizeof(*o));
410 o->mux_max_delay = 0.7;
411 o->recording_time = INT64_MAX;
412 o->limit_filesize = UINT64_MAX;
413 o->chapters_input_file = INT_MAX;
419 static int alloc_buffer(InputStream *ist, AVCodecContext *s, FrameBuffer **pbuf)
421 FrameBuffer *buf = av_mallocz(sizeof(*buf));
423 const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1;
424 int h_chroma_shift, v_chroma_shift;
425 int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
426 int w = s->width, h = s->height;
429 return AVERROR(ENOMEM);
431 if (!(s->flags & CODEC_FLAG_EMU_EDGE)) {
436 avcodec_align_dimensions(s, &w, &h);
437 if ((ret = av_image_alloc(buf->base, buf->linesize, w, h,
438 s->pix_fmt, 32)) < 0) {
442 /* XXX this shouldn't be needed, but some tests break without this line
443 * those decoders are buggy and need to be fixed.
444 * the following tests fail:
445 * cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
447 memset(buf->base[0], 128, ret);
449 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
450 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
451 const int h_shift = i==0 ? 0 : h_chroma_shift;
452 const int v_shift = i==0 ? 0 : v_chroma_shift;
453 if (s->flags & CODEC_FLAG_EMU_EDGE)
454 buf->data[i] = buf->base[i];
456 buf->data[i] = buf->base[i] +
457 FFALIGN((buf->linesize[i]*edge >> v_shift) +
458 (pixel_size*edge >> h_shift), 32);
462 buf->pix_fmt = s->pix_fmt;
469 static void free_buffer_pool(InputStream *ist)
471 FrameBuffer *buf = ist->buffer_pool;
473 ist->buffer_pool = buf->next;
474 av_freep(&buf->base[0]);
476 buf = ist->buffer_pool;
480 static void unref_buffer(InputStream *ist, FrameBuffer *buf)
482 av_assert0(buf->refcount);
484 if (!buf->refcount) {
485 buf->next = ist->buffer_pool;
486 ist->buffer_pool = buf;
490 static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
492 InputStream *ist = s->opaque;
496 if (!ist->buffer_pool && (ret = alloc_buffer(ist, s, &ist->buffer_pool)) < 0)
499 buf = ist->buffer_pool;
500 ist->buffer_pool = buf->next;
502 if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) {
503 av_freep(&buf->base[0]);
505 if ((ret = alloc_buffer(ist, s, &buf)) < 0)
511 frame->type = FF_BUFFER_TYPE_USER;
512 frame->extended_data = frame->data;
513 frame->pkt_pts = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE;
514 frame->width = buf->w;
515 frame->height = buf->h;
516 frame->format = buf->pix_fmt;
517 frame->sample_aspect_ratio = s->sample_aspect_ratio;
519 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
520 frame->base[i] = buf->base[i]; // XXX h264.c uses base though it shouldn't
521 frame->data[i] = buf->data[i];
522 frame->linesize[i] = buf->linesize[i];
528 static void codec_release_buffer(AVCodecContext *s, AVFrame *frame)
530 InputStream *ist = s->opaque;
531 FrameBuffer *buf = frame->opaque;
534 for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++)
535 frame->data[i] = NULL;
537 unref_buffer(ist, buf);
540 static void filter_release_buffer(AVFilterBuffer *fb)
542 FrameBuffer *buf = fb->priv;
544 unref_buffer(buf->ist, buf);
547 static int configure_video_filters(InputStream *ist, OutputStream *ost)
549 AVFilterContext *last_filter, *filter;
550 /** filter graph containing all filters including input & output */
551 AVCodecContext *codec = ost->st->codec;
552 AVCodecContext *icodec = ist->st->codec;
553 SinkContext sink_ctx = { .pix_fmt = codec->pix_fmt };
554 AVRational sample_aspect_ratio;
558 ost->graph = avfilter_graph_alloc();
560 if (ist->st->sample_aspect_ratio.num) {
561 sample_aspect_ratio = ist->st->sample_aspect_ratio;
563 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
565 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
566 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
567 sample_aspect_ratio.num, sample_aspect_ratio.den);
569 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
570 "src", args, NULL, ost->graph);
573 ret = avfilter_graph_create_filter(&ost->output_video_filter, &sink,
574 "out", NULL, &sink_ctx, ost->graph);
577 last_filter = ost->input_video_filter;
579 if (codec->width != icodec->width || codec->height != icodec->height) {
580 snprintf(args, 255, "%d:%d:flags=0x%X",
583 (unsigned)ost->sws_flags);
584 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
585 NULL, args, NULL, ost->graph)) < 0)
587 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
589 last_filter = filter;
592 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
593 ost->graph->scale_sws_opts = av_strdup(args);
596 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
597 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
599 outputs->name = av_strdup("in");
600 outputs->filter_ctx = last_filter;
601 outputs->pad_idx = 0;
602 outputs->next = NULL;
604 inputs->name = av_strdup("out");
605 inputs->filter_ctx = ost->output_video_filter;
609 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
612 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
616 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
619 codec->width = ost->output_video_filter->inputs[0]->w;
620 codec->height = ost->output_video_filter->inputs[0]->h;
621 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
622 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
623 av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
624 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
629 static void term_exit(void)
631 av_log(NULL, AV_LOG_QUIET, "");
634 static volatile int received_sigterm = 0;
635 static volatile int received_nb_signals = 0;
638 sigterm_handler(int sig)
640 received_sigterm = sig;
641 received_nb_signals++;
645 static void term_init(void)
647 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
648 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
650 signal(SIGXCPU, sigterm_handler);
654 static int decode_interrupt_cb(void *ctx)
656 return received_nb_signals > 1;
659 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
661 void exit_program(int ret)
666 for (i = 0; i < nb_output_files; i++) {
667 AVFormatContext *s = output_files[i].ctx;
668 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
670 avformat_free_context(s);
671 av_dict_free(&output_files[i].opts);
673 for (i = 0; i < nb_output_streams; i++) {
674 AVBitStreamFilterContext *bsfc = output_streams[i].bitstream_filters;
676 AVBitStreamFilterContext *next = bsfc->next;
677 av_bitstream_filter_close(bsfc);
680 output_streams[i].bitstream_filters = NULL;
682 if (output_streams[i].output_frame) {
683 AVFrame *frame = output_streams[i].output_frame;
684 if (frame->extended_data != frame->data)
685 av_freep(&frame->extended_data);
689 av_freep(&output_streams[i].avfilter);
691 for (i = 0; i < nb_input_files; i++) {
692 avformat_close_input(&input_files[i].ctx);
694 for (i = 0; i < nb_input_streams; i++) {
695 av_freep(&input_streams[i].decoded_frame);
696 av_freep(&input_streams[i].filtered_frame);
697 av_dict_free(&input_streams[i].opts);
698 free_buffer_pool(&input_streams[i]);
703 av_free(vstats_filename);
705 av_freep(&input_streams);
706 av_freep(&input_files);
707 av_freep(&output_streams);
708 av_freep(&output_files);
712 allocated_audio_buf_size = 0;
714 allocated_async_buf_size = 0;
717 avformat_network_deinit();
719 if (received_sigterm) {
720 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
721 (int) received_sigterm);
728 static void assert_avoptions(AVDictionary *m)
730 AVDictionaryEntry *t;
731 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
732 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
737 static void assert_codec_experimental(AVCodecContext *c, int encoder)
739 const char *codec_string = encoder ? "encoder" : "decoder";
741 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
742 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
743 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
744 "results.\nAdd '-strict experimental' if you want to use it.\n",
745 codec_string, c->codec->name);
746 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
747 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
748 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
749 codec_string, codec->name);
754 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
756 if (codec && codec->sample_fmts) {
757 const enum AVSampleFormat *p = codec->sample_fmts;
758 for (; *p != -1; p++) {
759 if (*p == st->codec->sample_fmt)
763 av_log(NULL, AV_LOG_WARNING,
764 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
765 av_get_sample_fmt_name(st->codec->sample_fmt),
767 av_get_sample_fmt_name(codec->sample_fmts[0]));
768 st->codec->sample_fmt = codec->sample_fmts[0];
774 * Update the requested input sample format based on the output sample format.
775 * This is currently only used to request float output from decoders which
776 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
777 * Ideally this will be removed in the future when decoders do not do format
778 * conversion and only output in their native format.
780 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
783 /* if sample formats match or a decoder sample format has already been
784 requested, just return */
785 if (enc->sample_fmt == dec->sample_fmt ||
786 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
789 /* if decoder supports more than one output format */
790 if (dec_codec && dec_codec->sample_fmts &&
791 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
792 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
793 const enum AVSampleFormat *p;
794 int min_dec = -1, min_inc = -1;
796 /* find a matching sample format in the encoder */
797 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
798 if (*p == enc->sample_fmt) {
799 dec->request_sample_fmt = *p;
801 } else if (*p > enc->sample_fmt) {
802 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
804 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
807 /* if none match, provide the one that matches quality closest */
808 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
809 enc->sample_fmt - min_dec;
813 static void choose_sample_rate(AVStream *st, AVCodec *codec)
815 if (codec && codec->supported_samplerates) {
816 const int *p = codec->supported_samplerates;
818 int best_dist = INT_MAX;
820 int dist = abs(st->codec->sample_rate - *p);
821 if (dist < best_dist) {
827 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
829 st->codec->sample_rate = best;
833 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
835 if (codec && codec->pix_fmts) {
836 const enum PixelFormat *p = codec->pix_fmts;
837 if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
838 if (st->codec->codec_id == CODEC_ID_MJPEG) {
839 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
840 } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
841 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
842 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
845 for (; *p != PIX_FMT_NONE; p++) {
846 if (*p == st->codec->pix_fmt)
849 if (*p == PIX_FMT_NONE) {
850 if (st->codec->pix_fmt != PIX_FMT_NONE)
851 av_log(NULL, AV_LOG_WARNING,
852 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
853 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
855 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
856 st->codec->pix_fmt = codec->pix_fmts[0];
862 get_sync_ipts(const OutputStream *ost, int64_t pts)
864 OutputFile *of = &output_files[ost->file_index];
865 return (double)(pts - of->start_time) / AV_TIME_BASE;
868 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
870 AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
871 AVCodecContext *avctx = ost->st->codec;
875 * Audio encoders may split the packets -- #frames in != #packets out.
876 * But there is no reordering, so we can limit the number of output packets
877 * by simply dropping them here.
878 * Counting encoded video frames needs to be done separately because of
879 * reordering, see do_video_out()
881 if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) {
882 if (ost->frame_number >= ost->max_frames) {
890 AVPacket new_pkt = *pkt;
891 int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
892 &new_pkt.data, &new_pkt.size,
893 pkt->data, pkt->size,
894 pkt->flags & AV_PKT_FLAG_KEY);
897 new_pkt.destruct = av_destruct_packet;
899 av_log(NULL, AV_LOG_ERROR, "%s failed for stream %d, codec %s",
900 bsfc->filter->name, pkt->stream_index,
901 avctx->codec ? avctx->codec->name : "copy");
911 pkt->stream_index = ost->index;
912 ret = av_interleaved_write_frame(s, pkt);
914 print_error("av_interleaved_write_frame()", ret);
919 static int check_recording_time(OutputStream *ost)
921 OutputFile *of = &output_files[ost->file_index];
923 if (of->recording_time != INT64_MAX &&
924 av_compare_ts(ost->sync_opts - ost->first_pts, ost->st->codec->time_base, of->recording_time,
925 AV_TIME_BASE_Q) >= 0) {
926 ost->is_past_recording_time = 1;
932 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
934 int fill_char = 0x00;
935 if (sample_fmt == AV_SAMPLE_FMT_U8)
937 memset(buf, fill_char, size);
940 static int encode_audio_frame(AVFormatContext *s, OutputStream *ost,
941 const uint8_t *buf, int buf_size)
943 AVCodecContext *enc = ost->st->codec;
944 AVFrame *frame = NULL;
948 av_init_packet(&pkt);
953 if (!ost->output_frame) {
954 ost->output_frame = avcodec_alloc_frame();
955 if (!ost->output_frame) {
956 av_log(NULL, AV_LOG_FATAL, "out-of-memory in encode_audio_frame()\n");
960 frame = ost->output_frame;
961 if (frame->extended_data != frame->data)
962 av_freep(&frame->extended_data);
963 avcodec_get_frame_defaults(frame);
965 frame->nb_samples = buf_size /
966 (enc->channels * av_get_bytes_per_sample(enc->sample_fmt));
967 if ((ret = avcodec_fill_audio_frame(frame, enc->channels, enc->sample_fmt,
968 buf, buf_size, 1)) < 0) {
969 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
973 if (!check_recording_time(ost))
976 frame->pts = ost->sync_opts;
977 ost->sync_opts += frame->nb_samples;
981 if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
982 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
987 if (pkt.pts != AV_NOPTS_VALUE)
988 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
989 if (pkt.dts != AV_NOPTS_VALUE)
990 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
991 if (pkt.duration > 0)
992 pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
994 write_frame(s, &pkt, ost);
996 audio_size += pkt.size;
1002 static int alloc_audio_output_buf(AVCodecContext *dec, AVCodecContext *enc,
1005 int64_t audio_buf_samples;
1008 /* calculate required number of samples to allocate */
1009 audio_buf_samples = ((int64_t)nb_samples * enc->sample_rate + dec->sample_rate) /
1011 audio_buf_samples = 4 * audio_buf_samples + 16; // safety factors for resampling
1012 audio_buf_samples = FFMAX(audio_buf_samples, enc->frame_size);
1013 if (audio_buf_samples > INT_MAX)
1014 return AVERROR(EINVAL);
1016 audio_buf_size = av_samples_get_buffer_size(NULL, enc->channels,
1018 enc->sample_fmt, 32);
1019 if (audio_buf_size < 0)
1020 return audio_buf_size;
1022 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
1024 return AVERROR(ENOMEM);
1029 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
1030 InputStream *ist, AVFrame *decoded_frame)
1034 int size_out, frame_bytes, resample_changed;
1035 AVCodecContext *enc = ost->st->codec;
1036 AVCodecContext *dec = ist->st->codec;
1037 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1038 int isize = av_get_bytes_per_sample(dec->sample_fmt);
1039 uint8_t *buf = decoded_frame->data[0];
1040 int size = decoded_frame->nb_samples * dec->channels * isize;
1042 if (alloc_audio_output_buf(dec, enc, decoded_frame->nb_samples) < 0) {
1043 av_log(NULL, AV_LOG_FATAL, "Error allocating audio buffer\n");
1047 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
1048 ost->audio_resample = 1;
1050 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
1051 ost->resample_channels != dec->channels ||
1052 ost->resample_sample_rate != dec->sample_rate;
1054 if ((ost->audio_resample && !ost->resample) || resample_changed) {
1055 if (resample_changed) {
1056 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",
1057 ist->file_index, ist->st->index,
1058 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
1059 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
1060 ost->resample_sample_fmt = dec->sample_fmt;
1061 ost->resample_channels = dec->channels;
1062 ost->resample_sample_rate = dec->sample_rate;
1064 audio_resample_close(ost->resample);
1066 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
1067 if (audio_sync_method <= 1 &&
1068 ost->resample_sample_fmt == enc->sample_fmt &&
1069 ost->resample_channels == enc->channels &&
1070 ost->resample_sample_rate == enc->sample_rate) {
1071 ost->resample = NULL;
1072 ost->audio_resample = 0;
1073 } else if (ost->audio_resample) {
1074 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
1075 av_log(NULL, AV_LOG_WARNING, "Using s16 intermediate sample format for resampling\n");
1076 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
1077 enc->sample_rate, dec->sample_rate,
1078 enc->sample_fmt, dec->sample_fmt,
1080 if (!ost->resample) {
1081 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
1082 dec->channels, dec->sample_rate,
1083 enc->channels, enc->sample_rate);
1089 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
1090 if (!ost->audio_resample && dec->sample_fmt != enc->sample_fmt &&
1091 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt) != ost->reformat_pair) {
1092 if (ost->reformat_ctx)
1093 av_audio_convert_free(ost->reformat_ctx);
1094 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
1095 dec->sample_fmt, 1, NULL, 0);
1096 if (!ost->reformat_ctx) {
1097 av_log(NULL, AV_LOG_FATAL, "Cannot convert %s sample format to %s sample format\n",
1098 av_get_sample_fmt_name(dec->sample_fmt),
1099 av_get_sample_fmt_name(enc->sample_fmt));
1102 ost->reformat_pair = MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
1105 if (audio_sync_method) {
1106 double delta = get_sync_ipts(ost, ist->last_dts) * enc->sample_rate - ost->sync_opts -
1107 av_fifo_size(ost->fifo) / (enc->channels * osize);
1108 int idelta = delta * dec->sample_rate / enc->sample_rate;
1109 int byte_delta = idelta * isize * dec->channels;
1111 // FIXME resample delay
1112 if (fabs(delta) > 50) {
1113 if (ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate) {
1114 if (byte_delta < 0) {
1115 byte_delta = FFMAX(byte_delta, -size);
1118 av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n",
1119 -byte_delta / (isize * dec->channels));
1124 av_fast_malloc(&async_buf, &allocated_async_buf_size,
1127 av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
1131 if (alloc_audio_output_buf(dec, enc, decoded_frame->nb_samples + idelta) < 0) {
1132 av_log(NULL, AV_LOG_FATAL, "Error allocating audio buffer\n");
1137 generate_silence(async_buf, dec->sample_fmt, byte_delta);
1138 memcpy(async_buf + byte_delta, buf, size);
1141 av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
1143 } else if (audio_sync_method > 1) {
1144 int comp = av_clip(delta, -audio_sync_method, audio_sync_method);
1145 av_assert0(ost->audio_resample);
1146 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
1147 delta, comp, enc->sample_rate);
1148 // 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));
1149 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
1153 ost->sync_opts = lrintf(get_sync_ipts(ost, ist->last_dts) * enc->sample_rate) -
1154 av_fifo_size(ost->fifo) / (enc->channels * osize); // FIXME wrong
1156 if (ost->audio_resample) {
1158 size_out = audio_resample(ost->resample,
1159 (short *)buftmp, (short *)buf,
1160 size / (dec->channels * isize));
1161 size_out = size_out * enc->channels * osize;
1167 if (!ost->audio_resample && dec->sample_fmt != enc->sample_fmt) {
1168 const void *ibuf[6] = { buftmp };
1169 void *obuf[6] = { audio_buf };
1170 int istride[6] = { isize };
1171 int ostride[6] = { osize };
1172 int len = size_out / istride[0];
1173 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len) < 0) {
1174 printf("av_audio_convert() failed\n");
1180 size_out = len * osize;
1183 /* now encode as many frames as possible */
1184 if (!(enc->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)) {
1185 /* output resampled raw samples */
1186 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
1187 av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
1190 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
1192 frame_bytes = enc->frame_size * osize * enc->channels;
1194 while (av_fifo_size(ost->fifo) >= frame_bytes) {
1195 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
1196 encode_audio_frame(s, ost, audio_buf, frame_bytes);
1199 encode_audio_frame(s, ost, buftmp, size_out);
1203 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1205 AVCodecContext *dec;
1206 AVPicture *picture2;
1207 AVPicture picture_tmp;
1210 dec = ist->st->codec;
1212 /* deinterlace : must be done before any resize */
1213 if (do_deinterlace) {
1216 /* create temporary picture */
1217 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1218 buf = av_malloc(size);
1222 picture2 = &picture_tmp;
1223 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1225 if (avpicture_deinterlace(picture2, picture,
1226 dec->pix_fmt, dec->width, dec->height) < 0) {
1227 /* if error, do not deinterlace */
1228 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1237 if (picture != picture2)
1238 *picture = *picture2;
1242 static void do_subtitle_out(AVFormatContext *s,
1248 static uint8_t *subtitle_out = NULL;
1249 int subtitle_out_max_size = 1024 * 1024;
1250 int subtitle_out_size, nb, i;
1251 AVCodecContext *enc;
1254 if (pts == AV_NOPTS_VALUE) {
1255 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1261 enc = ost->st->codec;
1263 if (!subtitle_out) {
1264 subtitle_out = av_malloc(subtitle_out_max_size);
1267 /* Note: DVB subtitle need one packet to draw them and one other
1268 packet to clear them */
1269 /* XXX: signal it in the codec context ? */
1270 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1275 for (i = 0; i < nb; i++) {
1276 ost->sync_opts = av_rescale_q(pts, ist->st->time_base, enc->time_base);
1277 if (!check_recording_time(ost))
1280 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1281 // start_display_time is required to be 0
1282 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1283 sub->end_display_time -= sub->start_display_time;
1284 sub->start_display_time = 0;
1285 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1286 subtitle_out_max_size, sub);
1287 if (subtitle_out_size < 0) {
1288 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1292 av_init_packet(&pkt);
1293 pkt.data = subtitle_out;
1294 pkt.size = subtitle_out_size;
1295 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1296 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1297 /* XXX: the pts correction is handled here. Maybe handling
1298 it in the codec would be better */
1300 pkt.pts += 90 * sub->start_display_time;
1302 pkt.pts += 90 * sub->end_display_time;
1304 write_frame(s, &pkt, ost);
1308 static void do_video_out(AVFormatContext *s,
1310 AVFrame *in_picture,
1311 int *frame_size, float quality)
1313 int nb_frames, i, ret, format_video_sync;
1314 AVCodecContext *enc;
1315 double sync_ipts, delta;
1317 enc = ost->st->codec;
1319 sync_ipts = get_sync_ipts(ost, in_picture->pts) / av_q2d(enc->time_base);
1320 delta = sync_ipts - ost->sync_opts;
1322 /* by default, we output a single frame */
1327 format_video_sync = video_sync_method;
1328 if (format_video_sync == VSYNC_AUTO)
1329 format_video_sync = (s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH :
1330 (s->oformat->flags & AVFMT_VARIABLE_FPS) ? VSYNC_VFR : VSYNC_CFR;
1332 switch (format_video_sync) {
1334 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1337 else if (delta > 1.1)
1338 nb_frames = lrintf(delta);
1343 else if (delta > 0.6)
1344 ost->sync_opts = lrintf(sync_ipts);
1346 case VSYNC_PASSTHROUGH:
1347 ost->sync_opts = lrintf(sync_ipts);
1353 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1354 if (nb_frames == 0) {
1356 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1358 } else if (nb_frames > 1) {
1359 nb_frames_dup += nb_frames - 1;
1360 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1363 if (!ost->frame_number)
1364 ost->first_pts = ost->sync_opts;
1366 /* duplicates frame if needed */
1367 for (i = 0; i < nb_frames; i++) {
1369 av_init_packet(&pkt);
1373 if (!check_recording_time(ost))
1376 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1377 enc->codec->id == CODEC_ID_RAWVIDEO) {
1378 /* raw pictures are written as AVPicture structure to
1379 avoid any copies. We support temporarily the older
1381 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1382 enc->coded_frame->top_field_first = in_picture->top_field_first;
1383 pkt.data = (uint8_t *)in_picture;
1384 pkt.size = sizeof(AVPicture);
1385 pkt.pts = av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1386 pkt.flags |= AV_PKT_FLAG_KEY;
1388 write_frame(s, &pkt, ost);
1391 AVFrame big_picture;
1393 big_picture = *in_picture;
1394 /* better than nothing: use input picture interlaced
1396 big_picture.interlaced_frame = in_picture->interlaced_frame;
1397 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1398 if (ost->top_field_first == -1)
1399 big_picture.top_field_first = in_picture->top_field_first;
1401 big_picture.top_field_first = !!ost->top_field_first;
1404 /* handles same_quant here. This is not correct because it may
1405 not be a global option */
1406 big_picture.quality = quality;
1407 if (!enc->me_threshold)
1408 big_picture.pict_type = 0;
1409 big_picture.pts = ost->sync_opts;
1410 if (ost->forced_kf_index < ost->forced_kf_count &&
1411 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1412 big_picture.pict_type = AV_PICTURE_TYPE_I;
1413 ost->forced_kf_index++;
1415 ret = avcodec_encode_video2(enc, &pkt, &big_picture, &got_packet);
1417 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1422 if (pkt.pts != AV_NOPTS_VALUE)
1423 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1424 if (pkt.dts != AV_NOPTS_VALUE)
1425 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1427 write_frame(s, &pkt, ost);
1428 *frame_size = pkt.size;
1429 video_size += pkt.size;
1431 /* if two pass, output log */
1432 if (ost->logfile && enc->stats_out) {
1433 fprintf(ost->logfile, "%s", enc->stats_out);
1439 * For video, number of frames in == number of packets out.
1440 * But there may be reordering, so we can't throw away frames on encoder
1441 * flush, we need to limit them here, before they go into encoder.
1443 ost->frame_number++;
1447 static double psnr(double d)
1449 return -10.0 * log(d) / log(10.0);
1452 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1455 AVCodecContext *enc;
1457 double ti1, bitrate, avg_bitrate;
1459 /* this is executed just the first time do_video_stats is called */
1461 vstats_file = fopen(vstats_filename, "w");
1468 enc = ost->st->codec;
1469 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1470 frame_number = ost->frame_number;
1471 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1472 if (enc->flags&CODEC_FLAG_PSNR)
1473 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1475 fprintf(vstats_file,"f_size= %6d ", frame_size);
1476 /* compute pts value */
1477 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1481 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1482 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1483 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1484 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1485 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1489 static void print_report(OutputFile *output_files,
1490 OutputStream *ost_table, int nb_ostreams,
1491 int is_last_report, int64_t timer_start)
1495 AVFormatContext *oc;
1497 AVCodecContext *enc;
1498 int frame_number, vid, i;
1499 double bitrate, ti1, pts;
1500 static int64_t last_time = -1;
1501 static int qp_histogram[52];
1503 if (!print_stats && !is_last_report)
1506 if (!is_last_report) {
1508 /* display the report every 0.5 seconds */
1509 cur_time = av_gettime();
1510 if (last_time == -1) {
1511 last_time = cur_time;
1514 if ((cur_time - last_time) < 500000)
1516 last_time = cur_time;
1520 oc = output_files[0].ctx;
1522 total_size = avio_size(oc->pb);
1523 if (total_size < 0) // FIXME improve avio_size() so it works with non seekable output too
1524 total_size = avio_tell(oc->pb);
1529 for (i = 0; i < nb_ostreams; i++) {
1531 ost = &ost_table[i];
1532 enc = ost->st->codec;
1533 if (!ost->stream_copy && enc->coded_frame)
1534 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
1535 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1536 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1538 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1539 float t = (av_gettime() - timer_start) / 1000000.0;
1541 frame_number = ost->frame_number;
1542 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1543 frame_number, (t > 1) ? (int)(frame_number / t + 0.5) : 0, q);
1545 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1549 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
1551 for (j = 0; j < 32; j++)
1552 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
1554 if (enc->flags&CODEC_FLAG_PSNR) {
1556 double error, error_sum = 0;
1557 double scale, scale_sum = 0;
1558 char type[3] = { 'Y','U','V' };
1559 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1560 for (j = 0; j < 3; j++) {
1561 if (is_last_report) {
1562 error = enc->error[j];
1563 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
1565 error = enc->coded_frame->error[j];
1566 scale = enc->width * enc->height * 255.0 * 255.0;
1572 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error / scale));
1574 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
1578 /* compute min output value */
1579 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1580 if ((pts < ti1) && (pts > 0))
1586 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1588 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1589 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1590 (double)total_size / 1024, ti1, bitrate);
1592 if (nb_frames_dup || nb_frames_drop)
1593 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1594 nb_frames_dup, nb_frames_drop);
1596 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
1600 if (is_last_report) {
1601 int64_t raw= audio_size + video_size + extra_size;
1602 av_log(NULL, AV_LOG_INFO, "\n");
1603 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1604 video_size / 1024.0,
1605 audio_size / 1024.0,
1606 extra_size / 1024.0,
1607 100.0 * (total_size - raw) / raw
1612 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1616 for (i = 0; i < nb_ostreams; i++) {
1617 OutputStream *ost = &ost_table[i];
1618 AVCodecContext *enc = ost->st->codec;
1619 AVFormatContext *os = output_files[ost->file_index].ctx;
1620 int stop_encoding = 0;
1622 if (!ost->encoding_needed)
1625 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
1627 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
1632 int fifo_bytes, got_packet;
1633 av_init_packet(&pkt);
1637 switch (ost->st->codec->codec_type) {
1638 case AVMEDIA_TYPE_AUDIO:
1639 fifo_bytes = av_fifo_size(ost->fifo);
1640 if (fifo_bytes > 0) {
1641 /* encode any samples remaining in fifo */
1642 int frame_bytes = fifo_bytes;
1644 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1646 /* pad last frame with silence if needed */
1647 if (!(enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME)) {
1648 frame_bytes = enc->frame_size * enc->channels *
1649 av_get_bytes_per_sample(enc->sample_fmt);
1650 if (allocated_audio_buf_size < frame_bytes)
1652 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1654 encode_audio_frame(os, ost, audio_buf, frame_bytes);
1656 /* flush encoder with NULL frames until it is done
1657 returning packets */
1658 if (encode_audio_frame(os, ost, NULL, 0) == 0) {
1664 case AVMEDIA_TYPE_VIDEO:
1665 ret = avcodec_encode_video2(enc, &pkt, NULL, &got_packet);
1667 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1671 if (ost->logfile && enc->stats_out) {
1672 fprintf(ost->logfile, "%s", enc->stats_out);
1678 if (pkt.pts != AV_NOPTS_VALUE)
1679 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1680 if (pkt.dts != AV_NOPTS_VALUE)
1681 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1682 write_frame(os, &pkt, ost);
1694 * Check whether a packet from ist should be written into ost at this time
1696 static int check_output_constraints(InputStream *ist, OutputStream *ost)
1698 OutputFile *of = &output_files[ost->file_index];
1699 int ist_index = ist - input_streams;
1701 if (ost->source_index != ist_index)
1704 if (of->start_time && ist->last_dts < of->start_time)
1710 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
1712 OutputFile *of = &output_files[ost->file_index];
1713 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1716 av_init_packet(&opkt);
1718 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
1719 !ost->copy_initial_nonkeyframes)
1722 if (of->recording_time != INT64_MAX &&
1723 ist->last_dts >= of->recording_time + of->start_time) {
1724 ost->is_past_recording_time = 1;
1728 /* force the input stream PTS */
1729 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1730 audio_size += pkt->size;
1731 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1732 video_size += pkt->size;
1736 if (pkt->pts != AV_NOPTS_VALUE)
1737 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1739 opkt.pts = AV_NOPTS_VALUE;
1741 if (pkt->dts == AV_NOPTS_VALUE)
1742 opkt.dts = av_rescale_q(ist->last_dts, AV_TIME_BASE_Q, ost->st->time_base);
1744 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1745 opkt.dts -= ost_tb_start_time;
1747 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1748 opkt.flags = pkt->flags;
1750 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1751 if ( ost->st->codec->codec_id != CODEC_ID_H264
1752 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1753 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1754 && ost->st->codec->codec_id != CODEC_ID_VC1
1756 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
1757 opkt.destruct = av_destruct_packet;
1759 opkt.data = pkt->data;
1760 opkt.size = pkt->size;
1763 write_frame(of->ctx, &opkt, ost);
1764 ost->st->codec->frame_number++;
1765 av_free_packet(&opkt);
1768 static void rate_emu_sleep(InputStream *ist)
1770 if (input_files[ist->file_index].rate_emu) {
1771 int64_t pts = av_rescale(ist->last_dts, 1000000, AV_TIME_BASE);
1772 int64_t now = av_gettime() - ist->start;
1778 static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
1780 AVFrame *decoded_frame;
1781 AVCodecContext *avctx = ist->st->codec;
1782 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1785 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
1786 return AVERROR(ENOMEM);
1788 avcodec_get_frame_defaults(ist->decoded_frame);
1789 decoded_frame = ist->decoded_frame;
1791 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
1797 /* no audio frame */
1801 /* if the decoder provides a pts, use it instead of the last packet pts.
1802 the decoder could be delaying output by a packet or more. */
1803 if (decoded_frame->pts != AV_NOPTS_VALUE)
1804 ist->next_dts = decoded_frame->pts;
1806 /* increment next_dts to use for the case where the input stream does not
1807 have timestamps or there are multiple frames in the packet */
1808 ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
1811 // preprocess audio (volume)
1812 if (audio_volume != 256) {
1813 int decoded_data_size = decoded_frame->nb_samples * avctx->channels * bps;
1814 void *samples = decoded_frame->data[0];
1815 switch (avctx->sample_fmt) {
1816 case AV_SAMPLE_FMT_U8:
1818 uint8_t *volp = samples;
1819 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1820 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
1821 *volp++ = av_clip_uint8(v);
1825 case AV_SAMPLE_FMT_S16:
1827 int16_t *volp = samples;
1828 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1829 int v = ((*volp) * audio_volume + 128) >> 8;
1830 *volp++ = av_clip_int16(v);
1834 case AV_SAMPLE_FMT_S32:
1836 int32_t *volp = samples;
1837 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1838 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
1839 *volp++ = av_clipl_int32(v);
1843 case AV_SAMPLE_FMT_FLT:
1845 float *volp = samples;
1846 float scale = audio_volume / 256.f;
1847 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1852 case AV_SAMPLE_FMT_DBL:
1854 double *volp = samples;
1855 double scale = audio_volume / 256.;
1856 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1862 av_log(NULL, AV_LOG_FATAL,
1863 "Audio volume adjustment on sample format %s is not supported.\n",
1864 av_get_sample_fmt_name(ist->st->codec->sample_fmt));
1869 rate_emu_sleep(ist);
1871 for (i = 0; i < nb_output_streams; i++) {
1872 OutputStream *ost = &output_streams[i];
1874 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1876 do_audio_out(output_files[ost->file_index].ctx, ost, ist, decoded_frame);
1882 static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *pkt_pts)
1884 AVFrame *decoded_frame, *filtered_frame = NULL;
1885 void *buffer_to_free = NULL;
1888 int frame_available = 1;
1890 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
1891 return AVERROR(ENOMEM);
1893 avcodec_get_frame_defaults(ist->decoded_frame);
1894 decoded_frame = ist->decoded_frame;
1895 pkt->pts = *pkt_pts;
1896 pkt->dts = ist->last_dts;
1897 *pkt_pts = AV_NOPTS_VALUE;
1899 ret = avcodec_decode_video2(ist->st->codec,
1900 decoded_frame, got_output, pkt);
1904 quality = same_quant ? decoded_frame->quality : 0;
1906 /* no picture yet */
1909 decoded_frame->pts = guess_correct_pts(&ist->pts_ctx, decoded_frame->pkt_pts,
1910 decoded_frame->pkt_dts);
1912 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
1914 rate_emu_sleep(ist);
1916 for (i = 0; i < nb_output_streams; i++) {
1917 OutputStream *ost = &output_streams[i];
1918 int frame_size, resample_changed;
1920 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1923 resample_changed = ost->resample_width != decoded_frame->width ||
1924 ost->resample_height != decoded_frame->height ||
1925 ost->resample_pix_fmt != decoded_frame->format;
1926 if (resample_changed) {
1927 av_log(NULL, AV_LOG_INFO,
1928 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1929 ist->file_index, ist->st->index,
1930 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1931 decoded_frame->width, decoded_frame->height, av_get_pix_fmt_name(decoded_frame->format));
1933 avfilter_graph_free(&ost->graph);
1934 if (configure_video_filters(ist, ost)) {
1935 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
1939 ost->resample_width = decoded_frame->width;
1940 ost->resample_height = decoded_frame->height;
1941 ost->resample_pix_fmt = decoded_frame->format;
1944 if (ist->st->sample_aspect_ratio.num)
1945 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
1946 if (ist->st->codec->codec->capabilities & CODEC_CAP_DR1) {
1947 FrameBuffer *buf = decoded_frame->opaque;
1948 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
1949 decoded_frame->data, decoded_frame->linesize,
1950 AV_PERM_READ | AV_PERM_PRESERVE,
1951 ist->st->codec->width, ist->st->codec->height,
1952 ist->st->codec->pix_fmt);
1954 avfilter_copy_frame_props(fb, decoded_frame);
1955 fb->buf->priv = buf;
1956 fb->buf->free = filter_release_buffer;
1959 av_buffersrc_buffer(ost->input_video_filter, fb);
1961 av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame,
1962 decoded_frame->pts, decoded_frame->sample_aspect_ratio);
1964 if (!ist->filtered_frame && !(ist->filtered_frame = avcodec_alloc_frame())) {
1965 ret = AVERROR(ENOMEM);
1968 avcodec_get_frame_defaults(ist->filtered_frame);
1969 filtered_frame = ist->filtered_frame;
1971 frame_available = avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1972 while (frame_available) {
1973 AVRational ist_pts_tb;
1974 if ((ret = get_filtered_video_frame(ost->output_video_filter,
1975 filtered_frame, &ost->picref,
1978 filtered_frame->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1979 if (!ost->frame_aspect_ratio)
1980 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1982 do_video_out(output_files[ost->file_index].ctx, ost, filtered_frame, &frame_size,
1983 same_quant ? quality : ost->st->codec->global_quality);
1984 if (vstats_filename && frame_size)
1985 do_video_stats(output_files[ost->file_index].ctx, ost, frame_size);
1986 frame_available = ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1987 avfilter_unref_buffer(ost->picref);
1992 av_free(buffer_to_free);
1996 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
1998 AVSubtitle subtitle;
1999 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2000 &subtitle, got_output, pkt);
2006 rate_emu_sleep(ist);
2008 for (i = 0; i < nb_output_streams; i++) {
2009 OutputStream *ost = &output_streams[i];
2011 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2014 do_subtitle_out(output_files[ost->file_index].ctx, ost, ist, &subtitle, pkt->pts);
2017 avsubtitle_free(&subtitle);
2021 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2022 static int output_packet(InputStream *ist,
2023 OutputStream *ost_table, int nb_ostreams,
2024 const AVPacket *pkt)
2028 int64_t pkt_pts = AV_NOPTS_VALUE;
2031 if (ist->next_dts == AV_NOPTS_VALUE)
2032 ist->next_dts = ist->last_dts;
2036 av_init_packet(&avpkt);
2044 if (pkt->dts != AV_NOPTS_VALUE)
2045 ist->next_dts = ist->last_dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2046 if (pkt->pts != AV_NOPTS_VALUE)
2047 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2049 // while we have more to decode or while the decoder did output something on EOF
2050 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2054 ist->last_dts = ist->next_dts;
2056 if (avpkt.size && avpkt.size != pkt->size) {
2057 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2058 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2059 ist->showed_multi_packet_warning = 1;
2062 switch (ist->st->codec->codec_type) {
2063 case AVMEDIA_TYPE_AUDIO:
2064 ret = transcode_audio (ist, &avpkt, &got_output);
2066 case AVMEDIA_TYPE_VIDEO:
2067 ret = transcode_video (ist, &avpkt, &got_output, &pkt_pts);
2069 ist->next_dts += av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
2070 else if (ist->st->r_frame_rate.num)
2071 ist->next_dts += av_rescale_q(1, (AVRational){ist->st->r_frame_rate.den,
2072 ist->st->r_frame_rate.num},
2074 else if (ist->st->codec->time_base.num != 0) {
2075 int ticks = ist->st->parser ? ist->st->parser->repeat_pict + 1 :
2076 ist->st->codec->ticks_per_frame;
2077 ist->next_dts += av_rescale_q(ticks, ist->st->codec->time_base, AV_TIME_BASE_Q);
2080 case AVMEDIA_TYPE_SUBTITLE:
2081 ret = transcode_subtitles(ist, &avpkt, &got_output);
2089 // touch data and size only if not EOF
2099 /* handle stream copy */
2100 if (!ist->decoding_needed) {
2101 rate_emu_sleep(ist);
2102 ist->last_dts = ist->next_dts;
2103 switch (ist->st->codec->codec_type) {
2104 case AVMEDIA_TYPE_AUDIO:
2105 ist->next_dts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2106 ist->st->codec->sample_rate;
2108 case AVMEDIA_TYPE_VIDEO:
2109 if (ist->st->codec->time_base.num != 0) {
2110 int ticks = ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2111 ist->next_dts += ((int64_t)AV_TIME_BASE *
2112 ist->st->codec->time_base.num * ticks) /
2113 ist->st->codec->time_base.den;
2118 for (i = 0; pkt && i < nb_ostreams; i++) {
2119 OutputStream *ost = &ost_table[i];
2121 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2124 do_streamcopy(ist, ost, pkt);
2130 static void print_sdp(OutputFile *output_files, int n)
2134 AVFormatContext **avc = av_malloc(sizeof(*avc) * n);
2138 for (i = 0; i < n; i++)
2139 avc[i] = output_files[i].ctx;
2141 av_sdp_create(avc, n, sdp, sizeof(sdp));
2142 printf("SDP:\n%s\n", sdp);
2147 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
2148 char *error, int error_len)
2151 InputStream *ist = &input_streams[ist_index];
2152 if (ist->decoding_needed) {
2153 AVCodec *codec = ist->dec;
2155 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d:%d",
2156 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2157 return AVERROR(EINVAL);
2160 /* update requested sample format for the decoder based on the
2161 corresponding encoder sample format */
2162 for (i = 0; i < nb_output_streams; i++) {
2163 OutputStream *ost = &output_streams[i];
2164 if (ost->source_index == ist_index) {
2165 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
2170 if (codec->type == AVMEDIA_TYPE_VIDEO && codec->capabilities & CODEC_CAP_DR1) {
2171 ist->st->codec->get_buffer = codec_get_buffer;
2172 ist->st->codec->release_buffer = codec_release_buffer;
2173 ist->st->codec->opaque = ist;
2176 if (!av_dict_get(ist->opts, "threads", NULL, 0))
2177 av_dict_set(&ist->opts, "threads", "auto", 0);
2178 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2179 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2180 ist->file_index, ist->st->index);
2181 return AVERROR(EINVAL);
2183 assert_codec_experimental(ist->st->codec, 0);
2184 assert_avoptions(ist->opts);
2187 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;
2188 ist->next_dts = AV_NOPTS_VALUE;
2189 init_pts_correction(&ist->pts_ctx);
2195 static int transcode_init(OutputFile *output_files,
2196 int nb_output_files,
2197 InputFile *input_files,
2200 int ret = 0, i, j, k;
2201 AVFormatContext *oc;
2202 AVCodecContext *codec, *icodec;
2208 /* init framerate emulation */
2209 for (i = 0; i < nb_input_files; i++) {
2210 InputFile *ifile = &input_files[i];
2211 if (ifile->rate_emu)
2212 for (j = 0; j < ifile->nb_streams; j++)
2213 input_streams[j + ifile->ist_index].start = av_gettime();
2216 /* output stream init */
2217 for (i = 0; i < nb_output_files; i++) {
2218 oc = output_files[i].ctx;
2219 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2220 av_dump_format(oc, i, oc->filename, 1);
2221 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2222 return AVERROR(EINVAL);
2226 /* for each output stream, we compute the right encoding parameters */
2227 for (i = 0; i < nb_output_streams; i++) {
2228 ost = &output_streams[i];
2229 oc = output_files[ost->file_index].ctx;
2230 ist = &input_streams[ost->source_index];
2232 if (ost->attachment_filename)
2235 codec = ost->st->codec;
2236 icodec = ist->st->codec;
2238 ost->st->disposition = ist->st->disposition;
2239 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2240 codec->chroma_sample_location = icodec->chroma_sample_location;
2242 if (ost->stream_copy) {
2243 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2245 if (extra_size > INT_MAX) {
2246 return AVERROR(EINVAL);
2249 /* if stream_copy is selected, no need to decode or encode */
2250 codec->codec_id = icodec->codec_id;
2251 codec->codec_type = icodec->codec_type;
2253 if (!codec->codec_tag) {
2254 if (!oc->oformat->codec_tag ||
2255 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2256 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2257 codec->codec_tag = icodec->codec_tag;
2260 codec->bit_rate = icodec->bit_rate;
2261 codec->rc_max_rate = icodec->rc_max_rate;
2262 codec->rc_buffer_size = icodec->rc_buffer_size;
2263 codec->field_order = icodec->field_order;
2264 codec->extradata = av_mallocz(extra_size);
2265 if (!codec->extradata) {
2266 return AVERROR(ENOMEM);
2268 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2269 codec->extradata_size = icodec->extradata_size;
2271 codec->time_base = icodec->time_base;
2272 codec->time_base.num *= icodec->ticks_per_frame;
2273 av_reduce(&codec->time_base.num, &codec->time_base.den,
2274 codec->time_base.num, codec->time_base.den, INT_MAX);
2276 codec->time_base = ist->st->time_base;
2278 switch (codec->codec_type) {
2279 case AVMEDIA_TYPE_AUDIO:
2280 if (audio_volume != 256) {
2281 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2284 codec->channel_layout = icodec->channel_layout;
2285 codec->sample_rate = icodec->sample_rate;
2286 codec->channels = icodec->channels;
2287 codec->frame_size = icodec->frame_size;
2288 codec->audio_service_type = icodec->audio_service_type;
2289 codec->block_align = icodec->block_align;
2291 case AVMEDIA_TYPE_VIDEO:
2292 codec->pix_fmt = icodec->pix_fmt;
2293 codec->width = icodec->width;
2294 codec->height = icodec->height;
2295 codec->has_b_frames = icodec->has_b_frames;
2296 if (!codec->sample_aspect_ratio.num) {
2297 codec->sample_aspect_ratio =
2298 ost->st->sample_aspect_ratio =
2299 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2300 ist->st->codec->sample_aspect_ratio.num ?
2301 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2304 case AVMEDIA_TYPE_SUBTITLE:
2305 codec->width = icodec->width;
2306 codec->height = icodec->height;
2308 case AVMEDIA_TYPE_DATA:
2309 case AVMEDIA_TYPE_ATTACHMENT:
2316 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2318 ist->decoding_needed = 1;
2319 ost->encoding_needed = 1;
2321 switch (codec->codec_type) {
2322 case AVMEDIA_TYPE_AUDIO:
2323 ost->fifo = av_fifo_alloc(1024);
2325 return AVERROR(ENOMEM);
2327 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2329 if (!codec->sample_rate)
2330 codec->sample_rate = icodec->sample_rate;
2331 choose_sample_rate(ost->st, ost->enc);
2332 codec->time_base = (AVRational){ 1, codec->sample_rate };
2334 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2335 codec->sample_fmt = icodec->sample_fmt;
2336 choose_sample_fmt(ost->st, ost->enc);
2338 if (!codec->channels)
2339 codec->channels = icodec->channels;
2340 codec->channel_layout = icodec->channel_layout;
2341 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2342 codec->channel_layout = 0;
2344 ost->audio_resample = codec-> sample_rate != icodec->sample_rate || audio_sync_method > 1;
2345 icodec->request_channels = codec-> channels;
2346 ost->resample_sample_fmt = icodec->sample_fmt;
2347 ost->resample_sample_rate = icodec->sample_rate;
2348 ost->resample_channels = icodec->channels;
2350 case AVMEDIA_TYPE_VIDEO:
2351 if (codec->pix_fmt == PIX_FMT_NONE)
2352 codec->pix_fmt = icodec->pix_fmt;
2353 choose_pixel_fmt(ost->st, ost->enc);
2355 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2356 av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2360 if (!codec->width || !codec->height) {
2361 codec->width = icodec->width;
2362 codec->height = icodec->height;
2365 ost->video_resample = codec->width != icodec->width ||
2366 codec->height != icodec->height ||
2367 codec->pix_fmt != icodec->pix_fmt;
2368 if (ost->video_resample) {
2369 codec->bits_per_raw_sample = 0;
2372 ost->resample_height = icodec->height;
2373 ost->resample_width = icodec->width;
2374 ost->resample_pix_fmt = icodec->pix_fmt;
2377 * We want CFR output if and only if one of those is true:
2378 * 1) user specified output framerate with -r
2379 * 2) user specified -vsync cfr
2380 * 3) output format is CFR and the user didn't force vsync to
2381 * something else than CFR
2383 * in such a case, set ost->frame_rate
2385 if (!ost->frame_rate.num &&
2386 (video_sync_method == VSYNC_CFR ||
2387 (video_sync_method == VSYNC_AUTO &&
2388 !(oc->oformat->flags & (AVFMT_NOTIMESTAMPS | AVFMT_VARIABLE_FPS))))) {
2389 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25, 1};
2390 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2391 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2392 ost->frame_rate = ost->enc->supported_framerates[idx];
2395 if (ost->frame_rate.num) {
2396 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2397 video_sync_method = VSYNC_CFR;
2399 codec->time_base = ist->st->time_base;
2401 if (configure_video_filters(ist, ost)) {
2402 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2406 case AVMEDIA_TYPE_SUBTITLE:
2407 codec->time_base = (AVRational){1, 1000};
2414 if ((codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2415 char logfilename[1024];
2418 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2419 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2421 if (!strcmp(ost->enc->name, "libx264")) {
2422 av_dict_set(&ost->opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
2424 if (codec->flags & CODEC_FLAG_PASS1) {
2425 f = fopen(logfilename, "wb");
2427 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2428 logfilename, strerror(errno));
2434 size_t logbuffer_size;
2435 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2436 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2440 codec->stats_in = logbuffer;
2447 /* open each encoder */
2448 for (i = 0; i < nb_output_streams; i++) {
2449 ost = &output_streams[i];
2450 if (ost->encoding_needed) {
2451 AVCodec *codec = ost->enc;
2452 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2454 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d:%d",
2455 ost->st->codec->codec_id, ost->file_index, ost->index);
2456 ret = AVERROR(EINVAL);
2459 if (dec->subtitle_header) {
2460 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2461 if (!ost->st->codec->subtitle_header) {
2462 ret = AVERROR(ENOMEM);
2465 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2466 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2468 if (!av_dict_get(ost->opts, "threads", NULL, 0))
2469 av_dict_set(&ost->opts, "threads", "auto", 0);
2470 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2471 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2472 ost->file_index, ost->index);
2473 ret = AVERROR(EINVAL);
2476 assert_codec_experimental(ost->st->codec, 1);
2477 assert_avoptions(ost->opts);
2478 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2479 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2480 "It takes bits/s as argument, not kbits/s\n");
2481 extra_size += ost->st->codec->extradata_size;
2483 if (ost->st->codec->me_threshold)
2484 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2488 /* init input streams */
2489 for (i = 0; i < nb_input_streams; i++)
2490 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2493 /* discard unused programs */
2494 for (i = 0; i < nb_input_files; i++) {
2495 InputFile *ifile = &input_files[i];
2496 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2497 AVProgram *p = ifile->ctx->programs[j];
2498 int discard = AVDISCARD_ALL;
2500 for (k = 0; k < p->nb_stream_indexes; k++)
2501 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2502 discard = AVDISCARD_DEFAULT;
2505 p->discard = discard;
2509 /* open files and write file headers */
2510 for (i = 0; i < nb_output_files; i++) {
2511 oc = output_files[i].ctx;
2512 oc->interrupt_callback = int_cb;
2513 if (avformat_write_header(oc, &output_files[i].opts) < 0) {
2514 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2515 ret = AVERROR(EINVAL);
2518 assert_avoptions(output_files[i].opts);
2519 if (strcmp(oc->oformat->name, "rtp")) {
2525 /* dump the file output parameters - cannot be done before in case
2527 for (i = 0; i < nb_output_files; i++) {
2528 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2531 /* dump the stream mapping */
2532 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2533 for (i = 0; i < nb_output_streams; i++) {
2534 ost = &output_streams[i];
2536 if (ost->attachment_filename) {
2537 /* an attached file */
2538 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
2539 ost->attachment_filename, ost->file_index, ost->index);
2542 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
2543 input_streams[ost->source_index].file_index,
2544 input_streams[ost->source_index].st->index,
2547 if (ost->sync_ist != &input_streams[ost->source_index])
2548 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2549 ost->sync_ist->file_index,
2550 ost->sync_ist->st->index);
2551 if (ost->stream_copy)
2552 av_log(NULL, AV_LOG_INFO, " (copy)");
2554 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2555 input_streams[ost->source_index].dec->name : "?",
2556 ost->enc ? ost->enc->name : "?");
2557 av_log(NULL, AV_LOG_INFO, "\n");
2561 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2566 print_sdp(output_files, nb_output_files);
2573 * The following code is the main loop of the file converter
2575 static int transcode(OutputFile *output_files,
2576 int nb_output_files,
2577 InputFile *input_files,
2581 AVFormatContext *is, *os;
2585 int no_packet_count = 0;
2586 int64_t timer_start;
2588 if (!(no_packet = av_mallocz(nb_input_files)))
2591 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2595 av_log(NULL, AV_LOG_INFO, "Press ctrl-c to stop encoding\n");
2598 timer_start = av_gettime();
2600 for (; received_sigterm == 0;) {
2601 int file_index, ist_index;
2606 ipts_min = INT64_MAX;
2609 /* select the stream that we must read now by looking at the
2610 smallest output pts */
2612 for (i = 0; i < nb_output_streams; i++) {
2616 ost = &output_streams[i];
2617 of = &output_files[ost->file_index];
2618 os = output_files[ost->file_index].ctx;
2619 ist = &input_streams[ost->source_index];
2620 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2621 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2623 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2624 ipts = ist->last_dts;
2625 if (!input_files[ist->file_index].eof_reached) {
2626 if (ipts < ipts_min) {
2629 file_index = ist->file_index;
2631 if (opts < opts_min) {
2633 if (!input_sync) file_index = ist->file_index;
2636 if (ost->frame_number >= ost->max_frames) {
2638 for (j = 0; j < of->ctx->nb_streams; j++)
2639 output_streams[of->ost_index + j].is_past_recording_time = 1;
2643 /* if none, if is finished */
2644 if (file_index < 0) {
2645 if (no_packet_count) {
2646 no_packet_count = 0;
2647 memset(no_packet, 0, nb_input_files);
2654 /* read a frame from it and output it in the fifo */
2655 is = input_files[file_index].ctx;
2656 ret = av_read_frame(is, &pkt);
2657 if (ret == AVERROR(EAGAIN)) {
2658 no_packet[file_index] = 1;
2663 input_files[file_index].eof_reached = 1;
2670 no_packet_count = 0;
2671 memset(no_packet, 0, nb_input_files);
2674 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2675 is->streams[pkt.stream_index]);
2677 /* the following test is needed in case new streams appear
2678 dynamically in stream : we ignore them */
2679 if (pkt.stream_index >= input_files[file_index].nb_streams)
2680 goto discard_packet;
2681 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2682 ist = &input_streams[ist_index];
2684 goto discard_packet;
2686 if (pkt.dts != AV_NOPTS_VALUE)
2687 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2688 if (pkt.pts != AV_NOPTS_VALUE)
2689 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2691 if (pkt.pts != AV_NOPTS_VALUE)
2692 pkt.pts *= ist->ts_scale;
2693 if (pkt.dts != AV_NOPTS_VALUE)
2694 pkt.dts *= ist->ts_scale;
2696 //fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n",
2698 // pkt.dts, input_files[ist->file_index].ts_offset,
2699 // ist->st->codec->codec_type);
2700 if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE
2701 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2702 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2703 int64_t delta = pkt_dts - ist->next_dts;
2704 if ((FFABS(delta) > 1LL * dts_delta_threshold * AV_TIME_BASE || pkt_dts + 1 < ist->last_dts) && !copy_ts) {
2705 input_files[ist->file_index].ts_offset -= delta;
2706 av_log(NULL, AV_LOG_DEBUG,
2707 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2708 delta, input_files[ist->file_index].ts_offset);
2709 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2710 if (pkt.pts != AV_NOPTS_VALUE)
2711 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2715 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2716 if (output_packet(ist, output_streams, nb_output_streams, &pkt) < 0) {
2718 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
2719 ist->file_index, ist->st->index);
2722 av_free_packet(&pkt);
2727 av_free_packet(&pkt);
2729 /* dump report by using the output first video and audio streams */
2730 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2733 /* at the end of stream, we must flush the decoder buffers */
2734 for (i = 0; i < nb_input_streams; i++) {
2735 ist = &input_streams[i];
2736 if (ist->decoding_needed) {
2737 output_packet(ist, output_streams, nb_output_streams, NULL);
2740 flush_encoders(output_streams, nb_output_streams);
2744 /* write the trailer if needed and close file */
2745 for (i = 0; i < nb_output_files; i++) {
2746 os = output_files[i].ctx;
2747 av_write_trailer(os);
2750 /* dump report by using the first video and audio streams */
2751 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2753 /* close each encoder */
2754 for (i = 0; i < nb_output_streams; i++) {
2755 ost = &output_streams[i];
2756 if (ost->encoding_needed) {
2757 av_freep(&ost->st->codec->stats_in);
2758 avcodec_close(ost->st->codec);
2760 avfilter_graph_free(&ost->graph);
2763 /* close each decoder */
2764 for (i = 0; i < nb_input_streams; i++) {
2765 ist = &input_streams[i];
2766 if (ist->decoding_needed) {
2767 avcodec_close(ist->st->codec);
2775 av_freep(&no_packet);
2777 if (output_streams) {
2778 for (i = 0; i < nb_output_streams; i++) {
2779 ost = &output_streams[i];
2781 if (ost->stream_copy)
2782 av_freep(&ost->st->codec->extradata);
2784 fclose(ost->logfile);
2785 ost->logfile = NULL;
2787 av_fifo_free(ost->fifo); /* works even if fifo is not
2788 initialized but set to zero */
2789 av_freep(&ost->st->codec->subtitle_header);
2790 av_free(ost->forced_kf_pts);
2792 audio_resample_close(ost->resample);
2793 if (ost->reformat_ctx)
2794 av_audio_convert_free(ost->reformat_ctx);
2795 av_dict_free(&ost->opts);
2802 static double parse_frame_aspect_ratio(const char *arg)
2809 p = strchr(arg, ':');
2811 x = strtol(arg, &end, 10);
2813 y = strtol(end + 1, &end, 10);
2815 ar = (double)x / (double)y;
2817 ar = strtod(arg, NULL);
2820 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
2826 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2828 return parse_option(o, "codec:a", arg, options);
2831 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2833 return parse_option(o, "codec:v", arg, options);
2836 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2838 return parse_option(o, "codec:s", arg, options);
2841 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2843 return parse_option(o, "codec:d", arg, options);
2846 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2848 StreamMap *m = NULL;
2849 int i, negative = 0, file_idx;
2850 int sync_file_idx = -1, sync_stream_idx;
2858 map = av_strdup(arg);
2860 /* parse sync stream first, just pick first matching stream */
2861 if (sync = strchr(map, ',')) {
2863 sync_file_idx = strtol(sync + 1, &sync, 0);
2864 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2865 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
2870 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2871 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2872 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2873 sync_stream_idx = i;
2876 if (i == input_files[sync_file_idx].nb_streams) {
2877 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
2878 "match any streams.\n", arg);
2884 file_idx = strtol(map, &p, 0);
2885 if (file_idx >= nb_input_files || file_idx < 0) {
2886 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
2890 /* disable some already defined maps */
2891 for (i = 0; i < o->nb_stream_maps; i++) {
2892 m = &o->stream_maps[i];
2893 if (file_idx == m->file_index &&
2894 check_stream_specifier(input_files[m->file_index].ctx,
2895 input_files[m->file_index].ctx->streams[m->stream_index],
2896 *p == ':' ? p + 1 : p) > 0)
2900 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2901 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2902 *p == ':' ? p + 1 : p) <= 0)
2904 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2905 &o->nb_stream_maps, o->nb_stream_maps + 1);
2906 m = &o->stream_maps[o->nb_stream_maps - 1];
2908 m->file_index = file_idx;
2909 m->stream_index = i;
2911 if (sync_file_idx >= 0) {
2912 m->sync_file_index = sync_file_idx;
2913 m->sync_stream_index = sync_stream_idx;
2915 m->sync_file_index = file_idx;
2916 m->sync_stream_index = i;
2921 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
2929 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
2931 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
2932 &o->nb_attachments, o->nb_attachments + 1);
2933 o->attachments[o->nb_attachments - 1] = arg;
2938 * Parse a metadata specifier in arg.
2939 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
2940 * @param index for type c/p, chapter/program index is written here
2941 * @param stream_spec for type s, the stream specifier is written here
2943 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
2951 if (*(++arg) && *arg != ':') {
2952 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
2955 *stream_spec = *arg == ':' ? arg + 1 : "";
2959 if (*(++arg) == ':')
2960 *index = strtol(++arg, NULL, 0);
2963 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
2970 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
2972 AVDictionary **meta_in = NULL;
2973 AVDictionary **meta_out;
2975 char type_in, type_out;
2976 const char *istream_spec = NULL, *ostream_spec = NULL;
2977 int idx_in = 0, idx_out = 0;
2979 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
2980 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
2982 if (type_in == 'g' || type_out == 'g')
2983 o->metadata_global_manual = 1;
2984 if (type_in == 's' || type_out == 's')
2985 o->metadata_streams_manual = 1;
2986 if (type_in == 'c' || type_out == 'c')
2987 o->metadata_chapters_manual = 1;
2989 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2990 if ((index) < 0 || (index) >= (nb_elems)) {\
2991 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
2996 #define SET_DICT(type, meta, context, index)\
2999 meta = &context->metadata;\
3002 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
3003 meta = &context->chapters[index]->metadata;\
3006 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
3007 meta = &context->programs[index]->metadata;\
3011 SET_DICT(type_in, meta_in, ic, idx_in);
3012 SET_DICT(type_out, meta_out, oc, idx_out);
3014 /* for input streams choose first matching stream */
3015 if (type_in == 's') {
3016 for (i = 0; i < ic->nb_streams; i++) {
3017 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
3018 meta_in = &ic->streams[i]->metadata;
3024 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
3029 if (type_out == 's') {
3030 for (i = 0; i < oc->nb_streams; i++) {
3031 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
3032 meta_out = &oc->streams[i]->metadata;
3033 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3038 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3043 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
3045 const char *codec_string = encoder ? "encoder" : "decoder";
3049 avcodec_find_encoder_by_name(name) :
3050 avcodec_find_decoder_by_name(name);
3052 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
3055 if (codec->type != type) {
3056 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
3062 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
3064 char *codec_name = NULL;
3066 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
3068 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
3069 st->codec->codec_id = codec->id;
3072 return avcodec_find_decoder(st->codec->codec_id);
3076 * Add all the streams from the given input file to the global
3077 * list of input streams.
3079 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
3083 for (i = 0; i < ic->nb_streams; i++) {
3084 AVStream *st = ic->streams[i];
3085 AVCodecContext *dec = st->codec;
3088 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3089 ist = &input_streams[nb_input_streams - 1];
3091 ist->file_index = nb_input_files;
3093 st->discard = AVDISCARD_ALL;
3094 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
3096 ist->ts_scale = 1.0;
3097 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
3099 ist->dec = choose_decoder(o, ic, st);
3101 switch (dec->codec_type) {
3102 case AVMEDIA_TYPE_VIDEO:
3104 dec->flags |= CODEC_FLAG_EMU_EDGE;
3105 dec->height >>= dec->lowres;
3106 dec->width >>= dec->lowres;
3110 case AVMEDIA_TYPE_AUDIO:
3111 case AVMEDIA_TYPE_DATA:
3112 case AVMEDIA_TYPE_SUBTITLE:
3113 case AVMEDIA_TYPE_ATTACHMENT:
3114 case AVMEDIA_TYPE_UNKNOWN:
3122 static void assert_file_overwrite(const char *filename)
3124 if (!file_overwrite &&
3125 (strchr(filename, ':') == NULL || filename[1] == ':' ||
3126 av_strstart(filename, "file:", NULL))) {
3127 if (avio_check(filename, 0) == 0) {
3129 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3131 if (!read_yesno()) {
3132 fprintf(stderr, "Not overwriting - exiting\n");
3137 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3144 static void dump_attachment(AVStream *st, const char *filename)
3147 AVIOContext *out = NULL;
3148 AVDictionaryEntry *e;
3150 if (!st->codec->extradata_size) {
3151 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
3152 nb_input_files - 1, st->index);
3155 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
3156 filename = e->value;
3158 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
3159 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
3163 assert_file_overwrite(filename);
3165 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
3166 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
3171 avio_write(out, st->codec->extradata, st->codec->extradata_size);
3176 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
3178 AVFormatContext *ic;
3179 AVInputFormat *file_iformat = NULL;
3183 AVDictionary **opts;
3184 int orig_nb_streams; // number of streams before avformat_find_stream_info
3187 if (!(file_iformat = av_find_input_format(o->format))) {
3188 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
3193 if (!strcmp(filename, "-"))
3196 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3197 !strcmp(filename, "/dev/stdin");
3199 /* get default parameters from command line */
3200 ic = avformat_alloc_context();
3202 print_error(filename, AVERROR(ENOMEM));
3205 if (o->nb_audio_sample_rate) {
3206 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
3207 av_dict_set(&format_opts, "sample_rate", buf, 0);
3209 if (o->nb_audio_channels) {
3210 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
3211 av_dict_set(&format_opts, "channels", buf, 0);
3213 if (o->nb_frame_rates) {
3214 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
3216 if (o->nb_frame_sizes) {
3217 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
3219 if (o->nb_frame_pix_fmts)
3220 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
3222 ic->flags |= AVFMT_FLAG_NONBLOCK;
3223 ic->interrupt_callback = int_cb;
3225 /* open the input file with generic libav function */
3226 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3228 print_error(filename, err);
3231 assert_avoptions(format_opts);
3233 /* apply forced codec ids */
3234 for (i = 0; i < ic->nb_streams; i++)
3235 choose_decoder(o, ic, ic->streams[i]);
3237 /* Set AVCodecContext options for avformat_find_stream_info */
3238 opts = setup_find_stream_info_opts(ic, codec_opts);
3239 orig_nb_streams = ic->nb_streams;
3241 /* If not enough info to get the stream parameters, we decode the
3242 first frames to get it. (used in mpeg case for example) */
3243 ret = avformat_find_stream_info(ic, opts);
3245 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
3246 avformat_close_input(&ic);
3250 timestamp = o->start_time;
3251 /* add the stream start time */
3252 if (ic->start_time != AV_NOPTS_VALUE)
3253 timestamp += ic->start_time;
3255 /* if seeking requested, we execute it */
3256 if (o->start_time != 0) {
3257 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3259 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
3260 filename, (double)timestamp / AV_TIME_BASE);
3264 /* update the current parameters so that they match the one of the input stream */
3265 add_input_streams(o, ic);
3267 /* dump the file content */
3268 av_dump_format(ic, nb_input_files, filename, 0);
3270 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3271 input_files[nb_input_files - 1].ctx = ic;
3272 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3273 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3274 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3275 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
3277 for (i = 0; i < o->nb_dump_attachment; i++) {
3280 for (j = 0; j < ic->nb_streams; j++) {
3281 AVStream *st = ic->streams[j];
3283 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
3284 dump_attachment(st, o->dump_attachment[i].u.str);
3288 for (i = 0; i < orig_nb_streams; i++)
3289 av_dict_free(&opts[i]);
3296 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3297 AVCodecContext *avctx)
3303 for (p = kf; *p; p++)
3306 ost->forced_kf_count = n;
3307 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3308 if (!ost->forced_kf_pts) {
3309 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3312 for (i = 0; i < n; i++) {
3313 p = i ? strchr(p, ',') + 1 : kf;
3314 t = parse_time_or_die("force_key_frames", p, 1);
3315 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3319 static uint8_t *get_line(AVIOContext *s)
3325 if (avio_open_dyn_buf(&line) < 0) {
3326 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
3330 while ((c = avio_r8(s)) && c != '\n')
3333 avio_close_dyn_buf(line, &buf);
3338 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
3341 char filename[1000];
3342 const char *base[3] = { getenv("AVCONV_DATADIR"),
3347 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
3351 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
3352 i != 1 ? "" : "/.avconv", codec_name, preset_name);
3353 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3356 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
3357 i != 1 ? "" : "/.avconv", preset_name);
3358 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3364 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
3366 char *codec_name = NULL;
3368 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
3370 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
3371 NULL, ost->st->codec->codec_type);
3372 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
3373 } else if (!strcmp(codec_name, "copy"))
3374 ost->stream_copy = 1;
3376 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
3377 ost->st->codec->codec_id = ost->enc->id;
3381 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3384 AVStream *st = avformat_new_stream(oc, NULL);
3385 int idx = oc->nb_streams - 1, ret = 0;
3386 char *bsf = NULL, *next, *codec_tag = NULL;
3387 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3389 char *buf = NULL, *arg = NULL, *preset = NULL;
3390 AVIOContext *s = NULL;
3393 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3397 if (oc->nb_streams - 1 < o->nb_streamid_map)
3398 st->id = o->streamid_map[oc->nb_streams - 1];
3400 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3401 nb_output_streams + 1);
3402 ost = &output_streams[nb_output_streams - 1];
3403 ost->file_index = nb_output_files;
3406 st->codec->codec_type = type;
3407 choose_encoder(o, oc, ost);
3409 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3412 avcodec_get_context_defaults3(st->codec, ost->enc);
3413 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3415 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
3416 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
3419 if (!buf[0] || buf[0] == '#') {
3423 if (!(arg = strchr(buf, '='))) {
3424 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
3428 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
3430 } while (!s->eof_reached);
3434 av_log(NULL, AV_LOG_FATAL,
3435 "Preset %s specified for stream %d:%d, but could not be opened.\n",
3436 preset, ost->file_index, ost->index);
3440 ost->max_frames = INT64_MAX;
3441 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
3443 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3445 if (next = strchr(bsf, ','))
3447 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3448 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3452 bsfc_prev->next = bsfc;
3454 ost->bitstream_filters = bsfc;
3460 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3462 uint32_t tag = strtol(codec_tag, &next, 0);
3464 tag = AV_RL32(codec_tag);
3465 st->codec->codec_tag = tag;
3468 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3469 if (qscale >= 0 || same_quant) {
3470 st->codec->flags |= CODEC_FLAG_QSCALE;
3471 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3474 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
3475 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3477 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3481 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3484 const char *p = str;
3491 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3498 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3502 AVCodecContext *video_enc;
3504 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3506 video_enc = st->codec;
3508 if (!ost->stream_copy) {
3509 const char *p = NULL;
3510 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3511 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3512 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3515 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3516 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3517 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3521 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3522 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3523 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3527 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3528 if (frame_aspect_ratio)
3529 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3531 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3532 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3533 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3536 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3538 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3540 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3541 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
3544 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3546 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3548 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3549 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
3552 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
3555 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
3556 for (i = 0; p; i++) {
3558 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
3560 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
3563 video_enc->rc_override =
3564 av_realloc(video_enc->rc_override,
3565 sizeof(RcOverride) * (i + 1));
3566 video_enc->rc_override[i].start_frame = start;
3567 video_enc->rc_override[i].end_frame = end;
3569 video_enc->rc_override[i].qscale = q;
3570 video_enc->rc_override[i].quality_factor = 1.0;
3573 video_enc->rc_override[i].qscale = 0;
3574 video_enc->rc_override[i].quality_factor = -q/100.0;
3579 video_enc->rc_override_count = i;
3580 if (!video_enc->rc_initial_buffer_occupancy)
3581 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
3582 video_enc->intra_dc_precision = intra_dc_precision - 8;
3587 video_enc->flags |= CODEC_FLAG_PASS1;
3589 video_enc->flags |= CODEC_FLAG_PASS2;
3593 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
3594 if (forced_key_frames)
3595 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3597 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
3599 ost->top_field_first = -1;
3600 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
3602 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
3604 ost->avfilter = av_strdup(filters);
3606 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
3612 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3616 AVCodecContext *audio_enc;
3618 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3621 audio_enc = st->codec;
3622 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3624 if (!ost->stream_copy) {
3625 char *sample_fmt = NULL;
3627 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3629 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
3631 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
3632 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
3636 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
3642 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3646 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3647 if (!ost->stream_copy) {
3648 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
3655 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
3657 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
3658 ost->stream_copy = 1;
3662 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3666 AVCodecContext *subtitle_enc;
3668 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3670 subtitle_enc = st->codec;
3672 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3677 /* arg format is "output-stream-index:streamid-value". */
3678 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
3684 av_strlcpy(idx_str, arg, sizeof(idx_str));
3685 p = strchr(idx_str, ':');
3687 av_log(NULL, AV_LOG_FATAL,
3688 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3693 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3694 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
3695 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3699 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3701 AVFormatContext *is = ifile->ctx;
3702 AVFormatContext *os = ofile->ctx;
3705 for (i = 0; i < is->nb_chapters; i++) {
3706 AVChapter *in_ch = is->chapters[i], *out_ch;
3707 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3708 AV_TIME_BASE_Q, in_ch->time_base);
3709 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3710 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3713 if (in_ch->end < ts_off)
3715 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3718 out_ch = av_mallocz(sizeof(AVChapter));
3720 return AVERROR(ENOMEM);
3722 out_ch->id = in_ch->id;
3723 out_ch->time_base = in_ch->time_base;
3724 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3725 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3728 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3731 os->chapters = av_realloc(os->chapters, sizeof(AVChapter) * os->nb_chapters);
3733 return AVERROR(ENOMEM);
3734 os->chapters[os->nb_chapters - 1] = out_ch;
3739 static void opt_output_file(void *optctx, const char *filename)
3741 OptionsContext *o = optctx;
3742 AVFormatContext *oc;
3744 AVOutputFormat *file_oformat;
3748 if (!strcmp(filename, "-"))
3751 oc = avformat_alloc_context();
3753 print_error(filename, AVERROR(ENOMEM));
3758 file_oformat = av_guess_format(o->format, NULL, NULL);
3759 if (!file_oformat) {
3760 av_log(NULL, AV_LOG_FATAL, "Requested output format '%s' is not a suitable output format\n", o->format);
3764 file_oformat = av_guess_format(NULL, filename, NULL);
3765 if (!file_oformat) {
3766 av_log(NULL, AV_LOG_FATAL, "Unable to find a suitable output format for '%s'\n",
3772 oc->oformat = file_oformat;
3773 oc->interrupt_callback = int_cb;
3774 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3776 if (!o->nb_stream_maps) {
3777 /* pick the "best" stream of each type */
3778 #define NEW_STREAM(type, index)\
3780 ost = new_ ## type ## _stream(o, oc);\
3781 ost->source_index = index;\
3782 ost->sync_ist = &input_streams[index];\
3783 input_streams[index].discard = 0;\
3784 input_streams[index].st->discard = AVDISCARD_NONE;\
3787 /* video: highest resolution */
3788 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3789 int area = 0, idx = -1;
3790 for (i = 0; i < nb_input_streams; i++) {
3791 ist = &input_streams[i];
3792 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3793 ist->st->codec->width * ist->st->codec->height > area) {
3794 area = ist->st->codec->width * ist->st->codec->height;
3798 NEW_STREAM(video, idx);
3801 /* audio: most channels */
3802 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3803 int channels = 0, idx = -1;
3804 for (i = 0; i < nb_input_streams; i++) {
3805 ist = &input_streams[i];
3806 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3807 ist->st->codec->channels > channels) {
3808 channels = ist->st->codec->channels;
3812 NEW_STREAM(audio, idx);
3815 /* subtitles: pick first */
3816 if (!o->subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3817 for (i = 0; i < nb_input_streams; i++)
3818 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3819 NEW_STREAM(subtitle, i);
3823 /* do something with data? */
3825 for (i = 0; i < o->nb_stream_maps; i++) {
3826 StreamMap *map = &o->stream_maps[i];
3831 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3832 switch (ist->st->codec->codec_type) {
3833 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3834 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3835 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3836 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3837 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
3839 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
3840 map->file_index, map->stream_index);
3844 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3845 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3846 map->sync_stream_index];
3848 ist->st->discard = AVDISCARD_NONE;
3852 /* handle attached files */
3853 for (i = 0; i < o->nb_attachments; i++) {
3855 uint8_t *attachment;
3859 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
3860 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
3864 if ((len = avio_size(pb)) <= 0) {
3865 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
3869 if (!(attachment = av_malloc(len))) {
3870 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
3874 avio_read(pb, attachment, len);
3876 ost = new_attachment_stream(o, oc);
3877 ost->stream_copy = 0;
3878 ost->source_index = -1;
3879 ost->attachment_filename = o->attachments[i];
3880 ost->st->codec->extradata = attachment;
3881 ost->st->codec->extradata_size = len;
3883 p = strrchr(o->attachments[i], '/');
3884 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
3888 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3889 output_files[nb_output_files - 1].ctx = oc;
3890 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3891 output_files[nb_output_files - 1].recording_time = o->recording_time;
3892 if (o->recording_time != INT64_MAX)
3893 oc->duration = o->recording_time;
3894 output_files[nb_output_files - 1].start_time = o->start_time;
3895 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3896 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3898 /* check filename in case of an image number is expected */
3899 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3900 if (!av_filename_number_test(oc->filename)) {
3901 print_error(oc->filename, AVERROR(EINVAL));
3906 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3907 /* test if it already exists to avoid losing precious files */
3908 assert_file_overwrite(filename);
3911 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
3912 &oc->interrupt_callback,
3913 &output_files[nb_output_files - 1].opts)) < 0) {
3914 print_error(filename, err);
3919 if (o->mux_preload) {
3921 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
3922 av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
3924 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
3925 oc->flags |= AVFMT_FLAG_NONBLOCK;
3928 for (i = 0; i < o->nb_metadata_map; i++) {
3930 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
3932 if (in_file_index < 0)
3934 if (in_file_index >= nb_input_files) {
3935 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
3938 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, input_files[in_file_index].ctx, o);
3942 if (o->chapters_input_file >= nb_input_files) {
3943 if (o->chapters_input_file == INT_MAX) {
3944 /* copy chapters from the first input file that has them*/
3945 o->chapters_input_file = -1;
3946 for (i = 0; i < nb_input_files; i++)
3947 if (input_files[i].ctx->nb_chapters) {
3948 o->chapters_input_file = i;
3952 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
3953 o->chapters_input_file);
3957 if (o->chapters_input_file >= 0)
3958 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
3959 !o->metadata_chapters_manual);
3961 /* copy global metadata by default */
3962 if (!o->metadata_global_manual && nb_input_files)
3963 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3964 AV_DICT_DONT_OVERWRITE);
3965 if (!o->metadata_streams_manual)
3966 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3968 if (output_streams[i].source_index < 0) /* this is true e.g. for attached files */
3970 ist = &input_streams[output_streams[i].source_index];
3971 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3974 /* process manually set metadata */
3975 for (i = 0; i < o->nb_metadata; i++) {
3978 const char *stream_spec;
3979 int index = 0, j, ret;
3981 val = strchr(o->metadata[i].u.str, '=');
3983 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
3984 o->metadata[i].u.str);
3989 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
3991 for (j = 0; j < oc->nb_streams; j++) {
3992 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
3993 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
3997 printf("ret %d, stream_spec %s\n", ret, stream_spec);
4005 if (index < 0 || index >= oc->nb_chapters) {
4006 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
4009 m = &oc->chapters[index]->metadata;
4012 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
4015 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
4022 /* same option as mencoder */
4023 static int opt_pass(const char *opt, const char *arg)
4025 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
4029 static int64_t getutime(void)
4032 struct rusage rusage;
4034 getrusage(RUSAGE_SELF, &rusage);
4035 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4036 #elif HAVE_GETPROCESSTIMES
4038 FILETIME c, e, k, u;
4039 proc = GetCurrentProcess();
4040 GetProcessTimes(proc, &c, &e, &k, &u);
4041 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4043 return av_gettime();
4047 static int64_t getmaxrss(void)
4049 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4050 struct rusage rusage;
4051 getrusage(RUSAGE_SELF, &rusage);
4052 return (int64_t)rusage.ru_maxrss * 1024;
4053 #elif HAVE_GETPROCESSMEMORYINFO
4055 PROCESS_MEMORY_COUNTERS memcounters;
4056 proc = GetCurrentProcess();
4057 memcounters.cb = sizeof(memcounters);
4058 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4059 return memcounters.PeakPagefileUsage;
4065 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
4067 return parse_option(o, "q:a", arg, options);
4070 static void show_usage(void)
4072 printf("Hyper fast Audio and Video encoder\n");
4073 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
4077 static void show_help(void)
4079 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
4080 av_log_set_callback(log_callback_help);
4082 show_help_options(options, "Main options:\n",
4083 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4084 show_help_options(options, "\nAdvanced options:\n",
4085 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4087 show_help_options(options, "\nVideo options:\n",
4088 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4090 show_help_options(options, "\nAdvanced Video options:\n",
4091 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4092 OPT_VIDEO | OPT_EXPERT);
4093 show_help_options(options, "\nAudio options:\n",
4094 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4096 show_help_options(options, "\nAdvanced Audio options:\n",
4097 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4098 OPT_AUDIO | OPT_EXPERT);
4099 show_help_options(options, "\nSubtitle options:\n",
4100 OPT_SUBTITLE | OPT_GRAB,
4102 show_help_options(options, "\nAudio/Video grab options:\n",
4106 show_help_children(avcodec_get_class(), flags);
4107 show_help_children(avformat_get_class(), flags);
4108 show_help_children(sws_get_class(), flags);
4111 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
4113 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4114 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
4116 if (!strncmp(arg, "pal-", 4)) {
4119 } else if (!strncmp(arg, "ntsc-", 5)) {
4122 } else if (!strncmp(arg, "film-", 5)) {
4126 /* Try to determine PAL/NTSC by peeking in the input files */
4127 if (nb_input_files) {
4129 for (j = 0; j < nb_input_files; j++) {
4130 for (i = 0; i < input_files[j].nb_streams; i++) {
4131 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4132 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
4134 fr = c->time_base.den * 1000 / c->time_base.num;
4138 } else if ((fr == 29970) || (fr == 23976)) {
4143 if (norm != UNKNOWN)
4147 if (norm != UNKNOWN)
4148 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4151 if (norm == UNKNOWN) {
4152 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4153 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4154 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
4158 if (!strcmp(arg, "vcd")) {
4159 opt_video_codec(o, "c:v", "mpeg1video");
4160 opt_audio_codec(o, "c:a", "mp2");
4161 parse_option(o, "f", "vcd", options);
4163 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
4164 parse_option(o, "r", frame_rates[norm], options);
4165 opt_default("g", norm == PAL ? "15" : "18");
4167 opt_default("b", "1150000");
4168 opt_default("maxrate", "1150000");
4169 opt_default("minrate", "1150000");
4170 opt_default("bufsize", "327680"); // 40*1024*8;
4172 opt_default("b:a", "224000");
4173 parse_option(o, "ar", "44100", options);
4174 parse_option(o, "ac", "2", options);
4176 opt_default("packetsize", "2324");
4177 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4179 /* We have to offset the PTS, so that it is consistent with the SCR.
4180 SCR starts at 36000, but the first two packs contain only padding
4181 and the first pack from the other stream, respectively, may also have
4182 been written before.
4183 So the real data starts at SCR 36000+3*1200. */
4184 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
4185 } else if (!strcmp(arg, "svcd")) {
4187 opt_video_codec(o, "c:v", "mpeg2video");
4188 opt_audio_codec(o, "c:a", "mp2");
4189 parse_option(o, "f", "svcd", options);
4191 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
4192 parse_option(o, "r", frame_rates[norm], options);
4193 opt_default("g", norm == PAL ? "15" : "18");
4195 opt_default("b", "2040000");
4196 opt_default("maxrate", "2516000");
4197 opt_default("minrate", "0"); // 1145000;
4198 opt_default("bufsize", "1835008"); // 224*1024*8;
4199 opt_default("flags", "+scan_offset");
4202 opt_default("b:a", "224000");
4203 parse_option(o, "ar", "44100", options);
4205 opt_default("packetsize", "2324");
4207 } else if (!strcmp(arg, "dvd")) {
4209 opt_video_codec(o, "c:v", "mpeg2video");
4210 opt_audio_codec(o, "c:a", "ac3");
4211 parse_option(o, "f", "dvd", options);
4213 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4214 parse_option(o, "r", frame_rates[norm], options);
4215 opt_default("g", norm == PAL ? "15" : "18");
4217 opt_default("b", "6000000");
4218 opt_default("maxrate", "9000000");
4219 opt_default("minrate", "0"); // 1500000;
4220 opt_default("bufsize", "1835008"); // 224*1024*8;
4222 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4223 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4225 opt_default("b:a", "448000");
4226 parse_option(o, "ar", "48000", options);
4228 } else if (!strncmp(arg, "dv", 2)) {
4230 parse_option(o, "f", "dv", options);
4232 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4233 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4234 norm == PAL ? "yuv420p" : "yuv411p", options);
4235 parse_option(o, "r", frame_rates[norm], options);
4237 parse_option(o, "ar", "48000", options);
4238 parse_option(o, "ac", "2", options);
4241 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
4242 return AVERROR(EINVAL);
4247 static int opt_vstats_file(const char *opt, const char *arg)
4249 av_free (vstats_filename);
4250 vstats_filename = av_strdup (arg);
4254 static int opt_vstats(const char *opt, const char *arg)
4257 time_t today2 = time(NULL);
4258 struct tm *today = localtime(&today2);
4260 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4262 return opt_vstats_file(opt, filename);
4265 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4267 return parse_option(o, "frames:v", arg, options);
4270 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4272 return parse_option(o, "frames:a", arg, options);
4275 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4277 return parse_option(o, "frames:d", arg, options);
4280 static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg)
4282 return parse_option(o, "tag:v", arg, options);
4285 static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg)
4287 return parse_option(o, "tag:a", arg, options);
4290 static int opt_subtitle_tag(OptionsContext *o, const char *opt, const char *arg)
4292 return parse_option(o, "tag:s", arg, options);
4295 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4297 return parse_option(o, "filter:v", arg, options);
4300 static int opt_vsync(const char *opt, const char *arg)
4302 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
4303 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
4304 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
4306 if (video_sync_method == VSYNC_AUTO)
4307 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
4311 static int opt_deinterlace(const char *opt, const char *arg)
4313 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
4318 static int opt_cpuflags(const char *opt, const char *arg)
4320 #define CPUFLAG_MMX2 (AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMX2)
4321 #define CPUFLAG_3DNOW (AV_CPU_FLAG_3DNOW | AV_CPU_FLAG_MMX)
4322 #define CPUFLAG_3DNOWEXT (AV_CPU_FLAG_3DNOWEXT | CPUFLAG_3DNOW)
4323 #define CPUFLAG_SSE (AV_CPU_FLAG_SSE | CPUFLAG_MMX2)
4324 #define CPUFLAG_SSE2 (AV_CPU_FLAG_SSE2 | CPUFLAG_SSE)
4325 #define CPUFLAG_SSE2SLOW (AV_CPU_FLAG_SSE2SLOW | CPUFLAG_SSE2)
4326 #define CPUFLAG_SSE3 (AV_CPU_FLAG_SSE3 | CPUFLAG_SSE2)
4327 #define CPUFLAG_SSE3SLOW (AV_CPU_FLAG_SSE3SLOW | CPUFLAG_SSE3)
4328 #define CPUFLAG_SSSE3 (AV_CPU_FLAG_SSSE3 | CPUFLAG_SSE3)
4329 #define CPUFLAG_SSE4 (AV_CPU_FLAG_SSE4 | CPUFLAG_SSSE3)
4330 #define CPUFLAG_SSE42 (AV_CPU_FLAG_SSE42 | CPUFLAG_SSE4)
4331 #define CPUFLAG_AVX (AV_CPU_FLAG_AVX | CPUFLAG_SSE42)
4332 #define CPUFLAG_XOP (AV_CPU_FLAG_XOP | CPUFLAG_AVX)
4333 #define CPUFLAG_FMA4 (AV_CPU_FLAG_FMA4 | CPUFLAG_AVX)
4334 static const AVOption cpuflags_opts[] = {
4335 { "flags" , NULL, 0, AV_OPT_TYPE_FLAGS, { 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
4336 { "altivec" , NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_ALTIVEC }, .unit = "flags" },
4337 { "mmx" , NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_MMX }, .unit = "flags" },
4338 { "mmx2" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_MMX2 }, .unit = "flags" },
4339 { "sse" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE }, .unit = "flags" },
4340 { "sse2" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE2 }, .unit = "flags" },
4341 { "sse2slow", NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE2SLOW }, .unit = "flags" },
4342 { "sse3" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE3 }, .unit = "flags" },
4343 { "sse3slow", NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE3SLOW }, .unit = "flags" },
4344 { "ssse3" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSSE3 }, .unit = "flags" },
4345 { "atom" , NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_ATOM }, .unit = "flags" },
4346 { "sse4.1" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE4 }, .unit = "flags" },
4347 { "sse4.2" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE42 }, .unit = "flags" },
4348 { "avx" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_AVX }, .unit = "flags" },
4349 { "xop" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_XOP }, .unit = "flags" },
4350 { "fma4" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_FMA4 }, .unit = "flags" },
4351 { "3dnow" , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_3DNOW }, .unit = "flags" },
4352 { "3dnowext", NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_3DNOWEXT }, .unit = "flags" },
4355 static const AVClass class = {
4356 .class_name = "cpuflags",
4357 .item_name = av_default_item_name,
4358 .option = cpuflags_opts,
4359 .version = LIBAVUTIL_VERSION_INT,
4363 const AVClass *pclass = &class;
4365 if ((ret = av_opt_eval_flags(&pclass, &cpuflags_opts[0], arg, &flags)) < 0)
4368 av_set_cpu_flags_mask(flags);
4372 static void parse_cpuflags(int argc, char **argv, const OptionDef *options)
4374 int idx = locate_option(argc, argv, options, "cpuflags");
4375 if (idx && argv[idx + 1])
4376 opt_cpuflags("cpuflags", argv[idx + 1]);
4379 #define OFFSET(x) offsetof(OptionsContext, x)
4380 static const OptionDef options[] = {
4382 #include "cmdutils_common_opts.h"
4383 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4384 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4385 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4386 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4387 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4388 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
4389 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
4390 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
4391 "outfile[,metadata]:infile[,metadata]" },
4392 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4393 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4394 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4395 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4396 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4397 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4398 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4399 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4400 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4401 "add timings for benchmarking" },
4402 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4403 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4404 "dump each input packet" },
4405 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4406 "when dumping packets, also dump the payload" },
4407 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4408 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4409 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
4410 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4411 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4412 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4413 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4414 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4415 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4416 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4417 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
4418 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4419 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4420 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4421 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4422 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4423 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
4424 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
4425 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
4426 { "cpuflags", HAS_ARG | OPT_EXPERT, {(void*)opt_cpuflags}, "set CPU flags mask", "mask" },
4429 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4430 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4431 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4432 { "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" },
4433 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4434 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4435 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4436 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4437 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4438 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4439 "use same quantizer as source (implies VBR)" },
4440 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4441 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4442 { "deinterlace", OPT_EXPERT | OPT_VIDEO, {(void*)opt_deinterlace},
4443 "this option is deprecated, use the yadif filter instead" },
4444 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4445 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4446 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
4447 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
4448 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
4449 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
4450 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4451 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4452 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4453 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
4454 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4455 { "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" },
4458 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4459 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
4460 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
4461 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
4462 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
4463 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4464 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4465 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4466 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
4468 /* subtitle options */
4469 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
4470 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4471 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4474 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4477 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4478 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4480 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4482 /* data codec support */
4483 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4485 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4489 int main(int argc, char **argv)
4491 OptionsContext o = { 0 };
4496 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4497 parse_loglevel(argc, argv, options);
4499 avcodec_register_all();
4501 avdevice_register_all();
4503 avfilter_register_all();
4505 avformat_network_init();
4509 parse_cpuflags(argc, argv, options);
4512 parse_options(&o, argc, argv, options, opt_output_file);
4514 if (nb_output_files <= 0 && nb_input_files == 0) {
4516 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4520 /* file converter / grab */
4521 if (nb_output_files <= 0) {
4522 fprintf(stderr, "At least one output file must be specified\n");
4526 if (nb_input_files == 0) {
4527 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
4532 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4534 ti = getutime() - ti;
4536 int maxrss = getmaxrss() / 1024;
4537 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);