3 * Copyright (c) 2000-2011 The libav developers.
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/dict.h"
43 #include "libavutil/mathematics.h"
44 #include "libavutil/pixdesc.h"
45 #include "libavutil/avstring.h"
46 #include "libavutil/libm.h"
47 #include "libavutil/imgutils.h"
48 #include "libavformat/os_support.h"
51 # include "libavfilter/avfilter.h"
52 # include "libavfilter/avfiltergraph.h"
53 # include "libavfilter/buffersrc.h"
54 # include "libavfilter/vsrc_buffer.h"
57 #if HAVE_SYS_RESOURCE_H
58 #include <sys/types.h>
60 #include <sys/resource.h>
61 #elif HAVE_GETPROCESSTIMES
64 #if HAVE_GETPROCESSMEMORYINFO
70 #include <sys/select.h>
77 #include "libavutil/avassert.h"
80 #define VSYNC_PASSTHROUGH 0
84 const char program_name[] = "avconv";
85 const int program_birth_year = 2000;
87 /* select an input stream for an output stream */
88 typedef struct StreamMap {
89 int disabled; /** 1 is this mapping is disabled by a negative map */
93 int sync_stream_index;
97 * select an input file for an output file
99 typedef struct MetadataMap {
100 int file; ///< file index
101 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
102 int index; ///< stream/chapter/program number
105 static const OptionDef options[];
107 static int video_discard = 0;
108 static int same_quant = 0;
109 static int do_deinterlace = 0;
110 static int intra_dc_precision = 8;
111 static int qp_hist = 0;
113 static int file_overwrite = 0;
114 static int do_benchmark = 0;
115 static int do_hex_dump = 0;
116 static int do_pkt_dump = 0;
117 static int do_pass = 0;
118 static char *pass_logfilename_prefix = NULL;
119 static int video_sync_method = VSYNC_AUTO;
120 static int audio_sync_method = 0;
121 static float audio_drift_threshold = 0.1;
122 static int copy_ts = 0;
123 static int copy_tb = 1;
124 static int opt_shortest = 0;
125 static char *vstats_filename;
126 static FILE *vstats_file;
128 static int audio_volume = 256;
130 static int exit_on_error = 0;
131 static int using_stdin = 0;
132 static int64_t video_size = 0;
133 static int64_t audio_size = 0;
134 static int64_t extra_size = 0;
135 static int nb_frames_dup = 0;
136 static int nb_frames_drop = 0;
137 static int input_sync;
139 static float dts_delta_threshold = 10;
141 static int print_stats = 1;
143 static uint8_t *audio_buf;
144 static uint8_t *audio_out;
145 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
147 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
149 typedef struct FrameBuffer {
155 enum PixelFormat pix_fmt;
158 struct InputStream *ist;
159 struct FrameBuffer *next;
162 typedef struct InputStream {
165 int discard; /* true if stream data should be discarded */
166 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
168 AVFrame *decoded_frame;
169 AVFrame *filtered_frame;
171 int64_t start; /* time when read started */
172 int64_t next_pts; /* synthetic pts for cases where pkt.pts
174 int64_t pts; /* current pts */
175 PtsCorrectionContext pts_ctx;
177 int is_start; /* is 1 at the start and after a discontinuity */
178 int showed_multi_packet_warning;
181 /* a pool of free buffers for decoded data */
182 FrameBuffer *buffer_pool;
185 typedef struct InputFile {
186 AVFormatContext *ctx;
187 int eof_reached; /* true if eof reached */
188 int ist_index; /* index of first stream in ist_table */
189 int buffer_size; /* current total buffer size */
191 int nb_streams; /* number of stream that avconv is aware of; may be different
192 from ctx.nb_streams if new streams appear during av_read_frame() */
196 typedef struct OutputStream {
197 int file_index; /* file index */
198 int index; /* stream index in the output file */
199 int source_index; /* InputStream index */
200 AVStream *st; /* stream in the output file */
201 int encoding_needed; /* true if encoding needed for this stream */
203 /* input pts and corresponding output pts
205 // double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
206 struct InputStream *sync_ist; /* input stream to sync against */
207 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
208 AVBitStreamFilterContext *bitstream_filters;
214 AVFrame pict_tmp; /* temporary image for resampling */
215 struct SwsContext *img_resample_ctx; /* for image resampling */
218 int resample_pix_fmt;
219 AVRational frame_rate;
223 float frame_aspect_ratio;
225 /* forced key frames */
226 int64_t *forced_kf_pts;
232 ReSampleContext *resample; /* for audio resampling */
233 int resample_sample_fmt;
234 int resample_channels;
235 int resample_sample_rate;
237 AVAudioConvert *reformat_ctx;
238 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
242 AVFilterContext *output_video_filter;
243 AVFilterContext *input_video_filter;
244 AVFilterBufferRef *picref;
246 AVFilterGraph *graph;
251 int is_past_recording_time;
253 const char *attachment_filename;
254 int copy_initial_nonkeyframes;
258 typedef struct OutputFile {
259 AVFormatContext *ctx;
261 int ost_index; /* index of the first stream in output_streams */
262 int64_t recording_time; /* desired length of the resulting file in microseconds */
263 int64_t start_time; /* start time in microseconds */
264 uint64_t limit_filesize;
267 static InputStream *input_streams = NULL;
268 static int nb_input_streams = 0;
269 static InputFile *input_files = NULL;
270 static int nb_input_files = 0;
272 static OutputStream *output_streams = NULL;
273 static int nb_output_streams = 0;
274 static OutputFile *output_files = NULL;
275 static int nb_output_files = 0;
277 typedef struct OptionsContext {
278 /* input/output options */
282 SpecifierOpt *codec_names;
284 SpecifierOpt *audio_channels;
285 int nb_audio_channels;
286 SpecifierOpt *audio_sample_rate;
287 int nb_audio_sample_rate;
288 SpecifierOpt *frame_rates;
290 SpecifierOpt *frame_sizes;
292 SpecifierOpt *frame_pix_fmts;
293 int nb_frame_pix_fmts;
296 int64_t input_ts_offset;
299 SpecifierOpt *ts_scale;
301 SpecifierOpt *dump_attachment;
302 int nb_dump_attachment;
305 StreamMap *stream_maps;
307 /* first item specifies output metadata, second is input */
308 MetadataMap (*meta_data_maps)[2];
309 int nb_meta_data_maps;
310 int metadata_global_manual;
311 int metadata_streams_manual;
312 int metadata_chapters_manual;
313 const char **attachments;
316 int chapters_input_file;
318 int64_t recording_time;
319 uint64_t limit_filesize;
325 int subtitle_disable;
328 /* indexed by output file stream index */
332 SpecifierOpt *metadata;
334 SpecifierOpt *max_frames;
336 SpecifierOpt *bitstream_filters;
337 int nb_bitstream_filters;
338 SpecifierOpt *codec_tags;
340 SpecifierOpt *sample_fmts;
342 SpecifierOpt *qscale;
344 SpecifierOpt *forced_key_frames;
345 int nb_forced_key_frames;
346 SpecifierOpt *force_fps;
348 SpecifierOpt *frame_aspect_ratios;
349 int nb_frame_aspect_ratios;
350 SpecifierOpt *rc_overrides;
352 SpecifierOpt *intra_matrices;
353 int nb_intra_matrices;
354 SpecifierOpt *inter_matrices;
355 int nb_inter_matrices;
356 SpecifierOpt *top_field_first;
357 int nb_top_field_first;
358 SpecifierOpt *metadata_map;
360 SpecifierOpt *presets;
362 SpecifierOpt *copy_initial_nonkeyframes;
363 int nb_copy_initial_nonkeyframes;
365 SpecifierOpt *filters;
370 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
373 for (i = 0; i < o->nb_ ## name; i++) {\
374 char *spec = o->name[i].specifier;\
375 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
376 outvar = o->name[i].u.type;\
382 static void reset_options(OptionsContext *o)
384 const OptionDef *po = options;
386 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
388 void *dst = (uint8_t*)o + po->u.off;
390 if (po->flags & OPT_SPEC) {
391 SpecifierOpt **so = dst;
392 int i, *count = (int*)(so + 1);
393 for (i = 0; i < *count; i++) {
394 av_freep(&(*so)[i].specifier);
395 if (po->flags & OPT_STRING)
396 av_freep(&(*so)[i].u.str);
400 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
405 av_freep(&o->stream_maps);
406 av_freep(&o->meta_data_maps);
407 av_freep(&o->streamid_map);
409 memset(o, 0, sizeof(*o));
411 o->mux_max_delay = 0.7;
412 o->recording_time = INT64_MAX;
413 o->limit_filesize = UINT64_MAX;
414 o->chapters_input_file = INT_MAX;
420 static int alloc_buffer(InputStream *ist, FrameBuffer **pbuf)
422 AVCodecContext *s = ist->st->codec;
423 FrameBuffer *buf = av_mallocz(sizeof(*buf));
425 const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1;
426 int h_chroma_shift, v_chroma_shift;
427 int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
428 int w = s->width, h = s->height;
431 return AVERROR(ENOMEM);
433 if (!(s->flags & CODEC_FLAG_EMU_EDGE)) {
438 avcodec_align_dimensions(s, &w, &h);
439 if ((ret = av_image_alloc(buf->base, buf->linesize, w, h,
440 s->pix_fmt, 32)) < 0) {
444 /* XXX this shouldn't be needed, but some tests break without this line
445 * those decoders are buggy and need to be fixed.
446 * the following tests fail:
447 * bethsoft-vid, cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
449 memset(buf->base[0], 128, ret);
451 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
452 for (int i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
453 const int h_shift = i==0 ? 0 : h_chroma_shift;
454 const int v_shift = i==0 ? 0 : v_chroma_shift;
455 if (s->flags & CODEC_FLAG_EMU_EDGE)
456 buf->data[i] = buf->base[i];
458 buf->data[i] = buf->base[i] +
459 FFALIGN((buf->linesize[i]*edge >> v_shift) +
460 (pixel_size*edge >> h_shift), 32);
464 buf->pix_fmt = s->pix_fmt;
471 static void free_buffer_pool(InputStream *ist)
473 FrameBuffer *buf = ist->buffer_pool;
475 ist->buffer_pool = buf->next;
476 av_freep(&buf->base[0]);
478 buf = ist->buffer_pool;
482 static void unref_buffer(InputStream *ist, FrameBuffer *buf)
484 av_assert0(buf->refcount);
486 if (!buf->refcount) {
487 buf->next = ist->buffer_pool;
488 ist->buffer_pool = buf;
492 static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
494 InputStream *ist = s->opaque;
498 if (!ist->buffer_pool && (ret = alloc_buffer(ist, &ist->buffer_pool)) < 0)
501 buf = ist->buffer_pool;
502 ist->buffer_pool = buf->next;
504 if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) {
505 av_freep(&buf->base[0]);
507 if ((ret = alloc_buffer(ist, &buf)) < 0)
513 frame->type = FF_BUFFER_TYPE_USER;
514 frame->extended_data = frame->data;
515 frame->pkt_pts = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE;
517 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
518 frame->base[i] = buf->base[i]; // XXX h264.c uses base though it shouldn't
519 frame->data[i] = buf->data[i];
520 frame->linesize[i] = buf->linesize[i];
526 static void codec_release_buffer(AVCodecContext *s, AVFrame *frame)
528 InputStream *ist = s->opaque;
529 FrameBuffer *buf = frame->opaque;
532 for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++)
533 frame->data[i] = NULL;
535 unref_buffer(ist, buf);
538 static void filter_release_buffer(AVFilterBuffer *fb)
540 FrameBuffer *buf = fb->priv;
542 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 FFSinkContext ffsink_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, &ffsink,
574 "out", NULL, &ffsink_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;
628 #endif /* CONFIG_AVFILTER */
630 static void term_exit(void)
632 av_log(NULL, AV_LOG_QUIET, "");
635 static volatile int received_sigterm = 0;
636 static volatile int received_nb_signals = 0;
639 sigterm_handler(int sig)
641 received_sigterm = sig;
642 received_nb_signals++;
646 static void term_init(void)
648 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
649 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
651 signal(SIGXCPU, sigterm_handler);
655 static int decode_interrupt_cb(void *ctx)
657 return received_nb_signals > 1;
660 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
662 void exit_program(int ret)
667 for (i = 0; i < nb_output_files; i++) {
668 AVFormatContext *s = output_files[i].ctx;
669 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
671 avformat_free_context(s);
672 av_dict_free(&output_files[i].opts);
674 for (i = 0; i < nb_output_streams; i++) {
675 AVBitStreamFilterContext *bsfc = output_streams[i].bitstream_filters;
677 AVBitStreamFilterContext *next = bsfc->next;
678 av_bitstream_filter_close(bsfc);
681 output_streams[i].bitstream_filters = NULL;
684 av_freep(&output_streams[i].avfilter);
687 for (i = 0; i < nb_input_files; i++) {
688 avformat_close_input(&input_files[i].ctx);
690 for (i = 0; i < nb_input_streams; i++) {
691 av_freep(&input_streams[i].decoded_frame);
692 av_freep(&input_streams[i].filtered_frame);
693 av_dict_free(&input_streams[i].opts);
694 free_buffer_pool(&input_streams[i]);
699 av_free(vstats_filename);
701 av_freep(&input_streams);
702 av_freep(&input_files);
703 av_freep(&output_streams);
704 av_freep(&output_files);
709 allocated_audio_buf_size = allocated_audio_out_size = 0;
714 avformat_network_deinit();
716 if (received_sigterm) {
717 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
718 (int) received_sigterm);
725 static void assert_avoptions(AVDictionary *m)
727 AVDictionaryEntry *t;
728 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
729 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
734 static void assert_codec_experimental(AVCodecContext *c, int encoder)
736 const char *codec_string = encoder ? "encoder" : "decoder";
738 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
739 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
740 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
741 "results.\nAdd '-strict experimental' if you want to use it.\n",
742 codec_string, c->codec->name);
743 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
744 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
745 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
746 codec_string, codec->name);
751 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
753 if (codec && codec->sample_fmts) {
754 const enum AVSampleFormat *p = codec->sample_fmts;
755 for (; *p != -1; p++) {
756 if (*p == st->codec->sample_fmt)
760 av_log(NULL, AV_LOG_WARNING,
761 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
762 av_get_sample_fmt_name(st->codec->sample_fmt),
764 av_get_sample_fmt_name(codec->sample_fmts[0]));
765 st->codec->sample_fmt = codec->sample_fmts[0];
771 * Update the requested input sample format based on the output sample format.
772 * This is currently only used to request float output from decoders which
773 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
774 * Ideally this will be removed in the future when decoders do not do format
775 * conversion and only output in their native format.
777 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
780 /* if sample formats match or a decoder sample format has already been
781 requested, just return */
782 if (enc->sample_fmt == dec->sample_fmt ||
783 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
786 /* if decoder supports more than one output format */
787 if (dec_codec && dec_codec->sample_fmts &&
788 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
789 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
790 const enum AVSampleFormat *p;
791 int min_dec = -1, min_inc = -1;
793 /* find a matching sample format in the encoder */
794 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
795 if (*p == enc->sample_fmt) {
796 dec->request_sample_fmt = *p;
798 } else if (*p > enc->sample_fmt) {
799 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
801 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
804 /* if none match, provide the one that matches quality closest */
805 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
806 enc->sample_fmt - min_dec;
810 static void choose_sample_rate(AVStream *st, AVCodec *codec)
812 if (codec && codec->supported_samplerates) {
813 const int *p = codec->supported_samplerates;
815 int best_dist = INT_MAX;
817 int dist = abs(st->codec->sample_rate - *p);
818 if (dist < best_dist) {
824 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
826 st->codec->sample_rate = best;
830 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
832 if (codec && codec->pix_fmts) {
833 const enum PixelFormat *p = codec->pix_fmts;
834 if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
835 if (st->codec->codec_id == CODEC_ID_MJPEG) {
836 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
837 } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
838 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
839 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
842 for (; *p != PIX_FMT_NONE; p++) {
843 if (*p == st->codec->pix_fmt)
846 if (*p == PIX_FMT_NONE) {
847 if (st->codec->pix_fmt != PIX_FMT_NONE)
848 av_log(NULL, AV_LOG_WARNING,
849 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
850 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
852 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
853 st->codec->pix_fmt = codec->pix_fmts[0];
859 get_sync_ipts(const OutputStream *ost)
861 const InputStream *ist = ost->sync_ist;
862 OutputFile *of = &output_files[ost->file_index];
863 return (double)(ist->pts - of->start_time) / AV_TIME_BASE;
866 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
868 AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
869 AVCodecContext *avctx = ost->st->codec;
873 AVPacket new_pkt = *pkt;
874 int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
875 &new_pkt.data, &new_pkt.size,
876 pkt->data, pkt->size,
877 pkt->flags & AV_PKT_FLAG_KEY);
880 new_pkt.destruct = av_destruct_packet;
882 av_log(NULL, AV_LOG_ERROR, "%s failed for stream %d, codec %s",
883 bsfc->filter->name, pkt->stream_index,
884 avctx->codec ? avctx->codec->name : "copy");
894 ret = av_interleaved_write_frame(s, pkt);
896 print_error("av_interleaved_write_frame()", ret);
902 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
904 int fill_char = 0x00;
905 if (sample_fmt == AV_SAMPLE_FMT_U8)
907 memset(buf, fill_char, size);
910 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
911 InputStream *ist, AVFrame *decoded_frame)
914 int64_t audio_out_size, audio_buf_size;
916 int size_out, frame_bytes, ret, resample_changed;
917 AVCodecContext *enc = ost->st->codec;
918 AVCodecContext *dec = ist->st->codec;
919 int osize = av_get_bytes_per_sample(enc->sample_fmt);
920 int isize = av_get_bytes_per_sample(dec->sample_fmt);
921 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
922 uint8_t *buf = decoded_frame->data[0];
923 int size = decoded_frame->nb_samples * dec->channels * isize;
924 int64_t allocated_for_size = size;
927 audio_buf_size = (allocated_for_size + isize * dec->channels - 1) / (isize * dec->channels);
928 audio_buf_size = (audio_buf_size * enc->sample_rate + dec->sample_rate) / dec->sample_rate;
929 audio_buf_size = audio_buf_size * 2 + 10000; // safety factors for the deprecated resampling API
930 audio_buf_size = FFMAX(audio_buf_size, enc->frame_size);
931 audio_buf_size *= osize * enc->channels;
933 audio_out_size = FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
934 if (coded_bps > 8 * osize)
935 audio_out_size = audio_out_size * coded_bps / (8*osize);
936 audio_out_size += FF_MIN_BUFFER_SIZE;
938 if (audio_out_size > INT_MAX || audio_buf_size > INT_MAX) {
939 av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n");
943 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
944 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
945 if (!audio_buf || !audio_out) {
946 av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
950 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
951 ost->audio_resample = 1;
953 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
954 ost->resample_channels != dec->channels ||
955 ost->resample_sample_rate != dec->sample_rate;
957 if ((ost->audio_resample && !ost->resample) || resample_changed) {
958 if (resample_changed) {
959 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",
960 ist->file_index, ist->st->index,
961 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
962 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
963 ost->resample_sample_fmt = dec->sample_fmt;
964 ost->resample_channels = dec->channels;
965 ost->resample_sample_rate = dec->sample_rate;
967 audio_resample_close(ost->resample);
969 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
970 if (audio_sync_method <= 1 &&
971 ost->resample_sample_fmt == enc->sample_fmt &&
972 ost->resample_channels == enc->channels &&
973 ost->resample_sample_rate == enc->sample_rate) {
974 ost->resample = NULL;
975 ost->audio_resample = 0;
976 } else if (ost->audio_resample) {
977 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
978 av_log(NULL, AV_LOG_WARNING, "Using s16 intermediate sample format for resampling\n");
979 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
980 enc->sample_rate, dec->sample_rate,
981 enc->sample_fmt, dec->sample_fmt,
983 if (!ost->resample) {
984 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
985 dec->channels, dec->sample_rate,
986 enc->channels, enc->sample_rate);
992 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
993 if (!ost->audio_resample && dec->sample_fmt != enc->sample_fmt &&
994 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt) != ost->reformat_pair) {
995 if (ost->reformat_ctx)
996 av_audio_convert_free(ost->reformat_ctx);
997 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
998 dec->sample_fmt, 1, NULL, 0);
999 if (!ost->reformat_ctx) {
1000 av_log(NULL, AV_LOG_FATAL, "Cannot convert %s sample format to %s sample format\n",
1001 av_get_sample_fmt_name(dec->sample_fmt),
1002 av_get_sample_fmt_name(enc->sample_fmt));
1005 ost->reformat_pair = MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
1008 if (audio_sync_method) {
1009 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts -
1010 av_fifo_size(ost->fifo) / (enc->channels * osize);
1011 int idelta = delta * dec->sample_rate / enc->sample_rate;
1012 int byte_delta = idelta * isize * dec->channels;
1014 // FIXME resample delay
1015 if (fabs(delta) > 50) {
1016 if (ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate) {
1017 if (byte_delta < 0) {
1018 byte_delta = FFMAX(byte_delta, -size);
1021 av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n",
1022 -byte_delta / (isize * dec->channels));
1027 static uint8_t *input_tmp = NULL;
1028 input_tmp = av_realloc(input_tmp, byte_delta + size);
1030 if (byte_delta > allocated_for_size - size) {
1031 allocated_for_size = byte_delta + (int64_t)size;
1036 generate_silence(input_tmp, dec->sample_fmt, byte_delta);
1037 memcpy(input_tmp + byte_delta, buf, size);
1040 av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
1042 } else if (audio_sync_method > 1) {
1043 int comp = av_clip(delta, -audio_sync_method, audio_sync_method);
1044 av_assert0(ost->audio_resample);
1045 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
1046 delta, comp, enc->sample_rate);
1047 // 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));
1048 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
1052 ost->sync_opts = lrintf(get_sync_ipts(ost) * enc->sample_rate) -
1053 av_fifo_size(ost->fifo) / (enc->channels * osize); // FIXME wrong
1055 if (ost->audio_resample) {
1057 size_out = audio_resample(ost->resample,
1058 (short *)buftmp, (short *)buf,
1059 size / (dec->channels * isize));
1060 size_out = size_out * enc->channels * osize;
1066 if (!ost->audio_resample && dec->sample_fmt != enc->sample_fmt) {
1067 const void *ibuf[6] = { buftmp };
1068 void *obuf[6] = { audio_buf };
1069 int istride[6] = { isize };
1070 int ostride[6] = { osize };
1071 int len = size_out / istride[0];
1072 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len) < 0) {
1073 printf("av_audio_convert() failed\n");
1079 size_out = len * osize;
1082 /* now encode as many frames as possible */
1083 if (enc->frame_size > 1) {
1084 /* output resampled raw samples */
1085 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
1086 av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
1089 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
1091 frame_bytes = enc->frame_size * osize * enc->channels;
1093 while (av_fifo_size(ost->fifo) >= frame_bytes) {
1095 av_init_packet(&pkt);
1097 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
1099 // FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1101 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
1102 (short *)audio_buf);
1104 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1108 pkt.stream_index = ost->index;
1109 pkt.data = audio_out;
1111 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1112 pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1113 pkt.flags |= AV_PKT_FLAG_KEY;
1114 write_frame(s, &pkt, ost);
1116 ost->sync_opts += enc->frame_size;
1120 av_init_packet(&pkt);
1122 ost->sync_opts += size_out / (osize * enc->channels);
1124 /* output a pcm frame */
1125 /* determine the size of the coded buffer */
1128 size_out = size_out * coded_bps / 8;
1130 if (size_out > audio_out_size) {
1131 av_log(NULL, AV_LOG_FATAL, "Internal error, buffer size too small\n");
1135 // FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1136 ret = avcodec_encode_audio(enc, audio_out, size_out,
1139 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1143 pkt.stream_index = ost->index;
1144 pkt.data = audio_out;
1146 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1147 pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1148 pkt.flags |= AV_PKT_FLAG_KEY;
1149 write_frame(s, &pkt, ost);
1153 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1155 AVCodecContext *dec;
1156 AVPicture *picture2;
1157 AVPicture picture_tmp;
1160 dec = ist->st->codec;
1162 /* deinterlace : must be done before any resize */
1163 if (do_deinterlace) {
1166 /* create temporary picture */
1167 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1168 buf = av_malloc(size);
1172 picture2 = &picture_tmp;
1173 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1175 if (avpicture_deinterlace(picture2, picture,
1176 dec->pix_fmt, dec->width, dec->height) < 0) {
1177 /* if error, do not deinterlace */
1178 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1187 if (picture != picture2)
1188 *picture = *picture2;
1192 static void do_subtitle_out(AVFormatContext *s,
1198 static uint8_t *subtitle_out = NULL;
1199 int subtitle_out_max_size = 1024 * 1024;
1200 int subtitle_out_size, nb, i;
1201 AVCodecContext *enc;
1204 if (pts == AV_NOPTS_VALUE) {
1205 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1211 enc = ost->st->codec;
1213 if (!subtitle_out) {
1214 subtitle_out = av_malloc(subtitle_out_max_size);
1217 /* Note: DVB subtitle need one packet to draw them and one other
1218 packet to clear them */
1219 /* XXX: signal it in the codec context ? */
1220 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1225 for (i = 0; i < nb; i++) {
1226 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1227 // start_display_time is required to be 0
1228 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1229 sub->end_display_time -= sub->start_display_time;
1230 sub->start_display_time = 0;
1231 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1232 subtitle_out_max_size, sub);
1233 if (subtitle_out_size < 0) {
1234 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1238 av_init_packet(&pkt);
1239 pkt.stream_index = ost->index;
1240 pkt.data = subtitle_out;
1241 pkt.size = subtitle_out_size;
1242 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1243 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1244 /* XXX: the pts correction is handled here. Maybe handling
1245 it in the codec would be better */
1247 pkt.pts += 90 * sub->start_display_time;
1249 pkt.pts += 90 * sub->end_display_time;
1251 write_frame(s, &pkt, ost);
1255 static int bit_buffer_size = 1024 * 256;
1256 static uint8_t *bit_buffer = NULL;
1258 #if !CONFIG_AVFILTER
1259 static void do_video_resample(OutputStream *ost,
1261 AVFrame *in_picture,
1262 AVFrame **out_picture)
1264 int resample_changed = 0;
1265 AVCodecContext *dec = ist->st->codec;
1266 *out_picture = in_picture;
1268 resample_changed = ost->resample_width != dec->width ||
1269 ost->resample_height != dec->height ||
1270 ost->resample_pix_fmt != dec->pix_fmt;
1272 if (resample_changed) {
1273 av_log(NULL, AV_LOG_INFO,
1274 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1275 ist->file_index, ist->st->index,
1276 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1277 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1278 if (!ost->video_resample)
1279 ost->video_resample = 1;
1282 if (ost->video_resample) {
1283 *out_picture = &ost->pict_tmp;
1284 if (resample_changed) {
1285 /* initialize a new scaler context */
1286 sws_freeContext(ost->img_resample_ctx);
1287 ost->img_resample_ctx = sws_getContext(
1288 ist->st->codec->width,
1289 ist->st->codec->height,
1290 ist->st->codec->pix_fmt,
1291 ost->st->codec->width,
1292 ost->st->codec->height,
1293 ost->st->codec->pix_fmt,
1294 ost->sws_flags, NULL, NULL, NULL);
1295 if (ost->img_resample_ctx == NULL) {
1296 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1300 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1301 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1303 if (resample_changed) {
1304 ost->resample_width = dec->width;
1305 ost->resample_height = dec->height;
1306 ost->resample_pix_fmt = dec->pix_fmt;
1312 static void do_video_out(AVFormatContext *s,
1315 AVFrame *in_picture,
1316 int *frame_size, float quality)
1318 int nb_frames, i, ret, format_video_sync;
1319 AVFrame *final_picture;
1320 AVCodecContext *enc;
1323 enc = ost->st->codec;
1325 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1327 /* by default, we output a single frame */
1332 format_video_sync = video_sync_method;
1333 if (format_video_sync == VSYNC_AUTO)
1334 format_video_sync = (s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH :
1335 (s->oformat->flags & AVFMT_VARIABLE_FPS) ? VSYNC_VFR : VSYNC_CFR;
1337 if (format_video_sync != VSYNC_PASSTHROUGH) {
1338 double vdelta = sync_ipts - ost->sync_opts;
1339 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1342 else if (format_video_sync == VSYNC_VFR) {
1343 if (vdelta <= -0.6) {
1345 } else if (vdelta > 0.6)
1346 ost->sync_opts = lrintf(sync_ipts);
1347 } else if (vdelta > 1.1)
1348 nb_frames = lrintf(vdelta);
1349 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, get_sync_ipts(ost), nb_frames);
1350 if (nb_frames == 0) {
1352 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1353 } else if (nb_frames > 1) {
1354 nb_frames_dup += nb_frames - 1;
1355 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1358 ost->sync_opts = lrintf(sync_ipts);
1360 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1364 #if !CONFIG_AVFILTER
1365 do_video_resample(ost, ist, in_picture, &final_picture);
1367 final_picture = in_picture;
1370 /* duplicates frame if needed */
1371 for (i = 0; i < nb_frames; i++) {
1373 av_init_packet(&pkt);
1374 pkt.stream_index = ost->index;
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 *)final_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);
1390 AVFrame big_picture;
1392 big_picture = *final_picture;
1393 /* better than nothing: use input picture interlaced
1395 big_picture.interlaced_frame = in_picture->interlaced_frame;
1396 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1397 if (ost->top_field_first == -1)
1398 big_picture.top_field_first = in_picture->top_field_first;
1400 big_picture.top_field_first = !!ost->top_field_first;
1403 /* handles same_quant here. This is not correct because it may
1404 not be a global option */
1405 big_picture.quality = quality;
1406 if (!enc->me_threshold)
1407 big_picture.pict_type = 0;
1408 // big_picture.pts = AV_NOPTS_VALUE;
1409 big_picture.pts = ost->sync_opts;
1410 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1411 // av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1412 if (ost->forced_kf_index < ost->forced_kf_count &&
1413 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1414 big_picture.pict_type = AV_PICTURE_TYPE_I;
1415 ost->forced_kf_index++;
1417 ret = avcodec_encode_video(enc,
1418 bit_buffer, bit_buffer_size,
1421 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1426 pkt.data = bit_buffer;
1428 if (enc->coded_frame->pts != AV_NOPTS_VALUE)
1429 pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1430 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1431 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1432 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1434 if (enc->coded_frame->key_frame)
1435 pkt.flags |= AV_PKT_FLAG_KEY;
1436 write_frame(s, &pkt, ost);
1439 // fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1440 // enc->frame_number-1, ret, enc->pict_type);
1441 /* if two pass, output log */
1442 if (ost->logfile && enc->stats_out) {
1443 fprintf(ost->logfile, "%s", enc->stats_out);
1451 static double psnr(double d)
1453 return -10.0 * log(d) / log(10.0);
1456 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1459 AVCodecContext *enc;
1461 double ti1, bitrate, avg_bitrate;
1463 /* this is executed just the first time do_video_stats is called */
1465 vstats_file = fopen(vstats_filename, "w");
1472 enc = ost->st->codec;
1473 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1474 frame_number = ost->frame_number;
1475 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1476 if (enc->flags&CODEC_FLAG_PSNR)
1477 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1479 fprintf(vstats_file,"f_size= %6d ", frame_size);
1480 /* compute pts value */
1481 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1485 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1486 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1487 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1488 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1489 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1493 static void print_report(OutputFile *output_files,
1494 OutputStream *ost_table, int nb_ostreams,
1495 int is_last_report, int64_t timer_start)
1499 AVFormatContext *oc;
1501 AVCodecContext *enc;
1502 int frame_number, vid, i;
1503 double bitrate, ti1, pts;
1504 static int64_t last_time = -1;
1505 static int qp_histogram[52];
1507 if (!print_stats && !is_last_report)
1510 if (!is_last_report) {
1512 /* display the report every 0.5 seconds */
1513 cur_time = av_gettime();
1514 if (last_time == -1) {
1515 last_time = cur_time;
1518 if ((cur_time - last_time) < 500000)
1520 last_time = cur_time;
1524 oc = output_files[0].ctx;
1526 total_size = avio_size(oc->pb);
1527 if (total_size < 0) // FIXME improve avio_size() so it works with non seekable output too
1528 total_size = avio_tell(oc->pb);
1533 for (i = 0; i < nb_ostreams; i++) {
1535 ost = &ost_table[i];
1536 enc = ost->st->codec;
1537 if (!ost->stream_copy && enc->coded_frame)
1538 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
1539 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1540 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1542 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1543 float t = (av_gettime() - timer_start) / 1000000.0;
1545 frame_number = ost->frame_number;
1546 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1547 frame_number, (t > 1) ? (int)(frame_number / t + 0.5) : 0, q);
1549 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1553 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
1555 for (j = 0; j < 32; j++)
1556 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
1558 if (enc->flags&CODEC_FLAG_PSNR) {
1560 double error, error_sum = 0;
1561 double scale, scale_sum = 0;
1562 char type[3] = { 'Y','U','V' };
1563 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1564 for (j = 0; j < 3; j++) {
1565 if (is_last_report) {
1566 error = enc->error[j];
1567 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
1569 error = enc->coded_frame->error[j];
1570 scale = enc->width * enc->height * 255.0 * 255.0;
1576 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error / scale));
1578 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
1582 /* compute min output value */
1583 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1584 if ((pts < ti1) && (pts > 0))
1590 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1592 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1593 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1594 (double)total_size / 1024, ti1, bitrate);
1596 if (nb_frames_dup || nb_frames_drop)
1597 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1598 nb_frames_dup, nb_frames_drop);
1600 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
1604 if (is_last_report) {
1605 int64_t raw= audio_size + video_size + extra_size;
1606 av_log(NULL, AV_LOG_INFO, "\n");
1607 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1608 video_size / 1024.0,
1609 audio_size / 1024.0,
1610 extra_size / 1024.0,
1611 100.0 * (total_size - raw) / raw
1616 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1620 for (i = 0; i < nb_ostreams; i++) {
1621 OutputStream *ost = &ost_table[i];
1622 AVCodecContext *enc = ost->st->codec;
1623 AVFormatContext *os = output_files[ost->file_index].ctx;
1625 if (!ost->encoding_needed)
1628 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
1630 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
1636 av_init_packet(&pkt);
1637 pkt.stream_index = ost->index;
1639 switch (ost->st->codec->codec_type) {
1640 case AVMEDIA_TYPE_AUDIO:
1641 fifo_bytes = av_fifo_size(ost->fifo);
1643 /* encode any samples remaining in fifo */
1644 if (fifo_bytes > 0) {
1645 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1646 int fs_tmp = enc->frame_size;
1648 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1649 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1650 enc->frame_size = fifo_bytes / (osize * enc->channels);
1652 int frame_bytes = enc->frame_size*osize*enc->channels;
1653 if (allocated_audio_buf_size < frame_bytes)
1655 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1658 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1659 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1660 ost->st->time_base.num, enc->sample_rate);
1661 enc->frame_size = fs_tmp;
1664 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1667 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1671 pkt.flags |= AV_PKT_FLAG_KEY;
1673 case AVMEDIA_TYPE_VIDEO:
1674 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1676 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1680 if (enc->coded_frame && enc->coded_frame->key_frame)
1681 pkt.flags |= AV_PKT_FLAG_KEY;
1682 if (ost->logfile && enc->stats_out) {
1683 fprintf(ost->logfile, "%s", enc->stats_out);
1692 pkt.data = bit_buffer;
1694 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1695 pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1696 write_frame(os, &pkt, ost);
1702 * Check whether a packet from ist should be written into ost at this time
1704 static int check_output_constraints(InputStream *ist, OutputStream *ost)
1706 OutputFile *of = &output_files[ost->file_index];
1707 int ist_index = ist - input_streams;
1709 if (ost->source_index != ist_index)
1712 if (of->start_time && ist->pts < of->start_time)
1715 if (of->recording_time != INT64_MAX &&
1716 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1717 (AVRational){ 1, 1000000 }) >= 0) {
1718 ost->is_past_recording_time = 1;
1725 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
1727 OutputFile *of = &output_files[ost->file_index];
1728 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1731 av_init_packet(&opkt);
1733 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
1734 !ost->copy_initial_nonkeyframes)
1737 /* force the input stream PTS */
1738 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1739 audio_size += pkt->size;
1740 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1741 video_size += pkt->size;
1745 opkt.stream_index = ost->index;
1746 if (pkt->pts != AV_NOPTS_VALUE)
1747 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1749 opkt.pts = AV_NOPTS_VALUE;
1751 if (pkt->dts == AV_NOPTS_VALUE)
1752 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1754 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1755 opkt.dts -= ost_tb_start_time;
1757 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1758 opkt.flags = pkt->flags;
1760 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1761 if ( ost->st->codec->codec_id != CODEC_ID_H264
1762 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1763 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1765 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
1766 opkt.destruct = av_destruct_packet;
1768 opkt.data = pkt->data;
1769 opkt.size = pkt->size;
1772 write_frame(of->ctx, &opkt, ost);
1773 ost->st->codec->frame_number++;
1774 av_free_packet(&opkt);
1777 static void rate_emu_sleep(InputStream *ist)
1779 if (input_files[ist->file_index].rate_emu) {
1780 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1781 int64_t now = av_gettime() - ist->start;
1787 static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
1789 AVFrame *decoded_frame;
1790 AVCodecContext *avctx = ist->st->codec;
1791 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1794 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
1795 return AVERROR(ENOMEM);
1797 avcodec_get_frame_defaults(ist->decoded_frame);
1798 decoded_frame = ist->decoded_frame;
1800 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
1806 /* no audio frame */
1810 /* if the decoder provides a pts, use it instead of the last packet pts.
1811 the decoder could be delaying output by a packet or more. */
1812 if (decoded_frame->pts != AV_NOPTS_VALUE)
1813 ist->next_pts = decoded_frame->pts;
1815 /* increment next_pts to use for the case where the input stream does not
1816 have timestamps or there are multiple frames in the packet */
1817 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
1820 // preprocess audio (volume)
1821 if (audio_volume != 256) {
1822 int decoded_data_size = decoded_frame->nb_samples * avctx->channels * bps;
1823 void *samples = decoded_frame->data[0];
1824 switch (avctx->sample_fmt) {
1825 case AV_SAMPLE_FMT_U8:
1827 uint8_t *volp = samples;
1828 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1829 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
1830 *volp++ = av_clip_uint8(v);
1834 case AV_SAMPLE_FMT_S16:
1836 int16_t *volp = samples;
1837 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1838 int v = ((*volp) * audio_volume + 128) >> 8;
1839 *volp++ = av_clip_int16(v);
1843 case AV_SAMPLE_FMT_S32:
1845 int32_t *volp = samples;
1846 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1847 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
1848 *volp++ = av_clipl_int32(v);
1852 case AV_SAMPLE_FMT_FLT:
1854 float *volp = samples;
1855 float scale = audio_volume / 256.f;
1856 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1861 case AV_SAMPLE_FMT_DBL:
1863 double *volp = samples;
1864 double scale = audio_volume / 256.;
1865 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1871 av_log(NULL, AV_LOG_FATAL,
1872 "Audio volume adjustment on sample format %s is not supported.\n",
1873 av_get_sample_fmt_name(ist->st->codec->sample_fmt));
1878 rate_emu_sleep(ist);
1880 for (i = 0; i < nb_output_streams; i++) {
1881 OutputStream *ost = &output_streams[i];
1883 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1885 do_audio_out(output_files[ost->file_index].ctx, ost, ist, decoded_frame);
1891 static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *pkt_pts)
1893 AVFrame *decoded_frame, *filtered_frame = NULL;
1894 void *buffer_to_free = NULL;
1898 int frame_available = 1;
1901 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
1902 return AVERROR(ENOMEM);
1904 avcodec_get_frame_defaults(ist->decoded_frame);
1905 decoded_frame = ist->decoded_frame;
1906 pkt->pts = *pkt_pts;
1907 pkt->dts = ist->pts;
1908 *pkt_pts = AV_NOPTS_VALUE;
1910 ret = avcodec_decode_video2(ist->st->codec,
1911 decoded_frame, got_output, pkt);
1915 quality = same_quant ? decoded_frame->quality : 0;
1917 /* no picture yet */
1920 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, decoded_frame->pkt_pts,
1921 decoded_frame->pkt_dts);
1923 ist->next_pts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
1924 else if (ist->st->codec->time_base.num != 0) {
1925 int ticks = ist->st->parser ? ist->st->parser->repeat_pict + 1 :
1926 ist->st->codec->ticks_per_frame;
1927 ist->next_pts += ((int64_t)AV_TIME_BASE *
1928 ist->st->codec->time_base.num * ticks) /
1929 ist->st->codec->time_base.den;
1932 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
1934 rate_emu_sleep(ist);
1936 for (i = 0; i < nb_output_streams; i++) {
1937 OutputStream *ost = &output_streams[i];
1938 int frame_size, resample_changed;
1940 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1944 resample_changed = ost->resample_width != decoded_frame->width ||
1945 ost->resample_height != decoded_frame->height ||
1946 ost->resample_pix_fmt != decoded_frame->format;
1947 if (resample_changed) {
1948 av_log(NULL, AV_LOG_INFO,
1949 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1950 ist->file_index, ist->st->index,
1951 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1952 decoded_frame->width, decoded_frame->height, av_get_pix_fmt_name(decoded_frame->format));
1954 avfilter_graph_free(&ost->graph);
1955 if (configure_video_filters(ist, ost)) {
1956 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
1960 ost->resample_width = decoded_frame->width;
1961 ost->resample_height = decoded_frame->height;
1962 ost->resample_pix_fmt = decoded_frame->format;
1965 if (ist->st->sample_aspect_ratio.num)
1966 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
1967 if (ist->st->codec->codec->capabilities & CODEC_CAP_DR1) {
1968 FrameBuffer *buf = decoded_frame->opaque;
1969 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
1970 decoded_frame->data, decoded_frame->linesize,
1971 AV_PERM_READ | AV_PERM_PRESERVE,
1972 ist->st->codec->width, ist->st->codec->height,
1973 ist->st->codec->pix_fmt);
1975 avfilter_copy_frame_props(fb, decoded_frame);
1977 fb->buf->priv = buf;
1978 fb->buf->free = filter_release_buffer;
1981 av_buffersrc_buffer(ost->input_video_filter, fb);
1983 av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame,
1984 ist->pts, decoded_frame->sample_aspect_ratio);
1986 if (!ist->filtered_frame && !(ist->filtered_frame = avcodec_alloc_frame())) {
1987 av_free(buffer_to_free);
1988 return AVERROR(ENOMEM);
1990 avcodec_get_frame_defaults(ist->filtered_frame);
1991 filtered_frame = ist->filtered_frame;
1993 frame_available = avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1994 while (frame_available) {
1995 AVRational ist_pts_tb;
1996 if (ost->output_video_filter)
1997 get_filtered_video_frame(ost->output_video_filter, filtered_frame, &ost->picref, &ist_pts_tb);
1999 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
2000 if (ost->picref->video && !ost->frame_aspect_ratio)
2001 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
2003 filtered_frame = decoded_frame;
2006 do_video_out(output_files[ost->file_index].ctx, ost, ist, filtered_frame, &frame_size,
2007 same_quant ? quality : ost->st->codec->global_quality);
2008 if (vstats_filename && frame_size)
2009 do_video_stats(output_files[ost->file_index].ctx, ost, frame_size);
2011 frame_available = ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
2013 avfilter_unref_buffer(ost->picref);
2018 av_free(buffer_to_free);
2022 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2024 AVSubtitle subtitle;
2025 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2026 &subtitle, got_output, pkt);
2032 rate_emu_sleep(ist);
2034 for (i = 0; i < nb_output_streams; i++) {
2035 OutputStream *ost = &output_streams[i];
2037 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2040 do_subtitle_out(output_files[ost->file_index].ctx, ost, ist, &subtitle, pkt->pts);
2043 avsubtitle_free(&subtitle);
2047 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2048 static int output_packet(InputStream *ist,
2049 OutputStream *ost_table, int nb_ostreams,
2050 const AVPacket *pkt)
2054 int64_t pkt_pts = AV_NOPTS_VALUE;
2057 if (ist->next_pts == AV_NOPTS_VALUE)
2058 ist->next_pts = ist->pts;
2062 av_init_packet(&avpkt);
2070 if (pkt->dts != AV_NOPTS_VALUE)
2071 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2072 if (pkt->pts != AV_NOPTS_VALUE)
2073 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2075 // while we have more to decode or while the decoder did output something on EOF
2076 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2080 ist->pts = ist->next_pts;
2082 if (avpkt.size && avpkt.size != pkt->size) {
2083 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2084 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2085 ist->showed_multi_packet_warning = 1;
2088 switch (ist->st->codec->codec_type) {
2089 case AVMEDIA_TYPE_AUDIO:
2090 ret = transcode_audio (ist, &avpkt, &got_output);
2092 case AVMEDIA_TYPE_VIDEO:
2093 ret = transcode_video (ist, &avpkt, &got_output, &pkt_pts);
2095 case AVMEDIA_TYPE_SUBTITLE:
2096 ret = transcode_subtitles(ist, &avpkt, &got_output);
2104 // touch data and size only if not EOF
2114 /* handle stream copy */
2115 if (!ist->decoding_needed) {
2116 rate_emu_sleep(ist);
2117 ist->pts = ist->next_pts;
2118 switch (ist->st->codec->codec_type) {
2119 case AVMEDIA_TYPE_AUDIO:
2120 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2121 ist->st->codec->sample_rate;
2123 case AVMEDIA_TYPE_VIDEO:
2124 if (ist->st->codec->time_base.num != 0) {
2125 int ticks = ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2126 ist->next_pts += ((int64_t)AV_TIME_BASE *
2127 ist->st->codec->time_base.num * ticks) /
2128 ist->st->codec->time_base.den;
2133 for (i = 0; pkt && i < nb_ostreams; i++) {
2134 OutputStream *ost = &ost_table[i];
2136 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2139 do_streamcopy(ist, ost, pkt);
2145 static void print_sdp(OutputFile *output_files, int n)
2149 AVFormatContext **avc = av_malloc(sizeof(*avc) * n);
2153 for (i = 0; i < n; i++)
2154 avc[i] = output_files[i].ctx;
2156 av_sdp_create(avc, n, sdp, sizeof(sdp));
2157 printf("SDP:\n%s\n", sdp);
2162 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
2163 char *error, int error_len)
2166 InputStream *ist = &input_streams[ist_index];
2167 if (ist->decoding_needed) {
2168 AVCodec *codec = ist->dec;
2170 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d:%d",
2171 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2172 return AVERROR(EINVAL);
2175 /* update requested sample format for the decoder based on the
2176 corresponding encoder sample format */
2177 for (i = 0; i < nb_output_streams; i++) {
2178 OutputStream *ost = &output_streams[i];
2179 if (ost->source_index == ist_index) {
2180 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
2185 if (codec->type == AVMEDIA_TYPE_VIDEO && codec->capabilities & CODEC_CAP_DR1) {
2186 ist->st->codec->get_buffer = codec_get_buffer;
2187 ist->st->codec->release_buffer = codec_release_buffer;
2188 ist->st->codec->opaque = ist;
2191 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2192 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2193 ist->file_index, ist->st->index);
2194 return AVERROR(EINVAL);
2196 assert_codec_experimental(ist->st->codec, 0);
2197 assert_avoptions(ist->opts);
2200 ist->pts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames * AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
2201 ist->next_pts = AV_NOPTS_VALUE;
2202 init_pts_correction(&ist->pts_ctx);
2208 static int transcode_init(OutputFile *output_files,
2209 int nb_output_files,
2210 InputFile *input_files,
2213 int ret = 0, i, j, k;
2214 AVFormatContext *oc;
2215 AVCodecContext *codec, *icodec;
2221 /* init framerate emulation */
2222 for (i = 0; i < nb_input_files; i++) {
2223 InputFile *ifile = &input_files[i];
2224 if (ifile->rate_emu)
2225 for (j = 0; j < ifile->nb_streams; j++)
2226 input_streams[j + ifile->ist_index].start = av_gettime();
2229 /* output stream init */
2230 for (i = 0; i < nb_output_files; i++) {
2231 oc = output_files[i].ctx;
2232 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2233 av_dump_format(oc, i, oc->filename, 1);
2234 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2235 return AVERROR(EINVAL);
2239 /* for each output stream, we compute the right encoding parameters */
2240 for (i = 0; i < nb_output_streams; i++) {
2241 ost = &output_streams[i];
2242 oc = output_files[ost->file_index].ctx;
2243 ist = &input_streams[ost->source_index];
2245 if (ost->attachment_filename)
2248 codec = ost->st->codec;
2249 icodec = ist->st->codec;
2251 ost->st->disposition = ist->st->disposition;
2252 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2253 codec->chroma_sample_location = icodec->chroma_sample_location;
2255 if (ost->stream_copy) {
2256 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2258 if (extra_size > INT_MAX) {
2259 return AVERROR(EINVAL);
2262 /* if stream_copy is selected, no need to decode or encode */
2263 codec->codec_id = icodec->codec_id;
2264 codec->codec_type = icodec->codec_type;
2266 if (!codec->codec_tag) {
2267 if (!oc->oformat->codec_tag ||
2268 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2269 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2270 codec->codec_tag = icodec->codec_tag;
2273 codec->bit_rate = icodec->bit_rate;
2274 codec->rc_max_rate = icodec->rc_max_rate;
2275 codec->rc_buffer_size = icodec->rc_buffer_size;
2276 codec->field_order = icodec->field_order;
2277 codec->extradata = av_mallocz(extra_size);
2278 if (!codec->extradata) {
2279 return AVERROR(ENOMEM);
2281 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2282 codec->extradata_size = icodec->extradata_size;
2284 codec->time_base = icodec->time_base;
2285 codec->time_base.num *= icodec->ticks_per_frame;
2286 av_reduce(&codec->time_base.num, &codec->time_base.den,
2287 codec->time_base.num, codec->time_base.den, INT_MAX);
2289 codec->time_base = ist->st->time_base;
2291 switch (codec->codec_type) {
2292 case AVMEDIA_TYPE_AUDIO:
2293 if (audio_volume != 256) {
2294 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2297 codec->channel_layout = icodec->channel_layout;
2298 codec->sample_rate = icodec->sample_rate;
2299 codec->channels = icodec->channels;
2300 codec->frame_size = icodec->frame_size;
2301 codec->audio_service_type = icodec->audio_service_type;
2302 codec->block_align = icodec->block_align;
2304 case AVMEDIA_TYPE_VIDEO:
2305 codec->pix_fmt = icodec->pix_fmt;
2306 codec->width = icodec->width;
2307 codec->height = icodec->height;
2308 codec->has_b_frames = icodec->has_b_frames;
2309 if (!codec->sample_aspect_ratio.num) {
2310 codec->sample_aspect_ratio =
2311 ost->st->sample_aspect_ratio =
2312 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2313 ist->st->codec->sample_aspect_ratio.num ?
2314 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2317 case AVMEDIA_TYPE_SUBTITLE:
2318 codec->width = icodec->width;
2319 codec->height = icodec->height;
2321 case AVMEDIA_TYPE_DATA:
2322 case AVMEDIA_TYPE_ATTACHMENT:
2329 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2331 ist->decoding_needed = 1;
2332 ost->encoding_needed = 1;
2334 switch (codec->codec_type) {
2335 case AVMEDIA_TYPE_AUDIO:
2336 ost->fifo = av_fifo_alloc(1024);
2338 return AVERROR(ENOMEM);
2340 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2342 if (!codec->sample_rate)
2343 codec->sample_rate = icodec->sample_rate;
2344 choose_sample_rate(ost->st, ost->enc);
2345 codec->time_base = (AVRational){ 1, codec->sample_rate };
2347 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2348 codec->sample_fmt = icodec->sample_fmt;
2349 choose_sample_fmt(ost->st, ost->enc);
2351 if (!codec->channels)
2352 codec->channels = icodec->channels;
2353 codec->channel_layout = icodec->channel_layout;
2354 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2355 codec->channel_layout = 0;
2357 ost->audio_resample = codec-> sample_rate != icodec->sample_rate || audio_sync_method > 1;
2358 icodec->request_channels = codec-> channels;
2359 ost->resample_sample_fmt = icodec->sample_fmt;
2360 ost->resample_sample_rate = icodec->sample_rate;
2361 ost->resample_channels = icodec->channels;
2363 case AVMEDIA_TYPE_VIDEO:
2364 if (codec->pix_fmt == PIX_FMT_NONE)
2365 codec->pix_fmt = icodec->pix_fmt;
2366 choose_pixel_fmt(ost->st, ost->enc);
2368 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2369 av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2373 if (!codec->width || !codec->height) {
2374 codec->width = icodec->width;
2375 codec->height = icodec->height;
2378 ost->video_resample = codec->width != icodec->width ||
2379 codec->height != icodec->height ||
2380 codec->pix_fmt != icodec->pix_fmt;
2381 if (ost->video_resample) {
2382 #if !CONFIG_AVFILTER
2383 avcodec_get_frame_defaults(&ost->pict_tmp);
2384 if (avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2385 codec->width, codec->height)) {
2386 av_log(NULL, AV_LOG_FATAL, "Cannot allocate temp picture, check pix fmt\n");
2389 ost->img_resample_ctx = sws_getContext(
2396 ost->sws_flags, NULL, NULL, NULL);
2397 if (ost->img_resample_ctx == NULL) {
2398 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
2402 codec->bits_per_raw_sample = 0;
2405 ost->resample_height = icodec->height;
2406 ost->resample_width = icodec->width;
2407 ost->resample_pix_fmt = icodec->pix_fmt;
2409 if (!ost->frame_rate.num)
2410 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational) { 25, 1 };
2411 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2412 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2413 ost->frame_rate = ost->enc->supported_framerates[idx];
2415 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2418 if (configure_video_filters(ist, ost)) {
2419 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2424 case AVMEDIA_TYPE_SUBTITLE:
2431 if ((codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2432 char logfilename[1024];
2435 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2436 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2438 if (codec->flags & CODEC_FLAG_PASS1) {
2439 f = fopen(logfilename, "wb");
2441 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2442 logfilename, strerror(errno));
2448 size_t logbuffer_size;
2449 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2450 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2454 codec->stats_in = logbuffer;
2458 if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2459 int size = codec->width * codec->height;
2460 bit_buffer_size = FFMAX(bit_buffer_size, 6 * size + 200);
2465 bit_buffer = av_malloc(bit_buffer_size);
2467 av_log(NULL, AV_LOG_ERROR, "Cannot allocate %d bytes output buffer\n",
2469 return AVERROR(ENOMEM);
2472 /* open each encoder */
2473 for (i = 0; i < nb_output_streams; i++) {
2474 ost = &output_streams[i];
2475 if (ost->encoding_needed) {
2476 AVCodec *codec = ost->enc;
2477 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2479 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d:%d",
2480 ost->st->codec->codec_id, ost->file_index, ost->index);
2481 ret = AVERROR(EINVAL);
2484 if (dec->subtitle_header) {
2485 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2486 if (!ost->st->codec->subtitle_header) {
2487 ret = AVERROR(ENOMEM);
2490 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2491 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2493 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2494 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2495 ost->file_index, ost->index);
2496 ret = AVERROR(EINVAL);
2499 assert_codec_experimental(ost->st->codec, 1);
2500 assert_avoptions(ost->opts);
2501 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2502 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2503 "It takes bits/s as argument, not kbits/s\n");
2504 extra_size += ost->st->codec->extradata_size;
2506 if (ost->st->codec->me_threshold)
2507 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2511 /* init input streams */
2512 for (i = 0; i < nb_input_streams; i++)
2513 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2516 /* discard unused programs */
2517 for (i = 0; i < nb_input_files; i++) {
2518 InputFile *ifile = &input_files[i];
2519 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2520 AVProgram *p = ifile->ctx->programs[j];
2521 int discard = AVDISCARD_ALL;
2523 for (k = 0; k < p->nb_stream_indexes; k++)
2524 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2525 discard = AVDISCARD_DEFAULT;
2528 p->discard = discard;
2532 /* open files and write file headers */
2533 for (i = 0; i < nb_output_files; i++) {
2534 oc = output_files[i].ctx;
2535 oc->interrupt_callback = int_cb;
2536 if (avformat_write_header(oc, &output_files[i].opts) < 0) {
2537 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2538 ret = AVERROR(EINVAL);
2541 assert_avoptions(output_files[i].opts);
2542 if (strcmp(oc->oformat->name, "rtp")) {
2548 /* dump the file output parameters - cannot be done before in case
2550 for (i = 0; i < nb_output_files; i++) {
2551 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2554 /* dump the stream mapping */
2555 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2556 for (i = 0; i < nb_output_streams; i++) {
2557 ost = &output_streams[i];
2559 if (ost->attachment_filename) {
2560 /* an attached file */
2561 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
2562 ost->attachment_filename, ost->file_index, ost->index);
2565 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
2566 input_streams[ost->source_index].file_index,
2567 input_streams[ost->source_index].st->index,
2570 if (ost->sync_ist != &input_streams[ost->source_index])
2571 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2572 ost->sync_ist->file_index,
2573 ost->sync_ist->st->index);
2574 if (ost->stream_copy)
2575 av_log(NULL, AV_LOG_INFO, " (copy)");
2577 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2578 input_streams[ost->source_index].dec->name : "?",
2579 ost->enc ? ost->enc->name : "?");
2580 av_log(NULL, AV_LOG_INFO, "\n");
2584 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2589 print_sdp(output_files, nb_output_files);
2596 * The following code is the main loop of the file converter
2598 static int transcode(OutputFile *output_files,
2599 int nb_output_files,
2600 InputFile *input_files,
2604 AVFormatContext *is, *os;
2608 int no_packet_count = 0;
2609 int64_t timer_start;
2611 if (!(no_packet = av_mallocz(nb_input_files)))
2614 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2618 av_log(NULL, AV_LOG_INFO, "Press ctrl-c to stop encoding\n");
2621 timer_start = av_gettime();
2623 for (; received_sigterm == 0;) {
2624 int file_index, ist_index;
2629 ipts_min = INT64_MAX;
2632 /* select the stream that we must read now by looking at the
2633 smallest output pts */
2635 for (i = 0; i < nb_output_streams; i++) {
2639 ost = &output_streams[i];
2640 of = &output_files[ost->file_index];
2641 os = output_files[ost->file_index].ctx;
2642 ist = &input_streams[ost->source_index];
2643 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2644 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2646 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2648 if (!input_files[ist->file_index].eof_reached) {
2649 if (ipts < ipts_min) {
2652 file_index = ist->file_index;
2654 if (opts < opts_min) {
2656 if (!input_sync) file_index = ist->file_index;
2659 if (ost->frame_number >= ost->max_frames) {
2661 for (j = 0; j < of->ctx->nb_streams; j++)
2662 output_streams[of->ost_index + j].is_past_recording_time = 1;
2666 /* if none, if is finished */
2667 if (file_index < 0) {
2668 if (no_packet_count) {
2669 no_packet_count = 0;
2670 memset(no_packet, 0, nb_input_files);
2677 /* read a frame from it and output it in the fifo */
2678 is = input_files[file_index].ctx;
2679 ret = av_read_frame(is, &pkt);
2680 if (ret == AVERROR(EAGAIN)) {
2681 no_packet[file_index] = 1;
2686 input_files[file_index].eof_reached = 1;
2693 no_packet_count = 0;
2694 memset(no_packet, 0, nb_input_files);
2697 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2698 is->streams[pkt.stream_index]);
2700 /* the following test is needed in case new streams appear
2701 dynamically in stream : we ignore them */
2702 if (pkt.stream_index >= input_files[file_index].nb_streams)
2703 goto discard_packet;
2704 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2705 ist = &input_streams[ist_index];
2707 goto discard_packet;
2709 if (pkt.dts != AV_NOPTS_VALUE)
2710 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2711 if (pkt.pts != AV_NOPTS_VALUE)
2712 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2714 if (pkt.pts != AV_NOPTS_VALUE)
2715 pkt.pts *= ist->ts_scale;
2716 if (pkt.dts != AV_NOPTS_VALUE)
2717 pkt.dts *= ist->ts_scale;
2719 //fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n",
2721 // pkt.dts, input_files[ist->file_index].ts_offset,
2722 // ist->st->codec->codec_type);
2723 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2724 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2725 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2726 int64_t delta = pkt_dts - ist->next_pts;
2727 if ((FFABS(delta) > 1LL * dts_delta_threshold * AV_TIME_BASE || pkt_dts + 1 < ist->pts) && !copy_ts) {
2728 input_files[ist->file_index].ts_offset -= delta;
2729 av_log(NULL, AV_LOG_DEBUG,
2730 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2731 delta, input_files[ist->file_index].ts_offset);
2732 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2733 if (pkt.pts != AV_NOPTS_VALUE)
2734 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2738 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2739 if (output_packet(ist, output_streams, nb_output_streams, &pkt) < 0) {
2741 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
2742 ist->file_index, ist->st->index);
2745 av_free_packet(&pkt);
2750 av_free_packet(&pkt);
2752 /* dump report by using the output first video and audio streams */
2753 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2756 /* at the end of stream, we must flush the decoder buffers */
2757 for (i = 0; i < nb_input_streams; i++) {
2758 ist = &input_streams[i];
2759 if (ist->decoding_needed) {
2760 output_packet(ist, output_streams, nb_output_streams, NULL);
2763 flush_encoders(output_streams, nb_output_streams);
2767 /* write the trailer if needed and close file */
2768 for (i = 0; i < nb_output_files; i++) {
2769 os = output_files[i].ctx;
2770 av_write_trailer(os);
2773 /* dump report by using the first video and audio streams */
2774 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2776 /* close each encoder */
2777 for (i = 0; i < nb_output_streams; i++) {
2778 ost = &output_streams[i];
2779 if (ost->encoding_needed) {
2780 av_freep(&ost->st->codec->stats_in);
2781 avcodec_close(ost->st->codec);
2784 avfilter_graph_free(&ost->graph);
2788 /* close each decoder */
2789 for (i = 0; i < nb_input_streams; i++) {
2790 ist = &input_streams[i];
2791 if (ist->decoding_needed) {
2792 avcodec_close(ist->st->codec);
2800 av_freep(&bit_buffer);
2801 av_freep(&no_packet);
2803 if (output_streams) {
2804 for (i = 0; i < nb_output_streams; i++) {
2805 ost = &output_streams[i];
2807 if (ost->stream_copy)
2808 av_freep(&ost->st->codec->extradata);
2810 fclose(ost->logfile);
2811 ost->logfile = NULL;
2813 av_fifo_free(ost->fifo); /* works even if fifo is not
2814 initialized but set to zero */
2815 av_freep(&ost->st->codec->subtitle_header);
2816 av_free(ost->pict_tmp.data[0]);
2817 av_free(ost->forced_kf_pts);
2818 if (ost->video_resample)
2819 sws_freeContext(ost->img_resample_ctx);
2821 audio_resample_close(ost->resample);
2822 if (ost->reformat_ctx)
2823 av_audio_convert_free(ost->reformat_ctx);
2824 av_dict_free(&ost->opts);
2831 static double parse_frame_aspect_ratio(const char *arg)
2838 p = strchr(arg, ':');
2840 x = strtol(arg, &end, 10);
2842 y = strtol(end + 1, &end, 10);
2844 ar = (double)x / (double)y;
2846 ar = strtod(arg, NULL);
2849 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
2855 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2857 return parse_option(o, "codec:a", arg, options);
2860 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2862 return parse_option(o, "codec:v", arg, options);
2865 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2867 return parse_option(o, "codec:s", arg, options);
2870 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2872 return parse_option(o, "codec:d", arg, options);
2875 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2877 StreamMap *m = NULL;
2878 int i, negative = 0, file_idx;
2879 int sync_file_idx = -1, sync_stream_idx;
2887 map = av_strdup(arg);
2889 /* parse sync stream first, just pick first matching stream */
2890 if (sync = strchr(map, ',')) {
2892 sync_file_idx = strtol(sync + 1, &sync, 0);
2893 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2894 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
2899 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2900 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2901 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2902 sync_stream_idx = i;
2905 if (i == input_files[sync_file_idx].nb_streams) {
2906 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
2907 "match any streams.\n", arg);
2913 file_idx = strtol(map, &p, 0);
2914 if (file_idx >= nb_input_files || file_idx < 0) {
2915 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
2919 /* disable some already defined maps */
2920 for (i = 0; i < o->nb_stream_maps; i++) {
2921 m = &o->stream_maps[i];
2922 if (file_idx == m->file_index &&
2923 check_stream_specifier(input_files[m->file_index].ctx,
2924 input_files[m->file_index].ctx->streams[m->stream_index],
2925 *p == ':' ? p + 1 : p) > 0)
2929 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2930 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2931 *p == ':' ? p + 1 : p) <= 0)
2933 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2934 &o->nb_stream_maps, o->nb_stream_maps + 1);
2935 m = &o->stream_maps[o->nb_stream_maps - 1];
2937 m->file_index = file_idx;
2938 m->stream_index = i;
2940 if (sync_file_idx >= 0) {
2941 m->sync_file_index = sync_file_idx;
2942 m->sync_stream_index = sync_stream_idx;
2944 m->sync_file_index = file_idx;
2945 m->sync_stream_index = i;
2950 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
2958 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
2960 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
2961 &o->nb_attachments, o->nb_attachments + 1);
2962 o->attachments[o->nb_attachments - 1] = arg;
2967 * Parse a metadata specifier in arg.
2968 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
2969 * @param index for type c/p, chapter/program index is written here
2970 * @param stream_spec for type s, the stream specifier is written here
2972 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
2980 if (*(++arg) && *arg != ':') {
2981 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
2984 *stream_spec = *arg == ':' ? arg + 1 : "";
2988 if (*(++arg) == ':')
2989 *index = strtol(++arg, NULL, 0);
2992 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
2999 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
3001 AVDictionary **meta_in = NULL;
3002 AVDictionary **meta_out;
3004 char type_in, type_out;
3005 const char *istream_spec = NULL, *ostream_spec = NULL;
3006 int idx_in = 0, idx_out = 0;
3008 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
3009 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
3011 if (type_in == 'g' || type_out == 'g')
3012 o->metadata_global_manual = 1;
3013 if (type_in == 's' || type_out == 's')
3014 o->metadata_streams_manual = 1;
3015 if (type_in == 'c' || type_out == 'c')
3016 o->metadata_chapters_manual = 1;
3018 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3019 if ((index) < 0 || (index) >= (nb_elems)) {\
3020 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
3025 #define SET_DICT(type, meta, context, index)\
3028 meta = &context->metadata;\
3031 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
3032 meta = &context->chapters[index]->metadata;\
3035 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
3036 meta = &context->programs[index]->metadata;\
3040 SET_DICT(type_in, meta_in, ic, idx_in);
3041 SET_DICT(type_out, meta_out, oc, idx_out);
3043 /* for input streams choose first matching stream */
3044 if (type_in == 's') {
3045 for (i = 0; i < ic->nb_streams; i++) {
3046 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
3047 meta_in = &ic->streams[i]->metadata;
3053 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
3058 if (type_out == 's') {
3059 for (i = 0; i < oc->nb_streams; i++) {
3060 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
3061 meta_out = &oc->streams[i]->metadata;
3062 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3067 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3072 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
3074 const char *codec_string = encoder ? "encoder" : "decoder";
3078 avcodec_find_encoder_by_name(name) :
3079 avcodec_find_decoder_by_name(name);
3081 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
3084 if (codec->type != type) {
3085 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
3091 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
3093 char *codec_name = NULL;
3095 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
3097 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
3098 st->codec->codec_id = codec->id;
3101 return avcodec_find_decoder(st->codec->codec_id);
3105 * Add all the streams from the given input file to the global
3106 * list of input streams.
3108 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
3112 for (i = 0; i < ic->nb_streams; i++) {
3113 AVStream *st = ic->streams[i];
3114 AVCodecContext *dec = st->codec;
3117 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3118 ist = &input_streams[nb_input_streams - 1];
3120 ist->file_index = nb_input_files;
3122 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
3124 ist->ts_scale = 1.0;
3125 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
3127 ist->dec = choose_decoder(o, ic, st);
3129 switch (dec->codec_type) {
3130 case AVMEDIA_TYPE_AUDIO:
3131 if (o->audio_disable)
3132 st->discard = AVDISCARD_ALL;
3134 case AVMEDIA_TYPE_VIDEO:
3136 dec->flags |= CODEC_FLAG_EMU_EDGE;
3137 dec->height >>= dec->lowres;
3138 dec->width >>= dec->lowres;
3141 if (o->video_disable)
3142 st->discard = AVDISCARD_ALL;
3143 else if (video_discard)
3144 st->discard = video_discard;
3146 case AVMEDIA_TYPE_DATA:
3148 case AVMEDIA_TYPE_SUBTITLE:
3149 if (o->subtitle_disable)
3150 st->discard = AVDISCARD_ALL;
3152 case AVMEDIA_TYPE_ATTACHMENT:
3153 case AVMEDIA_TYPE_UNKNOWN:
3161 static void assert_file_overwrite(const char *filename)
3163 if (!file_overwrite &&
3164 (strchr(filename, ':') == NULL || filename[1] == ':' ||
3165 av_strstart(filename, "file:", NULL))) {
3166 if (avio_check(filename, 0) == 0) {
3168 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3170 if (!read_yesno()) {
3171 fprintf(stderr, "Not overwriting - exiting\n");
3176 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3183 static void dump_attachment(AVStream *st, const char *filename)
3186 AVIOContext *out = NULL;
3187 AVDictionaryEntry *e;
3189 if (!st->codec->extradata_size) {
3190 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
3191 nb_input_files - 1, st->index);
3194 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
3195 filename = e->value;
3197 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
3198 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
3202 assert_file_overwrite(filename);
3204 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
3205 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
3210 avio_write(out, st->codec->extradata, st->codec->extradata_size);
3215 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
3217 AVFormatContext *ic;
3218 AVInputFormat *file_iformat = NULL;
3222 AVDictionary **opts;
3223 int orig_nb_streams; // number of streams before avformat_find_stream_info
3226 if (!(file_iformat = av_find_input_format(o->format))) {
3227 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
3232 if (!strcmp(filename, "-"))
3235 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3236 !strcmp(filename, "/dev/stdin");
3238 /* get default parameters from command line */
3239 ic = avformat_alloc_context();
3241 print_error(filename, AVERROR(ENOMEM));
3244 if (o->nb_audio_sample_rate) {
3245 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
3246 av_dict_set(&format_opts, "sample_rate", buf, 0);
3248 if (o->nb_audio_channels) {
3249 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
3250 av_dict_set(&format_opts, "channels", buf, 0);
3252 if (o->nb_frame_rates) {
3253 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
3255 if (o->nb_frame_sizes) {
3256 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
3258 if (o->nb_frame_pix_fmts)
3259 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
3261 ic->flags |= AVFMT_FLAG_NONBLOCK;
3262 ic->interrupt_callback = int_cb;
3264 /* open the input file with generic libav function */
3265 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3267 print_error(filename, err);
3270 assert_avoptions(format_opts);
3272 /* apply forced codec ids */
3273 for (i = 0; i < ic->nb_streams; i++)
3274 choose_decoder(o, ic, ic->streams[i]);
3276 /* Set AVCodecContext options for avformat_find_stream_info */
3277 opts = setup_find_stream_info_opts(ic, codec_opts);
3278 orig_nb_streams = ic->nb_streams;
3280 /* If not enough info to get the stream parameters, we decode the
3281 first frames to get it. (used in mpeg case for example) */
3282 ret = avformat_find_stream_info(ic, opts);
3284 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
3285 avformat_close_input(&ic);
3289 timestamp = o->start_time;
3290 /* add the stream start time */
3291 if (ic->start_time != AV_NOPTS_VALUE)
3292 timestamp += ic->start_time;
3294 /* if seeking requested, we execute it */
3295 if (o->start_time != 0) {
3296 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3298 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
3299 filename, (double)timestamp / AV_TIME_BASE);
3303 /* update the current parameters so that they match the one of the input stream */
3304 add_input_streams(o, ic);
3306 /* dump the file content */
3307 av_dump_format(ic, nb_input_files, filename, 0);
3309 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3310 input_files[nb_input_files - 1].ctx = ic;
3311 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3312 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3313 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3314 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
3316 for (i = 0; i < o->nb_dump_attachment; i++) {
3319 for (j = 0; j < ic->nb_streams; j++) {
3320 AVStream *st = ic->streams[j];
3322 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
3323 dump_attachment(st, o->dump_attachment[i].u.str);
3327 for (i = 0; i < orig_nb_streams; i++)
3328 av_dict_free(&opts[i]);
3335 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3336 AVCodecContext *avctx)
3342 for (p = kf; *p; p++)
3345 ost->forced_kf_count = n;
3346 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3347 if (!ost->forced_kf_pts) {
3348 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3351 for (i = 0; i < n; i++) {
3352 p = i ? strchr(p, ',') + 1 : kf;
3353 t = parse_time_or_die("force_key_frames", p, 1);
3354 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3358 static uint8_t *get_line(AVIOContext *s)
3364 if (avio_open_dyn_buf(&line) < 0) {
3365 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
3369 while ((c = avio_r8(s)) && c != '\n')
3372 avio_close_dyn_buf(line, &buf);
3377 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
3380 char filename[1000];
3381 const char *base[3] = { getenv("AVCONV_DATADIR"),
3386 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
3390 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
3391 i != 1 ? "" : "/.avconv", codec_name, preset_name);
3392 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3395 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
3396 i != 1 ? "" : "/.avconv", preset_name);
3397 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3403 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
3405 char *codec_name = NULL;
3407 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
3409 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
3410 NULL, ost->st->codec->codec_type);
3411 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
3412 } else if (!strcmp(codec_name, "copy"))
3413 ost->stream_copy = 1;
3415 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
3416 ost->st->codec->codec_id = ost->enc->id;
3420 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3423 AVStream *st = avformat_new_stream(oc, NULL);
3424 int idx = oc->nb_streams - 1, ret = 0;
3425 char *bsf = NULL, *next, *codec_tag = NULL;
3426 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3428 char *buf = NULL, *arg = NULL, *preset = NULL;
3429 AVIOContext *s = NULL;
3432 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3436 if (oc->nb_streams - 1 < o->nb_streamid_map)
3437 st->id = o->streamid_map[oc->nb_streams - 1];
3439 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3440 nb_output_streams + 1);
3441 ost = &output_streams[nb_output_streams - 1];
3442 ost->file_index = nb_output_files;
3445 st->codec->codec_type = type;
3446 choose_encoder(o, oc, ost);
3448 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3451 avcodec_get_context_defaults3(st->codec, ost->enc);
3452 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3454 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
3455 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
3458 if (!buf[0] || buf[0] == '#') {
3462 if (!(arg = strchr(buf, '='))) {
3463 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
3467 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
3469 } while (!s->eof_reached);
3473 av_log(NULL, AV_LOG_FATAL,
3474 "Preset %s specified for stream %d:%d, but could not be opened.\n",
3475 preset, ost->file_index, ost->index);
3479 ost->max_frames = INT64_MAX;
3480 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
3482 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3484 if (next = strchr(bsf, ','))
3486 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3487 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3491 bsfc_prev->next = bsfc;
3493 ost->bitstream_filters = bsfc;
3499 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3501 uint32_t tag = strtol(codec_tag, &next, 0);
3503 tag = AV_RL32(codec_tag);
3504 st->codec->codec_tag = tag;
3507 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3508 if (qscale >= 0 || same_quant) {
3509 st->codec->flags |= CODEC_FLAG_QSCALE;
3510 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3513 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
3514 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3516 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3520 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3523 const char *p = str;
3530 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3537 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3541 AVCodecContext *video_enc;
3543 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3545 video_enc = st->codec;
3547 if (!ost->stream_copy) {
3548 const char *p = NULL;
3549 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3550 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3551 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3554 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3555 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3556 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3560 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3561 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3562 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3566 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3567 if (frame_aspect_ratio)
3568 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3570 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3571 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3572 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3575 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3577 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3579 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3580 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
3583 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3585 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3587 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3588 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
3591 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
3594 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
3595 for (i = 0; p; i++) {
3597 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
3599 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
3602 video_enc->rc_override =
3603 av_realloc(video_enc->rc_override,
3604 sizeof(RcOverride) * (i + 1));
3605 video_enc->rc_override[i].start_frame = start;
3606 video_enc->rc_override[i].end_frame = end;
3608 video_enc->rc_override[i].qscale = q;
3609 video_enc->rc_override[i].quality_factor = 1.0;
3612 video_enc->rc_override[i].qscale = 0;
3613 video_enc->rc_override[i].quality_factor = -q/100.0;
3618 video_enc->rc_override_count = i;
3619 if (!video_enc->rc_initial_buffer_occupancy)
3620 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
3621 video_enc->intra_dc_precision = intra_dc_precision - 8;
3626 video_enc->flags |= CODEC_FLAG_PASS1;
3628 video_enc->flags |= CODEC_FLAG_PASS2;
3632 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
3633 if (forced_key_frames)
3634 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3636 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
3638 ost->top_field_first = -1;
3639 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
3642 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
3644 ost->avfilter = av_strdup(filters);
3647 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
3653 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3657 AVCodecContext *audio_enc;
3659 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3662 audio_enc = st->codec;
3663 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3665 if (!ost->stream_copy) {
3666 char *sample_fmt = NULL;
3668 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3670 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
3672 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
3673 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
3677 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
3683 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3687 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3688 if (!ost->stream_copy) {
3689 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
3696 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
3698 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
3699 ost->stream_copy = 1;
3703 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3707 AVCodecContext *subtitle_enc;
3709 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3711 subtitle_enc = st->codec;
3713 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3718 /* arg format is "output-stream-index:streamid-value". */
3719 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
3725 av_strlcpy(idx_str, arg, sizeof(idx_str));
3726 p = strchr(idx_str, ':');
3728 av_log(NULL, AV_LOG_FATAL,
3729 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3734 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3735 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
3736 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3740 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3742 AVFormatContext *is = ifile->ctx;
3743 AVFormatContext *os = ofile->ctx;
3746 for (i = 0; i < is->nb_chapters; i++) {
3747 AVChapter *in_ch = is->chapters[i], *out_ch;
3748 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3749 AV_TIME_BASE_Q, in_ch->time_base);
3750 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3751 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3754 if (in_ch->end < ts_off)
3756 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3759 out_ch = av_mallocz(sizeof(AVChapter));
3761 return AVERROR(ENOMEM);
3763 out_ch->id = in_ch->id;
3764 out_ch->time_base = in_ch->time_base;
3765 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3766 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3769 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3772 os->chapters = av_realloc(os->chapters, sizeof(AVChapter) * os->nb_chapters);
3774 return AVERROR(ENOMEM);
3775 os->chapters[os->nb_chapters - 1] = out_ch;
3780 static void opt_output_file(void *optctx, const char *filename)
3782 OptionsContext *o = optctx;
3783 AVFormatContext *oc;
3785 AVOutputFormat *file_oformat;
3789 if (!strcmp(filename, "-"))
3792 oc = avformat_alloc_context();
3794 print_error(filename, AVERROR(ENOMEM));
3799 file_oformat = av_guess_format(o->format, NULL, NULL);
3800 if (!file_oformat) {
3801 av_log(NULL, AV_LOG_FATAL, "Requested output format '%s' is not a suitable output format\n", o->format);
3805 file_oformat = av_guess_format(NULL, filename, NULL);
3806 if (!file_oformat) {
3807 av_log(NULL, AV_LOG_FATAL, "Unable to find a suitable output format for '%s'\n",
3813 oc->oformat = file_oformat;
3814 oc->interrupt_callback = int_cb;
3815 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3817 if (!o->nb_stream_maps) {
3818 /* pick the "best" stream of each type */
3819 #define NEW_STREAM(type, index)\
3821 ost = new_ ## type ## _stream(o, oc);\
3822 ost->source_index = index;\
3823 ost->sync_ist = &input_streams[index];\
3824 input_streams[index].discard = 0;\
3827 /* video: highest resolution */
3828 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3829 int area = 0, idx = -1;
3830 for (i = 0; i < nb_input_streams; i++) {
3831 ist = &input_streams[i];
3832 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3833 ist->st->codec->width * ist->st->codec->height > area) {
3834 area = ist->st->codec->width * ist->st->codec->height;
3838 NEW_STREAM(video, idx);
3841 /* audio: most channels */
3842 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3843 int channels = 0, idx = -1;
3844 for (i = 0; i < nb_input_streams; i++) {
3845 ist = &input_streams[i];
3846 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3847 ist->st->codec->channels > channels) {
3848 channels = ist->st->codec->channels;
3852 NEW_STREAM(audio, idx);
3855 /* subtitles: pick first */
3856 if (!o->subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3857 for (i = 0; i < nb_input_streams; i++)
3858 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3859 NEW_STREAM(subtitle, i);
3863 /* do something with data? */
3865 for (i = 0; i < o->nb_stream_maps; i++) {
3866 StreamMap *map = &o->stream_maps[i];
3871 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3872 switch (ist->st->codec->codec_type) {
3873 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3874 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3875 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3876 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3877 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
3879 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
3880 map->file_index, map->stream_index);
3884 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3885 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3886 map->sync_stream_index];
3891 /* handle attached files */
3892 for (i = 0; i < o->nb_attachments; i++) {
3894 uint8_t *attachment;
3898 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
3899 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
3903 if ((len = avio_size(pb)) <= 0) {
3904 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
3908 if (!(attachment = av_malloc(len))) {
3909 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
3913 avio_read(pb, attachment, len);
3915 ost = new_attachment_stream(o, oc);
3916 ost->stream_copy = 0;
3917 ost->source_index = -1;
3918 ost->attachment_filename = o->attachments[i];
3919 ost->st->codec->extradata = attachment;
3920 ost->st->codec->extradata_size = len;
3922 p = strrchr(o->attachments[i], '/');
3923 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
3927 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3928 output_files[nb_output_files - 1].ctx = oc;
3929 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3930 output_files[nb_output_files - 1].recording_time = o->recording_time;
3931 output_files[nb_output_files - 1].start_time = o->start_time;
3932 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3933 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3935 /* check filename in case of an image number is expected */
3936 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3937 if (!av_filename_number_test(oc->filename)) {
3938 print_error(oc->filename, AVERROR(EINVAL));
3943 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3944 /* test if it already exists to avoid losing precious files */
3945 assert_file_overwrite(filename);
3948 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
3949 &oc->interrupt_callback,
3950 &output_files[nb_output_files - 1].opts)) < 0) {
3951 print_error(filename, err);
3956 if (o->mux_preload) {
3958 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
3959 av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
3961 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
3962 oc->flags |= AVFMT_FLAG_NONBLOCK;
3965 for (i = 0; i < o->nb_metadata_map; i++) {
3967 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
3969 if (in_file_index < 0)
3971 if (in_file_index >= nb_input_files) {
3972 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
3975 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, input_files[in_file_index].ctx, o);
3979 if (o->chapters_input_file >= nb_input_files) {
3980 if (o->chapters_input_file == INT_MAX) {
3981 /* copy chapters from the first input file that has them*/
3982 o->chapters_input_file = -1;
3983 for (i = 0; i < nb_input_files; i++)
3984 if (input_files[i].ctx->nb_chapters) {
3985 o->chapters_input_file = i;
3989 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
3990 o->chapters_input_file);
3994 if (o->chapters_input_file >= 0)
3995 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
3996 !o->metadata_chapters_manual);
3998 /* copy global metadata by default */
3999 if (!o->metadata_global_manual && nb_input_files)
4000 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
4001 AV_DICT_DONT_OVERWRITE);
4002 if (!o->metadata_streams_manual)
4003 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
4005 if (output_streams[i].source_index < 0) /* this is true e.g. for attached files */
4007 ist = &input_streams[output_streams[i].source_index];
4008 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
4011 /* process manually set metadata */
4012 for (i = 0; i < o->nb_metadata; i++) {
4015 const char *stream_spec;
4016 int index = 0, j, ret;
4018 val = strchr(o->metadata[i].u.str, '=');
4020 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
4021 o->metadata[i].u.str);
4026 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
4028 for (j = 0; j < oc->nb_streams; j++) {
4029 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
4030 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
4034 printf("ret %d, stream_spec %s\n", ret, stream_spec);
4042 if (index < 0 || index >= oc->nb_chapters) {
4043 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
4046 m = &oc->chapters[index]->metadata;
4049 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
4052 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
4059 /* same option as mencoder */
4060 static int opt_pass(const char *opt, const char *arg)
4062 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
4066 static int64_t getutime(void)
4069 struct rusage rusage;
4071 getrusage(RUSAGE_SELF, &rusage);
4072 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4073 #elif HAVE_GETPROCESSTIMES
4075 FILETIME c, e, k, u;
4076 proc = GetCurrentProcess();
4077 GetProcessTimes(proc, &c, &e, &k, &u);
4078 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4080 return av_gettime();
4084 static int64_t getmaxrss(void)
4086 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4087 struct rusage rusage;
4088 getrusage(RUSAGE_SELF, &rusage);
4089 return (int64_t)rusage.ru_maxrss * 1024;
4090 #elif HAVE_GETPROCESSMEMORYINFO
4092 PROCESS_MEMORY_COUNTERS memcounters;
4093 proc = GetCurrentProcess();
4094 memcounters.cb = sizeof(memcounters);
4095 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4096 return memcounters.PeakPagefileUsage;
4102 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
4104 return parse_option(o, "q:a", arg, options);
4107 static void show_usage(void)
4109 printf("Hyper fast Audio and Video encoder\n");
4110 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
4114 static void show_help(void)
4116 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
4117 av_log_set_callback(log_callback_help);
4119 show_help_options(options, "Main options:\n",
4120 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4121 show_help_options(options, "\nAdvanced options:\n",
4122 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4124 show_help_options(options, "\nVideo options:\n",
4125 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4127 show_help_options(options, "\nAdvanced Video options:\n",
4128 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4129 OPT_VIDEO | OPT_EXPERT);
4130 show_help_options(options, "\nAudio options:\n",
4131 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4133 show_help_options(options, "\nAdvanced Audio options:\n",
4134 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4135 OPT_AUDIO | OPT_EXPERT);
4136 show_help_options(options, "\nSubtitle options:\n",
4137 OPT_SUBTITLE | OPT_GRAB,
4139 show_help_options(options, "\nAudio/Video grab options:\n",
4143 show_help_children(avcodec_get_class(), flags);
4144 show_help_children(avformat_get_class(), flags);
4145 show_help_children(sws_get_class(), flags);
4148 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
4150 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4151 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
4153 if (!strncmp(arg, "pal-", 4)) {
4156 } else if (!strncmp(arg, "ntsc-", 5)) {
4159 } else if (!strncmp(arg, "film-", 5)) {
4163 /* Try to determine PAL/NTSC by peeking in the input files */
4164 if (nb_input_files) {
4166 for (j = 0; j < nb_input_files; j++) {
4167 for (i = 0; i < input_files[j].nb_streams; i++) {
4168 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4169 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
4171 fr = c->time_base.den * 1000 / c->time_base.num;
4175 } else if ((fr == 29970) || (fr == 23976)) {
4180 if (norm != UNKNOWN)
4184 if (norm != UNKNOWN)
4185 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4188 if (norm == UNKNOWN) {
4189 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4190 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4191 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
4195 if (!strcmp(arg, "vcd")) {
4196 opt_video_codec(o, "c:v", "mpeg1video");
4197 opt_audio_codec(o, "c:a", "mp2");
4198 parse_option(o, "f", "vcd", options);
4200 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
4201 parse_option(o, "r", frame_rates[norm], options);
4202 opt_default("g", norm == PAL ? "15" : "18");
4204 opt_default("b", "1150000");
4205 opt_default("maxrate", "1150000");
4206 opt_default("minrate", "1150000");
4207 opt_default("bufsize", "327680"); // 40*1024*8;
4209 opt_default("b:a", "224000");
4210 parse_option(o, "ar", "44100", options);
4211 parse_option(o, "ac", "2", options);
4213 opt_default("packetsize", "2324");
4214 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4216 /* We have to offset the PTS, so that it is consistent with the SCR.
4217 SCR starts at 36000, but the first two packs contain only padding
4218 and the first pack from the other stream, respectively, may also have
4219 been written before.
4220 So the real data starts at SCR 36000+3*1200. */
4221 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
4222 } else if (!strcmp(arg, "svcd")) {
4224 opt_video_codec(o, "c:v", "mpeg2video");
4225 opt_audio_codec(o, "c:a", "mp2");
4226 parse_option(o, "f", "svcd", options);
4228 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
4229 parse_option(o, "r", frame_rates[norm], options);
4230 opt_default("g", norm == PAL ? "15" : "18");
4232 opt_default("b", "2040000");
4233 opt_default("maxrate", "2516000");
4234 opt_default("minrate", "0"); // 1145000;
4235 opt_default("bufsize", "1835008"); // 224*1024*8;
4236 opt_default("flags", "+scan_offset");
4239 opt_default("b:a", "224000");
4240 parse_option(o, "ar", "44100", options);
4242 opt_default("packetsize", "2324");
4244 } else if (!strcmp(arg, "dvd")) {
4246 opt_video_codec(o, "c:v", "mpeg2video");
4247 opt_audio_codec(o, "c:a", "ac3");
4248 parse_option(o, "f", "dvd", options);
4250 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4251 parse_option(o, "r", frame_rates[norm], options);
4252 opt_default("g", norm == PAL ? "15" : "18");
4254 opt_default("b", "6000000");
4255 opt_default("maxrate", "9000000");
4256 opt_default("minrate", "0"); // 1500000;
4257 opt_default("bufsize", "1835008"); // 224*1024*8;
4259 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4260 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4262 opt_default("b:a", "448000");
4263 parse_option(o, "ar", "48000", options);
4265 } else if (!strncmp(arg, "dv", 2)) {
4267 parse_option(o, "f", "dv", options);
4269 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4270 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4271 norm == PAL ? "yuv420p" : "yuv411p", options);
4272 parse_option(o, "r", frame_rates[norm], options);
4274 parse_option(o, "ar", "48000", options);
4275 parse_option(o, "ac", "2", options);
4278 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
4279 return AVERROR(EINVAL);
4284 static int opt_vstats_file(const char *opt, const char *arg)
4286 av_free (vstats_filename);
4287 vstats_filename = av_strdup (arg);
4291 static int opt_vstats(const char *opt, const char *arg)
4294 time_t today2 = time(NULL);
4295 struct tm *today = localtime(&today2);
4297 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4299 return opt_vstats_file(opt, filename);
4302 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4304 return parse_option(o, "frames:v", arg, options);
4307 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4309 return parse_option(o, "frames:a", arg, options);
4312 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4314 return parse_option(o, "frames:d", arg, options);
4317 static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg)
4319 return parse_option(o, "tag:v", arg, options);
4322 static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg)
4324 return parse_option(o, "tag:a", arg, options);
4327 static int opt_subtitle_tag(OptionsContext *o, const char *opt, const char *arg)
4329 return parse_option(o, "tag:s", arg, options);
4332 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4334 return parse_option(o, "filter:v", arg, options);
4337 static int opt_vsync(const char *opt, const char *arg)
4339 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
4340 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
4341 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
4343 if (video_sync_method == VSYNC_AUTO)
4344 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
4348 #define OFFSET(x) offsetof(OptionsContext, x)
4349 static const OptionDef options[] = {
4351 #include "cmdutils_common_opts.h"
4352 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4353 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4354 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4355 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4356 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4357 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
4358 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
4359 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
4360 "outfile[,metadata]:infile[,metadata]" },
4361 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4362 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4363 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4364 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4365 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4366 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4367 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4368 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4369 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4370 "add timings for benchmarking" },
4371 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4372 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4373 "dump each input packet" },
4374 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4375 "when dumping packets, also dump the payload" },
4376 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4377 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4378 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
4379 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4380 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4381 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4382 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4383 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4384 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4385 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4386 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
4387 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4388 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4389 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4390 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4392 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4394 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
4395 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
4396 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
4399 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4400 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4401 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4402 { "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" },
4403 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4404 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4405 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4406 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4407 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4408 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4409 "use same quantizer as source (implies VBR)" },
4410 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4411 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4412 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4413 "deinterlace pictures" },
4414 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4415 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4417 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
4419 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
4420 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
4421 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
4422 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4423 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4424 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4425 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
4426 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4427 { "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" },
4430 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4431 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
4432 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
4433 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
4434 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
4435 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4436 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4437 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4438 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
4440 /* subtitle options */
4441 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
4442 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4443 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4446 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4449 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4450 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4452 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4454 /* data codec support */
4455 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4457 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4461 int main(int argc, char **argv)
4463 OptionsContext o = { 0 };
4468 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4469 parse_loglevel(argc, argv, options);
4471 avcodec_register_all();
4473 avdevice_register_all();
4476 avfilter_register_all();
4479 avformat_network_init();
4484 parse_options(&o, argc, argv, options, opt_output_file);
4486 if (nb_output_files <= 0 && nb_input_files == 0) {
4488 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4492 /* file converter / grab */
4493 if (nb_output_files <= 0) {
4494 fprintf(stderr, "At least one output file must be specified\n");
4498 if (nb_input_files == 0) {
4499 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
4504 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4506 ti = getutime() - ti;
4508 int maxrss = getmaxrss() / 1024;
4509 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);