2 * Copyright (c) 2000-2003 Fabrice Bellard
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * multimedia converter based on the FFmpeg libraries
35 #include "libavformat/avformat.h"
36 #include "libavdevice/avdevice.h"
37 #include "libswscale/swscale.h"
38 #include "libavutil/opt.h"
39 #include "libavcodec/audioconvert.h"
40 #include "libavutil/audioconvert.h"
41 #include "libavutil/parseutils.h"
42 #include "libavutil/samplefmt.h"
43 #include "libavutil/colorspace.h"
44 #include "libavutil/fifo.h"
45 #include "libavutil/intreadwrite.h"
46 #include "libavutil/dict.h"
47 #include "libavutil/mathematics.h"
48 #include "libavutil/pixdesc.h"
49 #include "libavutil/avstring.h"
50 #include "libavutil/libm.h"
51 #include "libavutil/imgutils.h"
52 #include "libavutil/timestamp.h"
53 #include "libavformat/os_support.h"
54 #include "libswresample/swresample.h"
56 #include "libavformat/ffm.h" // not public API
58 # include "libavfilter/avcodec.h"
59 # include "libavfilter/avfilter.h"
60 # include "libavfilter/avfiltergraph.h"
61 # include "libavfilter/buffersink.h"
62 # include "libavfilter/buffersrc.h"
63 # include "libavfilter/vsrc_buffer.h"
65 #if HAVE_SYS_RESOURCE_H
66 #include <sys/types.h>
68 #include <sys/resource.h>
69 #elif HAVE_GETPROCESSTIMES
72 #if HAVE_GETPROCESSMEMORYINFO
78 #include <sys/select.h>
83 #include <sys/ioctl.h>
93 #include "libavutil/avassert.h"
96 #define VSYNC_PASSTHROUGH 0
99 #define VSYNC_DROP 0xff
101 const char program_name[] = "ffmpeg";
102 const int program_birth_year = 2000;
104 /* select an input stream for an output stream */
105 typedef struct StreamMap {
106 int disabled; /** 1 is this mapping is disabled by a negative map */
110 int sync_stream_index;
111 char *linklabel; /** name of an output link, for mapping lavfi outputs */
115 int file_idx, stream_idx, channel_idx; // input
116 int ofile_idx, ostream_idx; // output
119 static const OptionDef options[];
121 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
123 static int frame_bits_per_raw_sample = 0;
124 static int video_discard = 0;
125 static int same_quant = 0;
126 static int do_deinterlace = 0;
127 static int intra_dc_precision = 8;
128 static int qp_hist = 0;
129 static int intra_only = 0;
130 static const char *video_codec_name = NULL;
131 static const char *audio_codec_name = NULL;
132 static const char *subtitle_codec_name = NULL;
134 static int file_overwrite = 0;
135 static int no_file_overwrite = 0;
136 static int do_benchmark = 0;
137 static int do_benchmark_all = 0;
138 static int do_hex_dump = 0;
139 static int do_pkt_dump = 0;
140 static int do_psnr = 0;
141 static int do_pass = 0;
142 static const char *pass_logfilename_prefix;
143 static int video_sync_method = VSYNC_AUTO;
144 static int audio_sync_method = 0;
145 static float audio_drift_threshold = 0.1;
146 static int copy_ts = 0;
147 static int copy_tb = -1;
148 static int opt_shortest = 0;
149 static char *vstats_filename;
150 static FILE *vstats_file;
152 static int audio_volume = 256;
154 static int exit_on_error = 0;
155 static int using_stdin = 0;
156 static int run_as_daemon = 0;
157 static volatile int received_nb_signals = 0;
158 static int64_t video_size = 0;
159 static int64_t audio_size = 0;
160 static int64_t extra_size = 0;
161 static int nb_frames_dup = 0;
162 static int nb_frames_drop = 0;
163 static int input_sync;
165 static float dts_delta_threshold = 10;
166 static float dts_error_threshold = 3600*30;
168 static int print_stats = 1;
169 static int debug_ts = 0;
170 static int current_time;
172 static uint8_t *audio_buf;
173 static unsigned int allocated_audio_buf_size;
174 static uint8_t *async_buf;
175 static unsigned int allocated_async_buf_size;
177 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
179 typedef struct InputFilter {
180 AVFilterContext *filter;
181 struct InputStream *ist;
182 struct FilterGraph *graph;
185 typedef struct OutputFilter {
186 AVFilterContext *filter;
187 struct OutputStream *ost;
188 struct FilterGraph *graph;
190 /* temporary storage until stream maps are processed */
191 AVFilterInOut *out_tmp;
194 typedef struct FilterGraph {
196 const char *graph_desc;
198 AVFilterGraph *graph;
200 InputFilter **inputs;
202 OutputFilter **outputs;
206 typedef struct FrameBuffer {
212 enum PixelFormat pix_fmt;
215 struct InputStream *ist;
216 struct FrameBuffer *next;
219 typedef struct InputStream {
222 int discard; /* true if stream data should be discarded */
223 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
225 AVFrame *decoded_frame;
227 int64_t start; /* time when read started */
228 /* predicted dts of the next packet read for this stream or (when there are
229 * several frames in a packet) of the next frame in current packet */
231 /* dts of the last packet read for this stream */
234 int64_t next_pts; ///< synthetic pts for the next decode frame
235 int64_t pts; ///< current pts of the decoded frame
237 int is_start; /* is 1 at the start and after a discontinuity */
239 int showed_multi_packet_warning;
244 int resample_pix_fmt;
246 /* a pool of free buffers for decoded data */
247 FrameBuffer *buffer_pool;
250 /* decoded data from this stream goes into all those filters
251 * currently video only */
252 InputFilter **filters;
256 typedef struct InputFile {
257 AVFormatContext *ctx;
258 int eof_reached; /* true if eof reached */
259 int ist_index; /* index of first stream in input_streams */
260 int buffer_size; /* current total buffer size */
262 int nb_streams; /* number of stream that ffmpeg is aware of; may be different
263 from ctx.nb_streams if new streams appear during av_read_frame() */
267 typedef struct OutputStream {
268 int file_index; /* file index */
269 int index; /* stream index in the output file */
270 int source_index; /* InputStream index */
271 AVStream *st; /* stream in the output file */
272 int encoding_needed; /* true if encoding needed for this stream */
274 /* input pts and corresponding output pts
276 struct InputStream *sync_ist; /* input stream to sync against */
277 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
278 AVBitStreamFilterContext *bitstream_filters;
281 AVFrame *output_frame;
282 AVFrame *filtered_frame;
285 AVRational frame_rate;
289 float frame_aspect_ratio;
292 /* forced key frames */
293 int64_t *forced_kf_pts;
299 int audio_channels_map[SWR_CH_MAX]; ///< list of the channels id to pick from the source stream
300 int audio_channels_mapped; ///< number of channels in audio_channels_map
301 int resample_sample_fmt;
302 int resample_channels;
303 int resample_sample_rate;
304 float rematrix_volume;
305 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
310 OutputFilter *filter;
314 int64_t swr_dither_method;
315 double swr_dither_scale;
317 int is_past_recording_time;
319 const char *attachment_filename;
320 int copy_initial_nonkeyframes;
322 enum PixelFormat pix_fmts[2];
328 /* init terminal so that we can grab keys */
329 static struct termios oldtty;
330 static int restore_tty;
333 typedef struct OutputFile {
334 AVFormatContext *ctx;
336 int ost_index; /* index of the first stream in output_streams */
337 int64_t recording_time; /* desired length of the resulting file in microseconds */
338 int64_t start_time; /* start time in microseconds */
339 uint64_t limit_filesize; /* filesize limit expressed in bytes */
342 static InputStream **input_streams = NULL;
343 static int nb_input_streams = 0;
344 static InputFile **input_files = NULL;
345 static int nb_input_files = 0;
347 static OutputStream **output_streams = NULL;
348 static int nb_output_streams = 0;
349 static OutputFile **output_files = NULL;
350 static int nb_output_files = 0;
352 static FilterGraph **filtergraphs;
355 typedef struct OptionsContext {
356 /* input/output options */
360 SpecifierOpt *codec_names;
362 SpecifierOpt *audio_channels;
363 int nb_audio_channels;
364 SpecifierOpt *audio_sample_rate;
365 int nb_audio_sample_rate;
366 SpecifierOpt *rematrix_volume;
367 int nb_rematrix_volume;
368 SpecifierOpt *frame_rates;
370 SpecifierOpt *frame_sizes;
372 SpecifierOpt *frame_pix_fmts;
373 int nb_frame_pix_fmts;
376 int64_t input_ts_offset;
379 SpecifierOpt *ts_scale;
381 SpecifierOpt *dump_attachment;
382 int nb_dump_attachment;
385 StreamMap *stream_maps;
387 AudioChannelMap *audio_channel_maps; ///< one info entry per -map_channel
388 int nb_audio_channel_maps; ///< number of (valid) -map_channel settings
389 int metadata_global_manual;
390 int metadata_streams_manual;
391 int metadata_chapters_manual;
392 const char **attachments;
395 int chapters_input_file;
397 int64_t recording_time;
398 uint64_t limit_filesize;
404 int subtitle_disable;
407 /* indexed by output file stream index */
411 SpecifierOpt *metadata;
413 SpecifierOpt *max_frames;
415 SpecifierOpt *bitstream_filters;
416 int nb_bitstream_filters;
417 SpecifierOpt *codec_tags;
419 SpecifierOpt *sample_fmts;
421 SpecifierOpt *qscale;
423 SpecifierOpt *forced_key_frames;
424 int nb_forced_key_frames;
425 SpecifierOpt *force_fps;
427 SpecifierOpt *frame_aspect_ratios;
428 int nb_frame_aspect_ratios;
429 SpecifierOpt *rc_overrides;
431 SpecifierOpt *intra_matrices;
432 int nb_intra_matrices;
433 SpecifierOpt *inter_matrices;
434 int nb_inter_matrices;
435 SpecifierOpt *top_field_first;
436 int nb_top_field_first;
437 SpecifierOpt *metadata_map;
439 SpecifierOpt *presets;
441 SpecifierOpt *copy_initial_nonkeyframes;
442 int nb_copy_initial_nonkeyframes;
443 SpecifierOpt *filters;
447 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
450 for (i = 0; i < o->nb_ ## name; i++) {\
451 char *spec = o->name[i].specifier;\
452 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
453 outvar = o->name[i].u.type;\
459 static int64_t getutime(void)
462 struct rusage rusage;
464 getrusage(RUSAGE_SELF, &rusage);
465 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
466 #elif HAVE_GETPROCESSTIMES
469 proc = GetCurrentProcess();
470 GetProcessTimes(proc, &c, &e, &k, &u);
471 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
477 static void update_benchmark(const char *fmt, ...)
479 if (do_benchmark_all) {
480 int64_t t = getutime();
486 vsnprintf(buf, sizeof(buf), fmt, va);
488 printf("bench: %8"PRIu64" %s \n", t - current_time, buf);
494 static void reset_options(OptionsContext *o, int is_input)
496 const OptionDef *po = options;
497 OptionsContext bak= *o;
500 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
502 void *dst = (uint8_t*)o + po->u.off;
504 if (po->flags & OPT_SPEC) {
505 SpecifierOpt **so = dst;
506 int i, *count = (int*)(so + 1);
507 for (i = 0; i < *count; i++) {
508 av_freep(&(*so)[i].specifier);
509 if (po->flags & OPT_STRING)
510 av_freep(&(*so)[i].u.str);
514 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
519 for (i = 0; i < o->nb_stream_maps; i++)
520 av_freep(&o->stream_maps[i].linklabel);
521 av_freep(&o->stream_maps);
522 av_freep(&o->audio_channel_maps);
523 av_freep(&o->streamid_map);
525 memset(o, 0, sizeof(*o));
527 if(is_input) o->recording_time = bak.recording_time;
528 else o->recording_time = INT64_MAX;
529 o->mux_max_delay = 0.7;
530 o->limit_filesize = UINT64_MAX;
531 o->chapters_input_file = INT_MAX;
537 static int alloc_buffer(InputStream *ist, AVCodecContext *s, FrameBuffer **pbuf)
539 FrameBuffer *buf = av_mallocz(sizeof(*buf));
541 const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1;
542 int h_chroma_shift, v_chroma_shift;
543 int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
544 int w = s->width, h = s->height;
547 return AVERROR(ENOMEM);
549 if (!(s->flags & CODEC_FLAG_EMU_EDGE)) {
554 avcodec_align_dimensions(s, &w, &h);
555 if ((ret = av_image_alloc(buf->base, buf->linesize, w, h,
556 s->pix_fmt, 32)) < 0) {
560 /* XXX this shouldn't be needed, but some tests break without this line
561 * those decoders are buggy and need to be fixed.
562 * the following tests fail:
563 * cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
565 memset(buf->base[0], 128, ret);
567 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
568 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
569 const int h_shift = i==0 ? 0 : h_chroma_shift;
570 const int v_shift = i==0 ? 0 : v_chroma_shift;
571 if ((s->flags & CODEC_FLAG_EMU_EDGE) || !buf->linesize[1])
572 buf->data[i] = buf->base[i];
574 buf->data[i] = buf->base[i] +
575 FFALIGN((buf->linesize[i]*edge >> v_shift) +
576 (pixel_size*edge >> h_shift), 32);
580 buf->pix_fmt = s->pix_fmt;
587 static void free_buffer_pool(InputStream *ist)
589 FrameBuffer *buf = ist->buffer_pool;
591 ist->buffer_pool = buf->next;
592 av_freep(&buf->base[0]);
594 buf = ist->buffer_pool;
598 static void unref_buffer(InputStream *ist, FrameBuffer *buf)
600 av_assert0(buf->refcount > 0);
602 if (!buf->refcount) {
604 for(tmp= ist->buffer_pool; tmp; tmp= tmp->next)
605 av_assert1(tmp != buf);
606 buf->next = ist->buffer_pool;
607 ist->buffer_pool = buf;
611 static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
613 InputStream *ist = s->opaque;
617 if(av_image_check_size(s->width, s->height, 0, s) || s->pix_fmt<0)
620 if (!ist->buffer_pool && (ret = alloc_buffer(ist, s, &ist->buffer_pool)) < 0)
623 buf = ist->buffer_pool;
624 ist->buffer_pool = buf->next;
626 if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) {
627 av_freep(&buf->base[0]);
629 if ((ret = alloc_buffer(ist, s, &buf)) < 0)
632 av_assert0(!buf->refcount);
636 frame->type = FF_BUFFER_TYPE_USER;
637 frame->extended_data = frame->data;
638 frame->pkt_pts = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE;
639 frame->width = buf->w;
640 frame->height = buf->h;
641 frame->format = buf->pix_fmt;
642 frame->sample_aspect_ratio = s->sample_aspect_ratio;
644 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
645 frame->base[i] = buf->base[i]; // XXX h264.c uses base though it shouldn't
646 frame->data[i] = buf->data[i];
647 frame->linesize[i] = buf->linesize[i];
653 static void codec_release_buffer(AVCodecContext *s, AVFrame *frame)
655 InputStream *ist = s->opaque;
656 FrameBuffer *buf = frame->opaque;
659 if(frame->type!=FF_BUFFER_TYPE_USER)
660 return avcodec_default_release_buffer(s, frame);
662 for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++)
663 frame->data[i] = NULL;
665 unref_buffer(ist, buf);
668 static void filter_release_buffer(AVFilterBuffer *fb)
670 FrameBuffer *buf = fb->priv;
672 unref_buffer(buf->ist, buf);
675 static enum PixelFormat choose_pixel_fmt(AVStream *st, AVCodec *codec, enum PixelFormat target)
677 if (codec && codec->pix_fmts) {
678 const enum PixelFormat *p = codec->pix_fmts;
679 int has_alpha= av_pix_fmt_descriptors[target].nb_components % 2 == 0;
680 enum PixelFormat best= PIX_FMT_NONE;
681 if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
682 if (st->codec->codec_id == CODEC_ID_MJPEG) {
683 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
684 } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
685 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
686 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
689 for (; *p != PIX_FMT_NONE; p++) {
690 best= avcodec_find_best_pix_fmt2(best, *p, target, has_alpha, NULL);
694 if (*p == PIX_FMT_NONE) {
695 if (target != PIX_FMT_NONE)
696 av_log(NULL, AV_LOG_WARNING,
697 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
698 av_pix_fmt_descriptors[target].name,
700 av_pix_fmt_descriptors[best].name);
707 static const enum PixelFormat *choose_pixel_fmts(OutputStream *ost)
709 if (ost->st->codec->pix_fmt != PIX_FMT_NONE) {
710 ost->pix_fmts[0] = choose_pixel_fmt(ost->st, ost->enc, ost->st->codec->pix_fmt);
711 return ost->pix_fmts;
712 } else if (ost->enc->pix_fmts) {
713 if (ost->st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
714 if (ost->st->codec->codec_id == CODEC_ID_MJPEG) {
715 return (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
716 } else if (ost->st->codec->codec_id == CODEC_ID_LJPEG) {
717 return (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
718 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
721 return ost->enc->pix_fmts;
726 static int configure_video_filters(FilterGraph *fg)
728 InputStream *ist = fg->inputs[0]->ist;
729 OutputStream *ost = fg->outputs[0]->ost;
730 AVFilterContext *last_filter, *filter;
731 /** filter graph containing all filters including input & output */
732 AVCodecContext *codec = ost->st->codec;
733 enum PixelFormat *pix_fmts = choose_pixel_fmts(ost);
734 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
735 AVRational sample_aspect_ratio;
739 avfilter_graph_free(&fg->graph);
740 fg->graph = avfilter_graph_alloc();
742 return AVERROR(ENOMEM);
744 if (ist->st->sample_aspect_ratio.num) {
745 sample_aspect_ratio = ist->st->sample_aspect_ratio;
747 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
749 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d:flags=%d", ist->st->codec->width,
750 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
751 sample_aspect_ratio.num, sample_aspect_ratio.den, SWS_BILINEAR + ((ist->st->codec->flags&CODEC_FLAG_BITEXACT) ? SWS_BITEXACT:0));
753 ret = avfilter_graph_create_filter(&fg->inputs[0]->filter,
754 avfilter_get_by_name("buffer"),
755 "src", args, NULL, fg->graph);
759 #if FF_API_OLD_VSINK_API
760 ret = avfilter_graph_create_filter(&fg->outputs[0]->filter, avfilter_get_by_name("buffersink"),
761 "out", NULL, pix_fmts, fg->graph);
763 buffersink_params->pixel_fmts = pix_fmts;
764 ret = avfilter_graph_create_filter(&fg->outputs[0]->filter, avfilter_get_by_name("buffersink"),
765 "out", NULL, buffersink_params, fg->graph);
767 av_freep(&buffersink_params);
771 last_filter = fg->inputs[0]->filter;
773 if (codec->width || codec->height) {
774 snprintf(args, 255, "%d:%d:flags=0x%X",
777 (unsigned)ost->sws_flags);
778 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
779 NULL, args, NULL, fg->graph)) < 0)
781 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
783 last_filter = filter;
786 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
787 fg->graph->scale_sws_opts = av_strdup(args);
790 AVFilterInOut *outputs = avfilter_inout_alloc();
791 AVFilterInOut *inputs = avfilter_inout_alloc();
793 outputs->name = av_strdup("in");
794 outputs->filter_ctx = last_filter;
795 outputs->pad_idx = 0;
796 outputs->next = NULL;
798 inputs->name = av_strdup("out");
799 inputs->filter_ctx = fg->outputs[0]->filter;
803 if ((ret = avfilter_graph_parse(fg->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
805 av_freep(&ost->avfilter);
807 if ((ret = avfilter_link(last_filter, 0, fg->outputs[0]->filter, 0)) < 0)
811 if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0)
814 ost->filter = fg->outputs[0];
819 static FilterGraph *init_simple_filtergraph(InputStream *ist, OutputStream *ost)
821 FilterGraph *fg = av_mallocz(sizeof(*fg));
825 fg->index = nb_filtergraphs;
827 fg->outputs = grow_array(fg->outputs, sizeof(*fg->outputs), &fg->nb_outputs,
829 if (!(fg->outputs[0] = av_mallocz(sizeof(*fg->outputs[0]))))
831 fg->outputs[0]->ost = ost;
832 fg->outputs[0]->graph = fg;
834 fg->inputs = grow_array(fg->inputs, sizeof(*fg->inputs), &fg->nb_inputs,
836 if (!(fg->inputs[0] = av_mallocz(sizeof(*fg->inputs[0]))))
838 fg->inputs[0]->ist = ist;
839 fg->inputs[0]->graph = fg;
841 ist->filters = grow_array(ist->filters, sizeof(*ist->filters),
842 &ist->nb_filters, ist->nb_filters + 1);
843 ist->filters[ist->nb_filters - 1] = fg->inputs[0];
845 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
846 &nb_filtergraphs, nb_filtergraphs + 1);
847 filtergraphs[nb_filtergraphs - 1] = fg;
852 static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
855 enum AVMediaType type = in->filter_ctx->input_pads[in->pad_idx].type;
858 // TODO: support other filter types
859 if (type != AVMEDIA_TYPE_VIDEO) {
860 av_log(NULL, AV_LOG_FATAL, "Only video filters supported currently.\n");
868 int file_idx = strtol(in->name, &p, 0);
870 if (file_idx < 0 || file_idx >= nb_input_files) {
871 av_log(NULL, AV_LOG_FATAL, "Invalid file index %d in filtergraph description %s.\n",
872 file_idx, fg->graph_desc);
875 s = input_files[file_idx]->ctx;
877 for (i = 0; i < s->nb_streams; i++) {
878 if (s->streams[i]->codec->codec_type != type)
880 if (check_stream_specifier(s, s->streams[i], *p == ':' ? p + 1 : p) == 1) {
886 av_log(NULL, AV_LOG_FATAL, "Stream specifier '%s' in filtergraph description %s "
887 "matches no streams.\n", p, fg->graph_desc);
890 ist = input_streams[input_files[file_idx]->ist_index + st->index];
892 /* find the first unused stream of corresponding type */
893 for (i = 0; i < nb_input_streams; i++) {
894 ist = input_streams[i];
895 if (ist->st->codec->codec_type == type && ist->discard)
898 if (i == nb_input_streams) {
899 av_log(NULL, AV_LOG_FATAL, "Cannot find a matching stream for "
900 "unlabeled input pad %d on filter %s", in->pad_idx,
901 in->filter_ctx->name);
906 ist->decoding_needed = 1;
907 ist->st->discard = AVDISCARD_NONE;
909 fg->inputs = grow_array(fg->inputs, sizeof(*fg->inputs),
910 &fg->nb_inputs, fg->nb_inputs + 1);
911 if (!(fg->inputs[fg->nb_inputs - 1] = av_mallocz(sizeof(*fg->inputs[0]))))
913 fg->inputs[fg->nb_inputs - 1]->ist = ist;
914 fg->inputs[fg->nb_inputs - 1]->graph = fg;
916 ist->filters = grow_array(ist->filters, sizeof(*ist->filters),
917 &ist->nb_filters, ist->nb_filters + 1);
918 ist->filters[ist->nb_filters - 1] = fg->inputs[fg->nb_inputs - 1];
921 static int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
923 AVCodecContext *codec = ofilter->ost->st->codec;
924 AVFilterContext *last_filter = out->filter_ctx;
925 int pad_idx = out->pad_idx;
927 enum PixelFormat *pix_fmts = choose_pixel_fmts(ofilter->ost);
928 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
930 #if FF_API_OLD_VSINK_API
931 ret = avfilter_graph_create_filter(&ofilter->filter, avfilter_get_by_name("buffersink"),
932 "out", NULL, pix_fmts, fg->graph);
934 buffersink_params->pixel_fmts = pix_fmts;
935 ret = avfilter_graph_create_filter(&ofilter->filter, avfilter_get_by_name("buffersink"),
936 "out", NULL, buffersink_params, fg->graph);
938 av_freep(&buffersink_params);
943 if (codec->width || codec->height) {
945 snprintf(args, sizeof(args), "%d:%d:flags=0x%X",
948 (unsigned)ofilter->ost->sws_flags);
949 if ((ret = avfilter_graph_create_filter(&last_filter, avfilter_get_by_name("scale"),
950 NULL, args, NULL, fg->graph)) < 0)
952 if ((ret = avfilter_link(out->filter_ctx, out->pad_idx, last_filter, 0)) < 0)
957 if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
963 static int configure_complex_filter(FilterGraph *fg)
965 AVFilterInOut *inputs, *outputs, *cur;
966 int ret, i, init = !fg->graph;
968 avfilter_graph_free(&fg->graph);
969 if (!(fg->graph = avfilter_graph_alloc()))
970 return AVERROR(ENOMEM);
972 if ((ret = avfilter_graph_parse2(fg->graph, fg->graph_desc, &inputs, &outputs)) < 0)
975 for (cur = inputs; init && cur; cur = cur->next)
976 init_input_filter(fg, cur);
978 for (cur = inputs, i = 0; cur; cur = cur->next, i++) {
979 InputFilter *ifilter = fg->inputs[i];
980 InputStream *ist = ifilter->ist;
984 sar = ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
985 ist->st->codec->sample_aspect_ratio;
986 snprintf(args, sizeof(args), "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
987 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
990 if ((ret = avfilter_graph_create_filter(&ifilter->filter,
991 avfilter_get_by_name("buffer"), cur->name,
992 args, NULL, fg->graph)) < 0)
994 if ((ret = avfilter_link(ifilter->filter, 0,
995 cur->filter_ctx, cur->pad_idx)) < 0)
998 avfilter_inout_free(&inputs);
1001 /* we already know the mappings between lavfi outputs and output streams,
1002 * so we can finish the setup */
1003 for (cur = outputs, i = 0; cur; cur = cur->next, i++)
1004 configure_output_filter(fg, fg->outputs[i], cur);
1005 avfilter_inout_free(&outputs);
1007 if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0)
1010 /* wait until output mappings are processed */
1011 for (cur = outputs; cur;) {
1012 fg->outputs = grow_array(fg->outputs, sizeof(*fg->outputs),
1013 &fg->nb_outputs, fg->nb_outputs + 1);
1014 if (!(fg->outputs[fg->nb_outputs - 1] = av_mallocz(sizeof(*fg->outputs[0]))))
1016 fg->outputs[fg->nb_outputs - 1]->graph = fg;
1017 fg->outputs[fg->nb_outputs - 1]->out_tmp = cur;
1019 fg->outputs[fg->nb_outputs - 1]->out_tmp->next = NULL;
1026 static int configure_complex_filters(void)
1030 for (i = 0; i < nb_filtergraphs; i++)
1031 if (!filtergraphs[i]->graph &&
1032 (ret = configure_complex_filter(filtergraphs[i])) < 0)
1037 static int configure_filtergraph(FilterGraph *fg)
1039 return fg->graph_desc ? configure_complex_filter(fg) : configure_video_filters(fg);
1042 static int ist_in_filtergraph(FilterGraph *fg, InputStream *ist)
1045 for (i = 0; i < fg->nb_inputs; i++)
1046 if (fg->inputs[i]->ist == ist)
1051 static void term_exit(void)
1053 av_log(NULL, AV_LOG_QUIET, "%s", "");
1056 tcsetattr (0, TCSANOW, &oldtty);
1060 static volatile int received_sigterm = 0;
1062 static void sigterm_handler(int sig)
1064 received_sigterm = sig;
1065 received_nb_signals++;
1067 if(received_nb_signals > 3)
1071 static void term_init(void)
1077 if (tcgetattr (0, &tty) == 0) {
1082 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1083 |INLCR|IGNCR|ICRNL|IXON);
1084 tty.c_oflag |= OPOST;
1085 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
1086 tty.c_cflag &= ~(CSIZE|PARENB);
1089 tty.c_cc[VTIME] = 0;
1091 tcsetattr (0, TCSANOW, &tty);
1093 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
1096 avformat_network_deinit();
1098 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
1099 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
1101 signal(SIGXCPU, sigterm_handler);
1105 /* read a key without blocking */
1106 static int read_key(void)
1118 n = select(1, &rfds, NULL, NULL, &tv);
1120 n = read(0, &ch, 1);
1127 # if HAVE_PEEKNAMEDPIPE
1129 static HANDLE input_handle;
1132 input_handle = GetStdHandle(STD_INPUT_HANDLE);
1133 is_pipe = !GetConsoleMode(input_handle, &dw);
1136 if (stdin->_cnt > 0) {
1141 /* When running under a GUI, you will end here. */
1142 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
1159 static int decode_interrupt_cb(void *ctx)
1161 return received_nb_signals > 1;
1164 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
1166 void av_noreturn exit_program(int ret)
1170 for (i = 0; i < nb_filtergraphs; i++) {
1171 avfilter_graph_free(&filtergraphs[i]->graph);
1172 for (j = 0; j < filtergraphs[i]->nb_inputs; j++)
1173 av_freep(&filtergraphs[i]->inputs[j]);
1174 av_freep(&filtergraphs[i]->inputs);
1175 for (j = 0; j < filtergraphs[i]->nb_outputs; j++)
1176 av_freep(&filtergraphs[i]->outputs[j]);
1177 av_freep(&filtergraphs[i]->outputs);
1178 av_freep(&filtergraphs[i]);
1180 av_freep(&filtergraphs);
1183 for (i = 0; i < nb_output_files; i++) {
1184 AVFormatContext *s = output_files[i]->ctx;
1185 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
1187 avformat_free_context(s);
1188 av_dict_free(&output_files[i]->opts);
1189 av_freep(&output_files[i]);
1191 for (i = 0; i < nb_output_streams; i++) {
1192 AVBitStreamFilterContext *bsfc = output_streams[i]->bitstream_filters;
1194 AVBitStreamFilterContext *next = bsfc->next;
1195 av_bitstream_filter_close(bsfc);
1198 output_streams[i]->bitstream_filters = NULL;
1200 if (output_streams[i]->output_frame) {
1201 AVFrame *frame = output_streams[i]->output_frame;
1202 if (frame->extended_data != frame->data)
1203 av_freep(&frame->extended_data);
1206 av_freep(&output_streams[i]->filtered_frame);
1207 av_freep(&output_streams[i]);
1209 for (i = 0; i < nb_input_files; i++) {
1210 avformat_close_input(&input_files[i]->ctx);
1211 av_freep(&input_files[i]);
1213 for (i = 0; i < nb_input_streams; i++) {
1214 av_freep(&input_streams[i]->decoded_frame);
1215 av_dict_free(&input_streams[i]->opts);
1216 free_buffer_pool(input_streams[i]);
1217 av_freep(&input_streams[i]->filters);
1218 av_freep(&input_streams[i]);
1222 fclose(vstats_file);
1223 av_free(vstats_filename);
1225 av_freep(&input_streams);
1226 av_freep(&input_files);
1227 av_freep(&output_streams);
1228 av_freep(&output_files);
1231 av_freep(&audio_buf);
1232 allocated_audio_buf_size = 0;
1233 av_freep(&async_buf);
1234 allocated_async_buf_size = 0;
1237 avformat_network_deinit();
1239 if (received_sigterm) {
1240 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
1241 (int) received_sigterm);
1245 exit(ret); /* not all OS-es handle main() return value */
1248 static void assert_avoptions(AVDictionary *m)
1250 AVDictionaryEntry *t;
1251 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
1252 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
1257 static void assert_codec_experimental(AVCodecContext *c, int encoder)
1259 const char *codec_string = encoder ? "encoder" : "decoder";
1261 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
1262 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
1263 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
1264 "results.\nAdd '-strict experimental' if you want to use it.\n",
1265 codec_string, c->codec->name);
1266 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
1267 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
1268 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
1269 codec_string, codec->name);
1274 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
1276 if (codec && codec->sample_fmts) {
1277 const enum AVSampleFormat *p = codec->sample_fmts;
1278 for (; *p != -1; p++) {
1279 if (*p == st->codec->sample_fmt)
1283 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
1284 av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
1285 if(av_get_sample_fmt_name(st->codec->sample_fmt))
1286 av_log(NULL, AV_LOG_WARNING,
1287 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
1288 av_get_sample_fmt_name(st->codec->sample_fmt),
1290 av_get_sample_fmt_name(codec->sample_fmts[0]));
1291 st->codec->sample_fmt = codec->sample_fmts[0];
1296 static void choose_sample_rate(AVStream *st, AVCodec *codec)
1298 if (codec && codec->supported_samplerates) {
1299 const int *p = codec->supported_samplerates;
1301 int best_dist = INT_MAX;
1303 int dist = abs(st->codec->sample_rate - *p);
1304 if (dist < best_dist) {
1311 const int *sample_rates = codec->supported_samplerates;
1312 av_log(st->codec, AV_LOG_WARNING,
1313 "Requested sampling rate (%dHz) unsupported, using %dHz instead\n"
1314 "Available sampling rates for %s:",
1315 st->codec->sample_rate, best, codec->name);
1316 for (i = 0; sample_rates[i]; i++) {
1317 if (!sample_rates[i + 1]) av_log(st->codec, AV_LOG_WARNING, " and");
1318 else if (i) av_log(st->codec, AV_LOG_WARNING, ",");
1319 av_log(st->codec, AV_LOG_WARNING, " %d", sample_rates[i]);
1321 av_log(st->codec, AV_LOG_WARNING, ".\n");
1323 st->codec->sample_rate = best;
1328 get_sync_ipts(const OutputStream *ost, int64_t pts)
1330 OutputFile *of = output_files[ost->file_index];
1331 return (double)(pts - of->start_time) / AV_TIME_BASE;
1334 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
1336 AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
1337 AVCodecContext *avctx = ost->st->codec;
1340 if ((avctx->codec_type == AVMEDIA_TYPE_VIDEO && video_sync_method == VSYNC_DROP) ||
1341 (avctx->codec_type == AVMEDIA_TYPE_AUDIO && audio_sync_method < 0))
1342 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1345 * Audio encoders may split the packets -- #frames in != #packets out.
1346 * But there is no reordering, so we can limit the number of output packets
1347 * by simply dropping them here.
1348 * Counting encoded video frames needs to be done separately because of
1349 * reordering, see do_video_out()
1351 if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) {
1352 if (ost->frame_number >= ost->max_frames) {
1353 av_free_packet(pkt);
1356 ost->frame_number++;
1360 AVPacket new_pkt = *pkt;
1361 int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
1362 &new_pkt.data, &new_pkt.size,
1363 pkt->data, pkt->size,
1364 pkt->flags & AV_PKT_FLAG_KEY);
1366 av_free_packet(pkt);
1367 new_pkt.destruct = av_destruct_packet;
1369 av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
1370 bsfc->filter->name, pkt->stream_index,
1371 avctx->codec ? avctx->codec->name : "copy");
1381 pkt->stream_index = ost->index;
1382 ret = av_interleaved_write_frame(s, pkt);
1384 print_error("av_interleaved_write_frame()", ret);
1389 static void get_default_channel_layouts(OutputStream *ost, InputStream *ist)
1391 char layout_name[256];
1392 AVCodecContext *enc = ost->st->codec;
1393 AVCodecContext *dec = ist->st->codec;
1395 if (dec->channel_layout &&
1396 av_get_channel_layout_nb_channels(dec->channel_layout) != dec->channels) {
1397 av_get_channel_layout_string(layout_name, sizeof(layout_name),
1398 dec->channels, dec->channel_layout);
1399 av_log(NULL, AV_LOG_ERROR, "New channel layout (%s) is invalid\n",
1401 dec->channel_layout = 0;
1403 if (!dec->channel_layout) {
1404 if (enc->channel_layout && dec->channels == enc->channels) {
1405 dec->channel_layout = enc->channel_layout;
1407 dec->channel_layout = av_get_default_channel_layout(dec->channels);
1409 if (!dec->channel_layout) {
1410 av_log(NULL, AV_LOG_FATAL, "Unable to find default channel "
1411 "layout for Input Stream #%d.%d\n", ist->file_index,
1416 av_get_channel_layout_string(layout_name, sizeof(layout_name),
1417 dec->channels, dec->channel_layout);
1418 av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Input Stream "
1419 "#%d.%d : %s\n", ist->file_index, ist->st->index, layout_name);
1421 if (!enc->channel_layout) {
1422 if (dec->channels == enc->channels) {
1423 enc->channel_layout = dec->channel_layout;
1426 enc->channel_layout = av_get_default_channel_layout(enc->channels);
1428 if (!enc->channel_layout) {
1429 av_log(NULL, AV_LOG_FATAL, "Unable to find default channel layout "
1430 "for Output Stream #%d.%d\n", ost->file_index,
1434 av_get_channel_layout_string(layout_name, sizeof(layout_name),
1435 enc->channels, enc->channel_layout);
1436 av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Output Stream "
1437 "#%d.%d : %s\n", ost->file_index, ost->st->index, layout_name);
1441 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1443 int fill_char = 0x00;
1444 if (sample_fmt == AV_SAMPLE_FMT_U8)
1446 memset(buf, fill_char, size);
1449 static int encode_audio_frame(AVFormatContext *s, OutputStream *ost,
1450 const uint8_t *buf, int buf_size)
1452 AVCodecContext *enc = ost->st->codec;
1453 AVFrame *frame = NULL;
1455 int ret, got_packet;
1457 av_init_packet(&pkt);
1461 if (buf && buf_size) {
1462 if (!ost->output_frame) {
1463 ost->output_frame = avcodec_alloc_frame();
1464 if (!ost->output_frame) {
1465 av_log(NULL, AV_LOG_FATAL, "out-of-memory in encode_audio_frame()\n");
1469 frame = ost->output_frame;
1470 if (frame->extended_data != frame->data)
1471 av_freep(&frame->extended_data);
1472 avcodec_get_frame_defaults(frame);
1474 frame->nb_samples = buf_size /
1475 (enc->channels * av_get_bytes_per_sample(enc->sample_fmt));
1476 if ((ret = avcodec_fill_audio_frame(frame, enc->channels, enc->sample_fmt,
1477 buf, buf_size, 1)) < 0) {
1478 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed (avcodec_fill_audio_frame)\n");
1482 frame->pts = ost->sync_opts;
1483 ost->sync_opts += frame->nb_samples;
1487 update_benchmark(NULL);
1488 if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
1489 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed (avcodec_encode_audio2)\n");
1492 update_benchmark("encode_audio %d.%d", ost->file_index, ost->index);
1497 if (pkt.pts != AV_NOPTS_VALUE)
1498 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1499 if (pkt.dts != AV_NOPTS_VALUE) {
1500 int64_t max = ost->st->cur_dts + !(s->oformat->flags & AVFMT_TS_NONSTRICT);
1501 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1502 if (ost->st->cur_dts && ost->st->cur_dts != AV_NOPTS_VALUE && max > pkt.dts) {
1503 av_log(s, max - pkt.dts > 2 ? AV_LOG_WARNING : AV_LOG_DEBUG, "Audio timestamp %"PRId64" < %"PRId64" invalid, cliping\n", pkt.dts, max);
1504 pkt.pts = pkt.dts = max;
1507 if (pkt.duration > 0)
1508 pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
1510 write_frame(s, &pkt, ost);
1512 audio_size += pkt.size;
1514 av_free_packet(&pkt);
1518 av_log(NULL, AV_LOG_INFO, "encoder -> type:audio "
1519 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1520 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
1521 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
1527 static int alloc_audio_output_buf(AVCodecContext *dec, AVCodecContext *enc,
1530 int64_t audio_buf_samples;
1533 /* calculate required number of samples to allocate */
1534 audio_buf_samples = ((int64_t)nb_samples * enc->sample_rate + dec->sample_rate) /
1536 audio_buf_samples = 4 * audio_buf_samples + 10000; // safety factors for resampling
1537 audio_buf_samples = FFMAX(audio_buf_samples, enc->frame_size);
1538 if (audio_buf_samples > INT_MAX)
1539 return AVERROR(EINVAL);
1541 audio_buf_size = av_samples_get_buffer_size(NULL, enc->channels,
1543 enc->sample_fmt, 0);
1544 if (audio_buf_size < 0)
1545 return audio_buf_size;
1547 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
1549 return AVERROR(ENOMEM);
1554 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
1555 InputStream *ist, AVFrame *decoded_frame)
1560 int frame_bytes, resample_changed;
1561 AVCodecContext *enc = ost->st->codec;
1562 AVCodecContext *dec = ist->st->codec;
1563 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1564 int isize = av_get_bytes_per_sample(dec->sample_fmt);
1565 uint8_t *buf[AV_NUM_DATA_POINTERS];
1566 int size = decoded_frame->nb_samples * dec->channels * isize;
1567 int planes = av_sample_fmt_is_planar(dec->sample_fmt) ? dec->channels : 1;
1570 av_assert0(planes <= AV_NUM_DATA_POINTERS);
1572 for(i=0; i<planes; i++)
1573 buf[i]= decoded_frame->data[i];
1575 get_default_channel_layouts(ost, ist);
1577 if (alloc_audio_output_buf(dec, enc, decoded_frame->nb_samples) < 0) {
1578 av_log(NULL, AV_LOG_FATAL, "Error allocating audio buffer\n");
1582 if (enc->channels != dec->channels
1583 || enc->sample_fmt != dec->sample_fmt
1584 || enc->sample_rate!= dec->sample_rate
1586 ost->audio_resample = 1;
1588 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
1589 ost->resample_channels != dec->channels ||
1590 ost->resample_sample_rate != dec->sample_rate;
1592 if ((ost->audio_resample && !ost->swr) || resample_changed || ost->audio_channels_mapped) {
1593 if (resample_changed) {
1594 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",
1595 ist->file_index, ist->st->index,
1596 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
1597 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
1598 ost->resample_sample_fmt = dec->sample_fmt;
1599 ost->resample_channels = dec->channels;
1600 ost->resample_sample_rate = dec->sample_rate;
1601 swr_free(&ost->swr);
1603 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
1604 if (audio_sync_method <= 1 && !ost->audio_channels_mapped &&
1605 ost->resample_sample_fmt == enc->sample_fmt &&
1606 ost->resample_channels == enc->channels &&
1607 ost->resample_sample_rate == enc->sample_rate) {
1609 ost->audio_resample = 0;
1611 ost->swr = swr_alloc_set_opts(ost->swr,
1612 enc->channel_layout, enc->sample_fmt, enc->sample_rate,
1613 dec->channel_layout, dec->sample_fmt, dec->sample_rate,
1615 av_opt_set_int(ost->swr, "dither_method", ost->swr_dither_method,0);
1616 av_opt_set_int(ost->swr, "dither_scale", ost->swr_dither_scale,0);
1617 if (ost->audio_channels_mapped)
1618 swr_set_channel_mapping(ost->swr, ost->audio_channels_map);
1619 av_opt_set_double(ost->swr, "rmvol", ost->rematrix_volume, 0);
1620 if (ost->audio_channels_mapped) {
1621 av_opt_set_int(ost->swr, "icl", av_get_default_channel_layout(ost->audio_channels_mapped), 0);
1622 av_opt_set_int(ost->swr, "uch", ost->audio_channels_mapped, 0);
1624 if (av_opt_set_int(ost->swr, "ich", dec->channels, 0) < 0) {
1625 av_log(NULL, AV_LOG_FATAL, "Unsupported number of input channels\n");
1628 if (av_opt_set_int(ost->swr, "och", enc->channels, 0) < 0) {
1629 av_log(NULL, AV_LOG_FATAL, "Unsupported number of output channels\n");
1632 if(audio_sync_method>1) av_opt_set_int(ost->swr, "flags", SWR_FLAG_RESAMPLE, 0);
1633 if(ost->swr && swr_init(ost->swr) < 0){
1634 av_log(NULL, AV_LOG_FATAL, "swr_init() failed\n");
1635 swr_free(&ost->swr);
1639 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
1640 dec->channels, dec->sample_rate,
1641 enc->channels, enc->sample_rate);
1647 av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
1649 if (audio_sync_method > 0) {
1650 double delta = get_sync_ipts(ost, ist->pts) * enc->sample_rate - ost->sync_opts -
1651 av_fifo_size(ost->fifo) / (enc->channels * osize);
1652 int idelta = delta * dec->sample_rate / enc->sample_rate;
1653 int byte_delta = idelta * isize * dec->channels;
1655 // FIXME resample delay
1656 if (fabs(delta) > 50) {
1657 if (ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate) {
1658 if (byte_delta < 0) {
1659 byte_delta = FFMAX(byte_delta, -size);
1661 for (i=0; i<planes; i++)
1662 buf[i] -= byte_delta/planes;
1663 av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n",
1664 -byte_delta / (isize * dec->channels));
1669 av_fast_malloc(&async_buf, &allocated_async_buf_size,
1672 av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
1676 if (alloc_audio_output_buf(dec, enc, decoded_frame->nb_samples + idelta) < 0) {
1677 av_log(NULL, AV_LOG_FATAL, "Error allocating audio buffer\n");
1682 for (i=0; i<planes; i++) {
1683 uint8_t *t = async_buf + i*((byte_delta + size)/planes);
1684 generate_silence(t, dec->sample_fmt, byte_delta/planes);
1685 memcpy(t + byte_delta/planes, buf[i], size/planes);
1689 av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
1691 } else if (audio_sync_method > 1) {
1692 int comp = av_clip(delta, -audio_sync_method, audio_sync_method);
1693 av_assert0(ost->audio_resample);
1694 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
1695 delta, comp, enc->sample_rate);
1696 // 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));
1697 swr_set_compensation(ost->swr, comp, enc->sample_rate);
1700 } else if (audio_sync_method == 0)
1701 ost->sync_opts = lrintf(get_sync_ipts(ost, ist->pts) * enc->sample_rate) -
1702 av_fifo_size(ost->fifo) / (enc->channels * osize); // FIXME wrong
1704 if (ost->audio_resample || ost->audio_channels_mapped) {
1706 size_out = swr_convert(ost->swr, ( uint8_t*[]){buftmp}, allocated_audio_buf_size / (enc->channels * osize),
1707 buf, size / (dec->channels * isize));
1709 av_log(NULL, AV_LOG_FATAL, "swr_convert failed\n");
1712 size_out = size_out * enc->channels * osize;
1718 av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
1720 /* now encode as many frames as possible */
1721 if (!(enc->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)) {
1722 /* output resampled raw samples */
1723 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
1724 av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
1727 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
1729 frame_bytes = enc->frame_size * osize * enc->channels;
1731 while (av_fifo_size(ost->fifo) >= frame_bytes) {
1732 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
1733 encode_audio_frame(s, ost, audio_buf, frame_bytes);
1736 encode_audio_frame(s, ost, buftmp, size_out);
1740 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1742 AVCodecContext *dec;
1743 AVPicture *picture2;
1744 AVPicture picture_tmp;
1747 dec = ist->st->codec;
1749 /* deinterlace : must be done before any resize */
1750 if (do_deinterlace) {
1753 /* create temporary picture */
1754 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1755 buf = av_malloc(size);
1759 picture2 = &picture_tmp;
1760 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1762 if (avpicture_deinterlace(picture2, picture,
1763 dec->pix_fmt, dec->width, dec->height) < 0) {
1764 /* if error, do not deinterlace */
1765 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1774 if (picture != picture2)
1775 *picture = *picture2;
1779 static void do_subtitle_out(AVFormatContext *s,
1785 static uint8_t *subtitle_out = NULL;
1786 int subtitle_out_max_size = 1024 * 1024;
1787 int subtitle_out_size, nb, i;
1788 AVCodecContext *enc;
1791 if (pts == AV_NOPTS_VALUE) {
1792 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1798 enc = ost->st->codec;
1800 if (!subtitle_out) {
1801 subtitle_out = av_malloc(subtitle_out_max_size);
1804 /* Note: DVB subtitle need one packet to draw them and one other
1805 packet to clear them */
1806 /* XXX: signal it in the codec context ? */
1807 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1812 for (i = 0; i < nb; i++) {
1813 ost->sync_opts = av_rescale_q(pts, ist->st->time_base, enc->time_base);
1815 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1816 // start_display_time is required to be 0
1817 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1818 sub->end_display_time -= sub->start_display_time;
1819 sub->start_display_time = 0;
1820 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1821 subtitle_out_max_size, sub);
1822 if (subtitle_out_size < 0) {
1823 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1827 av_init_packet(&pkt);
1828 pkt.data = subtitle_out;
1829 pkt.size = subtitle_out_size;
1830 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1831 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1832 /* XXX: the pts correction is handled here. Maybe handling
1833 it in the codec would be better */
1835 pkt.pts += 90 * sub->start_display_time;
1837 pkt.pts += 90 * sub->end_display_time;
1839 write_frame(s, &pkt, ost);
1843 static double psnr(double d)
1845 return -10.0 * log(d) / log(10.0);
1848 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1851 AVCodecContext *enc;
1853 double ti1, bitrate, avg_bitrate;
1855 /* this is executed just the first time do_video_stats is called */
1857 vstats_file = fopen(vstats_filename, "w");
1864 enc = ost->st->codec;
1865 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1866 frame_number = ost->frame_number;
1867 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1868 if (enc->flags&CODEC_FLAG_PSNR)
1869 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1871 fprintf(vstats_file,"f_size= %6d ", frame_size);
1872 /* compute pts value */
1873 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1877 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1878 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1879 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1880 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1881 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1886 static void do_video_out(AVFormatContext *s, OutputStream *ost,
1887 AVFrame *in_picture, float quality)
1889 int nb_frames, i, ret, format_video_sync;
1890 AVCodecContext *enc;
1891 double sync_ipts, delta;
1892 double duration = 0;
1894 InputStream *ist = NULL;
1896 if (ost->source_index >= 0)
1897 ist = input_streams[ost->source_index];
1899 enc = ost->st->codec;
1901 if (ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE) {
1902 duration = FFMAX(av_q2d(ist->st->time_base), av_q2d(ist->st->codec->time_base));
1903 if(ist->st->r_frame_rate.num)
1904 duration= FFMAX(duration, 1/av_q2d(ist->st->r_frame_rate));
1905 if(ist->st->avg_frame_rate.num && 0)
1906 duration= FFMAX(duration, 1/av_q2d(ist->st->avg_frame_rate));
1908 duration /= av_q2d(enc->time_base);
1911 sync_ipts = get_sync_ipts(ost, in_picture->pts) / av_q2d(enc->time_base);
1912 delta = sync_ipts - ost->sync_opts + duration;
1914 /* by default, we output a single frame */
1917 format_video_sync = video_sync_method;
1918 if (format_video_sync == VSYNC_AUTO)
1919 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
1921 switch (format_video_sync) {
1923 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1926 else if (delta > 1.1)
1927 nb_frames = lrintf(delta);
1932 else if (delta > 0.6)
1933 ost->sync_opts = lrintf(sync_ipts);
1936 case VSYNC_PASSTHROUGH:
1937 ost->sync_opts = lrintf(sync_ipts);
1943 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1944 if (nb_frames == 0) {
1946 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1948 } else if (nb_frames > 1) {
1949 nb_frames_dup += nb_frames - 1;
1950 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1953 /* duplicates frame if needed */
1954 for (i = 0; i < nb_frames; i++) {
1956 av_init_packet(&pkt);
1960 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1961 enc->codec->id == CODEC_ID_RAWVIDEO) {
1962 /* raw pictures are written as AVPicture structure to
1963 avoid any copies. We support temporarily the older
1965 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1966 enc->coded_frame->top_field_first = in_picture->top_field_first;
1967 pkt.data = (uint8_t *)in_picture;
1968 pkt.size = sizeof(AVPicture);
1969 pkt.pts = av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1970 pkt.flags |= AV_PKT_FLAG_KEY;
1972 write_frame(s, &pkt, ost);
1975 AVFrame big_picture;
1977 big_picture = *in_picture;
1978 /* better than nothing: use input picture interlaced
1980 big_picture.interlaced_frame = in_picture->interlaced_frame;
1981 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1982 if (ost->top_field_first == -1)
1983 big_picture.top_field_first = in_picture->top_field_first;
1985 big_picture.top_field_first = !!ost->top_field_first;
1988 /* handles same_quant here. This is not correct because it may
1989 not be a global option */
1990 big_picture.quality = quality;
1991 if (!enc->me_threshold)
1992 big_picture.pict_type = 0;
1993 big_picture.pts = ost->sync_opts;
1994 if (ost->forced_kf_index < ost->forced_kf_count &&
1995 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1996 big_picture.pict_type = AV_PICTURE_TYPE_I;
1997 ost->forced_kf_index++;
1999 update_benchmark(NULL);
2000 ret = avcodec_encode_video2(enc, &pkt, &big_picture, &got_packet);
2001 update_benchmark("encode_video %d.%d", ost->file_index, ost->index);
2003 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
2008 if (pkt.pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & CODEC_CAP_DELAY))
2009 pkt.pts = ost->sync_opts;
2011 if (pkt.pts != AV_NOPTS_VALUE)
2012 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
2013 if (pkt.dts != AV_NOPTS_VALUE)
2014 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
2017 av_log(NULL, AV_LOG_INFO, "encoder -> type:video "
2018 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
2019 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
2020 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
2023 write_frame(s, &pkt, ost);
2024 frame_size = pkt.size;
2025 video_size += pkt.size;
2026 av_free_packet(&pkt);
2028 /* if two pass, output log */
2029 if (ost->logfile && enc->stats_out) {
2030 fprintf(ost->logfile, "%s", enc->stats_out);
2036 * For video, number of frames in == number of packets out.
2037 * But there may be reordering, so we can't throw away frames on encoder
2038 * flush, we need to limit them here, before they go into encoder.
2040 ost->frame_number++;
2042 if (vstats_filename && frame_size)
2043 do_video_stats(output_files[ost->file_index]->ctx, ost, frame_size);
2046 /* check for new output on any of the filtergraphs */
2047 static int poll_filters(void)
2049 AVFilterBufferRef *picref;
2050 AVFrame *filtered_frame = NULL;
2051 int i, ret, ret_all;
2052 unsigned nb_success, nb_eof;
2055 /* Reap all buffers present in the buffer sinks */
2057 for (i = 0; i < nb_output_streams; i++) {
2058 OutputStream *ost = output_streams[i];
2059 OutputFile *of = output_files[ost->file_index];
2061 if (!ost->filter || ost->is_past_recording_time)
2064 if (!ost->filtered_frame && !(ost->filtered_frame = avcodec_alloc_frame())) {
2065 return AVERROR(ENOMEM);
2067 avcodec_get_frame_defaults(ost->filtered_frame);
2068 filtered_frame = ost->filtered_frame;
2071 AVRational ist_pts_tb = ost->filter->filter->inputs[0]->time_base;
2072 ret = av_buffersink_get_buffer_ref(ost->filter->filter, &picref,
2073 AV_BUFFERSINK_FLAG_NO_REQUEST);
2075 if (ret != AVERROR(EAGAIN)) {
2077 av_strerror(ret, buf, sizeof(buf));
2078 av_log(NULL, AV_LOG_WARNING,
2079 "Error in av_buffersink_get_buffer_ref(): %s\n", buf);
2083 filtered_frame->pts = av_rescale_q(picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
2084 // if (ost->source_index >= 0)
2085 // *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold
2087 if (of->start_time && filtered_frame->pts < of->start_time)
2090 switch (ost->filter->filter->inputs[0]->type) {
2091 case AVMEDIA_TYPE_VIDEO:
2092 avfilter_fill_frame_from_video_buffer_ref(filtered_frame, picref);
2093 if (!ost->frame_aspect_ratio)
2094 ost->st->codec->sample_aspect_ratio = picref->video->sample_aspect_ratio;
2096 do_video_out(of->ctx, ost, filtered_frame,
2097 same_quant ? ost->last_quality :
2098 ost->st->codec->global_quality);
2101 // TODO support audio/subtitle filters
2105 avfilter_unref_buffer(picref);
2108 /* Request frames through all the graphs */
2109 ret_all = nb_success = nb_eof = 0;
2110 for (i = 0; i < nb_filtergraphs; i++) {
2111 ret = avfilter_graph_request_oldest(filtergraphs[i]->graph);
2114 } else if (ret == AVERROR_EOF) {
2116 } else if (ret != AVERROR(EAGAIN)) {
2118 av_strerror(ret, buf, sizeof(buf));
2119 av_log(NULL, AV_LOG_WARNING,
2120 "Error in request_frame(): %s\n", buf);
2126 /* Try again if anything succeeded */
2128 return nb_eof == nb_filtergraphs ? AVERROR_EOF : ret_all;
2131 static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time)
2135 AVFormatContext *oc;
2137 AVCodecContext *enc;
2138 int frame_number, vid, i;
2140 int64_t pts = INT64_MAX;
2141 static int64_t last_time = -1;
2142 static int qp_histogram[52];
2143 int hours, mins, secs, us;
2145 if (!print_stats && !is_last_report)
2148 if (!is_last_report) {
2149 if (last_time == -1) {
2150 last_time = cur_time;
2153 if ((cur_time - last_time) < 500000)
2155 last_time = cur_time;
2159 oc = output_files[0]->ctx;
2161 total_size = avio_size(oc->pb);
2162 if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
2163 total_size = avio_tell(oc->pb);
2170 for (i = 0; i < nb_output_streams; i++) {
2172 ost = output_streams[i];
2173 enc = ost->st->codec;
2174 if (!ost->stream_copy && enc->coded_frame)
2175 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
2176 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2177 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
2179 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2180 float fps, t = (cur_time-timer_start) / 1000000.0;
2182 frame_number = ost->frame_number;
2183 fps = t > 1 ? frame_number / t : 0;
2184 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3.*f q=%3.1f ",
2185 frame_number, fps < 9.95, fps, q);
2187 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
2191 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
2193 for (j = 0; j < 32; j++)
2194 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
2196 if (enc->flags&CODEC_FLAG_PSNR) {
2198 double error, error_sum = 0;
2199 double scale, scale_sum = 0;
2200 char type[3] = { 'Y','U','V' };
2201 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
2202 for (j = 0; j < 3; j++) {
2203 if (is_last_report) {
2204 error = enc->error[j];
2205 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
2207 error = enc->coded_frame->error[j];
2208 scale = enc->width * enc->height * 255.0 * 255.0;
2214 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error / scale));
2216 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
2220 /* compute min output value */
2221 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
2222 ost->st->time_base, AV_TIME_BASE_Q));
2225 secs = pts / AV_TIME_BASE;
2226 us = pts % AV_TIME_BASE;
2232 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
2234 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2235 "size=%8.0fkB time=", total_size / 1024.0);
2236 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2237 "%02d:%02d:%02d.%02d ", hours, mins, secs,
2238 (100 * us) / AV_TIME_BASE);
2239 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2240 "bitrate=%6.1fkbits/s", bitrate);
2242 if (nb_frames_dup || nb_frames_drop)
2243 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
2244 nb_frames_dup, nb_frames_drop);
2246 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
2250 if (is_last_report) {
2251 int64_t raw= audio_size + video_size + extra_size;
2252 av_log(NULL, AV_LOG_INFO, "\n");
2253 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
2254 video_size / 1024.0,
2255 audio_size / 1024.0,
2256 extra_size / 1024.0,
2257 100.0 * (total_size - raw) / raw
2259 if(video_size + audio_size + extra_size == 0){
2260 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
2265 static void flush_encoders(void)
2269 for (i = 0; i < nb_output_streams; i++) {
2270 OutputStream *ost = output_streams[i];
2271 AVCodecContext *enc = ost->st->codec;
2272 AVFormatContext *os = output_files[ost->file_index]->ctx;
2273 int stop_encoding = 0;
2275 if (!ost->encoding_needed)
2278 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
2280 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
2285 int fifo_bytes, got_packet;
2286 av_init_packet(&pkt);
2290 switch (ost->st->codec->codec_type) {
2291 case AVMEDIA_TYPE_AUDIO:
2292 fifo_bytes = av_fifo_size(ost->fifo);
2293 if (fifo_bytes > 0) {
2294 /* encode any samples remaining in fifo */
2295 int frame_bytes = fifo_bytes;
2297 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
2299 /* pad last frame with silence if needed */
2300 if (!(enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME)) {
2301 frame_bytes = enc->frame_size * enc->channels *
2302 av_get_bytes_per_sample(enc->sample_fmt);
2303 if (allocated_audio_buf_size < frame_bytes)
2305 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
2307 encode_audio_frame(os, ost, audio_buf, frame_bytes);
2309 /* flush encoder with NULL frames until it is done
2310 returning packets */
2311 if (encode_audio_frame(os, ost, NULL, 0) == 0) {
2317 case AVMEDIA_TYPE_VIDEO:
2318 update_benchmark(NULL);
2319 ret = avcodec_encode_video2(enc, &pkt, NULL, &got_packet);
2320 update_benchmark("encode_video %d.%d", ost->file_index, ost->index);
2322 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
2325 video_size += pkt.size;
2326 if (ost->logfile && enc->stats_out) {
2327 fprintf(ost->logfile, "%s", enc->stats_out);
2333 if (pkt.pts != AV_NOPTS_VALUE)
2334 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
2335 if (pkt.dts != AV_NOPTS_VALUE)
2336 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
2337 write_frame(os, &pkt, ost);
2349 * Check whether a packet from ist should be written into ost at this time
2351 static int check_output_constraints(InputStream *ist, OutputStream *ost)
2353 OutputFile *of = output_files[ost->file_index];
2354 int ist_index = input_files[ist->file_index]->ist_index + ist->st->index;
2356 if (ost->source_index != ist_index)
2359 if (of->start_time && ist->pts < of->start_time)
2362 if (of->recording_time != INT64_MAX &&
2363 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
2364 (AVRational){ 1, 1000000 }) >= 0) {
2365 ost->is_past_recording_time = 1;
2372 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
2374 OutputFile *of = output_files[ost->file_index];
2375 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
2379 av_init_packet(&opkt);
2381 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
2382 !ost->copy_initial_nonkeyframes)
2385 /* force the input stream PTS */
2386 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
2387 audio_size += pkt->size;
2388 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2389 video_size += pkt->size;
2393 if (pkt->pts != AV_NOPTS_VALUE)
2394 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
2396 opkt.pts = AV_NOPTS_VALUE;
2398 if (pkt->dts == AV_NOPTS_VALUE)
2399 opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->st->time_base);
2401 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
2402 opkt.dts -= ost_tb_start_time;
2404 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
2405 opkt.flags = pkt->flags;
2407 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
2408 if ( ost->st->codec->codec_id != CODEC_ID_H264
2409 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
2410 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
2411 && ost->st->codec->codec_id != CODEC_ID_VC1
2413 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
2414 opkt.destruct = av_destruct_packet;
2416 opkt.data = pkt->data;
2417 opkt.size = pkt->size;
2419 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
2420 /* store AVPicture in AVPacket, as expected by the output format */
2421 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
2422 opkt.data = (uint8_t *)&pict;
2423 opkt.size = sizeof(AVPicture);
2424 opkt.flags |= AV_PKT_FLAG_KEY;
2427 write_frame(of->ctx, &opkt, ost);
2428 ost->st->codec->frame_number++;
2429 av_free_packet(&opkt);
2432 static void rate_emu_sleep(InputStream *ist)
2434 if (input_files[ist->file_index]->rate_emu) {
2435 int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
2436 int64_t now = av_gettime() - ist->start;
2442 static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
2444 AVFrame *decoded_frame;
2445 AVCodecContext *avctx = ist->st->codec;
2446 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
2449 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2450 return AVERROR(ENOMEM);
2452 avcodec_get_frame_defaults(ist->decoded_frame);
2453 decoded_frame = ist->decoded_frame;
2455 update_benchmark(NULL);
2456 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
2457 update_benchmark("decode_audio %d.%d", ist->file_index, ist->st->index);
2461 if (avctx->sample_rate <= 0) {
2462 av_log(avctx, AV_LOG_ERROR, "Sample rate %d invalid\n", avctx->sample_rate);
2463 return AVERROR_INVALIDDATA;
2467 /* no audio frame */
2471 /* if the decoder provides a pts, use it instead of the last packet pts.
2472 the decoder could be delaying output by a packet or more. */
2473 if (decoded_frame->pts != AV_NOPTS_VALUE)
2474 ist->dts = ist->next_dts = ist->pts = ist->next_pts = decoded_frame->pts;
2476 /* increment next_dts to use for the case where the input stream does not
2477 have timestamps or there are multiple frames in the packet */
2478 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2480 ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2484 // preprocess audio (volume)
2485 if (audio_volume != 256) {
2486 int decoded_data_size = decoded_frame->nb_samples * avctx->channels * bps;
2487 void *samples = decoded_frame->data[0];
2488 switch (avctx->sample_fmt) {
2489 case AV_SAMPLE_FMT_U8:
2491 uint8_t *volp = samples;
2492 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2493 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
2494 *volp++ = av_clip_uint8(v);
2498 case AV_SAMPLE_FMT_S16:
2500 int16_t *volp = samples;
2501 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2502 int v = ((*volp) * audio_volume + 128) >> 8;
2503 *volp++ = av_clip_int16(v);
2507 case AV_SAMPLE_FMT_S32:
2509 int32_t *volp = samples;
2510 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2511 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
2512 *volp++ = av_clipl_int32(v);
2516 case AV_SAMPLE_FMT_FLT:
2518 float *volp = samples;
2519 float scale = audio_volume / 256.f;
2520 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2525 case AV_SAMPLE_FMT_DBL:
2527 double *volp = samples;
2528 double scale = audio_volume / 256.;
2529 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2535 av_log(NULL, AV_LOG_FATAL,
2536 "Audio volume adjustment on sample format %s is not supported.\n",
2537 av_get_sample_fmt_name(ist->st->codec->sample_fmt));
2542 rate_emu_sleep(ist);
2544 for (i = 0; i < nb_output_streams; i++) {
2545 OutputStream *ost = output_streams[i];
2547 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2549 do_audio_out(output_files[ost->file_index]->ctx, ost, ist, decoded_frame);
2555 static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *pkt_pts)
2557 AVFrame *decoded_frame;
2558 void *buffer_to_free = NULL;
2559 int i, ret = 0, resample_changed;
2560 int64_t *best_effort_timestamp;
2561 AVRational *frame_sample_aspect;
2564 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2565 return AVERROR(ENOMEM);
2567 avcodec_get_frame_defaults(ist->decoded_frame);
2568 decoded_frame = ist->decoded_frame;
2569 pkt->pts = *pkt_pts;
2570 pkt->dts = ist->dts;
2571 *pkt_pts = AV_NOPTS_VALUE;
2573 update_benchmark(NULL);
2574 ret = avcodec_decode_video2(ist->st->codec,
2575 decoded_frame, got_output, pkt);
2576 update_benchmark("decode_video %d.%d", ist->file_index, ist->st->index);
2580 quality = same_quant ? decoded_frame->quality : 0;
2582 /* no picture yet */
2584 for (i = 0; i < ist->nb_filters; i++)
2585 av_buffersrc_buffer(ist->filters[i]->filter, NULL);
2589 best_effort_timestamp= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "best_effort_timestamp");
2590 if(*best_effort_timestamp != AV_NOPTS_VALUE)
2591 ist->next_pts = ist->pts = decoded_frame->pts = *best_effort_timestamp;
2595 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2597 rate_emu_sleep(ist);
2599 if (ist->st->sample_aspect_ratio.num)
2600 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
2602 resample_changed = ist->resample_width != decoded_frame->width ||
2603 ist->resample_height != decoded_frame->height ||
2604 ist->resample_pix_fmt != decoded_frame->format;
2605 if (resample_changed) {
2606 av_log(NULL, AV_LOG_INFO,
2607 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
2608 ist->file_index, ist->st->index,
2609 ist->resample_width, ist->resample_height, av_get_pix_fmt_name(ist->resample_pix_fmt),
2610 decoded_frame->width, decoded_frame->height, av_get_pix_fmt_name(decoded_frame->format));
2612 ist->resample_width = decoded_frame->width;
2613 ist->resample_height = decoded_frame->height;
2614 ist->resample_pix_fmt = decoded_frame->format;
2616 for (i = 0; i < nb_filtergraphs; i++)
2617 if (ist_in_filtergraph(filtergraphs[i], ist) &&
2618 configure_filtergraph(filtergraphs[i]) < 0) {
2619 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2624 frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
2625 for (i = 0; i < ist->nb_filters; i++) {
2626 int changed = ist->st->codec->width != ist->filters[i]->filter->outputs[0]->w
2627 || ist->st->codec->height != ist->filters[i]->filter->outputs[0]->h
2628 || ist->st->codec->pix_fmt != ist->filters[i]->filter->outputs[0]->format;
2629 // XXX what an ugly hack
2630 if (ist->filters[i]->graph->nb_outputs == 1)
2631 ist->filters[i]->graph->outputs[0]->ost->last_quality = quality;
2633 if (!frame_sample_aspect->num)
2634 *frame_sample_aspect = ist->st->sample_aspect_ratio;
2635 if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER && !changed) {
2636 FrameBuffer *buf = decoded_frame->opaque;
2637 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2638 decoded_frame->data, decoded_frame->linesize,
2639 AV_PERM_READ | AV_PERM_PRESERVE,
2640 ist->st->codec->width, ist->st->codec->height,
2641 ist->st->codec->pix_fmt);
2643 avfilter_copy_frame_props(fb, decoded_frame);
2644 fb->buf->priv = buf;
2645 fb->buf->free = filter_release_buffer;
2647 av_assert0(buf->refcount>0);
2649 av_buffersrc_buffer(ist->filters[i]->filter, fb);
2651 if(av_vsrc_buffer_add_frame(ist->filters[i]->filter, decoded_frame,AV_VSRC_BUF_FLAG_OVERWRITE)<0) {
2652 av_log(NULL, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
2658 av_free(buffer_to_free);
2662 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2664 AVSubtitle subtitle;
2665 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2666 &subtitle, got_output, pkt);
2672 rate_emu_sleep(ist);
2674 for (i = 0; i < nb_output_streams; i++) {
2675 OutputStream *ost = output_streams[i];
2677 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2680 do_subtitle_out(output_files[ost->file_index]->ctx, ost, ist, &subtitle, pkt->pts);
2683 avsubtitle_free(&subtitle);
2687 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2688 static int output_packet(InputStream *ist, const AVPacket *pkt)
2692 int64_t pkt_pts = AV_NOPTS_VALUE;
2695 if (!ist->saw_first_ts) {
2696 ist->dts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames * AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
2698 if (pkt != NULL && pkt->pts != AV_NOPTS_VALUE && !ist->decoding_needed) {
2699 ist->dts += av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2700 ist->pts = ist->dts; //unused but better to set it to a value thats not totally wrong
2702 ist->saw_first_ts = 1;
2705 if (ist->next_dts == AV_NOPTS_VALUE)
2706 ist->next_dts = ist->dts;
2707 if (ist->next_pts == AV_NOPTS_VALUE)
2708 ist->next_pts = ist->pts;
2712 av_init_packet(&avpkt);
2720 if (pkt->dts != AV_NOPTS_VALUE) {
2721 ist->next_dts = ist->dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2722 if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2723 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2725 if(pkt->pts != AV_NOPTS_VALUE)
2726 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2728 // while we have more to decode or while the decoder did output something on EOF
2729 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2733 ist->pts = ist->next_pts;
2734 ist->dts = ist->next_dts;
2736 if (avpkt.size && avpkt.size != pkt->size) {
2737 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2738 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2739 ist->showed_multi_packet_warning = 1;
2742 switch (ist->st->codec->codec_type) {
2743 case AVMEDIA_TYPE_AUDIO:
2744 ret = transcode_audio (ist, &avpkt, &got_output);
2746 case AVMEDIA_TYPE_VIDEO:
2747 ret = transcode_video (ist, &avpkt, &got_output, &pkt_pts);
2748 if (avpkt.duration) {
2749 duration = av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
2750 } else if(ist->st->codec->time_base.num != 0 && ist->st->codec->time_base.den != 0) {
2751 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2752 duration = ((int64_t)AV_TIME_BASE *
2753 ist->st->codec->time_base.num * ticks) /
2754 ist->st->codec->time_base.den;
2758 if(ist->dts != AV_NOPTS_VALUE && duration) {
2759 ist->next_dts += duration;
2761 ist->next_dts = AV_NOPTS_VALUE;
2764 ist->next_pts += duration; //FIXME the duration is not correct in some cases
2766 case AVMEDIA_TYPE_SUBTITLE:
2767 ret = transcode_subtitles(ist, &avpkt, &got_output);
2777 avpkt.pts= AV_NOPTS_VALUE;
2779 // touch data and size only if not EOF
2781 if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2791 /* handle stream copy */
2792 if (!ist->decoding_needed) {
2793 rate_emu_sleep(ist);
2794 ist->dts = ist->next_dts;
2795 switch (ist->st->codec->codec_type) {
2796 case AVMEDIA_TYPE_AUDIO:
2797 ist->next_dts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2798 ist->st->codec->sample_rate;
2800 case AVMEDIA_TYPE_VIDEO:
2801 if (pkt->duration) {
2802 ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2803 } else if(ist->st->codec->time_base.num != 0) {
2804 int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2805 ist->next_dts += ((int64_t)AV_TIME_BASE *
2806 ist->st->codec->time_base.num * ticks) /
2807 ist->st->codec->time_base.den;
2811 ist->pts = ist->dts;
2812 ist->next_pts = ist->next_dts;
2814 for (i = 0; pkt && i < nb_output_streams; i++) {
2815 OutputStream *ost = output_streams[i];
2817 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2820 do_streamcopy(ist, ost, pkt);
2826 static void print_sdp(void)
2830 AVFormatContext **avc = av_malloc(sizeof(*avc) * nb_output_files);
2834 for (i = 0; i < nb_output_files; i++)
2835 avc[i] = output_files[i]->ctx;
2837 av_sdp_create(avc, nb_output_files, sdp, sizeof(sdp));
2838 printf("SDP:\n%s\n", sdp);
2843 static int init_input_stream(int ist_index, char *error, int error_len)
2846 InputStream *ist = input_streams[ist_index];
2848 if (ist->decoding_needed) {
2849 AVCodec *codec = ist->dec;
2851 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2852 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2853 return AVERROR(EINVAL);
2856 ist->dr1 = codec->capabilities & CODEC_CAP_DR1;
2857 if (codec->type == AVMEDIA_TYPE_VIDEO && ist->dr1) {
2858 ist->st->codec->get_buffer = codec_get_buffer;
2859 ist->st->codec->release_buffer = codec_release_buffer;
2860 ist->st->codec->opaque = ist;
2863 if (!av_dict_get(ist->opts, "threads", NULL, 0))
2864 av_dict_set(&ist->opts, "threads", "auto", 0);
2865 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2866 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2867 ist->file_index, ist->st->index);
2868 return AVERROR(EINVAL);
2870 assert_codec_experimental(ist->st->codec, 0);
2871 assert_avoptions(ist->opts);
2873 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2874 for (i = 0; i < nb_output_streams; i++) {
2875 OutputStream *ost = output_streams[i];
2876 if (ost->source_index == ist_index) {
2877 if (!ist->st->codec->channel_layout || !ost->st->codec->channel_layout)
2878 get_default_channel_layouts(ost, ist);
2885 ist->next_pts = AV_NOPTS_VALUE;
2886 ist->next_dts = AV_NOPTS_VALUE;
2892 static InputStream *get_input_stream(OutputStream *ost)
2894 if (ost->source_index >= 0)
2895 return input_streams[ost->source_index];
2898 FilterGraph *fg = ost->filter->graph;
2901 for (i = 0; i < fg->nb_inputs; i++)
2902 if (fg->inputs[i]->ist->st->codec->codec_type == ost->st->codec->codec_type)
2903 return fg->inputs[i]->ist;
2909 static int transcode_init(void)
2911 int ret = 0, i, j, k;
2912 AVFormatContext *oc;
2913 AVCodecContext *codec, *icodec;
2919 /* init framerate emulation */
2920 for (i = 0; i < nb_input_files; i++) {
2921 InputFile *ifile = input_files[i];
2922 if (ifile->rate_emu)
2923 for (j = 0; j < ifile->nb_streams; j++)
2924 input_streams[j + ifile->ist_index]->start = av_gettime();
2927 /* output stream init */
2928 for (i = 0; i < nb_output_files; i++) {
2929 oc = output_files[i]->ctx;
2930 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2931 av_dump_format(oc, i, oc->filename, 1);
2932 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2933 return AVERROR(EINVAL);
2937 /* init complex filtergraphs */
2938 for (i = 0; i < nb_filtergraphs; i++)
2939 if ((ret = avfilter_graph_config(filtergraphs[i]->graph, NULL)) < 0)
2942 /* for each output stream, we compute the right encoding parameters */
2943 for (i = 0; i < nb_output_streams; i++) {
2944 ost = output_streams[i];
2945 oc = output_files[ost->file_index]->ctx;
2946 ist = get_input_stream(ost);
2948 if (ost->attachment_filename)
2951 codec = ost->st->codec;
2954 icodec = ist->st->codec;
2956 ost->st->disposition = ist->st->disposition;
2957 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2958 codec->chroma_sample_location = icodec->chroma_sample_location;
2961 if (ost->stream_copy) {
2962 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2964 if (extra_size > INT_MAX) {
2965 return AVERROR(EINVAL);
2968 /* if stream_copy is selected, no need to decode or encode */
2969 codec->codec_id = icodec->codec_id;
2970 codec->codec_type = icodec->codec_type;
2972 if (!codec->codec_tag) {
2973 if (!oc->oformat->codec_tag ||
2974 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2975 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2976 codec->codec_tag = icodec->codec_tag;
2979 codec->bit_rate = icodec->bit_rate;
2980 codec->rc_max_rate = icodec->rc_max_rate;
2981 codec->rc_buffer_size = icodec->rc_buffer_size;
2982 codec->field_order = icodec->field_order;
2983 codec->extradata = av_mallocz(extra_size);
2984 if (!codec->extradata) {
2985 return AVERROR(ENOMEM);
2987 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2988 codec->extradata_size= icodec->extradata_size;
2990 codec->time_base = ist->st->time_base;
2992 * Avi is a special case here because it supports variable fps but
2993 * having the fps and timebase differe significantly adds quite some
2996 if(!strcmp(oc->oformat->name, "avi")) {
2997 if ( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
2998 && av_q2d(ist->st->time_base) < 1.0/500
3000 codec->time_base = icodec->time_base;
3001 codec->time_base.num *= icodec->ticks_per_frame;
3002 codec->time_base.den *= 2;
3003 codec->ticks_per_frame = 2;
3005 } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
3006 && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
3007 && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
3009 if( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
3010 && av_q2d(ist->st->time_base) < 1.0/500
3012 codec->time_base = icodec->time_base;
3013 codec->time_base.num *= icodec->ticks_per_frame;
3016 av_reduce(&codec->time_base.num, &codec->time_base.den,
3017 codec->time_base.num, codec->time_base.den, INT_MAX);
3019 switch (codec->codec_type) {
3020 case AVMEDIA_TYPE_AUDIO:
3021 if (audio_volume != 256) {
3022 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
3025 codec->channel_layout = icodec->channel_layout;
3026 codec->sample_rate = icodec->sample_rate;
3027 codec->channels = icodec->channels;
3028 codec->frame_size = icodec->frame_size;
3029 codec->audio_service_type = icodec->audio_service_type;
3030 codec->block_align = icodec->block_align;
3032 case AVMEDIA_TYPE_VIDEO:
3033 codec->pix_fmt = icodec->pix_fmt;
3034 codec->width = icodec->width;
3035 codec->height = icodec->height;
3036 codec->has_b_frames = icodec->has_b_frames;
3037 if (!codec->sample_aspect_ratio.num) {
3038 codec->sample_aspect_ratio =
3039 ost->st->sample_aspect_ratio =
3040 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
3041 ist->st->codec->sample_aspect_ratio.num ?
3042 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
3044 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
3046 case AVMEDIA_TYPE_SUBTITLE:
3047 codec->width = icodec->width;
3048 codec->height = icodec->height;
3050 case AVMEDIA_TYPE_DATA:
3051 case AVMEDIA_TYPE_ATTACHMENT:
3058 ost->enc = avcodec_find_encoder(codec->codec_id);
3060 /* should only happen when a default codec is not present. */
3061 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
3062 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
3063 ret = AVERROR(EINVAL);
3068 ist->decoding_needed = 1;
3069 ost->encoding_needed = 1;
3071 switch (codec->codec_type) {
3072 case AVMEDIA_TYPE_AUDIO:
3073 ost->fifo = av_fifo_alloc(1024);
3075 return AVERROR(ENOMEM);
3077 if (!codec->sample_rate)
3078 codec->sample_rate = icodec->sample_rate;
3079 choose_sample_rate(ost->st, ost->enc);
3080 codec->time_base = (AVRational){ 1, codec->sample_rate };
3082 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
3083 codec->sample_fmt = icodec->sample_fmt;
3084 choose_sample_fmt(ost->st, ost->enc);
3086 if (ost->audio_channels_mapped) {
3087 /* the requested output channel is set to the number of
3088 * -map_channel only if no -ac are specified */
3089 if (!codec->channels) {
3090 codec->channels = ost->audio_channels_mapped;
3091 codec->channel_layout = av_get_default_channel_layout(codec->channels);
3092 if (!codec->channel_layout) {
3093 av_log(NULL, AV_LOG_FATAL, "Unable to find an appropriate channel layout for requested number of channel\n");
3097 /* fill unused channel mapping with -1 (which means a muted
3098 * channel in case the number of output channels is bigger
3099 * than the number of mapped channel) */
3100 for (j = ost->audio_channels_mapped; j < FF_ARRAY_ELEMS(ost->audio_channels_map); j++)
3101 ost->audio_channels_map[j] = -1;
3102 } else if (!codec->channels) {
3103 codec->channels = icodec->channels;
3104 codec->channel_layout = icodec->channel_layout;
3106 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
3107 codec->channel_layout = 0;
3109 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
3110 ost->audio_resample |= codec->sample_fmt != icodec->sample_fmt
3111 || codec->channel_layout != icodec->channel_layout;
3112 icodec->request_channels = codec->channels;
3113 ost->resample_sample_fmt = icodec->sample_fmt;
3114 ost->resample_sample_rate = icodec->sample_rate;
3115 ost->resample_channels = icodec->channels;
3117 case AVMEDIA_TYPE_VIDEO:
3120 fg = init_simple_filtergraph(ist, ost);
3121 if (configure_video_filters(fg)) {
3122 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
3127 if (ist && !ost->frame_rate.num)
3128 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational) { 25, 1 };
3129 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
3130 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
3131 ost->frame_rate = ost->enc->supported_framerates[idx];
3133 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
3134 if ( av_q2d(codec->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
3135 && (video_sync_method == VSYNC_CFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
3136 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not efficiently supporting it.\n"
3137 "Please consider specifying a lower framerate, a different muxer or -vsync 2\n");
3139 for (j = 0; j < ost->forced_kf_count; j++)
3140 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
3144 codec->width = ost->filter->filter->inputs[0]->w;
3145 codec->height = ost->filter->filter->inputs[0]->h;
3146 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
3147 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
3148 av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
3149 ost->filter->filter->inputs[0]->sample_aspect_ratio;
3150 codec->pix_fmt = ost->filter->filter->inputs[0]->format;
3152 if (codec->width != icodec->width ||
3153 codec->height != icodec->height ||
3154 codec->pix_fmt != icodec->pix_fmt) {
3155 codec->bits_per_raw_sample = frame_bits_per_raw_sample;
3159 case AVMEDIA_TYPE_SUBTITLE:
3160 codec->time_base = (AVRational){1, 1000};
3167 if (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2)) {
3168 char logfilename[1024];
3171 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
3172 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
3174 if (!strcmp(ost->enc->name, "libx264")) {
3175 av_dict_set(&ost->opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
3177 if (codec->flags & CODEC_FLAG_PASS2) {
3179 size_t logbuffer_size;
3180 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
3181 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
3185 codec->stats_in = logbuffer;
3187 if (codec->flags & CODEC_FLAG_PASS1) {
3188 f = fopen(logfilename, "wb");
3190 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
3191 logfilename, strerror(errno));
3201 /* open each encoder */
3202 for (i = 0; i < nb_output_streams; i++) {
3203 ost = output_streams[i];
3204 if (ost->encoding_needed) {
3205 AVCodec *codec = ost->enc;
3206 AVCodecContext *dec = NULL;
3208 if ((ist = get_input_stream(ost)))
3209 dec = ist->st->codec;
3210 if (dec && dec->subtitle_header) {
3211 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
3212 if (!ost->st->codec->subtitle_header) {
3213 ret = AVERROR(ENOMEM);
3216 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
3217 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
3219 if (!av_dict_get(ost->opts, "threads", NULL, 0))
3220 av_dict_set(&ost->opts, "threads", "auto", 0);
3221 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
3222 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
3223 ost->file_index, ost->index);
3224 ret = AVERROR(EINVAL);
3227 assert_codec_experimental(ost->st->codec, 1);
3228 assert_avoptions(ost->opts);
3229 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
3230 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
3231 " It takes bits/s as argument, not kbits/s\n");
3232 extra_size += ost->st->codec->extradata_size;
3234 if (ost->st->codec->me_threshold)
3235 input_streams[ost->source_index]->st->codec->debug |= FF_DEBUG_MV;
3239 /* init input streams */
3240 for (i = 0; i < nb_input_streams; i++)
3241 if ((ret = init_input_stream(i, error, sizeof(error))) < 0)
3244 /* discard unused programs */
3245 for (i = 0; i < nb_input_files; i++) {
3246 InputFile *ifile = input_files[i];
3247 for (j = 0; j < ifile->ctx->nb_programs; j++) {
3248 AVProgram *p = ifile->ctx->programs[j];
3249 int discard = AVDISCARD_ALL;
3251 for (k = 0; k < p->nb_stream_indexes; k++)
3252 if (!input_streams[ifile->ist_index + p->stream_index[k]]->discard) {
3253 discard = AVDISCARD_DEFAULT;
3256 p->discard = discard;
3260 /* open files and write file headers */
3261 for (i = 0; i < nb_output_files; i++) {
3262 oc = output_files[i]->ctx;
3263 oc->interrupt_callback = int_cb;
3264 if (avformat_write_header(oc, &output_files[i]->opts) < 0) {
3265 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
3266 ret = AVERROR(EINVAL);
3269 // assert_avoptions(output_files[i]->opts);
3270 if (strcmp(oc->oformat->name, "rtp")) {
3276 /* dump the file output parameters - cannot be done before in case
3278 for (i = 0; i < nb_output_files; i++) {
3279 av_dump_format(output_files[i]->ctx, i, output_files[i]->ctx->filename, 1);
3282 /* dump the stream mapping */
3283 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
3284 for (i = 0; i < nb_input_streams; i++) {
3285 ist = input_streams[i];
3287 for (j = 0; j < ist->nb_filters; j++) {
3288 AVFilterLink *link = ist->filters[j]->filter->outputs[0];
3289 if (ist->filters[j]->graph->graph_desc) {
3290 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d (%s) -> %s",
3291 ist->file_index, ist->st->index, ist->dec ? ist->dec->name : "?",
3292 link->dst->filter->name);
3293 if (link->dst->input_count > 1)
3294 av_log(NULL, AV_LOG_INFO, ":%s", link->dstpad->name);
3295 if (nb_filtergraphs > 1)
3296 av_log(NULL, AV_LOG_INFO, " (graph %d)", ist->filters[j]->graph->index);
3297 av_log(NULL, AV_LOG_INFO, "\n");
3302 for (i = 0; i < nb_output_streams; i++) {
3303 ost = output_streams[i];
3305 if (ost->attachment_filename) {
3306 /* an attached file */
3307 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
3308 ost->attachment_filename, ost->file_index, ost->index);
3312 if (ost->filter && ost->filter->graph->graph_desc) {
3313 /* output from a complex graph */
3314 AVFilterLink *link = ost->filter->filter->inputs[0];
3315 av_log(NULL, AV_LOG_INFO, " %s", link->src->filter->name);
3316 if (link->src->output_count > 1)
3317 av_log(NULL, AV_LOG_INFO, ":%s", link->srcpad->name);
3318 if (nb_filtergraphs > 1)
3319 av_log(NULL, AV_LOG_INFO, " (graph %d)", ost->filter->graph->index);
3321 av_log(NULL, AV_LOG_INFO, " -> Stream #%d:%d (%s)\n", ost->file_index,
3322 ost->index, ost->enc ? ost->enc->name : "?");
3326 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
3327 input_streams[ost->source_index]->file_index,
3328 input_streams[ost->source_index]->st->index,
3331 if (ost->audio_channels_mapped) {
3332 av_log(NULL, AV_LOG_INFO, " [ch:");
3333 for (j = 0; j < ost->audio_channels_mapped; j++)
3334 if (ost->audio_channels_map[j] == -1)
3335 av_log(NULL, AV_LOG_INFO, " M");
3337 av_log(NULL, AV_LOG_INFO, " %d", ost->audio_channels_map[j]);
3338 av_log(NULL, AV_LOG_INFO, "]");
3340 if (ost->sync_ist != input_streams[ost->source_index])
3341 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
3342 ost->sync_ist->file_index,
3343 ost->sync_ist->st->index);
3344 if (ost->stream_copy)
3345 av_log(NULL, AV_LOG_INFO, " (copy)");
3347 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index]->dec ?
3348 input_streams[ost->source_index]->dec->name : "?",
3349 ost->enc ? ost->enc->name : "?");
3350 av_log(NULL, AV_LOG_INFO, "\n");
3354 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
3366 * The following code is the main loop of the file converter
3368 static int transcode(void)
3371 AVFormatContext *is, *os;
3375 int no_packet_count = 0;
3376 int64_t timer_start;
3379 if (!(no_packet = av_mallocz(nb_input_files)))
3382 ret = transcode_init();
3387 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
3390 timer_start = av_gettime();
3392 for (; received_sigterm == 0;) {
3393 int file_index, ist_index, past_recording_time = 1;
3396 int64_t cur_time= av_gettime();
3398 ipts_min = INT64_MAX;
3399 /* if 'q' pressed, exits */
3401 static int64_t last_time;
3402 if (received_nb_signals)
3404 /* read_key() returns 0 on EOF */
3405 if(cur_time - last_time >= 100000 && !run_as_daemon){
3407 last_time = cur_time;
3412 if (key == '+') av_log_set_level(av_log_get_level()+10);
3413 if (key == '-') av_log_set_level(av_log_get_level()-10);
3414 if (key == 's') qp_hist ^= 1;
3417 do_hex_dump = do_pkt_dump = 0;
3418 } else if(do_pkt_dump){
3422 av_log_set_level(AV_LOG_DEBUG);
3424 if (key == 'c' || key == 'C'){
3425 char buf[4096], target[64], command[256], arg[256] = {0};
3428 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
3430 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
3435 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
3436 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
3437 target, time, command, arg);
3438 for (i = 0; i < nb_filtergraphs; i++) {
3439 FilterGraph *fg = filtergraphs[i];
3442 ret = avfilter_graph_send_command(fg->graph, target, command, arg, buf, sizeof(buf),
3443 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
3444 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
3446 ret = avfilter_graph_queue_command(fg->graph, target, command, arg, 0, time);
3451 av_log(NULL, AV_LOG_ERROR,
3452 "Parse error, at least 3 arguments were expected, "
3453 "only %d given in string '%s'\n", n, buf);
3456 if (key == 'd' || key == 'D'){
3459 debug = input_streams[0]->st->codec->debug<<1;
3460 if(!debug) debug = 1;
3461 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
3464 if(scanf("%d", &debug)!=1)
3465 fprintf(stderr,"error parsing debug value\n");
3466 for(i=0;i<nb_input_streams;i++) {
3467 input_streams[i]->st->codec->debug = debug;
3469 for(i=0;i<nb_output_streams;i++) {
3470 ost = output_streams[i];
3471 ost->st->codec->debug = debug;
3473 if(debug) av_log_set_level(AV_LOG_DEBUG);
3474 fprintf(stderr,"debug=%d\n", debug);
3477 fprintf(stderr, "key function\n"
3478 "? show this help\n"
3479 "+ increase verbosity\n"
3480 "- decrease verbosity\n"
3481 "c Send command to filtergraph\n"
3482 "D cycle through available debug modes\n"
3483 "h dump packets/hex press to cycle through the 3 states\n"
3485 "s Show QP histogram\n"
3490 /* check if there's any stream where output is still needed */
3491 for (i = 0; i < nb_output_streams; i++) {
3493 ost = output_streams[i];
3494 of = output_files[ost->file_index];
3495 os = output_files[ost->file_index]->ctx;
3496 if (ost->is_past_recording_time ||
3497 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
3499 if (ost->frame_number >= ost->max_frames) {
3501 for (j = 0; j < of->ctx->nb_streams; j++)
3502 output_streams[of->ost_index + j]->is_past_recording_time = 1;
3505 past_recording_time = 0;
3507 if (past_recording_time)
3510 /* select the stream that we must read now by looking at the
3511 smallest output pts */
3513 for (i = 0; i < nb_input_streams; i++) {
3515 ist = input_streams[i];
3517 if (ist->discard || no_packet[ist->file_index])
3519 if (!input_files[ist->file_index]->eof_reached) {
3520 if (ipts < ipts_min) {
3522 file_index = ist->file_index;
3526 /* if none, if is finished */
3527 if (file_index < 0) {
3528 if (no_packet_count) {
3529 no_packet_count = 0;
3530 memset(no_packet, 0, nb_input_files);
3537 /* read a frame from it and output it in the fifo */
3538 is = input_files[file_index]->ctx;
3539 ret = av_read_frame(is, &pkt);
3540 if (ret == AVERROR(EAGAIN)) {
3541 no_packet[file_index] = 1;
3546 input_files[file_index]->eof_reached = 1;
3548 for (i = 0; i < input_files[file_index]->nb_streams; i++) {
3549 ist = input_streams[input_files[file_index]->ist_index + i];
3550 if (ist->decoding_needed)
3551 output_packet(ist, NULL);
3560 no_packet_count = 0;
3561 memset(no_packet, 0, nb_input_files);
3564 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
3565 is->streams[pkt.stream_index]);
3567 /* the following test is needed in case new streams appear
3568 dynamically in stream : we ignore them */
3569 if (pkt.stream_index >= input_files[file_index]->nb_streams)
3570 goto discard_packet;
3571 ist_index = input_files[file_index]->ist_index + pkt.stream_index;
3572 ist = input_streams[ist_index];
3574 goto discard_packet;
3576 if (pkt.dts != AV_NOPTS_VALUE)
3577 pkt.dts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3578 if (pkt.pts != AV_NOPTS_VALUE)
3579 pkt.pts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3581 if (pkt.pts != AV_NOPTS_VALUE)
3582 pkt.pts *= ist->ts_scale;
3583 if (pkt.dts != AV_NOPTS_VALUE)
3584 pkt.dts *= ist->ts_scale;
3587 av_log(NULL, AV_LOG_INFO, "demuxer -> ist_index:%d type:%s "
3588 "next_pts:%s next_pts_time:%s pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s off:%"PRId64"\n",
3589 ist_index, av_get_media_type_string(ist->st->codec->codec_type),
3590 av_ts2str(ist->next_pts), av_ts2timestr(ist->next_pts, &ist->st->time_base),
3591 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ist->st->time_base),
3592 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ist->st->time_base),
3593 input_files[ist->file_index]->ts_offset);
3596 if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE && !copy_ts) {
3597 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
3598 int64_t delta = pkt_dts - ist->next_dts;
3599 if (is->iformat->flags & AVFMT_TS_DISCONT) {
3600 if(delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
3601 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
3602 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3603 pkt_dts+1<ist->pts){
3604 input_files[ist->file_index]->ts_offset -= delta;
3605 av_log(NULL, AV_LOG_DEBUG,
3606 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
3607 delta, input_files[ist->file_index]->ts_offset);
3608 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3609 if (pkt.pts != AV_NOPTS_VALUE)
3610 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3613 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3614 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3615 pkt_dts+1<ist->pts){
3616 av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt.dts, ist->next_dts, pkt.stream_index);
3617 pkt.dts = AV_NOPTS_VALUE;
3619 if (pkt.pts != AV_NOPTS_VALUE){
3620 int64_t pkt_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q);
3621 delta = pkt_pts - ist->next_dts;
3622 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3623 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3624 pkt_pts+1<ist->pts) {
3625 av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt.pts, ist->next_dts, pkt.stream_index);
3626 pkt.pts = AV_NOPTS_VALUE;
3632 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
3633 if (output_packet(ist, &pkt) < 0 ||
3634 ((ret = poll_filters()) < 0 && ret != AVERROR_EOF)) {
3635 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
3636 ist->file_index, ist->st->index);
3639 av_free_packet(&pkt);
3644 av_free_packet(&pkt);
3646 /* dump report by using the output first video and audio streams */
3647 print_report(0, timer_start, cur_time);
3650 /* at the end of stream, we must flush the decoder buffers */
3651 for (i = 0; i < nb_input_streams; i++) {
3652 ist = input_streams[i];
3653 if (!input_files[ist->file_index]->eof_reached && ist->decoding_needed) {
3654 output_packet(ist, NULL);
3662 /* write the trailer if needed and close file */
3663 for (i = 0; i < nb_output_files; i++) {
3664 os = output_files[i]->ctx;
3665 av_write_trailer(os);
3668 /* dump report by using the first video and audio streams */
3669 print_report(1, timer_start, av_gettime());
3671 /* close each encoder */
3672 for (i = 0; i < nb_output_streams; i++) {
3673 ost = output_streams[i];
3674 if (ost->encoding_needed) {
3675 av_freep(&ost->st->codec->stats_in);
3676 avcodec_close(ost->st->codec);
3680 /* close each decoder */
3681 for (i = 0; i < nb_input_streams; i++) {
3682 ist = input_streams[i];
3683 if (ist->decoding_needed) {
3684 avcodec_close(ist->st->codec);
3692 av_freep(&no_packet);
3694 if (output_streams) {
3695 for (i = 0; i < nb_output_streams; i++) {
3696 ost = output_streams[i];
3698 if (ost->stream_copy)
3699 av_freep(&ost->st->codec->extradata);
3701 fclose(ost->logfile);
3702 ost->logfile = NULL;
3704 av_fifo_free(ost->fifo); /* works even if fifo is not
3705 initialized but set to zero */
3706 av_freep(&ost->st->codec->subtitle_header);
3707 av_free(ost->forced_kf_pts);
3708 swr_free(&ost->swr);
3709 av_dict_free(&ost->opts);
3716 static int opt_frame_crop(const char *opt, const char *arg)
3718 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
3719 return AVERROR(EINVAL);
3722 static int opt_pad(const char *opt, const char *arg)
3724 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
3728 static int opt_video_channel(const char *opt, const char *arg)
3730 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
3731 return opt_default("channel", arg);
3734 static int opt_video_standard(const char *opt, const char *arg)
3736 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
3737 return opt_default("standard", arg);
3740 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
3742 audio_codec_name = arg;
3743 return parse_option(o, "codec:a", arg, options);
3746 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3748 video_codec_name = arg;
3749 return parse_option(o, "codec:v", arg, options);
3752 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3754 subtitle_codec_name = arg;
3755 return parse_option(o, "codec:s", arg, options);
3758 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3760 return parse_option(o, "codec:d", arg, options);
3763 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
3765 StreamMap *m = NULL;
3766 int i, negative = 0, file_idx;
3767 int sync_file_idx = -1, sync_stream_idx = 0;
3775 map = av_strdup(arg);
3777 /* parse sync stream first, just pick first matching stream */
3778 if (sync = strchr(map, ',')) {
3780 sync_file_idx = strtol(sync + 1, &sync, 0);
3781 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3782 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
3787 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
3788 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
3789 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
3790 sync_stream_idx = i;
3793 if (i == input_files[sync_file_idx]->nb_streams) {
3794 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
3795 "match any streams.\n", arg);
3801 if (map[0] == '[') {
3802 /* this mapping refers to lavfi output */
3803 const char *c = map + 1;
3804 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3805 &o->nb_stream_maps, o->nb_stream_maps + 1);
3806 m = &o->stream_maps[o->nb_stream_maps - 1];
3807 m->linklabel = av_get_token(&c, "]");
3808 if (!m->linklabel) {
3809 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
3813 file_idx = strtol(map, &p, 0);
3814 if (file_idx >= nb_input_files || file_idx < 0) {
3815 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
3819 /* disable some already defined maps */
3820 for (i = 0; i < o->nb_stream_maps; i++) {
3821 m = &o->stream_maps[i];
3822 if (file_idx == m->file_index &&
3823 check_stream_specifier(input_files[m->file_index]->ctx,
3824 input_files[m->file_index]->ctx->streams[m->stream_index],
3825 *p == ':' ? p + 1 : p) > 0)
3829 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
3830 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
3831 *p == ':' ? p + 1 : p) <= 0)
3833 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3834 &o->nb_stream_maps, o->nb_stream_maps + 1);
3835 m = &o->stream_maps[o->nb_stream_maps - 1];
3837 m->file_index = file_idx;
3838 m->stream_index = i;
3840 if (sync_file_idx >= 0) {
3841 m->sync_file_index = sync_file_idx;
3842 m->sync_stream_index = sync_stream_idx;
3844 m->sync_file_index = file_idx;
3845 m->sync_stream_index = i;
3851 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3859 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3861 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3862 &o->nb_attachments, o->nb_attachments + 1);
3863 o->attachments[o->nb_attachments - 1] = arg;
3867 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
3873 o->audio_channel_maps =
3874 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
3875 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
3876 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
3878 /* muted channel syntax */
3879 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
3880 if ((n == 1 || n == 3) && m->channel_idx == -1) {
3881 m->file_idx = m->stream_idx = -1;
3883 m->ofile_idx = m->ostream_idx = -1;
3888 n = sscanf(arg, "%d.%d.%d:%d.%d",
3889 &m->file_idx, &m->stream_idx, &m->channel_idx,
3890 &m->ofile_idx, &m->ostream_idx);
3892 if (n != 3 && n != 5) {
3893 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
3894 "[file.stream.channel|-1][:syncfile:syncstream]\n");
3898 if (n != 5) // only file.stream.channel specified
3899 m->ofile_idx = m->ostream_idx = -1;
3902 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
3903 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
3907 if (m->stream_idx < 0 ||
3908 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
3909 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
3910 m->file_idx, m->stream_idx);
3913 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
3914 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
3915 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
3916 m->file_idx, m->stream_idx);
3919 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
3920 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
3921 m->file_idx, m->stream_idx, m->channel_idx);
3928 * Parse a metadata specifier in arg.
3929 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
3930 * @param index for type c/p, chapter/program index is written here
3931 * @param stream_spec for type s, the stream specifier is written here
3933 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
3941 if (*(++arg) && *arg != ':') {
3942 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
3945 *stream_spec = *arg == ':' ? arg + 1 : "";
3949 if (*(++arg) == ':')
3950 *index = strtol(++arg, NULL, 0);
3953 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
3960 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
3962 AVDictionary **meta_in = NULL;
3963 AVDictionary **meta_out = NULL;
3965 char type_in, type_out;
3966 const char *istream_spec = NULL, *ostream_spec = NULL;
3967 int idx_in = 0, idx_out = 0;
3969 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
3970 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
3973 if (type_out == 'g' || !*outspec)
3974 o->metadata_global_manual = 1;
3975 if (type_out == 's' || !*outspec)
3976 o->metadata_streams_manual = 1;
3977 if (type_out == 'c' || !*outspec)
3978 o->metadata_chapters_manual = 1;
3982 if (type_in == 'g' || type_out == 'g')
3983 o->metadata_global_manual = 1;
3984 if (type_in == 's' || type_out == 's')
3985 o->metadata_streams_manual = 1;
3986 if (type_in == 'c' || type_out == 'c')
3987 o->metadata_chapters_manual = 1;
3989 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3990 if ((index) < 0 || (index) >= (nb_elems)) {\
3991 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
3996 #define SET_DICT(type, meta, context, index)\
3999 meta = &context->metadata;\
4002 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
4003 meta = &context->chapters[index]->metadata;\
4006 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
4007 meta = &context->programs[index]->metadata;\
4011 SET_DICT(type_in, meta_in, ic, idx_in);
4012 SET_DICT(type_out, meta_out, oc, idx_out);
4014 /* for input streams choose first matching stream */
4015 if (type_in == 's') {
4016 for (i = 0; i < ic->nb_streams; i++) {
4017 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
4018 meta_in = &ic->streams[i]->metadata;
4024 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
4029 if (type_out == 's') {
4030 for (i = 0; i < oc->nb_streams; i++) {
4031 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
4032 meta_out = &oc->streams[i]->metadata;
4033 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4038 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4043 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
4046 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
4047 struct tm time = *gmtime((time_t*)&recording_timestamp);
4048 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
4049 parse_option(o, "metadata", buf, options);
4051 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
4052 "tag instead.\n", opt);
4056 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
4058 const char *codec_string = encoder ? "encoder" : "decoder";
4062 avcodec_find_encoder_by_name(name) :
4063 avcodec_find_decoder_by_name(name);
4065 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
4068 if (codec->type != type) {
4069 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
4075 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
4077 char *codec_name = NULL;
4079 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
4081 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
4082 st->codec->codec_id = codec->id;
4085 return avcodec_find_decoder(st->codec->codec_id);
4089 * Add all the streams from the given input file to the global
4090 * list of input streams.
4092 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
4095 char *next, *codec_tag = NULL;
4097 for (i = 0; i < ic->nb_streams; i++) {
4098 AVStream *st = ic->streams[i];
4099 AVCodecContext *dec = st->codec;
4100 InputStream *ist = av_mallocz(sizeof(*ist));
4105 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
4106 input_streams[nb_input_streams - 1] = ist;
4109 ist->file_index = nb_input_files;
4111 st->discard = AVDISCARD_ALL;
4112 ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), ic, st);
4114 ist->ts_scale = 1.0;
4115 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
4117 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
4119 uint32_t tag = strtol(codec_tag, &next, 0);
4121 tag = AV_RL32(codec_tag);
4122 st->codec->codec_tag = tag;
4125 ist->dec = choose_decoder(o, ic, st);
4127 switch (dec->codec_type) {
4128 case AVMEDIA_TYPE_VIDEO:
4130 ist->dec = avcodec_find_decoder(dec->codec_id);
4132 dec->flags |= CODEC_FLAG_EMU_EDGE;
4135 ist->resample_height = dec->height;
4136 ist->resample_width = dec->width;
4137 ist->resample_pix_fmt = dec->pix_fmt;
4140 case AVMEDIA_TYPE_AUDIO:
4141 case AVMEDIA_TYPE_DATA:
4142 case AVMEDIA_TYPE_SUBTITLE:
4144 ist->dec = avcodec_find_decoder(dec->codec_id);
4146 case AVMEDIA_TYPE_ATTACHMENT:
4147 case AVMEDIA_TYPE_UNKNOWN:
4155 static void assert_file_overwrite(const char *filename)
4157 if ((!file_overwrite || no_file_overwrite) &&
4158 (strchr(filename, ':') == NULL || filename[1] == ':' ||
4159 av_strstart(filename, "file:", NULL))) {
4160 if (avio_check(filename, 0) == 0) {
4161 if (!using_stdin && (!no_file_overwrite || file_overwrite)) {
4162 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
4165 signal(SIGINT, SIG_DFL);
4166 if (!read_yesno()) {
4167 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
4173 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
4180 static void dump_attachment(AVStream *st, const char *filename)
4183 AVIOContext *out = NULL;
4184 AVDictionaryEntry *e;
4186 if (!st->codec->extradata_size) {
4187 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
4188 nb_input_files - 1, st->index);
4191 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
4192 filename = e->value;
4194 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
4195 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
4199 assert_file_overwrite(filename);
4201 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
4202 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
4207 avio_write(out, st->codec->extradata, st->codec->extradata_size);
4212 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
4214 AVFormatContext *ic;
4215 AVInputFormat *file_iformat = NULL;
4219 AVDictionary **opts;
4220 int orig_nb_streams; // number of streams before avformat_find_stream_info
4223 if (!(file_iformat = av_find_input_format(o->format))) {
4224 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
4229 if (!strcmp(filename, "-"))
4232 using_stdin |= !strncmp(filename, "pipe:", 5) ||
4233 !strcmp(filename, "/dev/stdin");
4235 /* get default parameters from command line */
4236 ic = avformat_alloc_context();
4238 print_error(filename, AVERROR(ENOMEM));
4241 if (o->nb_audio_sample_rate) {
4242 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
4243 av_dict_set(&format_opts, "sample_rate", buf, 0);
4245 if (o->nb_audio_channels) {
4246 /* because we set audio_channels based on both the "ac" and
4247 * "channel_layout" options, we need to check that the specified
4248 * demuxer actually has the "channels" option before setting it */
4249 if (file_iformat && file_iformat->priv_class &&
4250 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
4251 AV_OPT_SEARCH_FAKE_OBJ)) {
4252 snprintf(buf, sizeof(buf), "%d",
4253 o->audio_channels[o->nb_audio_channels - 1].u.i);
4254 av_dict_set(&format_opts, "channels", buf, 0);
4257 if (o->nb_frame_rates) {
4258 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
4260 if (o->nb_frame_sizes) {
4261 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
4263 if (o->nb_frame_pix_fmts)
4264 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
4266 ic->video_codec_id = video_codec_name ?
4267 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
4268 ic->audio_codec_id = audio_codec_name ?
4269 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
4270 ic->subtitle_codec_id= subtitle_codec_name ?
4271 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
4272 ic->flags |= AVFMT_FLAG_NONBLOCK;
4273 ic->interrupt_callback = int_cb;
4275 /* open the input file with generic avformat function */
4276 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
4278 print_error(filename, err);
4281 assert_avoptions(format_opts);
4283 /* apply forced codec ids */
4284 for (i = 0; i < ic->nb_streams; i++)
4285 choose_decoder(o, ic, ic->streams[i]);
4287 /* Set AVCodecContext options for avformat_find_stream_info */
4288 opts = setup_find_stream_info_opts(ic, codec_opts);
4289 orig_nb_streams = ic->nb_streams;
4291 /* If not enough info to get the stream parameters, we decode the
4292 first frames to get it. (used in mpeg case for example) */
4293 ret = avformat_find_stream_info(ic, opts);
4295 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
4296 avformat_close_input(&ic);
4300 timestamp = o->start_time;
4301 /* add the stream start time */
4302 if (ic->start_time != AV_NOPTS_VALUE)
4303 timestamp += ic->start_time;
4305 /* if seeking requested, we execute it */
4306 if (o->start_time != 0) {
4307 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
4309 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
4310 filename, (double)timestamp / AV_TIME_BASE);
4314 /* update the current parameters so that they match the one of the input stream */
4315 add_input_streams(o, ic);
4317 /* dump the file content */
4318 av_dump_format(ic, nb_input_files, filename, 0);
4320 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
4321 if (!(input_files[nb_input_files - 1] = av_mallocz(sizeof(*input_files[0]))))
4324 input_files[nb_input_files - 1]->ctx = ic;
4325 input_files[nb_input_files - 1]->ist_index = nb_input_streams - ic->nb_streams;
4326 input_files[nb_input_files - 1]->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
4327 input_files[nb_input_files - 1]->nb_streams = ic->nb_streams;
4328 input_files[nb_input_files - 1]->rate_emu = o->rate_emu;
4330 for (i = 0; i < o->nb_dump_attachment; i++) {
4333 for (j = 0; j < ic->nb_streams; j++) {
4334 AVStream *st = ic->streams[j];
4336 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
4337 dump_attachment(st, o->dump_attachment[i].u.str);
4341 for (i = 0; i < orig_nb_streams; i++)
4342 av_dict_free(&opts[i]);
4345 reset_options(o, 1);
4349 static void parse_forced_key_frames(char *kf, OutputStream *ost)
4354 for (p = kf; *p; p++)
4357 ost->forced_kf_count = n;
4358 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
4359 if (!ost->forced_kf_pts) {
4360 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
4363 for (i = 0; i < n; i++) {
4364 p = i ? strchr(p, ',') + 1 : kf;
4365 ost->forced_kf_pts[i] = parse_time_or_die("force_key_frames", p, 1);
4369 static uint8_t *get_line(AVIOContext *s)
4375 if (avio_open_dyn_buf(&line) < 0) {
4376 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
4380 while ((c = avio_r8(s)) && c != '\n')
4383 avio_close_dyn_buf(line, &buf);
4388 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
4391 char filename[1000];
4392 const char *base[3] = { getenv("AVCONV_DATADIR"),
4397 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
4401 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
4402 i != 1 ? "" : "/.avconv", codec_name, preset_name);
4403 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4406 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
4407 i != 1 ? "" : "/.avconv", preset_name);
4408 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4414 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
4416 char *codec_name = NULL;
4418 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
4420 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
4421 NULL, ost->st->codec->codec_type);
4422 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
4423 } else if (!strcmp(codec_name, "copy"))
4424 ost->stream_copy = 1;
4426 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
4427 ost->st->codec->codec_id = ost->enc->id;
4431 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
4434 AVStream *st = avformat_new_stream(oc, NULL);
4435 int idx = oc->nb_streams - 1, ret = 0;
4436 char *bsf = NULL, *next, *codec_tag = NULL;
4437 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
4439 char *buf = NULL, *arg = NULL, *preset = NULL;
4440 AVIOContext *s = NULL;
4443 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
4447 if (oc->nb_streams - 1 < o->nb_streamid_map)
4448 st->id = o->streamid_map[oc->nb_streams - 1];
4450 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
4451 nb_output_streams + 1);
4452 if (!(ost = av_mallocz(sizeof(*ost))))
4454 output_streams[nb_output_streams - 1] = ost;
4456 ost->file_index = nb_output_files;
4459 st->codec->codec_type = type;
4460 choose_encoder(o, oc, ost);
4462 ost->opts = filter_codec_opts(codec_opts, ost->enc, oc, st);
4465 avcodec_get_context_defaults3(st->codec, ost->enc);
4466 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
4468 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
4469 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
4472 if (!buf[0] || buf[0] == '#') {
4476 if (!(arg = strchr(buf, '='))) {
4477 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
4481 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
4483 } while (!s->eof_reached);
4487 av_log(NULL, AV_LOG_FATAL,
4488 "Preset %s specified for stream %d:%d, but could not be opened.\n",
4489 preset, ost->file_index, ost->index);
4493 ost->max_frames = INT64_MAX;
4494 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
4496 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
4498 if (next = strchr(bsf, ','))
4500 if (!(bsfc = av_bitstream_filter_init(bsf))) {
4501 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
4505 bsfc_prev->next = bsfc;
4507 ost->bitstream_filters = bsfc;
4513 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
4515 uint32_t tag = strtol(codec_tag, &next, 0);
4517 tag = AV_RL32(codec_tag);
4518 st->codec->codec_tag = tag;
4521 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
4522 if (qscale >= 0 || same_quant) {
4523 st->codec->flags |= CODEC_FLAG_QSCALE;
4524 st->codec->global_quality = FF_QP2LAMBDA * qscale;
4527 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
4528 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
4530 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
4531 av_opt_get_int (swr_opts, "dither_method", 0, &ost->swr_dither_method);
4532 av_opt_get_double(swr_opts, "dither_scale" , 0, &ost->swr_dither_scale);
4534 ost->source_index = source_index;
4535 if (source_index >= 0) {
4536 ost->sync_ist = input_streams[source_index];
4537 input_streams[source_index]->discard = 0;
4538 input_streams[source_index]->st->discard = AVDISCARD_NONE;
4541 ost->pix_fmts[0] = ost->pix_fmts[1] = PIX_FMT_NONE;
4546 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
4549 const char *p = str;
4556 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
4563 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4567 AVCodecContext *video_enc;
4569 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
4571 video_enc = st->codec;
4573 if (!ost->stream_copy) {
4574 const char *p = NULL;
4575 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
4576 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
4577 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
4580 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
4581 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
4582 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
4586 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
4587 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
4588 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
4592 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
4593 if (frame_aspect_ratio) {
4595 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
4596 q.num <= 0 || q.den <= 0) {
4597 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
4600 ost->frame_aspect_ratio = av_q2d(q);
4603 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
4604 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
4605 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
4606 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
4609 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
4612 video_enc->gop_size = 0;
4613 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
4615 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
4616 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
4619 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
4621 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
4623 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
4624 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
4627 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
4630 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
4631 for (i = 0; p; i++) {
4633 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
4635 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
4638 /* FIXME realloc failure */
4639 video_enc->rc_override =
4640 av_realloc(video_enc->rc_override,
4641 sizeof(RcOverride) * (i + 1));
4642 video_enc->rc_override[i].start_frame = start;
4643 video_enc->rc_override[i].end_frame = end;
4645 video_enc->rc_override[i].qscale = q;
4646 video_enc->rc_override[i].quality_factor = 1.0;
4649 video_enc->rc_override[i].qscale = 0;
4650 video_enc->rc_override[i].quality_factor = -q/100.0;
4655 video_enc->rc_override_count = i;
4656 if (!video_enc->rc_initial_buffer_occupancy)
4657 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
4658 video_enc->intra_dc_precision = intra_dc_precision - 8;
4661 video_enc->flags|= CODEC_FLAG_PSNR;
4666 video_enc->flags |= CODEC_FLAG_PASS1;
4669 video_enc->flags |= CODEC_FLAG_PASS2;
4673 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
4674 if (forced_key_frames)
4675 parse_forced_key_frames(forced_key_frames, ost);
4677 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
4679 ost->top_field_first = -1;
4680 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
4682 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4684 ost->avfilter = av_strdup(filters);
4686 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
4692 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4697 AVCodecContext *audio_enc;
4699 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
4702 audio_enc = st->codec;
4703 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
4705 if (!ost->stream_copy) {
4706 char *sample_fmt = NULL;
4708 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
4710 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
4712 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
4713 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
4717 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
4719 ost->rematrix_volume=1.0;
4720 MATCH_PER_STREAM_OPT(rematrix_volume, f, ost->rematrix_volume, oc, st);
4723 /* check for channel mapping for this audio stream */
4724 for (n = 0; n < o->nb_audio_channel_maps; n++) {
4725 AudioChannelMap *map = &o->audio_channel_maps[n];
4726 InputStream *ist = input_streams[ost->source_index];
4727 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
4728 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
4729 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
4730 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
4731 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
4733 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
4734 ost->file_index, ost->st->index);
4741 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4745 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
4746 if (!ost->stream_copy) {
4747 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
4754 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4756 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
4757 ost->stream_copy = 1;
4761 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4765 AVCodecContext *subtitle_enc;
4767 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
4769 subtitle_enc = st->codec;
4771 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
4773 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
4778 /* arg format is "output-stream-index:streamid-value". */
4779 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
4785 av_strlcpy(idx_str, arg, sizeof(idx_str));
4786 p = strchr(idx_str, ':');
4788 av_log(NULL, AV_LOG_FATAL,
4789 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
4794 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
4795 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
4796 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
4800 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
4802 AVFormatContext *is = ifile->ctx;
4803 AVFormatContext *os = ofile->ctx;
4806 for (i = 0; i < is->nb_chapters; i++) {
4807 AVChapter *in_ch = is->chapters[i], *out_ch;
4808 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
4809 AV_TIME_BASE_Q, in_ch->time_base);
4810 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
4811 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
4814 if (in_ch->end < ts_off)
4816 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
4819 out_ch = av_mallocz(sizeof(AVChapter));
4821 return AVERROR(ENOMEM);
4823 out_ch->id = in_ch->id;
4824 out_ch->time_base = in_ch->time_base;
4825 out_ch->start = FFMAX(0, in_ch->start - ts_off);
4826 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
4829 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
4832 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
4834 return AVERROR(ENOMEM);
4835 os->chapters[os->nb_chapters - 1] = out_ch;
4840 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
4843 AVFormatContext *ic = avformat_alloc_context();
4845 ic->interrupt_callback = int_cb;
4846 err = avformat_open_input(&ic, filename, NULL, NULL);
4849 /* copy stream format */
4850 for(i=0;i<ic->nb_streams;i++) {
4854 AVCodecContext *avctx;
4856 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
4857 ost = new_output_stream(o, s, codec->type, -1);
4862 // FIXME: a more elegant solution is needed
4863 memcpy(st, ic->streams[i], sizeof(AVStream));
4865 st->info = av_malloc(sizeof(*st->info));
4866 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
4868 avcodec_copy_context(st->codec, ic->streams[i]->codec);
4870 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
4871 choose_sample_fmt(st, codec);
4872 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
4873 choose_pixel_fmt(st, codec, st->codec->pix_fmt);
4876 avformat_close_input(&ic);
4880 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
4881 AVFormatContext *oc)
4885 if (ofilter->out_tmp->filter_ctx->output_pads[ofilter->out_tmp->pad_idx].type != AVMEDIA_TYPE_VIDEO) {
4886 av_log(NULL, AV_LOG_FATAL, "Only video filters are supported currently.\n");
4890 ost = new_video_stream(o, oc, -1);
4891 ost->source_index = -1;
4892 ost->filter = ofilter;
4896 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
4897 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
4900 avfilter_inout_free(&ofilter->out_tmp);
4903 static void opt_output_file(void *optctx, const char *filename)
4905 OptionsContext *o = optctx;
4906 AVFormatContext *oc;
4908 AVOutputFormat *file_oformat;
4912 if (configure_complex_filters() < 0) {
4913 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
4917 if (!strcmp(filename, "-"))
4920 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
4922 print_error(filename, err);
4925 file_oformat= oc->oformat;
4926 oc->interrupt_callback = int_cb;
4928 /* create streams for all unlabeled output pads */
4929 for (i = 0; i < nb_filtergraphs; i++) {
4930 FilterGraph *fg = filtergraphs[i];
4931 for (j = 0; j < fg->nb_outputs; j++) {
4932 OutputFilter *ofilter = fg->outputs[j];
4934 if (!ofilter->out_tmp || ofilter->out_tmp->name)
4937 switch (ofilter->out_tmp->filter_ctx->output_pads[ofilter->out_tmp->pad_idx].type) {
4938 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
4939 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
4940 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
4942 init_output_filter(ofilter, o, oc);
4946 if (!strcmp(file_oformat->name, "ffm") &&
4947 av_strstart(filename, "http:", NULL)) {
4949 /* special case for files sent to ffserver: we get the stream
4950 parameters from ffserver */
4951 int err = read_ffserver_streams(o, oc, filename);
4953 print_error(filename, err);
4956 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
4957 ost = output_streams[j];
4958 for (i = 0; i < nb_input_streams; i++) {
4959 ist = input_streams[i];
4960 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
4962 ost->source_index= i;
4964 ist->st->discard = AVDISCARD_NONE;
4969 av_log(NULL, AV_LOG_FATAL, "Missing %s stream which is required by this ffm\n", av_get_media_type_string(ost->st->codec->codec_type));
4973 } else if (!o->nb_stream_maps) {
4974 /* pick the "best" stream of each type */
4976 /* video: highest resolution */
4977 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
4978 int area = 0, idx = -1;
4979 for (i = 0; i < nb_input_streams; i++) {
4980 ist = input_streams[i];
4981 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
4982 ist->st->codec->width * ist->st->codec->height > area) {
4983 area = ist->st->codec->width * ist->st->codec->height;
4988 new_video_stream(o, oc, idx);
4991 /* audio: most channels */
4992 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
4993 int channels = 0, idx = -1;
4994 for (i = 0; i < nb_input_streams; i++) {
4995 ist = input_streams[i];
4996 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
4997 ist->st->codec->channels > channels) {
4998 channels = ist->st->codec->channels;
5003 new_audio_stream(o, oc, idx);
5006 /* subtitles: pick first */
5007 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
5008 for (i = 0; i < nb_input_streams; i++)
5009 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
5010 new_subtitle_stream(o, oc, i);
5014 /* do something with data? */
5016 for (i = 0; i < o->nb_stream_maps; i++) {
5017 StreamMap *map = &o->stream_maps[i];
5018 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
5023 if (map->linklabel) {
5025 OutputFilter *ofilter = NULL;
5028 for (j = 0; j < nb_filtergraphs; j++) {
5029 fg = filtergraphs[j];
5030 for (k = 0; k < fg->nb_outputs; k++) {
5031 AVFilterInOut *out = fg->outputs[k]->out_tmp;
5032 if (out && !strcmp(out->name, map->linklabel)) {
5033 ofilter = fg->outputs[k];
5040 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
5041 "in any defined filter graph.\n", map->linklabel);
5044 init_output_filter(ofilter, o, oc);
5046 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
5047 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
5049 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
5051 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
5053 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
5056 switch (ist->st->codec->codec_type) {
5057 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
5058 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
5059 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
5060 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
5061 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
5063 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
5064 map->file_index, map->stream_index);
5072 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
5073 AVDictionaryEntry *e;
5074 ost = output_streams[i];
5076 if ( ost->stream_copy
5077 && (e = av_dict_get(codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
5078 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
5079 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
5083 /* handle attached files */
5084 for (i = 0; i < o->nb_attachments; i++) {
5086 uint8_t *attachment;
5090 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
5091 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
5095 if ((len = avio_size(pb)) <= 0) {
5096 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
5100 if (!(attachment = av_malloc(len))) {
5101 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
5105 avio_read(pb, attachment, len);
5107 ost = new_attachment_stream(o, oc, -1);
5108 ost->stream_copy = 0;
5109 ost->attachment_filename = o->attachments[i];
5110 ost->st->codec->extradata = attachment;
5111 ost->st->codec->extradata_size = len;
5113 p = strrchr(o->attachments[i], '/');
5114 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
5118 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
5119 if (!(output_files[nb_output_files - 1] = av_mallocz(sizeof(*output_files[0]))))
5122 output_files[nb_output_files - 1]->ctx = oc;
5123 output_files[nb_output_files - 1]->ost_index = nb_output_streams - oc->nb_streams;
5124 output_files[nb_output_files - 1]->recording_time = o->recording_time;
5125 if (o->recording_time != INT64_MAX)
5126 oc->duration = o->recording_time;
5127 output_files[nb_output_files - 1]->start_time = o->start_time;
5128 output_files[nb_output_files - 1]->limit_filesize = o->limit_filesize;
5129 av_dict_copy(&output_files[nb_output_files - 1]->opts, format_opts, 0);
5131 /* check filename in case of an image number is expected */
5132 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
5133 if (!av_filename_number_test(oc->filename)) {
5134 print_error(oc->filename, AVERROR(EINVAL));
5139 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
5140 /* test if it already exists to avoid losing precious files */
5141 assert_file_overwrite(filename);
5144 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
5145 &oc->interrupt_callback,
5146 &output_files[nb_output_files - 1]->opts)) < 0) {
5147 print_error(filename, err);
5152 if (o->mux_preload) {
5154 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
5155 av_dict_set(&output_files[nb_output_files - 1]->opts, "preload", buf, 0);
5157 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
5160 for (i = 0; i < o->nb_metadata_map; i++) {
5162 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
5164 if (in_file_index >= nb_input_files) {
5165 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
5168 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, in_file_index >= 0 ? input_files[in_file_index]->ctx : NULL, o);
5172 if (o->chapters_input_file >= nb_input_files) {
5173 if (o->chapters_input_file == INT_MAX) {
5174 /* copy chapters from the first input file that has them*/
5175 o->chapters_input_file = -1;
5176 for (i = 0; i < nb_input_files; i++)
5177 if (input_files[i]->ctx->nb_chapters) {
5178 o->chapters_input_file = i;
5182 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
5183 o->chapters_input_file);
5187 if (o->chapters_input_file >= 0)
5188 copy_chapters(input_files[o->chapters_input_file], output_files[nb_output_files - 1],
5189 !o->metadata_chapters_manual);
5191 /* copy global metadata by default */
5192 if (!o->metadata_global_manual && nb_input_files){
5193 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
5194 AV_DICT_DONT_OVERWRITE);
5195 if(o->recording_time != INT64_MAX)
5196 av_dict_set(&oc->metadata, "duration", NULL, 0);
5198 if (!o->metadata_streams_manual)
5199 for (i = output_files[nb_output_files - 1]->ost_index; i < nb_output_streams; i++) {
5201 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
5203 ist = input_streams[output_streams[i]->source_index];
5204 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
5207 /* process manually set metadata */
5208 for (i = 0; i < o->nb_metadata; i++) {
5211 const char *stream_spec;
5212 int index = 0, j, ret = 0;
5214 val = strchr(o->metadata[i].u.str, '=');
5216 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
5217 o->metadata[i].u.str);
5222 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
5224 for (j = 0; j < oc->nb_streams; j++) {
5225 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
5226 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
5230 printf("ret %d, stream_spec %s\n", ret, stream_spec);
5238 if (index < 0 || index >= oc->nb_chapters) {
5239 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
5242 m = &oc->chapters[index]->metadata;
5245 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
5248 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
5252 reset_options(o, 0);
5255 /* same option as mencoder */
5256 static int opt_pass(const char *opt, const char *arg)
5258 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
5262 static int64_t getmaxrss(void)
5264 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
5265 struct rusage rusage;
5266 getrusage(RUSAGE_SELF, &rusage);
5267 return (int64_t)rusage.ru_maxrss * 1024;
5268 #elif HAVE_GETPROCESSMEMORYINFO
5270 PROCESS_MEMORY_COUNTERS memcounters;
5271 proc = GetCurrentProcess();
5272 memcounters.cb = sizeof(memcounters);
5273 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
5274 return memcounters.PeakPagefileUsage;
5280 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
5282 return parse_option(o, "q:a", arg, options);
5285 static void show_usage(void)
5287 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
5288 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
5289 av_log(NULL, AV_LOG_INFO, "\n");
5292 static int opt_help(const char *opt, const char *arg)
5294 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
5295 av_log_set_callback(log_callback_help);
5297 show_help_options(options, "Main options:\n",
5298 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
5299 show_help_options(options, "\nAdvanced options:\n",
5300 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
5302 show_help_options(options, "\nVideo options:\n",
5303 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5305 show_help_options(options, "\nAdvanced Video options:\n",
5306 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5307 OPT_VIDEO | OPT_EXPERT);
5308 show_help_options(options, "\nAudio options:\n",
5309 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5311 show_help_options(options, "\nAdvanced Audio options:\n",
5312 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5313 OPT_AUDIO | OPT_EXPERT);
5314 show_help_options(options, "\nSubtitle options:\n",
5315 OPT_SUBTITLE | OPT_GRAB,
5317 show_help_options(options, "\nAudio/Video grab options:\n",
5321 show_help_children(avcodec_get_class(), flags);
5322 show_help_children(avformat_get_class(), flags);
5323 show_help_children(sws_get_class(), flags);
5328 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
5330 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
5331 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
5333 if (!strncmp(arg, "pal-", 4)) {
5336 } else if (!strncmp(arg, "ntsc-", 5)) {
5339 } else if (!strncmp(arg, "film-", 5)) {
5343 /* Try to determine PAL/NTSC by peeking in the input files */
5344 if (nb_input_files) {
5346 for (j = 0; j < nb_input_files; j++) {
5347 for (i = 0; i < input_files[j]->nb_streams; i++) {
5348 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
5349 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
5351 fr = c->time_base.den * 1000 / c->time_base.num;
5355 } else if ((fr == 29970) || (fr == 23976)) {
5360 if (norm != UNKNOWN)
5364 if (norm != UNKNOWN)
5365 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
5368 if (norm == UNKNOWN) {
5369 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
5370 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
5371 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
5375 if (!strcmp(arg, "vcd")) {
5376 opt_video_codec(o, "c:v", "mpeg1video");
5377 opt_audio_codec(o, "c:a", "mp2");
5378 parse_option(o, "f", "vcd", options);
5380 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
5381 parse_option(o, "r", frame_rates[norm], options);
5382 opt_default("g", norm == PAL ? "15" : "18");
5384 opt_default("b:v", "1150000");
5385 opt_default("maxrate", "1150000");
5386 opt_default("minrate", "1150000");
5387 opt_default("bufsize", "327680"); // 40*1024*8;
5389 opt_default("b:a", "224000");
5390 parse_option(o, "ar", "44100", options);
5391 parse_option(o, "ac", "2", options);
5393 opt_default("packetsize", "2324");
5394 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
5396 /* We have to offset the PTS, so that it is consistent with the SCR.
5397 SCR starts at 36000, but the first two packs contain only padding
5398 and the first pack from the other stream, respectively, may also have
5399 been written before.
5400 So the real data starts at SCR 36000+3*1200. */
5401 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
5402 } else if (!strcmp(arg, "svcd")) {
5404 opt_video_codec(o, "c:v", "mpeg2video");
5405 opt_audio_codec(o, "c:a", "mp2");
5406 parse_option(o, "f", "svcd", options);
5408 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
5409 parse_option(o, "r", frame_rates[norm], options);
5410 parse_option(o, "pix_fmt", "yuv420p", options);
5411 opt_default("g", norm == PAL ? "15" : "18");
5413 opt_default("b:v", "2040000");
5414 opt_default("maxrate", "2516000");
5415 opt_default("minrate", "0"); // 1145000;
5416 opt_default("bufsize", "1835008"); // 224*1024*8;
5417 opt_default("scan_offset", "1");
5420 opt_default("b:a", "224000");
5421 parse_option(o, "ar", "44100", options);
5423 opt_default("packetsize", "2324");
5425 } else if (!strcmp(arg, "dvd")) {
5427 opt_video_codec(o, "c:v", "mpeg2video");
5428 opt_audio_codec(o, "c:a", "ac3");
5429 parse_option(o, "f", "dvd", options);
5431 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5432 parse_option(o, "r", frame_rates[norm], options);
5433 parse_option(o, "pix_fmt", "yuv420p", options);
5434 opt_default("g", norm == PAL ? "15" : "18");
5436 opt_default("b:v", "6000000");
5437 opt_default("maxrate", "9000000");
5438 opt_default("minrate", "0"); // 1500000;
5439 opt_default("bufsize", "1835008"); // 224*1024*8;
5441 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
5442 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
5444 opt_default("b:a", "448000");
5445 parse_option(o, "ar", "48000", options);
5447 } else if (!strncmp(arg, "dv", 2)) {
5449 parse_option(o, "f", "dv", options);
5451 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5452 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
5453 norm == PAL ? "yuv420p" : "yuv411p", options);
5454 parse_option(o, "r", frame_rates[norm], options);
5456 parse_option(o, "ar", "48000", options);
5457 parse_option(o, "ac", "2", options);
5460 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
5461 return AVERROR(EINVAL);
5466 static int opt_vstats_file(const char *opt, const char *arg)
5468 av_free (vstats_filename);
5469 vstats_filename = av_strdup (arg);
5473 static int opt_vstats(const char *opt, const char *arg)
5476 time_t today2 = time(NULL);
5477 struct tm *today = localtime(&today2);
5479 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
5481 return opt_vstats_file(opt, filename);
5484 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
5486 return parse_option(o, "frames:v", arg, options);
5489 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
5491 return parse_option(o, "frames:a", arg, options);
5494 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
5496 return parse_option(o, "frames:d", arg, options);
5499 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
5502 char filename[1000], tmp[1000], tmp2[1000], line[1000];
5503 const char *codec_name = *opt == 'v' ? video_codec_name :
5504 *opt == 'a' ? audio_codec_name :
5505 subtitle_codec_name;
5507 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
5508 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
5509 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
5511 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
5516 int e= fscanf(f, "%999[^\n]\n", line) - 1;
5517 if(line[0] == '#' && !e)
5519 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
5521 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
5524 if(!strcmp(tmp, "acodec")){
5525 opt_audio_codec(o, tmp, tmp2);
5526 }else if(!strcmp(tmp, "vcodec")){
5527 opt_video_codec(o, tmp, tmp2);
5528 }else if(!strcmp(tmp, "scodec")){
5529 opt_subtitle_codec(o, tmp, tmp2);
5530 }else if(!strcmp(tmp, "dcodec")){
5531 opt_data_codec(o, tmp, tmp2);
5532 }else if(opt_default(tmp, tmp2) < 0){
5533 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
5543 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
5547 static int opt_passlogfile(const char *opt, const char *arg)
5549 pass_logfilename_prefix = arg;
5550 #if CONFIG_LIBX264_ENCODER
5551 return opt_default(opt, arg);
5557 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
5559 char *s = av_asprintf("%s:%c", opt + 1, *opt);
5560 int ret = parse_option(o, s, arg, options);
5565 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
5567 if(!strcmp(opt, "b")){
5568 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
5569 return parse_option(o, "b:v", arg, options);
5571 return opt_default(opt, arg);
5574 static int opt_qscale(OptionsContext *o, const char *opt, const char *arg)
5578 if(!strcmp(opt, "qscale")){
5579 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
5580 return parse_option(o, "q:v", arg, options);
5582 s = av_asprintf("q%s", opt + 6);
5583 ret = parse_option(o, s, arg, options);
5588 static int opt_profile(OptionsContext *o, const char *opt, const char *arg)
5590 if(!strcmp(opt, "profile")){
5591 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
5592 return parse_option(o, "profile:v", arg, options);
5594 return opt_default(opt, arg);
5597 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
5599 return parse_option(o, "filter:v", arg, options);
5602 static int opt_vsync(const char *opt, const char *arg)
5604 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
5605 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
5606 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
5607 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
5609 if (video_sync_method == VSYNC_AUTO)
5610 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
5614 static int opt_deinterlace(const char *opt, const char *arg)
5616 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
5621 static void parse_cpuflags(int argc, char **argv, const OptionDef *options)
5623 int idx = locate_option(argc, argv, options, "cpuflags");
5624 if (idx && argv[idx + 1])
5625 opt_cpuflags("cpuflags", argv[idx + 1]);
5628 static int opt_channel_layout(OptionsContext *o, const char *opt, const char *arg)
5630 char layout_str[32];
5633 int ret, channels, ac_str_size;
5636 layout = av_get_channel_layout(arg);
5638 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
5639 return AVERROR(EINVAL);
5641 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
5642 ret = opt_default(opt, layout_str);
5646 /* set 'ac' option based on channel layout */
5647 channels = av_get_channel_layout_nb_channels(layout);
5648 snprintf(layout_str, sizeof(layout_str), "%d", channels);
5649 stream_str = strchr(opt, ':');
5650 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
5651 ac_str = av_mallocz(ac_str_size);
5653 return AVERROR(ENOMEM);
5654 av_strlcpy(ac_str, "ac", 3);
5656 av_strlcat(ac_str, stream_str, ac_str_size);
5657 ret = parse_option(o, ac_str, layout_str, options);
5663 static int opt_filter_complex(const char *opt, const char *arg)
5665 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
5666 &nb_filtergraphs, nb_filtergraphs + 1);
5667 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
5668 return AVERROR(ENOMEM);
5669 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
5670 filtergraphs[nb_filtergraphs - 1]->graph_desc = arg;
5674 #define OFFSET(x) offsetof(OptionsContext, x)
5675 static const OptionDef options[] = {
5677 #include "cmdutils_common_opts.h"
5678 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
5679 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
5680 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
5681 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
5682 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5683 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5684 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
5685 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
5686 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_channel}, "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
5687 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
5688 "outfile[,metadata]:infile[,metadata]" },
5689 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
5690 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
5691 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
5692 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
5693 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
5694 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
5695 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
5696 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
5697 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
5698 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
5699 "add timings for benchmarking" },
5700 { "benchmark_all", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark_all},
5701 "add timings for each task" },
5702 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
5703 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
5704 "dump each input packet" },
5705 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
5706 "when dumping packets, also dump the payload" },
5707 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
5708 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
5709 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
5710 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
5711 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
5712 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
5713 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying", "mode" },
5714 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
5715 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
5716 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_error_threshold}, "timestamp error delta threshold", "threshold" },
5717 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
5718 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
5719 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
5720 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
5721 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
5722 { "qscale", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_qscale}, "use fixed quality scale (VBR)", "q" },
5723 { "profile", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_profile}, "set profile", "profile" },
5724 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
5725 { "filter_complex", HAS_ARG | OPT_EXPERT, {(void*)opt_filter_complex}, "create a complex filtergraph", "graph_description" },
5726 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
5727 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
5728 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
5729 { "debug_ts", OPT_BOOL | OPT_EXPERT, {&debug_ts}, "print timestamp debugging info" },
5732 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
5733 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
5734 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
5735 { "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" },
5736 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
5737 { "bits_per_raw_sample", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&frame_bits_per_raw_sample}, "set the number of bits per raw sample", "number" },
5738 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5739 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5740 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5741 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5742 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5743 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5744 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5745 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5746 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
5747 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "deprecated use -g 1"},
5748 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
5749 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
5750 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
5751 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
5752 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
5753 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
5754 "use same quantizer as source (implies VBR)" },
5755 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
5756 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
5757 { "deinterlace", OPT_EXPERT | OPT_VIDEO, {(void*)opt_deinterlace},
5758 "this option is deprecated, use the yadif filter instead" },
5759 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
5760 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
5761 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
5762 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
5763 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
5764 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
5765 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
5766 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
5767 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
5768 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
5769 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
5770 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
5771 { "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" },
5772 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
5775 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
5776 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
5777 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
5778 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
5779 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
5780 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
5781 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
5782 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
5783 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
5784 { "rmvol", HAS_ARG | OPT_AUDIO | OPT_FLOAT | OPT_SPEC, {.off = OFFSET(rematrix_volume)}, "rematrix volume (as factor)", "volume" },
5785 { "channel_layout", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_channel_layout}, "set channel layout", "layout" },
5787 /* subtitle options */
5788 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
5789 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
5790 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
5793 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
5794 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
5795 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
5798 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
5799 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
5801 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
5802 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
5803 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
5805 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
5806 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
5807 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
5808 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
5809 /* data codec support */
5810 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
5811 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
5813 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
5817 int main(int argc, char **argv)
5819 OptionsContext o = { 0 };
5822 reset_options(&o, 0);
5824 av_log_set_flags(AV_LOG_SKIP_REPEATED);
5825 parse_loglevel(argc, argv, options);
5827 if(argc>1 && !strcmp(argv[1], "-d")){
5829 av_log_set_callback(log_callback_null);
5834 avcodec_register_all();
5836 avdevice_register_all();
5838 avfilter_register_all();
5840 avformat_network_init();
5842 show_banner(argc, argv, options);
5846 parse_cpuflags(argc, argv, options);
5849 parse_options(&o, argc, argv, options, opt_output_file);
5851 if (nb_output_files <= 0 && nb_input_files == 0) {
5853 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
5857 /* file converter / grab */
5858 if (nb_output_files <= 0) {
5859 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
5863 if (nb_input_files == 0) {
5864 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
5868 current_time = ti = getutime();
5869 if (transcode() < 0)
5871 ti = getutime() - ti;
5873 int maxrss = getmaxrss() / 1024;
5874 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);