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 "libavformat/os_support.h"
53 #include "libswresample/swresample.h"
55 #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"
66 #if HAVE_SYS_RESOURCE_H
67 #include <sys/types.h>
69 #include <sys/resource.h>
70 #elif HAVE_GETPROCESSTIMES
73 #if HAVE_GETPROCESSMEMORYINFO
79 #include <sys/select.h>
84 #include <sys/ioctl.h>
94 #include "libavutil/avassert.h"
97 #define VSYNC_PASSTHROUGH 0
100 #define VSYNC_DROP 0xff
102 const char program_name[] = "ffmpeg";
103 const int program_birth_year = 2000;
105 /* select an input stream for an output stream */
106 typedef struct StreamMap {
107 int disabled; /** 1 is this mapping is disabled by a negative map */
111 int sync_stream_index;
115 int file_idx, stream_idx, channel_idx; // input
116 int ofile_idx, ostream_idx; // output
120 * select an input file for an output file
122 typedef struct MetadataMap {
123 int file; ///< file index
124 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
125 int index; ///< stream/chapter/program number
128 static const OptionDef options[];
130 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
132 static int frame_bits_per_raw_sample = 0;
133 static int video_discard = 0;
134 static int same_quant = 0;
135 static int do_deinterlace = 0;
136 static int intra_dc_precision = 8;
137 static int qp_hist = 0;
138 static int intra_only = 0;
139 static const char *video_codec_name = NULL;
140 static const char *audio_codec_name = NULL;
141 static const char *subtitle_codec_name = NULL;
143 static int file_overwrite = 0;
144 static int no_file_overwrite = 0;
145 static int do_benchmark = 0;
146 static int do_hex_dump = 0;
147 static int do_pkt_dump = 0;
148 static int do_psnr = 0;
149 static int do_pass = 0;
150 static const char *pass_logfilename_prefix;
151 static int video_sync_method = VSYNC_AUTO;
152 static int audio_sync_method = 0;
153 static float audio_drift_threshold = 0.1;
154 static int copy_ts = 0;
155 static int copy_tb = -1;
156 static int opt_shortest = 0;
157 static char *vstats_filename;
158 static FILE *vstats_file;
160 static int audio_volume = 256;
162 static int exit_on_error = 0;
163 static int using_stdin = 0;
164 static int run_as_daemon = 0;
165 static volatile int received_nb_signals = 0;
166 static int64_t video_size = 0;
167 static int64_t audio_size = 0;
168 static int64_t extra_size = 0;
169 static int nb_frames_dup = 0;
170 static int nb_frames_drop = 0;
171 static int input_sync;
173 static float dts_delta_threshold = 10;
175 static int print_stats = 1;
177 static uint8_t *audio_buf;
178 static unsigned int allocated_audio_buf_size;
180 static uint8_t *input_tmp= NULL;
182 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
184 typedef struct FrameBuffer {
190 enum PixelFormat pix_fmt;
193 struct InputStream *ist;
194 struct FrameBuffer *next;
197 typedef struct InputStream {
200 int discard; /* true if stream data should be discarded */
201 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
203 AVFrame *decoded_frame;
204 AVFrame *filtered_frame;
206 int64_t start; /* time when read started */
207 /* predicted dts of the next packet read for this stream or (when there are
208 * several frames in a packet) of the next frame in current packet */
210 /* dts of the last packet read for this stream */
213 int64_t next_pts; ///< synthetic pts for the next decode frame
214 int64_t pts; ///< current pts of the decoded frame
216 int is_start; /* is 1 at the start and after a discontinuity */
217 int showed_multi_packet_warning;
220 /* a pool of free buffers for decoded data */
221 FrameBuffer *buffer_pool;
225 typedef struct InputFile {
226 AVFormatContext *ctx;
227 int eof_reached; /* true if eof reached */
228 int ist_index; /* index of first stream in input_streams */
229 int buffer_size; /* current total buffer size */
231 int nb_streams; /* number of stream that ffmpeg is aware of; may be different
232 from ctx.nb_streams if new streams appear during av_read_frame() */
236 typedef struct OutputStream {
237 int file_index; /* file index */
238 int index; /* stream index in the output file */
239 int source_index; /* InputStream index */
240 AVStream *st; /* stream in the output file */
241 int encoding_needed; /* true if encoding needed for this stream */
243 /* input pts and corresponding output pts
245 struct InputStream *sync_ist; /* input stream to sync against */
246 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
247 AVBitStreamFilterContext *bitstream_filters;
250 AVFrame *output_frame;
254 AVFrame resample_frame; /* temporary frame for image resampling */
255 struct SwsContext *img_resample_ctx; /* for image resampling */
258 int resample_pix_fmt;
259 AVRational frame_rate;
263 float frame_aspect_ratio;
265 /* forced key frames */
266 int64_t *forced_kf_pts;
272 int audio_channels_map[SWR_CH_MAX]; ///< list of the channels id to pick from the source stream
273 int audio_channels_mapped; ///< number of channels in audio_channels_map
274 int resample_sample_fmt;
275 int resample_channels;
276 int resample_sample_rate;
277 float rematrix_volume;
278 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
281 struct SwrContext *swr;
284 AVFilterContext *output_video_filter;
285 AVFilterContext *input_video_filter;
286 AVFilterBufferRef *picref;
288 AVFilterGraph *graph;
293 int is_past_recording_time;
295 const char *attachment_filename;
296 int copy_initial_nonkeyframes;
302 /* init terminal so that we can grab keys */
303 static struct termios oldtty;
304 static int restore_tty;
307 typedef struct OutputFile {
308 AVFormatContext *ctx;
310 int ost_index; /* index of the first stream in output_streams */
311 int64_t recording_time; /* desired length of the resulting file in microseconds */
312 int64_t start_time; /* start time in microseconds */
313 uint64_t limit_filesize; /* filesize limit expressed in bytes */
316 static InputStream *input_streams = NULL;
317 static int nb_input_streams = 0;
318 static InputFile *input_files = NULL;
319 static int nb_input_files = 0;
321 static OutputStream *output_streams = NULL;
322 static int nb_output_streams = 0;
323 static OutputFile *output_files = NULL;
324 static int nb_output_files = 0;
326 typedef struct OptionsContext {
327 /* input/output options */
331 SpecifierOpt *codec_names;
333 SpecifierOpt *audio_channels;
334 int nb_audio_channels;
335 SpecifierOpt *audio_sample_rate;
336 int nb_audio_sample_rate;
337 SpecifierOpt *rematrix_volume;
338 int nb_rematrix_volume;
339 SpecifierOpt *frame_rates;
341 SpecifierOpt *frame_sizes;
343 SpecifierOpt *frame_pix_fmts;
344 int nb_frame_pix_fmts;
347 int64_t input_ts_offset;
350 SpecifierOpt *ts_scale;
352 SpecifierOpt *dump_attachment;
353 int nb_dump_attachment;
356 StreamMap *stream_maps;
358 AudioChannelMap *audio_channel_maps; ///< one info entry per -map_channel
359 int nb_audio_channel_maps; ///< number of (valid) -map_channel settings
360 /* first item specifies output metadata, second is input */
361 MetadataMap (*meta_data_maps)[2];
362 int nb_meta_data_maps;
363 int metadata_global_manual;
364 int metadata_streams_manual;
365 int metadata_chapters_manual;
366 const char **attachments;
369 int chapters_input_file;
371 int64_t recording_time;
372 uint64_t limit_filesize;
378 int subtitle_disable;
381 /* indexed by output file stream index */
385 SpecifierOpt *metadata;
387 SpecifierOpt *max_frames;
389 SpecifierOpt *bitstream_filters;
390 int nb_bitstream_filters;
391 SpecifierOpt *codec_tags;
393 SpecifierOpt *sample_fmts;
395 SpecifierOpt *qscale;
397 SpecifierOpt *forced_key_frames;
398 int nb_forced_key_frames;
399 SpecifierOpt *force_fps;
401 SpecifierOpt *frame_aspect_ratios;
402 int nb_frame_aspect_ratios;
403 SpecifierOpt *rc_overrides;
405 SpecifierOpt *intra_matrices;
406 int nb_intra_matrices;
407 SpecifierOpt *inter_matrices;
408 int nb_inter_matrices;
409 SpecifierOpt *top_field_first;
410 int nb_top_field_first;
411 SpecifierOpt *metadata_map;
413 SpecifierOpt *presets;
415 SpecifierOpt *copy_initial_nonkeyframes;
416 int nb_copy_initial_nonkeyframes;
418 SpecifierOpt *filters;
423 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
426 for (i = 0; i < o->nb_ ## name; i++) {\
427 char *spec = o->name[i].specifier;\
428 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
429 outvar = o->name[i].u.type;\
435 static void reset_options(OptionsContext *o, int is_input)
437 const OptionDef *po = options;
438 OptionsContext bak= *o;
440 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
442 void *dst = (uint8_t*)o + po->u.off;
444 if (po->flags & OPT_SPEC) {
445 SpecifierOpt **so = dst;
446 int i, *count = (int*)(so + 1);
447 for (i = 0; i < *count; i++) {
448 av_freep(&(*so)[i].specifier);
449 if (po->flags & OPT_STRING)
450 av_freep(&(*so)[i].u.str);
454 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
459 av_freep(&o->stream_maps);
460 av_freep(&o->audio_channel_maps);
461 av_freep(&o->meta_data_maps);
462 av_freep(&o->streamid_map);
464 memset(o, 0, sizeof(*o));
466 if(is_input) o->recording_time = bak.recording_time;
467 else o->recording_time = INT64_MAX;
468 o->mux_max_delay = 0.7;
469 o->limit_filesize = UINT64_MAX;
470 o->chapters_input_file = INT_MAX;
476 static int alloc_buffer(AVCodecContext *s, InputStream *ist, FrameBuffer **pbuf)
478 FrameBuffer *buf = av_mallocz(sizeof(*buf));
480 const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1;
481 int h_chroma_shift, v_chroma_shift;
482 int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
483 int w = s->width, h = s->height;
486 return AVERROR(ENOMEM);
488 if (!(s->flags & CODEC_FLAG_EMU_EDGE)) {
493 avcodec_align_dimensions(s, &w, &h);
494 if ((ret = av_image_alloc(buf->base, buf->linesize, w, h,
495 s->pix_fmt, 32)) < 0) {
499 /* XXX this shouldn't be needed, but some tests break without this line
500 * those decoders are buggy and need to be fixed.
501 * the following tests fail:
502 * bethsoft-vid, cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
504 memset(buf->base[0], 128, ret);
506 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
507 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
508 const int h_shift = i==0 ? 0 : h_chroma_shift;
509 const int v_shift = i==0 ? 0 : v_chroma_shift;
510 if (s->flags & CODEC_FLAG_EMU_EDGE)
511 buf->data[i] = buf->base[i];
513 buf->data[i] = buf->base[i] +
514 FFALIGN((buf->linesize[i]*edge >> v_shift) +
515 (pixel_size*edge >> h_shift), 32);
519 buf->pix_fmt = s->pix_fmt;
526 static void free_buffer_pool(InputStream *ist)
528 FrameBuffer *buf = ist->buffer_pool;
530 ist->buffer_pool = buf->next;
531 av_freep(&buf->base[0]);
533 buf = ist->buffer_pool;
537 static void unref_buffer(InputStream *ist, FrameBuffer *buf)
539 av_assert0(buf->refcount);
541 if (!buf->refcount) {
542 buf->next = ist->buffer_pool;
543 ist->buffer_pool = buf;
547 static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
549 InputStream *ist = s->opaque;
553 if(av_image_check_size(s->width, s->height, 0, s))
556 if (!ist->buffer_pool && (ret = alloc_buffer(s, ist, &ist->buffer_pool)) < 0)
559 buf = ist->buffer_pool;
560 ist->buffer_pool = buf->next;
562 if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) {
563 av_freep(&buf->base[0]);
566 if ((ret = alloc_buffer(s, ist, &buf)) < 0)
572 frame->type = FF_BUFFER_TYPE_USER;
573 frame->extended_data = frame->data;
574 frame->pkt_pts = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE;
576 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
577 frame->base[i] = buf->base[i]; // XXX h264.c uses base though it shouldn't
578 frame->data[i] = buf->data[i];
579 frame->linesize[i] = buf->linesize[i];
585 static void codec_release_buffer(AVCodecContext *s, AVFrame *frame)
587 InputStream *ist = s->opaque;
588 FrameBuffer *buf = frame->opaque;
591 if(frame->type!=FF_BUFFER_TYPE_USER)
592 return avcodec_default_release_buffer(s, frame);
594 for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++)
595 frame->data[i] = NULL;
597 unref_buffer(ist, buf);
600 static void filter_release_buffer(AVFilterBuffer *fb)
602 FrameBuffer *buf = fb->priv;
604 unref_buffer(buf->ist, buf);
609 static int configure_video_filters(InputStream *ist, OutputStream *ost)
611 AVFilterContext *last_filter, *filter;
612 /** filter graph containing all filters including input & output */
613 AVCodecContext *codec = ost->st->codec;
614 AVCodecContext *icodec = ist->st->codec;
615 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
616 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
617 AVRational sample_aspect_ratio;
621 ost->graph = avfilter_graph_alloc();
623 if (ist->st->sample_aspect_ratio.num) {
624 sample_aspect_ratio = ist->st->sample_aspect_ratio;
626 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
628 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
629 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
630 sample_aspect_ratio.num, sample_aspect_ratio.den);
632 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
633 "src", args, NULL, ost->graph);
637 #if FF_API_OLD_VSINK_API
638 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
639 "out", NULL, pix_fmts, ost->graph);
641 buffersink_params->pixel_fmts = pix_fmts;
642 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
643 "out", NULL, buffersink_params, ost->graph);
645 av_freep(&buffersink_params);
649 last_filter = ost->input_video_filter;
651 if (codec->width != icodec->width || codec->height != icodec->height) {
652 snprintf(args, 255, "%d:%d:flags=0x%X",
655 (unsigned)ost->sws_flags);
656 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
657 NULL, args, NULL, ost->graph)) < 0)
659 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
661 last_filter = filter;
664 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
665 ost->graph->scale_sws_opts = av_strdup(args);
668 AVFilterInOut *outputs = avfilter_inout_alloc();
669 AVFilterInOut *inputs = avfilter_inout_alloc();
671 outputs->name = av_strdup("in");
672 outputs->filter_ctx = last_filter;
673 outputs->pad_idx = 0;
674 outputs->next = NULL;
676 inputs->name = av_strdup("out");
677 inputs->filter_ctx = ost->output_video_filter;
681 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
683 av_freep(&ost->avfilter);
685 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
689 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
692 codec->width = ost->output_video_filter->inputs[0]->w;
693 codec->height = ost->output_video_filter->inputs[0]->h;
694 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
695 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
696 av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
697 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
701 #endif /* CONFIG_AVFILTER */
703 static void term_exit(void)
705 av_log(NULL, AV_LOG_QUIET, "%s", "");
708 tcsetattr (0, TCSANOW, &oldtty);
712 static volatile int received_sigterm = 0;
714 static void sigterm_handler(int sig)
716 received_sigterm = sig;
717 received_nb_signals++;
719 if(received_nb_signals > 3)
723 static void term_init(void)
729 if (tcgetattr (0, &tty) == 0) {
734 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
735 |INLCR|IGNCR|ICRNL|IXON);
736 tty.c_oflag |= OPOST;
737 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
738 tty.c_cflag &= ~(CSIZE|PARENB);
743 tcsetattr (0, TCSANOW, &tty);
745 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
748 avformat_network_deinit();
750 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
751 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
753 signal(SIGXCPU, sigterm_handler);
757 /* read a key without blocking */
758 static int read_key(void)
770 n = select(1, &rfds, NULL, NULL, &tv);
779 # if HAVE_PEEKNAMEDPIPE
781 static HANDLE input_handle;
784 input_handle = GetStdHandle(STD_INPUT_HANDLE);
785 is_pipe = !GetConsoleMode(input_handle, &dw);
788 if (stdin->_cnt > 0) {
793 /* When running under a GUI, you will end here. */
794 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
811 static int decode_interrupt_cb(void *ctx)
813 return received_nb_signals > 1;
816 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
818 void av_noreturn exit_program(int ret)
823 for (i = 0; i < nb_output_files; i++) {
824 AVFormatContext *s = output_files[i].ctx;
825 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
827 avformat_free_context(s);
828 av_dict_free(&output_files[i].opts);
830 for (i = 0; i < nb_output_streams; i++) {
831 AVBitStreamFilterContext *bsfc = output_streams[i].bitstream_filters;
833 AVBitStreamFilterContext *next = bsfc->next;
834 av_bitstream_filter_close(bsfc);
837 output_streams[i].bitstream_filters = NULL;
839 if (output_streams[i].output_frame) {
840 AVFrame *frame = output_streams[i].output_frame;
841 if (frame->extended_data != frame->data)
842 av_freep(&frame->extended_data);
846 for (i = 0; i < nb_input_files; i++) {
847 avformat_close_input(&input_files[i].ctx);
849 for (i = 0; i < nb_input_streams; i++) {
850 av_freep(&input_streams[i].decoded_frame);
851 av_freep(&input_streams[i].filtered_frame);
852 av_dict_free(&input_streams[i].opts);
853 free_buffer_pool(&input_streams[i]);
858 av_free(vstats_filename);
860 av_freep(&input_streams);
861 av_freep(&input_files);
862 av_freep(&output_streams);
863 av_freep(&output_files);
867 allocated_audio_buf_size = 0;
872 avformat_network_deinit();
874 av_freep(&input_tmp);
876 if (received_sigterm) {
877 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
878 (int) received_sigterm);
882 exit(ret); /* not all OS-es handle main() return value */
885 static void assert_avoptions(AVDictionary *m)
887 AVDictionaryEntry *t;
888 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
889 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
894 static void assert_codec_experimental(AVCodecContext *c, int encoder)
896 const char *codec_string = encoder ? "encoder" : "decoder";
898 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
899 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
900 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
901 "results.\nAdd '-strict experimental' if you want to use it.\n",
902 codec_string, c->codec->name);
903 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
904 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
905 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
906 codec_string, codec->name);
911 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
913 if (codec && codec->sample_fmts) {
914 const enum AVSampleFormat *p = codec->sample_fmts;
915 for (; *p != -1; p++) {
916 if (*p == st->codec->sample_fmt)
920 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
921 av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
922 if(av_get_sample_fmt_name(st->codec->sample_fmt))
923 av_log(NULL, AV_LOG_WARNING,
924 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
925 av_get_sample_fmt_name(st->codec->sample_fmt),
927 av_get_sample_fmt_name(codec->sample_fmts[0]));
928 st->codec->sample_fmt = codec->sample_fmts[0];
933 static void choose_sample_rate(AVStream *st, AVCodec *codec)
935 if (codec && codec->supported_samplerates) {
936 const int *p = codec->supported_samplerates;
938 int best_dist = INT_MAX;
940 int dist = abs(st->codec->sample_rate - *p);
941 if (dist < best_dist) {
947 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
949 st->codec->sample_rate = best;
953 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
955 if (codec && codec->pix_fmts) {
956 const enum PixelFormat *p = codec->pix_fmts;
957 int has_alpha= av_pix_fmt_descriptors[st->codec->pix_fmt].nb_components % 2 == 0;
958 enum PixelFormat best= PIX_FMT_NONE;
959 if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
960 if (st->codec->codec_id == CODEC_ID_MJPEG) {
961 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
962 } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
963 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
964 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
967 for (; *p != PIX_FMT_NONE; p++) {
968 best= avcodec_find_best_pix_fmt2(best, *p, st->codec->pix_fmt, has_alpha, NULL);
969 if (*p == st->codec->pix_fmt)
972 if (*p == PIX_FMT_NONE) {
973 if (st->codec->pix_fmt != PIX_FMT_NONE)
974 av_log(NULL, AV_LOG_WARNING,
975 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
976 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
978 av_pix_fmt_descriptors[best].name);
979 st->codec->pix_fmt = best;
985 get_sync_ipts(const OutputStream *ost, int64_t pts)
987 OutputFile *of = &output_files[ost->file_index];
988 return (double)(pts - of->start_time) / AV_TIME_BASE;
991 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
993 AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
994 AVCodecContext *avctx = ost->st->codec;
998 * Audio encoders may split the packets -- #frames in != #packets out.
999 * But there is no reordering, so we can limit the number of output packets
1000 * by simply dropping them here.
1001 * Counting encoded video frames needs to be done separately because of
1002 * reordering, see do_video_out()
1004 if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) {
1005 if (ost->frame_number >= ost->max_frames)
1007 ost->frame_number++;
1011 AVPacket new_pkt = *pkt;
1012 int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
1013 &new_pkt.data, &new_pkt.size,
1014 pkt->data, pkt->size,
1015 pkt->flags & AV_PKT_FLAG_KEY);
1017 av_free_packet(pkt);
1018 new_pkt.destruct = av_destruct_packet;
1020 av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
1021 bsfc->filter->name, pkt->stream_index,
1022 avctx->codec ? avctx->codec->name : "copy");
1032 pkt->stream_index = ost->index;
1033 ret = av_interleaved_write_frame(s, pkt);
1035 print_error("av_interleaved_write_frame()", ret);
1040 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1042 int fill_char = 0x00;
1043 if (sample_fmt == AV_SAMPLE_FMT_U8)
1045 memset(buf, fill_char, size);
1048 static int encode_audio_frame(AVFormatContext *s, OutputStream *ost,
1049 const uint8_t *buf, int buf_size)
1051 AVCodecContext *enc = ost->st->codec;
1052 AVFrame *frame = NULL;
1054 int ret, got_packet;
1056 av_init_packet(&pkt);
1061 if (!ost->output_frame) {
1062 ost->output_frame = avcodec_alloc_frame();
1063 if (!ost->output_frame) {
1064 av_log(NULL, AV_LOG_FATAL, "out-of-memory in encode_audio_frame()\n");
1068 frame = ost->output_frame;
1069 if (frame->extended_data != frame->data)
1070 av_freep(&frame->extended_data);
1071 avcodec_get_frame_defaults(frame);
1073 frame->nb_samples = buf_size /
1074 (enc->channels * av_get_bytes_per_sample(enc->sample_fmt));
1075 if ((ret = avcodec_fill_audio_frame(frame, enc->channels, enc->sample_fmt,
1076 buf, buf_size, 1)) < 0) {
1077 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1081 ost->sync_opts += frame->nb_samples;
1085 if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
1086 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1093 if (pkt.pts != AV_NOPTS_VALUE)
1094 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1095 if (pkt.duration > 0)
1096 pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
1098 write_frame(s, &pkt, ost);
1100 audio_size += pkt.size;
1102 av_free_packet(&pkt);
1108 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
1109 InputStream *ist, AVFrame *decoded_frame)
1112 int64_t audio_buf_size, size_out;
1114 int frame_bytes, resample_changed;
1115 AVCodecContext *enc = ost->st->codec;
1116 AVCodecContext *dec = ist->st->codec;
1117 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1118 int isize = av_get_bytes_per_sample(dec->sample_fmt);
1119 uint8_t *buf = decoded_frame->data[0];
1120 int size = decoded_frame->nb_samples * dec->channels * isize;
1121 int64_t allocated_for_size = size;
1124 audio_buf_size = (allocated_for_size + isize * dec->channels - 1) / (isize * dec->channels);
1125 audio_buf_size = (audio_buf_size * enc->sample_rate + dec->sample_rate) / dec->sample_rate;
1126 audio_buf_size = audio_buf_size * 2 + 10000; // safety factors for the deprecated resampling API
1127 audio_buf_size = FFMAX(audio_buf_size, enc->frame_size);
1128 audio_buf_size *= osize * enc->channels;
1130 if (audio_buf_size > INT_MAX) {
1131 av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n");
1135 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
1137 av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
1141 if (enc->channels != dec->channels
1142 || enc->sample_fmt != dec->sample_fmt
1143 || enc->sample_rate!= dec->sample_rate
1145 ost->audio_resample = 1;
1147 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
1148 ost->resample_channels != dec->channels ||
1149 ost->resample_sample_rate != dec->sample_rate;
1151 if ((ost->audio_resample && !ost->swr) || resample_changed || ost->audio_channels_mapped) {
1152 if (resample_changed) {
1153 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",
1154 ist->file_index, ist->st->index,
1155 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
1156 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
1157 ost->resample_sample_fmt = dec->sample_fmt;
1158 ost->resample_channels = dec->channels;
1159 ost->resample_sample_rate = dec->sample_rate;
1160 swr_free(&ost->swr);
1162 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
1163 if (audio_sync_method <= 1 && !ost->audio_channels_mapped &&
1164 ost->resample_sample_fmt == enc->sample_fmt &&
1165 ost->resample_channels == enc->channels &&
1166 ost->resample_sample_rate == enc->sample_rate) {
1168 ost->audio_resample = 0;
1170 ost->swr = swr_alloc_set_opts(ost->swr,
1171 enc->channel_layout, enc->sample_fmt, enc->sample_rate,
1172 dec->channel_layout, dec->sample_fmt, dec->sample_rate,
1174 if (ost->audio_channels_mapped)
1175 swr_set_channel_mapping(ost->swr, ost->audio_channels_map);
1176 av_opt_set_double(ost->swr, "rmvol", ost->rematrix_volume, 0);
1177 if (ost->audio_channels_mapped) {
1178 av_opt_set_int(ost->swr, "icl", av_get_default_channel_layout(ost->audio_channels_mapped), 0);
1179 av_opt_set_int(ost->swr, "uch", ost->audio_channels_mapped, 0);
1181 if (av_opt_set_int(ost->swr, "ich", dec->channels, 0) < 0) {
1182 av_log(NULL, AV_LOG_FATAL, "Unsupported number of input channels\n");
1185 if (av_opt_set_int(ost->swr, "och", enc->channels, 0) < 0) {
1186 av_log(NULL, AV_LOG_FATAL, "Unsupported number of output channels\n");
1189 if(audio_sync_method>1) av_opt_set_int(ost->swr, "flags", SWR_FLAG_RESAMPLE, 0);
1190 if(ost->swr && swr_init(ost->swr) < 0){
1191 av_log(NULL, AV_LOG_FATAL, "swr_init() failed\n");
1192 swr_free(&ost->swr);
1196 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
1197 dec->channels, dec->sample_rate,
1198 enc->channels, enc->sample_rate);
1204 av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
1206 if (audio_sync_method) {
1207 double delta = get_sync_ipts(ost, ist->pts) * enc->sample_rate - ost->sync_opts -
1208 av_fifo_size(ost->fifo) / (enc->channels * osize);
1209 int idelta = delta * dec->sample_rate / enc->sample_rate;
1210 int byte_delta = idelta * isize * dec->channels;
1212 // FIXME resample delay
1213 if (fabs(delta) > 50) {
1214 if (ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate) {
1215 if (byte_delta < 0) {
1216 byte_delta = FFMAX(byte_delta, -size);
1219 av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n",
1220 -byte_delta / (isize * dec->channels));
1225 input_tmp = av_realloc(input_tmp, byte_delta + size);
1227 if (byte_delta > allocated_for_size - size) {
1228 allocated_for_size = byte_delta + (int64_t)size;
1233 generate_silence(input_tmp, dec->sample_fmt, byte_delta);
1234 memcpy(input_tmp + byte_delta, buf, size);
1237 av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
1239 } else if (audio_sync_method > 1) {
1240 int comp = av_clip(delta, -audio_sync_method, audio_sync_method);
1241 av_assert0(ost->audio_resample);
1242 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
1243 delta, comp, enc->sample_rate);
1244 // 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));
1245 swr_set_compensation(ost->swr, comp, enc->sample_rate);
1249 ost->sync_opts = lrintf(get_sync_ipts(ost, ist->pts) * enc->sample_rate) -
1250 av_fifo_size(ost->fifo) / (enc->channels * osize); // FIXME wrong
1252 if (ost->audio_resample || ost->audio_channels_mapped) {
1254 size_out = swr_convert(ost->swr, ( uint8_t*[]){buftmp}, audio_buf_size / (enc->channels * osize),
1255 (const uint8_t*[]){buf }, size / (dec->channels * isize));
1256 size_out = size_out * enc->channels * osize;
1262 av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
1264 /* now encode as many frames as possible */
1265 if (!(enc->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)) {
1266 /* output resampled raw samples */
1267 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
1268 av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
1271 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
1273 frame_bytes = enc->frame_size * osize * enc->channels;
1275 while (av_fifo_size(ost->fifo) >= frame_bytes) {
1276 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
1277 encode_audio_frame(s, ost, audio_buf, frame_bytes);
1280 encode_audio_frame(s, ost, buftmp, size_out);
1284 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1286 AVCodecContext *dec;
1287 AVPicture *picture2;
1288 AVPicture picture_tmp;
1291 dec = ist->st->codec;
1293 /* deinterlace : must be done before any resize */
1294 if (do_deinterlace) {
1297 /* create temporary picture */
1298 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1299 buf = av_malloc(size);
1303 picture2 = &picture_tmp;
1304 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1306 if (avpicture_deinterlace(picture2, picture,
1307 dec->pix_fmt, dec->width, dec->height) < 0) {
1308 /* if error, do not deinterlace */
1309 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1318 if (picture != picture2)
1319 *picture = *picture2;
1323 static void do_subtitle_out(AVFormatContext *s,
1329 static uint8_t *subtitle_out = NULL;
1330 int subtitle_out_max_size = 1024 * 1024;
1331 int subtitle_out_size, nb, i;
1332 AVCodecContext *enc;
1335 if (pts == AV_NOPTS_VALUE) {
1336 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1342 enc = ost->st->codec;
1344 if (!subtitle_out) {
1345 subtitle_out = av_malloc(subtitle_out_max_size);
1348 /* Note: DVB subtitle need one packet to draw them and one other
1349 packet to clear them */
1350 /* XXX: signal it in the codec context ? */
1351 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1356 for (i = 0; i < nb; i++) {
1357 ost->sync_opts = av_rescale_q(pts, ist->st->time_base, enc->time_base);
1359 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1360 // start_display_time is required to be 0
1361 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1362 sub->end_display_time -= sub->start_display_time;
1363 sub->start_display_time = 0;
1364 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1365 subtitle_out_max_size, sub);
1366 if (subtitle_out_size < 0) {
1367 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1371 av_init_packet(&pkt);
1372 pkt.data = subtitle_out;
1373 pkt.size = subtitle_out_size;
1374 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1375 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1376 /* XXX: the pts correction is handled here. Maybe handling
1377 it in the codec would be better */
1379 pkt.pts += 90 * sub->start_display_time;
1381 pkt.pts += 90 * sub->end_display_time;
1383 write_frame(s, &pkt, ost);
1387 static void do_video_resample(OutputStream *ost,
1389 AVFrame *in_picture,
1390 AVFrame **out_picture)
1393 *out_picture = in_picture;
1395 AVCodecContext *dec = ist->st->codec;
1396 AVCodecContext *enc = ost->st->codec;
1397 int resample_changed = ost->resample_width != in_picture->width ||
1398 ost->resample_height != in_picture->height ||
1399 ost->resample_pix_fmt != in_picture->format;
1401 *out_picture = in_picture;
1402 if (resample_changed) {
1403 av_log(NULL, AV_LOG_INFO,
1404 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s / frm size:%dx%d fmt:%s\n",
1405 ist->file_index, ist->st->index,
1406 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1407 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt),
1408 in_picture->width, in_picture->height, av_get_pix_fmt_name(in_picture->format));
1409 ost->resample_width = in_picture->width;
1410 ost->resample_height = in_picture->height;
1411 ost->resample_pix_fmt = in_picture->format;
1414 ost->video_resample = in_picture->width != enc->width ||
1415 in_picture->height != enc->height ||
1416 in_picture->format != enc->pix_fmt;
1418 if (ost->video_resample) {
1419 *out_picture = &ost->resample_frame;
1420 if (!ost->img_resample_ctx || resample_changed) {
1421 /* initialize the destination picture */
1422 if (!ost->resample_frame.data[0]) {
1423 avcodec_get_frame_defaults(&ost->resample_frame);
1424 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1425 enc->width, enc->height)) {
1426 av_log(NULL, AV_LOG_FATAL, "Cannot allocate temp picture, check pix fmt\n");
1430 /* initialize a new scaler context */
1431 sws_freeContext(ost->img_resample_ctx);
1432 ost->img_resample_ctx = sws_getContext(in_picture->width, in_picture->height, in_picture->format,
1433 enc->width, enc->height, enc->pix_fmt,
1434 ost->sws_flags, NULL, NULL, NULL);
1435 if (ost->img_resample_ctx == NULL) {
1436 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1440 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1441 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1447 static void do_video_out(AVFormatContext *s,
1450 AVFrame *in_picture,
1451 int *frame_size, float quality)
1453 int nb_frames, i, ret, format_video_sync;
1454 AVFrame *final_picture;
1455 AVCodecContext *enc;
1457 double duration = 0;
1459 enc = ost->st->codec;
1461 if (ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE) {
1462 duration = FFMAX(av_q2d(ist->st->time_base), av_q2d(ist->st->codec->time_base));
1463 if(ist->st->avg_frame_rate.num)
1464 duration= FFMAX(duration, 1/av_q2d(ist->st->avg_frame_rate));
1466 duration /= av_q2d(enc->time_base);
1469 sync_ipts = get_sync_ipts(ost, in_picture->pts) / av_q2d(enc->time_base);
1471 /* by default, we output a single frame */
1476 format_video_sync = video_sync_method;
1477 if (format_video_sync == VSYNC_AUTO)
1478 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
1480 if (format_video_sync != VSYNC_PASSTHROUGH && format_video_sync != VSYNC_DROP) {
1481 double vdelta = sync_ipts - ost->sync_opts + duration;
1482 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1485 else if (format_video_sync == VSYNC_VFR) {
1486 if (vdelta <= -0.6) {
1488 } else if (vdelta > 0.6)
1489 ost->sync_opts = lrintf(sync_ipts);
1490 } else if (vdelta > 1.1)
1491 nb_frames = lrintf(vdelta);
1492 if (nb_frames == 0) {
1494 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1495 } else if (nb_frames > 1) {
1496 nb_frames_dup += nb_frames - 1;
1497 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1500 ost->sync_opts = lrintf(sync_ipts);
1502 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1506 do_video_resample(ost, ist, in_picture, &final_picture);
1508 /* duplicates frame if needed */
1509 for (i = 0; i < nb_frames; i++) {
1511 av_init_packet(&pkt);
1515 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1516 enc->codec->id == CODEC_ID_RAWVIDEO) {
1517 /* raw pictures are written as AVPicture structure to
1518 avoid any copies. We support temporarily the older
1520 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1521 enc->coded_frame->top_field_first = in_picture->top_field_first;
1522 pkt.data = (uint8_t *)final_picture;
1523 pkt.size = sizeof(AVPicture);
1524 pkt.pts = av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1525 pkt.flags |= AV_PKT_FLAG_KEY;
1527 write_frame(s, &pkt, ost);
1530 AVFrame big_picture;
1532 big_picture = *final_picture;
1533 /* better than nothing: use input picture interlaced
1535 big_picture.interlaced_frame = in_picture->interlaced_frame;
1536 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1537 if (ost->top_field_first == -1)
1538 big_picture.top_field_first = in_picture->top_field_first;
1540 big_picture.top_field_first = !!ost->top_field_first;
1543 /* handles same_quant here. This is not correct because it may
1544 not be a global option */
1545 big_picture.quality = quality;
1546 if (!enc->me_threshold)
1547 big_picture.pict_type = 0;
1548 big_picture.pts = ost->sync_opts;
1549 if (ost->forced_kf_index < ost->forced_kf_count &&
1550 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1551 big_picture.pict_type = AV_PICTURE_TYPE_I;
1552 ost->forced_kf_index++;
1554 ret = avcodec_encode_video2(enc, &pkt, &big_picture, &got_packet);
1556 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1561 if (pkt.pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & CODEC_CAP_DELAY))
1562 pkt.pts = ost->sync_opts;
1564 if (pkt.pts != AV_NOPTS_VALUE)
1565 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1566 if (pkt.dts != AV_NOPTS_VALUE)
1567 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1569 if (format_video_sync == VSYNC_DROP)
1570 pkt.pts = pkt.dts = AV_NOPTS_VALUE;
1572 write_frame(s, &pkt, ost);
1573 *frame_size = pkt.size;
1574 video_size += pkt.size;
1576 /* if two pass, output log */
1577 if (ost->logfile && enc->stats_out) {
1578 fprintf(ost->logfile, "%s", enc->stats_out);
1584 * For video, number of frames in == number of packets out.
1585 * But there may be reordering, so we can't throw away frames on encoder
1586 * flush, we need to limit them here, before they go into encoder.
1588 ost->frame_number++;
1592 static double psnr(double d)
1594 return -10.0 * log(d) / log(10.0);
1597 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1600 AVCodecContext *enc;
1602 double ti1, bitrate, avg_bitrate;
1604 /* this is executed just the first time do_video_stats is called */
1606 vstats_file = fopen(vstats_filename, "w");
1613 enc = ost->st->codec;
1614 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1615 frame_number = ost->frame_number;
1616 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1617 if (enc->flags&CODEC_FLAG_PSNR)
1618 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1620 fprintf(vstats_file,"f_size= %6d ", frame_size);
1621 /* compute pts value */
1622 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1626 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1627 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1628 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1629 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1630 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1634 static void print_report(OutputFile *output_files,
1635 OutputStream *ost_table, int nb_ostreams,
1636 int is_last_report, int64_t timer_start, int64_t cur_time)
1640 AVFormatContext *oc;
1642 AVCodecContext *enc;
1643 int frame_number, vid, i;
1645 int64_t pts = INT64_MAX;
1646 static int64_t last_time = -1;
1647 static int qp_histogram[52];
1648 int hours, mins, secs, us;
1650 if (!print_stats && !is_last_report)
1653 if (!is_last_report) {
1654 if (last_time == -1) {
1655 last_time = cur_time;
1658 if ((cur_time - last_time) < 500000)
1660 last_time = cur_time;
1664 oc = output_files[0].ctx;
1666 total_size = avio_size(oc->pb);
1667 if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
1668 total_size = avio_tell(oc->pb);
1675 for (i = 0; i < nb_ostreams; i++) {
1677 ost = &ost_table[i];
1678 enc = ost->st->codec;
1679 if (!ost->stream_copy && enc->coded_frame)
1680 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
1681 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1682 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1684 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1685 float t = (cur_time-timer_start) / 1000000.0;
1687 frame_number = ost->frame_number;
1688 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1689 frame_number, (t > 1) ? (int)(frame_number / t + 0.5) : 0, q);
1691 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1695 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
1697 for (j = 0; j < 32; j++)
1698 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
1700 if (enc->flags&CODEC_FLAG_PSNR) {
1702 double error, error_sum = 0;
1703 double scale, scale_sum = 0;
1704 char type[3] = { 'Y','U','V' };
1705 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1706 for (j = 0; j < 3; j++) {
1707 if (is_last_report) {
1708 error = enc->error[j];
1709 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
1711 error = enc->coded_frame->error[j];
1712 scale = enc->width * enc->height * 255.0 * 255.0;
1718 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error / scale));
1720 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
1724 /* compute min output value */
1725 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1726 ost->st->time_base, AV_TIME_BASE_Q));
1729 secs = pts / AV_TIME_BASE;
1730 us = pts % AV_TIME_BASE;
1736 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1738 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1739 "size=%8.0fkB time=", total_size / 1024.0);
1740 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1741 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1742 (100 * us) / AV_TIME_BASE);
1743 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1744 "bitrate=%6.1fkbits/s", bitrate);
1746 if (nb_frames_dup || nb_frames_drop)
1747 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1748 nb_frames_dup, nb_frames_drop);
1750 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
1754 if (is_last_report) {
1755 int64_t raw= audio_size + video_size + extra_size;
1756 av_log(NULL, AV_LOG_INFO, "\n");
1757 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1758 video_size / 1024.0,
1759 audio_size / 1024.0,
1760 extra_size / 1024.0,
1761 100.0 * (total_size - raw) / raw
1763 if(video_size + audio_size + extra_size == 0){
1764 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
1769 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1773 for (i = 0; i < nb_ostreams; i++) {
1774 OutputStream *ost = &ost_table[i];
1775 AVCodecContext *enc = ost->st->codec;
1776 AVFormatContext *os = output_files[ost->file_index].ctx;
1777 int stop_encoding = 0;
1779 if (!ost->encoding_needed)
1782 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
1784 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
1789 int fifo_bytes, got_packet;
1790 av_init_packet(&pkt);
1794 switch (ost->st->codec->codec_type) {
1795 case AVMEDIA_TYPE_AUDIO:
1796 fifo_bytes = av_fifo_size(ost->fifo);
1797 if (fifo_bytes > 0) {
1798 /* encode any samples remaining in fifo */
1799 int frame_bytes = fifo_bytes;
1801 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1803 /* pad last frame with silence if needed */
1804 if (!(enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME)) {
1805 frame_bytes = enc->frame_size * enc->channels *
1806 av_get_bytes_per_sample(enc->sample_fmt);
1807 if (allocated_audio_buf_size < frame_bytes)
1809 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1811 encode_audio_frame(os, ost, audio_buf, frame_bytes);
1813 /* flush encoder with NULL frames until it is done
1814 returning packets */
1815 if (encode_audio_frame(os, ost, NULL, 0) == 0) {
1821 case AVMEDIA_TYPE_VIDEO:
1822 ret = avcodec_encode_video2(enc, &pkt, NULL, &got_packet);
1824 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1827 video_size += pkt.size;
1828 if (ost->logfile && enc->stats_out) {
1829 fprintf(ost->logfile, "%s", enc->stats_out);
1835 if (pkt.pts != AV_NOPTS_VALUE)
1836 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1837 if (pkt.dts != AV_NOPTS_VALUE)
1838 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1839 write_frame(os, &pkt, ost);
1851 * Check whether a packet from ist should be written into ost at this time
1853 static int check_output_constraints(InputStream *ist, OutputStream *ost)
1855 OutputFile *of = &output_files[ost->file_index];
1856 int ist_index = ist - input_streams;
1858 if (ost->source_index != ist_index)
1861 if (of->start_time && ist->pts < of->start_time)
1864 if (of->recording_time != INT64_MAX &&
1865 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1866 (AVRational){ 1, 1000000 }) >= 0) {
1867 ost->is_past_recording_time = 1;
1874 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
1876 OutputFile *of = &output_files[ost->file_index];
1877 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1881 av_init_packet(&opkt);
1883 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
1884 !ost->copy_initial_nonkeyframes)
1887 /* force the input stream PTS */
1888 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1889 audio_size += pkt->size;
1890 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1891 video_size += pkt->size;
1895 if (pkt->pts != AV_NOPTS_VALUE)
1896 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1898 opkt.pts = AV_NOPTS_VALUE;
1900 if (pkt->dts == AV_NOPTS_VALUE)
1901 opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->st->time_base);
1903 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1904 opkt.dts -= ost_tb_start_time;
1906 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1907 opkt.flags = pkt->flags;
1909 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1910 if ( ost->st->codec->codec_id != CODEC_ID_H264
1911 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1912 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1914 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
1915 opkt.destruct = av_destruct_packet;
1917 opkt.data = pkt->data;
1918 opkt.size = pkt->size;
1920 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
1921 /* store AVPicture in AVPacket, as expected by the output format */
1922 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1923 opkt.data = (uint8_t *)&pict;
1924 opkt.size = sizeof(AVPicture);
1925 opkt.flags |= AV_PKT_FLAG_KEY;
1928 write_frame(of->ctx, &opkt, ost);
1929 ost->st->codec->frame_number++;
1930 av_free_packet(&opkt);
1933 static void rate_emu_sleep(InputStream *ist)
1935 if (input_files[ist->file_index].rate_emu) {
1936 int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
1937 int64_t now = av_gettime() - ist->start;
1943 static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
1945 AVFrame *decoded_frame;
1946 AVCodecContext *avctx = ist->st->codec;
1947 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1950 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
1951 return AVERROR(ENOMEM);
1953 avcodec_get_frame_defaults(ist->decoded_frame);
1954 decoded_frame = ist->decoded_frame;
1956 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
1962 /* no audio frame */
1966 /* if the decoder provides a pts, use it instead of the last packet pts.
1967 the decoder could be delaying output by a packet or more. */
1968 if (decoded_frame->pts != AV_NOPTS_VALUE)
1969 ist->dts = ist->next_dts = ist->pts = ist->next_pts = decoded_frame->pts;
1971 /* increment next_dts to use for the case where the input stream does not
1972 have timestamps or there are multiple frames in the packet */
1973 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
1975 ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
1979 // preprocess audio (volume)
1980 if (audio_volume != 256) {
1981 int decoded_data_size = decoded_frame->nb_samples * avctx->channels * bps;
1982 void *samples = decoded_frame->data[0];
1983 switch (avctx->sample_fmt) {
1984 case AV_SAMPLE_FMT_U8:
1986 uint8_t *volp = samples;
1987 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1988 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
1989 *volp++ = av_clip_uint8(v);
1993 case AV_SAMPLE_FMT_S16:
1995 int16_t *volp = samples;
1996 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1997 int v = ((*volp) * audio_volume + 128) >> 8;
1998 *volp++ = av_clip_int16(v);
2002 case AV_SAMPLE_FMT_S32:
2004 int32_t *volp = samples;
2005 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2006 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
2007 *volp++ = av_clipl_int32(v);
2011 case AV_SAMPLE_FMT_FLT:
2013 float *volp = samples;
2014 float scale = audio_volume / 256.f;
2015 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2020 case AV_SAMPLE_FMT_DBL:
2022 double *volp = samples;
2023 double scale = audio_volume / 256.;
2024 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2030 av_log(NULL, AV_LOG_FATAL,
2031 "Audio volume adjustment on sample format %s is not supported.\n",
2032 av_get_sample_fmt_name(ist->st->codec->sample_fmt));
2037 rate_emu_sleep(ist);
2039 for (i = 0; i < nb_output_streams; i++) {
2040 OutputStream *ost = &output_streams[i];
2042 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2044 do_audio_out(output_files[ost->file_index].ctx, ost, ist, decoded_frame);
2050 static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *pkt_pts)
2052 AVFrame *decoded_frame, *filtered_frame = NULL;
2053 void *buffer_to_free = NULL;
2057 int frame_available = 1;
2059 int64_t *best_effort_timestamp;
2060 AVRational *frame_sample_aspect;
2062 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2063 return AVERROR(ENOMEM);
2065 avcodec_get_frame_defaults(ist->decoded_frame);
2066 decoded_frame = ist->decoded_frame;
2067 pkt->pts = *pkt_pts;
2068 pkt->dts = ist->dts;
2069 *pkt_pts = AV_NOPTS_VALUE;
2071 ret = avcodec_decode_video2(ist->st->codec,
2072 decoded_frame, got_output, pkt);
2076 quality = same_quant ? decoded_frame->quality : 0;
2078 /* no picture yet */
2082 best_effort_timestamp= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "best_effort_timestamp");
2083 if(*best_effort_timestamp != AV_NOPTS_VALUE)
2084 ist->next_pts = ist->pts = decoded_frame->pts = *best_effort_timestamp;
2088 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2091 frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
2092 for(i=0;i<nb_output_streams;i++) {
2093 OutputStream *ost = ost = &output_streams[i];
2094 if(check_output_constraints(ist, ost) && ost->encoding_needed){
2095 if (!frame_sample_aspect->num)
2096 *frame_sample_aspect = ist->st->sample_aspect_ratio;
2097 decoded_frame->pts = ist->pts;
2098 if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER) {
2099 FrameBuffer *buf = decoded_frame->opaque;
2100 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2101 decoded_frame->data, decoded_frame->linesize,
2102 AV_PERM_READ | AV_PERM_PRESERVE,
2103 ist->st->codec->width, ist->st->codec->height,
2104 ist->st->codec->pix_fmt);
2106 avfilter_copy_frame_props(fb, decoded_frame);
2107 fb->buf->priv = buf;
2108 fb->buf->free = filter_release_buffer;
2111 av_buffersrc_buffer(ost->input_video_filter, fb);
2113 if((av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame, AV_VSRC_BUF_FLAG_OVERWRITE)) < 0){
2114 av_log(0, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
2121 rate_emu_sleep(ist);
2123 for (i = 0; i < nb_output_streams; i++) {
2124 OutputStream *ost = &output_streams[i];
2127 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2131 if (ost->input_video_filter) {
2132 frame_available = av_buffersink_poll_frame(ost->output_video_filter);
2134 while (frame_available) {
2135 if (ost->output_video_filter) {
2136 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
2137 if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0){
2138 av_log(0, AV_LOG_WARNING, "AV Filter told us it has a frame available but failed to output one\n");
2141 if (!ist->filtered_frame && !(ist->filtered_frame = avcodec_alloc_frame())) {
2142 av_free(buffer_to_free);
2143 return AVERROR(ENOMEM);
2145 avcodec_get_frame_defaults(ist->filtered_frame);
2146 filtered_frame = ist->filtered_frame;
2147 *filtered_frame= *decoded_frame; //for me_threshold
2149 avfilter_fill_frame_from_video_buffer_ref(filtered_frame, ost->picref);
2150 filtered_frame->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
2153 if (ost->picref->video && !ost->frame_aspect_ratio)
2154 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
2156 filtered_frame = decoded_frame;
2159 do_video_out(output_files[ost->file_index].ctx, ost, ist, filtered_frame, &frame_size,
2160 same_quant ? quality : ost->st->codec->global_quality);
2161 if (vstats_filename && frame_size)
2162 do_video_stats(output_files[ost->file_index].ctx, ost, frame_size);
2165 frame_available = ost->output_video_filter && av_buffersink_poll_frame(ost->output_video_filter);
2166 avfilter_unref_buffer(ost->picref);
2171 av_free(buffer_to_free);
2175 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2177 AVSubtitle subtitle;
2178 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2179 &subtitle, got_output, pkt);
2185 rate_emu_sleep(ist);
2187 for (i = 0; i < nb_output_streams; i++) {
2188 OutputStream *ost = &output_streams[i];
2190 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2193 do_subtitle_out(output_files[ost->file_index].ctx, ost, ist, &subtitle, pkt->pts);
2196 avsubtitle_free(&subtitle);
2200 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2201 static int output_packet(InputStream *ist,
2202 OutputStream *ost_table, int nb_ostreams,
2203 const AVPacket *pkt)
2207 int64_t pkt_pts = AV_NOPTS_VALUE;
2211 if (ist->next_dts == AV_NOPTS_VALUE)
2212 ist->next_dts = ist->dts;
2213 if (ist->next_pts == AV_NOPTS_VALUE)
2214 ist->next_pts = ist->pts;
2218 av_init_packet(&avpkt);
2226 if (pkt->dts != AV_NOPTS_VALUE) {
2227 ist->next_dts = ist->dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2228 if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2229 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2231 if(pkt->pts != AV_NOPTS_VALUE)
2232 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2234 // while we have more to decode or while the decoder did output something on EOF
2235 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2239 ist->pts = ist->next_pts;
2240 ist->dts = ist->next_dts;
2242 if (avpkt.size && avpkt.size != pkt->size) {
2243 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2244 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2245 ist->showed_multi_packet_warning = 1;
2248 switch (ist->st->codec->codec_type) {
2249 case AVMEDIA_TYPE_AUDIO:
2250 ret = transcode_audio (ist, &avpkt, &got_output);
2252 case AVMEDIA_TYPE_VIDEO:
2253 ret = transcode_video (ist, &avpkt, &got_output, &pkt_pts);
2254 if (avpkt.duration) {
2255 duration = av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
2256 } else if(ist->st->codec->time_base.num != 0) {
2257 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2258 duration = ((int64_t)AV_TIME_BASE *
2259 ist->st->codec->time_base.num * ticks) /
2260 ist->st->codec->time_base.den;
2264 if(ist->dts != AV_NOPTS_VALUE && duration) {
2265 ist->next_dts += duration;
2267 ist->next_dts = AV_NOPTS_VALUE;
2270 ist->next_pts += duration; //FIXME the duration is not correct in some cases
2272 case AVMEDIA_TYPE_SUBTITLE:
2273 ret = transcode_subtitles(ist, &avpkt, &got_output);
2283 avpkt.pts= AV_NOPTS_VALUE;
2285 // touch data and size only if not EOF
2287 if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2297 /* handle stream copy */
2298 if (!ist->decoding_needed) {
2299 rate_emu_sleep(ist);
2300 ist->dts = ist->next_dts;
2301 switch (ist->st->codec->codec_type) {
2302 case AVMEDIA_TYPE_AUDIO:
2303 ist->next_dts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2304 ist->st->codec->sample_rate;
2306 case AVMEDIA_TYPE_VIDEO:
2307 if (pkt->duration) {
2308 ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2309 } else if(ist->st->codec->time_base.num != 0) {
2310 int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2311 ist->next_dts += ((int64_t)AV_TIME_BASE *
2312 ist->st->codec->time_base.num * ticks) /
2313 ist->st->codec->time_base.den;
2317 ist->pts = ist->dts;
2318 ist->next_pts = ist->next_dts;
2320 for (i = 0; pkt && i < nb_ostreams; i++) {
2321 OutputStream *ost = &ost_table[i];
2323 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2326 do_streamcopy(ist, ost, pkt);
2332 static void print_sdp(OutputFile *output_files, int n)
2336 AVFormatContext **avc = av_malloc(sizeof(*avc) * n);
2340 for (i = 0; i < n; i++)
2341 avc[i] = output_files[i].ctx;
2343 av_sdp_create(avc, n, sdp, sizeof(sdp));
2344 printf("SDP:\n%s\n", sdp);
2349 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
2350 char *error, int error_len)
2352 InputStream *ist = &input_streams[ist_index];
2353 if (ist->decoding_needed) {
2354 AVCodec *codec = ist->dec;
2356 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2357 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2358 return AVERROR(EINVAL);
2361 ist->dr1 = codec->capabilities & CODEC_CAP_DR1;
2362 if (codec->type == AVMEDIA_TYPE_VIDEO && ist->dr1) {
2363 ist->st->codec->get_buffer = codec_get_buffer;
2364 ist->st->codec->release_buffer = codec_release_buffer;
2365 ist->st->codec->opaque = ist;
2368 if (!av_dict_get(ist->opts, "threads", NULL, 0))
2369 av_dict_set(&ist->opts, "threads", "auto", 0);
2370 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2371 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2372 ist->file_index, ist->st->index);
2373 return AVERROR(EINVAL);
2375 assert_codec_experimental(ist->st->codec, 0);
2376 assert_avoptions(ist->opts);
2379 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;
2380 ist->next_pts = AV_NOPTS_VALUE;
2381 ist->next_dts = AV_NOPTS_VALUE;
2387 static int transcode_init(OutputFile *output_files, int nb_output_files,
2388 InputFile *input_files, int nb_input_files)
2390 int ret = 0, i, j, k;
2391 AVFormatContext *oc;
2392 AVCodecContext *codec, *icodec;
2398 /* init framerate emulation */
2399 for (i = 0; i < nb_input_files; i++) {
2400 InputFile *ifile = &input_files[i];
2401 if (ifile->rate_emu)
2402 for (j = 0; j < ifile->nb_streams; j++)
2403 input_streams[j + ifile->ist_index].start = av_gettime();
2406 /* output stream init */
2407 for (i = 0; i < nb_output_files; i++) {
2408 oc = output_files[i].ctx;
2409 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2410 av_dump_format(oc, i, oc->filename, 1);
2411 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2412 return AVERROR(EINVAL);
2416 /* for each output stream, we compute the right encoding parameters */
2417 for (i = 0; i < nb_output_streams; i++) {
2418 ost = &output_streams[i];
2419 oc = output_files[ost->file_index].ctx;
2420 ist = &input_streams[ost->source_index];
2422 if (ost->attachment_filename)
2425 codec = ost->st->codec;
2426 icodec = ist->st->codec;
2428 ost->st->disposition = ist->st->disposition;
2429 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2430 codec->chroma_sample_location = icodec->chroma_sample_location;
2432 if (ost->stream_copy) {
2433 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2435 if (extra_size > INT_MAX) {
2436 return AVERROR(EINVAL);
2439 /* if stream_copy is selected, no need to decode or encode */
2440 codec->codec_id = icodec->codec_id;
2441 codec->codec_type = icodec->codec_type;
2443 if (!codec->codec_tag) {
2444 if (!oc->oformat->codec_tag ||
2445 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2446 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2447 codec->codec_tag = icodec->codec_tag;
2450 codec->bit_rate = icodec->bit_rate;
2451 codec->rc_max_rate = icodec->rc_max_rate;
2452 codec->rc_buffer_size = icodec->rc_buffer_size;
2453 codec->field_order = icodec->field_order;
2454 codec->extradata = av_mallocz(extra_size);
2455 if (!codec->extradata) {
2456 return AVERROR(ENOMEM);
2458 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2459 codec->extradata_size= icodec->extradata_size;
2461 codec->time_base = ist->st->time_base;
2463 * Avi is a special case here because it supports variable fps but
2464 * having the fps and timebase differe significantly adds quite some
2467 if(!strcmp(oc->oformat->name, "avi")) {
2468 if ( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
2469 && av_q2d(ist->st->time_base) < 1.0/500
2471 codec->time_base = icodec->time_base;
2472 codec->time_base.num *= icodec->ticks_per_frame;
2473 codec->time_base.den *= 2;
2475 } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
2476 && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
2477 && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
2479 if( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
2480 && av_q2d(ist->st->time_base) < 1.0/500
2482 codec->time_base = icodec->time_base;
2483 codec->time_base.num *= icodec->ticks_per_frame;
2486 av_reduce(&codec->time_base.num, &codec->time_base.den,
2487 codec->time_base.num, codec->time_base.den, INT_MAX);
2489 switch (codec->codec_type) {
2490 case AVMEDIA_TYPE_AUDIO:
2491 if (audio_volume != 256) {
2492 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2495 codec->channel_layout = icodec->channel_layout;
2496 codec->sample_rate = icodec->sample_rate;
2497 codec->channels = icodec->channels;
2498 codec->frame_size = icodec->frame_size;
2499 codec->audio_service_type = icodec->audio_service_type;
2500 codec->block_align = icodec->block_align;
2502 case AVMEDIA_TYPE_VIDEO:
2503 codec->pix_fmt = icodec->pix_fmt;
2504 codec->width = icodec->width;
2505 codec->height = icodec->height;
2506 codec->has_b_frames = icodec->has_b_frames;
2507 if (!codec->sample_aspect_ratio.num) {
2508 codec->sample_aspect_ratio =
2509 ost->st->sample_aspect_ratio =
2510 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2511 ist->st->codec->sample_aspect_ratio.num ?
2512 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2514 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
2516 case AVMEDIA_TYPE_SUBTITLE:
2517 codec->width = icodec->width;
2518 codec->height = icodec->height;
2520 case AVMEDIA_TYPE_DATA:
2521 case AVMEDIA_TYPE_ATTACHMENT:
2528 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2530 ist->decoding_needed = 1;
2531 ost->encoding_needed = 1;
2533 switch (codec->codec_type) {
2534 case AVMEDIA_TYPE_AUDIO:
2535 ost->fifo = av_fifo_alloc(1024);
2537 return AVERROR(ENOMEM);
2539 if (!codec->sample_rate)
2540 codec->sample_rate = icodec->sample_rate;
2541 choose_sample_rate(ost->st, ost->enc);
2542 codec->time_base = (AVRational){ 1, codec->sample_rate };
2544 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2545 codec->sample_fmt = icodec->sample_fmt;
2546 choose_sample_fmt(ost->st, ost->enc);
2548 if (ost->audio_channels_mapped) {
2549 /* the requested output channel is set to the number of
2550 * -map_channel only if no -ac are specified */
2551 if (!codec->channels) {
2552 codec->channels = ost->audio_channels_mapped;
2553 codec->channel_layout = av_get_default_channel_layout(codec->channels);
2554 if (!codec->channel_layout) {
2555 av_log(NULL, AV_LOG_FATAL, "Unable to find an appropriate channel layout for requested number of channel\n");
2559 /* fill unused channel mapping with -1 (which means a muted
2560 * channel in case the number of output channels is bigger
2561 * than the number of mapped channel) */
2562 for (j = ost->audio_channels_mapped; j < FF_ARRAY_ELEMS(ost->audio_channels_map); j++)
2563 ost->audio_channels_map[j] = -1;
2564 } else if (!codec->channels) {
2565 codec->channels = icodec->channels;
2566 codec->channel_layout = icodec->channel_layout;
2568 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2569 codec->channel_layout = 0;
2571 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2572 ost->audio_resample |= codec->sample_fmt != icodec->sample_fmt
2573 || codec->channel_layout != icodec->channel_layout;
2574 icodec->request_channels = codec->channels;
2575 ost->resample_sample_fmt = icodec->sample_fmt;
2576 ost->resample_sample_rate = icodec->sample_rate;
2577 ost->resample_channels = icodec->channels;
2579 case AVMEDIA_TYPE_VIDEO:
2580 if (codec->pix_fmt == PIX_FMT_NONE)
2581 codec->pix_fmt = icodec->pix_fmt;
2582 choose_pixel_fmt(ost->st, ost->enc);
2584 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2585 av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2589 if (!codec->width || !codec->height) {
2590 codec->width = icodec->width;
2591 codec->height = icodec->height;
2594 ost->video_resample = codec->width != icodec->width ||
2595 codec->height != icodec->height ||
2596 codec->pix_fmt != icodec->pix_fmt;
2597 if (ost->video_resample) {
2598 codec->bits_per_raw_sample = frame_bits_per_raw_sample;
2601 ost->resample_height = icodec->height;
2602 ost->resample_width = icodec->width;
2603 ost->resample_pix_fmt = icodec->pix_fmt;
2605 if (!ost->frame_rate.num)
2606 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational) { 25, 1 };
2607 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2608 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2609 ost->frame_rate = ost->enc->supported_framerates[idx];
2611 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2612 if ( av_q2d(codec->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
2613 && (video_sync_method == VSYNC_CFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
2614 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2615 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2617 for (j = 0; j < ost->forced_kf_count; j++)
2618 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
2623 if (configure_video_filters(ist, ost)) {
2624 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2629 case AVMEDIA_TYPE_SUBTITLE:
2630 codec->time_base = (AVRational){1, 1000};
2637 if (codec->codec_id != CODEC_ID_H264 &&
2638 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2639 char logfilename[1024];
2642 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2643 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2645 if (codec->flags & CODEC_FLAG_PASS2) {
2647 size_t logbuffer_size;
2648 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2649 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2653 codec->stats_in = logbuffer;
2655 if (codec->flags & CODEC_FLAG_PASS1) {
2656 f = fopen(logfilename, "wb");
2658 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2659 logfilename, strerror(errno));
2668 /* open each encoder */
2669 for (i = 0; i < nb_output_streams; i++) {
2670 ost = &output_streams[i];
2671 if (ost->encoding_needed) {
2672 AVCodec *codec = ost->enc;
2673 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2675 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
2676 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2677 ret = AVERROR(EINVAL);
2680 if (dec->subtitle_header) {
2681 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2682 if (!ost->st->codec->subtitle_header) {
2683 ret = AVERROR(ENOMEM);
2686 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2687 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2689 if (!av_dict_get(ost->opts, "threads", NULL, 0))
2690 av_dict_set(&ost->opts, "threads", "auto", 0);
2691 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2692 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2693 ost->file_index, ost->index);
2694 ret = AVERROR(EINVAL);
2697 assert_codec_experimental(ost->st->codec, 1);
2698 assert_avoptions(ost->opts);
2699 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2700 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2701 " It takes bits/s as argument, not kbits/s\n");
2702 extra_size += ost->st->codec->extradata_size;
2704 if (ost->st->codec->me_threshold)
2705 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2709 /* init input streams */
2710 for (i = 0; i < nb_input_streams; i++)
2711 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2714 /* discard unused programs */
2715 for (i = 0; i < nb_input_files; i++) {
2716 InputFile *ifile = &input_files[i];
2717 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2718 AVProgram *p = ifile->ctx->programs[j];
2719 int discard = AVDISCARD_ALL;
2721 for (k = 0; k < p->nb_stream_indexes; k++)
2722 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2723 discard = AVDISCARD_DEFAULT;
2726 p->discard = discard;
2730 /* open files and write file headers */
2731 for (i = 0; i < nb_output_files; i++) {
2732 oc = output_files[i].ctx;
2733 oc->interrupt_callback = int_cb;
2734 if (avformat_write_header(oc, &output_files[i].opts) < 0) {
2735 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2736 ret = AVERROR(EINVAL);
2739 // assert_avoptions(output_files[i].opts);
2740 if (strcmp(oc->oformat->name, "rtp")) {
2746 /* dump the file output parameters - cannot be done before in case
2748 for (i = 0; i < nb_output_files; i++) {
2749 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2752 /* dump the stream mapping */
2753 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2754 for (i = 0; i < nb_output_streams; i++) {
2755 ost = &output_streams[i];
2757 if (ost->attachment_filename) {
2758 /* an attached file */
2759 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
2760 ost->attachment_filename, ost->file_index, ost->index);
2763 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
2764 input_streams[ost->source_index].file_index,
2765 input_streams[ost->source_index].st->index,
2768 if (ost->audio_channels_mapped) {
2769 av_log(NULL, AV_LOG_INFO, " [ch:");
2770 for (j = 0; j < ost->audio_channels_mapped; j++)
2771 if (ost->audio_channels_map[j] == -1)
2772 av_log(NULL, AV_LOG_INFO, " M");
2774 av_log(NULL, AV_LOG_INFO, " %d", ost->audio_channels_map[j]);
2775 av_log(NULL, AV_LOG_INFO, "]");
2777 if (ost->sync_ist != &input_streams[ost->source_index])
2778 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2779 ost->sync_ist->file_index,
2780 ost->sync_ist->st->index);
2781 if (ost->stream_copy)
2782 av_log(NULL, AV_LOG_INFO, " (copy)");
2784 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2785 input_streams[ost->source_index].dec->name : "?",
2786 ost->enc ? ost->enc->name : "?");
2787 av_log(NULL, AV_LOG_INFO, "\n");
2791 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2796 print_sdp(output_files, nb_output_files);
2803 * The following code is the main loop of the file converter
2805 static int transcode(OutputFile *output_files, int nb_output_files,
2806 InputFile *input_files, int nb_input_files)
2809 AVFormatContext *is, *os;
2813 int no_packet_count = 0;
2814 int64_t timer_start;
2817 if (!(no_packet = av_mallocz(nb_input_files)))
2820 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2825 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
2828 timer_start = av_gettime();
2830 for (; received_sigterm == 0;) {
2831 int file_index, ist_index;
2835 int64_t cur_time= av_gettime();
2837 ipts_min = INT64_MAX;
2839 /* if 'q' pressed, exits */
2841 static int64_t last_time;
2842 if (received_nb_signals)
2844 /* read_key() returns 0 on EOF */
2845 if(cur_time - last_time >= 100000 && !run_as_daemon){
2847 last_time = cur_time;
2852 if (key == '+') av_log_set_level(av_log_get_level()+10);
2853 if (key == '-') av_log_set_level(av_log_get_level()-10);
2854 if (key == 's') qp_hist ^= 1;
2857 do_hex_dump = do_pkt_dump = 0;
2858 } else if(do_pkt_dump){
2862 av_log_set_level(AV_LOG_DEBUG);
2865 if (key == 'c' || key == 'C'){
2866 char buf[4096], target[64], command[256], arg[256] = {0};
2869 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2871 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
2876 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
2877 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
2878 target, time, command, arg);
2879 for (i = 0; i < nb_output_streams; i++) {
2880 ost = &output_streams[i];
2883 ret = avfilter_graph_send_command(ost->graph, target, command, arg, buf, sizeof(buf),
2884 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
2885 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
2887 ret = avfilter_graph_queue_command(ost->graph, target, command, arg, 0, time);
2892 av_log(NULL, AV_LOG_ERROR,
2893 "Parse error, at least 3 arguments were expected, "
2894 "only %d given in string '%s'\n", n, buf);
2898 if (key == 'd' || key == 'D'){
2901 debug = input_streams[0].st->codec->debug<<1;
2902 if(!debug) debug = 1;
2903 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2906 if(scanf("%d", &debug)!=1)
2907 fprintf(stderr,"error parsing debug value\n");
2908 for(i=0;i<nb_input_streams;i++) {
2909 input_streams[i].st->codec->debug = debug;
2911 for(i=0;i<nb_output_streams;i++) {
2912 ost = &output_streams[i];
2913 ost->st->codec->debug = debug;
2915 if(debug) av_log_set_level(AV_LOG_DEBUG);
2916 fprintf(stderr,"debug=%d\n", debug);
2919 fprintf(stderr, "key function\n"
2920 "? show this help\n"
2921 "+ increase verbosity\n"
2922 "- decrease verbosity\n"
2923 "c Send command to filtergraph\n"
2924 "D cycle through available debug modes\n"
2925 "h dump packets/hex press to cycle through the 3 states\n"
2927 "s Show QP histogram\n"
2932 /* select the stream that we must read now by looking at the
2933 smallest output pts */
2935 for (i = 0; i < nb_output_streams; i++) {
2939 ost = &output_streams[i];
2940 of = &output_files[ost->file_index];
2941 os = output_files[ost->file_index].ctx;
2942 ist = &input_streams[ost->source_index];
2943 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2944 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2946 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2948 if (!input_files[ist->file_index].eof_reached) {
2949 if (ipts < ipts_min) {
2952 file_index = ist->file_index;
2954 if (opts < opts_min) {
2956 if (!input_sync) file_index = ist->file_index;
2959 if (ost->frame_number >= ost->max_frames) {
2961 for (j = 0; j < of->ctx->nb_streams; j++)
2962 output_streams[of->ost_index + j].is_past_recording_time = 1;
2966 /* if none, if is finished */
2967 if (file_index < 0) {
2968 if (no_packet_count) {
2969 no_packet_count = 0;
2970 memset(no_packet, 0, nb_input_files);
2977 /* read a frame from it and output it in the fifo */
2978 is = input_files[file_index].ctx;
2979 ret = av_read_frame(is, &pkt);
2980 if (ret == AVERROR(EAGAIN)) {
2981 no_packet[file_index] = 1;
2986 input_files[file_index].eof_reached = 1;
2993 no_packet_count = 0;
2994 memset(no_packet, 0, nb_input_files);
2997 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2998 is->streams[pkt.stream_index]);
3000 /* the following test is needed in case new streams appear
3001 dynamically in stream : we ignore them */
3002 if (pkt.stream_index >= input_files[file_index].nb_streams)
3003 goto discard_packet;
3004 ist_index = input_files[file_index].ist_index + pkt.stream_index;
3005 ist = &input_streams[ist_index];
3007 goto discard_packet;
3009 if (pkt.dts != AV_NOPTS_VALUE)
3010 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3011 if (pkt.pts != AV_NOPTS_VALUE)
3012 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3014 if (pkt.pts != AV_NOPTS_VALUE)
3015 pkt.pts *= ist->ts_scale;
3016 if (pkt.dts != AV_NOPTS_VALUE)
3017 pkt.dts *= ist->ts_scale;
3019 //fprintf(stderr, "next:%"PRId64" dts:%"PRId64"/%"PRId64" off:%"PRId64" %d\n",
3021 // ist->dts, av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q), input_files[ist->file_index].ts_offset,
3022 // ist->st->codec->codec_type);
3023 if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE
3024 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
3025 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
3026 int64_t delta = pkt_dts - ist->next_dts;
3027 if((delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
3028 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
3029 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3030 pkt_dts+1<ist->pts)&& !copy_ts){
3031 input_files[ist->file_index].ts_offset -= delta;
3032 av_log(NULL, AV_LOG_DEBUG,
3033 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
3034 delta, input_files[ist->file_index].ts_offset);
3035 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3036 if (pkt.pts != AV_NOPTS_VALUE)
3037 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3041 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
3042 if (output_packet(ist, output_streams, nb_output_streams, &pkt) < 0) {
3044 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
3045 ist->file_index, ist->st->index);
3048 av_free_packet(&pkt);
3053 av_free_packet(&pkt);
3055 /* dump report by using the output first video and audio streams */
3056 print_report(output_files, output_streams, nb_output_streams, 0, timer_start, cur_time);
3059 /* at the end of stream, we must flush the decoder buffers */
3060 for (i = 0; i < nb_input_streams; i++) {
3061 ist = &input_streams[i];
3062 if (ist->decoding_needed) {
3063 output_packet(ist, output_streams, nb_output_streams, NULL);
3066 flush_encoders(output_streams, nb_output_streams);
3070 /* write the trailer if needed and close file */
3071 for (i = 0; i < nb_output_files; i++) {
3072 os = output_files[i].ctx;
3073 av_write_trailer(os);
3076 /* dump report by using the first video and audio streams */
3077 print_report(output_files, output_streams, nb_output_streams, 1, timer_start, av_gettime());
3079 /* close each encoder */
3080 for (i = 0; i < nb_output_streams; i++) {
3081 ost = &output_streams[i];
3082 if (ost->encoding_needed) {
3083 av_freep(&ost->st->codec->stats_in);
3084 avcodec_close(ost->st->codec);
3087 avfilter_graph_free(&ost->graph);
3091 /* close each decoder */
3092 for (i = 0; i < nb_input_streams; i++) {
3093 ist = &input_streams[i];
3094 if (ist->decoding_needed) {
3095 avcodec_close(ist->st->codec);
3103 av_freep(&no_packet);
3105 if (output_streams) {
3106 for (i = 0; i < nb_output_streams; i++) {
3107 ost = &output_streams[i];
3109 if (ost->stream_copy)
3110 av_freep(&ost->st->codec->extradata);
3112 fclose(ost->logfile);
3113 ost->logfile = NULL;
3115 av_fifo_free(ost->fifo); /* works even if fifo is not
3116 initialized but set to zero */
3117 av_freep(&ost->st->codec->subtitle_header);
3118 av_free(ost->resample_frame.data[0]);
3119 av_free(ost->forced_kf_pts);
3120 if (ost->video_resample)
3121 sws_freeContext(ost->img_resample_ctx);
3122 swr_free(&ost->swr);
3123 av_dict_free(&ost->opts);
3130 static int opt_frame_crop(const char *opt, const char *arg)
3132 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
3133 return AVERROR(EINVAL);
3136 static int opt_pad(const char *opt, const char *arg)
3138 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
3142 static int opt_video_channel(const char *opt, const char *arg)
3144 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
3145 return opt_default("channel", arg);
3148 static int opt_video_standard(const char *opt, const char *arg)
3150 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
3151 return opt_default("standard", arg);
3154 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
3156 audio_codec_name = arg;
3157 return parse_option(o, "codec:a", arg, options);
3160 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3162 video_codec_name = arg;
3163 return parse_option(o, "codec:v", arg, options);
3166 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3168 subtitle_codec_name = arg;
3169 return parse_option(o, "codec:s", arg, options);
3172 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3174 return parse_option(o, "codec:d", arg, options);
3177 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
3179 StreamMap *m = NULL;
3180 int i, negative = 0, file_idx;
3181 int sync_file_idx = -1, sync_stream_idx = 0;
3189 map = av_strdup(arg);
3191 /* parse sync stream first, just pick first matching stream */
3192 if (sync = strchr(map, ',')) {
3194 sync_file_idx = strtol(sync + 1, &sync, 0);
3195 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3196 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
3201 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
3202 if (check_stream_specifier(input_files[sync_file_idx].ctx,
3203 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
3204 sync_stream_idx = i;
3207 if (i == input_files[sync_file_idx].nb_streams) {
3208 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
3209 "match any streams.\n", arg);
3215 file_idx = strtol(map, &p, 0);
3216 if (file_idx >= nb_input_files || file_idx < 0) {
3217 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
3221 /* disable some already defined maps */
3222 for (i = 0; i < o->nb_stream_maps; i++) {
3223 m = &o->stream_maps[i];
3224 if (file_idx == m->file_index &&
3225 check_stream_specifier(input_files[m->file_index].ctx,
3226 input_files[m->file_index].ctx->streams[m->stream_index],
3227 *p == ':' ? p + 1 : p) > 0)
3231 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
3232 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
3233 *p == ':' ? p + 1 : p) <= 0)
3235 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3236 &o->nb_stream_maps, o->nb_stream_maps + 1);
3237 m = &o->stream_maps[o->nb_stream_maps - 1];
3239 m->file_index = file_idx;
3240 m->stream_index = i;
3242 if (sync_file_idx >= 0) {
3243 m->sync_file_index = sync_file_idx;
3244 m->sync_stream_index = sync_stream_idx;
3246 m->sync_file_index = file_idx;
3247 m->sync_stream_index = i;
3252 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3260 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3262 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3263 &o->nb_attachments, o->nb_attachments + 1);
3264 o->attachments[o->nb_attachments - 1] = arg;
3268 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
3274 o->audio_channel_maps =
3275 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
3276 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
3277 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
3279 /* muted channel syntax */
3280 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
3281 if ((n == 1 || n == 3) && m->channel_idx == -1) {
3282 m->file_idx = m->stream_idx = -1;
3284 m->ofile_idx = m->ostream_idx = -1;
3289 n = sscanf(arg, "%d.%d.%d:%d.%d",
3290 &m->file_idx, &m->stream_idx, &m->channel_idx,
3291 &m->ofile_idx, &m->ostream_idx);
3293 if (n != 3 && n != 5) {
3294 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
3295 "[file.stream.channel|-1][:syncfile:syncstream]\n");
3299 if (n != 5) // only file.stream.channel specified
3300 m->ofile_idx = m->ostream_idx = -1;
3303 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
3304 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
3308 if (m->stream_idx < 0 ||
3309 m->stream_idx >= input_files[m->file_idx].nb_streams) {
3310 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
3311 m->file_idx, m->stream_idx);
3314 st = input_files[m->file_idx].ctx->streams[m->stream_idx];
3315 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
3316 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
3317 m->file_idx, m->stream_idx);
3320 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
3321 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
3322 m->file_idx, m->stream_idx, m->channel_idx);
3329 * Parse a metadata specifier in arg.
3330 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
3331 * @param index for type c/p, chapter/program index is written here
3332 * @param stream_spec for type s, the stream specifier is written here
3334 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
3342 if (*(++arg) && *arg != ':') {
3343 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
3346 *stream_spec = *arg == ':' ? arg + 1 : "";
3350 if (*(++arg) == ':')
3351 *index = strtol(++arg, NULL, 0);
3354 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
3361 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
3363 AVDictionary **meta_in = NULL;
3364 AVDictionary **meta_out = NULL;
3366 char type_in, type_out;
3367 const char *istream_spec = NULL, *ostream_spec = NULL;
3368 int idx_in = 0, idx_out = 0;
3370 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
3371 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
3373 if (type_in == 'g' || type_out == 'g')
3374 o->metadata_global_manual = 1;
3375 if (type_in == 's' || type_out == 's')
3376 o->metadata_streams_manual = 1;
3377 if (type_in == 'c' || type_out == 'c')
3378 o->metadata_chapters_manual = 1;
3380 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3381 if ((index) < 0 || (index) >= (nb_elems)) {\
3382 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
3387 #define SET_DICT(type, meta, context, index)\
3390 meta = &context->metadata;\
3393 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
3394 meta = &context->chapters[index]->metadata;\
3397 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
3398 meta = &context->programs[index]->metadata;\
3402 SET_DICT(type_in, meta_in, ic, idx_in);
3403 SET_DICT(type_out, meta_out, oc, idx_out);
3405 /* for input streams choose first matching stream */
3406 if (type_in == 's') {
3407 for (i = 0; i < ic->nb_streams; i++) {
3408 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
3409 meta_in = &ic->streams[i]->metadata;
3415 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
3420 if (type_out == 's') {
3421 for (i = 0; i < oc->nb_streams; i++) {
3422 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
3423 meta_out = &oc->streams[i]->metadata;
3424 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3429 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3434 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
3437 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
3438 struct tm time = *gmtime((time_t*)&recording_timestamp);
3439 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
3440 parse_option(o, "metadata", buf, options);
3442 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
3443 "tag instead.\n", opt);
3447 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
3449 const char *codec_string = encoder ? "encoder" : "decoder";
3453 avcodec_find_encoder_by_name(name) :
3454 avcodec_find_decoder_by_name(name);
3456 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
3459 if (codec->type != type) {
3460 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
3466 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
3468 char *codec_name = NULL;
3470 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
3472 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
3473 st->codec->codec_id = codec->id;
3476 return avcodec_find_decoder(st->codec->codec_id);
3480 * Add all the streams from the given input file to the global
3481 * list of input streams.
3483 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
3486 char *next, *codec_tag = NULL;
3488 for (i = 0; i < ic->nb_streams; i++) {
3489 AVStream *st = ic->streams[i];
3490 AVCodecContext *dec = st->codec;
3493 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3494 ist = &input_streams[nb_input_streams - 1];
3496 ist->file_index = nb_input_files;
3498 ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), ic, st);
3500 ist->ts_scale = 1.0;
3501 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
3503 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
3505 uint32_t tag = strtol(codec_tag, &next, 0);
3507 tag = AV_RL32(codec_tag);
3508 st->codec->codec_tag = tag;
3511 ist->dec = choose_decoder(o, ic, st);
3513 switch (dec->codec_type) {
3514 case AVMEDIA_TYPE_AUDIO:
3516 ist->dec = avcodec_find_decoder(dec->codec_id);
3517 if (o->audio_disable)
3518 st->discard = AVDISCARD_ALL;
3520 case AVMEDIA_TYPE_VIDEO:
3522 ist->dec = avcodec_find_decoder(dec->codec_id);
3524 dec->flags |= CODEC_FLAG_EMU_EDGE;
3527 if (o->video_disable)
3528 st->discard = AVDISCARD_ALL;
3529 else if (video_discard)
3530 st->discard = video_discard;
3532 case AVMEDIA_TYPE_DATA:
3533 if (o->data_disable)
3534 st->discard= AVDISCARD_ALL;
3536 case AVMEDIA_TYPE_SUBTITLE:
3538 ist->dec = avcodec_find_decoder(dec->codec_id);
3539 if(o->subtitle_disable)
3540 st->discard = AVDISCARD_ALL;
3542 case AVMEDIA_TYPE_ATTACHMENT:
3543 case AVMEDIA_TYPE_UNKNOWN:
3551 static void assert_file_overwrite(const char *filename)
3553 if ((!file_overwrite || no_file_overwrite) &&
3554 (strchr(filename, ':') == NULL || filename[1] == ':' ||
3555 av_strstart(filename, "file:", NULL))) {
3556 if (avio_check(filename, 0) == 0) {
3557 if (!using_stdin && (!no_file_overwrite || file_overwrite)) {
3558 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3561 signal(SIGINT, SIG_DFL);
3562 if (!read_yesno()) {
3563 av_log(0, AV_LOG_FATAL, "Not overwriting - exiting\n");
3569 av_log(0, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
3576 static void dump_attachment(AVStream *st, const char *filename)
3579 AVIOContext *out = NULL;
3580 AVDictionaryEntry *e;
3582 if (!st->codec->extradata_size) {
3583 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
3584 nb_input_files - 1, st->index);
3587 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
3588 filename = e->value;
3590 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
3591 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
3595 assert_file_overwrite(filename);
3597 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
3598 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
3603 avio_write(out, st->codec->extradata, st->codec->extradata_size);
3608 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
3610 AVFormatContext *ic;
3611 AVInputFormat *file_iformat = NULL;
3615 AVDictionary **opts;
3616 int orig_nb_streams; // number of streams before avformat_find_stream_info
3619 if (!(file_iformat = av_find_input_format(o->format))) {
3620 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
3625 if (!strcmp(filename, "-"))
3628 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3629 !strcmp(filename, "/dev/stdin");
3631 /* get default parameters from command line */
3632 ic = avformat_alloc_context();
3634 print_error(filename, AVERROR(ENOMEM));
3637 if (o->nb_audio_sample_rate) {
3638 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
3639 av_dict_set(&format_opts, "sample_rate", buf, 0);
3641 if (o->nb_audio_channels) {
3642 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
3643 av_dict_set(&format_opts, "channels", buf, 0);
3645 if (o->nb_frame_rates) {
3646 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
3648 if (o->nb_frame_sizes) {
3649 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
3651 if (o->nb_frame_pix_fmts)
3652 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
3654 ic->video_codec_id = video_codec_name ?
3655 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
3656 ic->audio_codec_id = audio_codec_name ?
3657 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
3658 ic->subtitle_codec_id= subtitle_codec_name ?
3659 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
3660 ic->flags |= AVFMT_FLAG_NONBLOCK;
3661 ic->interrupt_callback = int_cb;
3663 /* open the input file with generic avformat function */
3664 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3666 print_error(filename, err);
3669 assert_avoptions(format_opts);
3671 /* apply forced codec ids */
3672 for (i = 0; i < ic->nb_streams; i++)
3673 choose_decoder(o, ic, ic->streams[i]);
3675 /* Set AVCodecContext options for avformat_find_stream_info */
3676 opts = setup_find_stream_info_opts(ic, codec_opts);
3677 orig_nb_streams = ic->nb_streams;
3679 /* If not enough info to get the stream parameters, we decode the
3680 first frames to get it. (used in mpeg case for example) */
3681 ret = avformat_find_stream_info(ic, opts);
3683 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
3684 avformat_close_input(&ic);
3688 timestamp = o->start_time;
3689 /* add the stream start time */
3690 if (ic->start_time != AV_NOPTS_VALUE)
3691 timestamp += ic->start_time;
3693 /* if seeking requested, we execute it */
3694 if (o->start_time != 0) {
3695 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3697 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
3698 filename, (double)timestamp / AV_TIME_BASE);
3702 /* update the current parameters so that they match the one of the input stream */
3703 add_input_streams(o, ic);
3705 /* dump the file content */
3706 av_dump_format(ic, nb_input_files, filename, 0);
3708 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3709 input_files[nb_input_files - 1].ctx = ic;
3710 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3711 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3712 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3713 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
3715 for (i = 0; i < o->nb_dump_attachment; i++) {
3718 for (j = 0; j < ic->nb_streams; j++) {
3719 AVStream *st = ic->streams[j];
3721 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
3722 dump_attachment(st, o->dump_attachment[i].u.str);
3726 for (i = 0; i < orig_nb_streams; i++)
3727 av_dict_free(&opts[i]);
3730 reset_options(o, 1);
3734 static void parse_forced_key_frames(char *kf, OutputStream *ost)
3739 for (p = kf; *p; p++)
3742 ost->forced_kf_count = n;
3743 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3744 if (!ost->forced_kf_pts) {
3745 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3748 for (i = 0; i < n; i++) {
3749 p = i ? strchr(p, ',') + 1 : kf;
3750 ost->forced_kf_pts[i] = parse_time_or_die("force_key_frames", p, 1);
3754 static uint8_t *get_line(AVIOContext *s)
3760 if (avio_open_dyn_buf(&line) < 0) {
3761 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
3765 while ((c = avio_r8(s)) && c != '\n')
3768 avio_close_dyn_buf(line, &buf);
3773 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
3776 char filename[1000];
3777 const char *base[3] = { getenv("AVCONV_DATADIR"),
3782 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
3786 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
3787 i != 1 ? "" : "/.avconv", codec_name, preset_name);
3788 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3791 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
3792 i != 1 ? "" : "/.avconv", preset_name);
3793 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3799 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
3801 char *codec_name = NULL;
3803 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
3805 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
3806 NULL, ost->st->codec->codec_type);
3807 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
3808 } else if (!strcmp(codec_name, "copy"))
3809 ost->stream_copy = 1;
3811 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
3812 ost->st->codec->codec_id = ost->enc->id;
3816 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3819 AVStream *st = avformat_new_stream(oc, NULL);
3820 int idx = oc->nb_streams - 1, ret = 0;
3821 char *bsf = NULL, *next, *codec_tag = NULL;
3822 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3824 char *buf = NULL, *arg = NULL, *preset = NULL;
3825 AVIOContext *s = NULL;
3828 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3832 if (oc->nb_streams - 1 < o->nb_streamid_map)
3833 st->id = o->streamid_map[oc->nb_streams - 1];
3835 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3836 nb_output_streams + 1);
3837 ost = &output_streams[nb_output_streams - 1];
3838 ost->file_index = nb_output_files;
3841 st->codec->codec_type = type;
3842 choose_encoder(o, oc, ost);
3844 ost->opts = filter_codec_opts(codec_opts, ost->enc, oc, st);
3847 avcodec_get_context_defaults3(st->codec, ost->enc);
3848 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3850 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
3851 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
3854 if (!buf[0] || buf[0] == '#') {
3858 if (!(arg = strchr(buf, '='))) {
3859 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
3863 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
3865 } while (!s->eof_reached);
3869 av_log(NULL, AV_LOG_FATAL,
3870 "Preset %s specified for stream %d:%d, but could not be opened.\n",
3871 preset, ost->file_index, ost->index);
3875 ost->max_frames = INT64_MAX;
3876 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
3878 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3880 if (next = strchr(bsf, ','))
3882 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3883 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3887 bsfc_prev->next = bsfc;
3889 ost->bitstream_filters = bsfc;
3895 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3897 uint32_t tag = strtol(codec_tag, &next, 0);
3899 tag = AV_RL32(codec_tag);
3900 st->codec->codec_tag = tag;
3903 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3904 if (qscale >= 0 || same_quant) {
3905 st->codec->flags |= CODEC_FLAG_QSCALE;
3906 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3909 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
3910 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3912 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3916 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3919 const char *p = str;
3926 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3933 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3937 AVCodecContext *video_enc;
3939 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3941 video_enc = st->codec;
3943 if (!ost->stream_copy) {
3944 const char *p = NULL;
3945 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3946 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3947 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3950 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3951 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3952 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3956 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3957 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3958 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3962 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3963 if (frame_aspect_ratio) {
3965 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
3966 q.num <= 0 || q.den <= 0) {
3967 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
3970 ost->frame_aspect_ratio = av_q2d(q);
3973 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3974 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3975 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3976 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3979 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3982 video_enc->gop_size = 0;
3983 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3985 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3986 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
3989 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3991 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3993 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3994 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
3997 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
4000 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
4001 for (i = 0; p; i++) {
4003 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
4005 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
4008 /* FIXME realloc failure */
4009 video_enc->rc_override =
4010 av_realloc(video_enc->rc_override,
4011 sizeof(RcOverride) * (i + 1));
4012 video_enc->rc_override[i].start_frame = start;
4013 video_enc->rc_override[i].end_frame = end;
4015 video_enc->rc_override[i].qscale = q;
4016 video_enc->rc_override[i].quality_factor = 1.0;
4019 video_enc->rc_override[i].qscale = 0;
4020 video_enc->rc_override[i].quality_factor = -q/100.0;
4025 video_enc->rc_override_count = i;
4026 if (!video_enc->rc_initial_buffer_occupancy)
4027 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
4028 video_enc->intra_dc_precision = intra_dc_precision - 8;
4031 video_enc->flags|= CODEC_FLAG_PSNR;
4036 video_enc->flags |= CODEC_FLAG_PASS1;
4039 video_enc->flags |= CODEC_FLAG_PASS2;
4043 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
4044 if (forced_key_frames)
4045 parse_forced_key_frames(forced_key_frames, ost);
4047 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
4049 ost->top_field_first = -1;
4050 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
4053 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4055 ost->avfilter = av_strdup(filters);
4058 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
4064 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
4069 AVCodecContext *audio_enc;
4071 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
4074 audio_enc = st->codec;
4075 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
4077 if (!ost->stream_copy) {
4078 char *sample_fmt = NULL;
4080 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
4082 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
4084 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
4085 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
4089 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
4091 ost->rematrix_volume=1.0;
4092 MATCH_PER_STREAM_OPT(rematrix_volume, f, ost->rematrix_volume, oc, st);
4095 /* check for channel mapping for this audio stream */
4096 for (n = 0; n < o->nb_audio_channel_maps; n++) {
4097 AudioChannelMap *map = &o->audio_channel_maps[n];
4098 InputStream *ist = &input_streams[ost->source_index];
4099 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
4100 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
4101 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
4102 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
4103 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
4105 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
4106 ost->file_index, ost->st->index);
4113 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
4117 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
4118 if (!ost->stream_copy) {
4119 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
4126 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
4128 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
4129 ost->stream_copy = 1;
4133 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
4137 AVCodecContext *subtitle_enc;
4139 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
4141 subtitle_enc = st->codec;
4143 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
4148 /* arg format is "output-stream-index:streamid-value". */
4149 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
4155 av_strlcpy(idx_str, arg, sizeof(idx_str));
4156 p = strchr(idx_str, ':');
4158 av_log(NULL, AV_LOG_FATAL,
4159 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
4164 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
4165 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
4166 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
4170 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
4172 AVFormatContext *is = ifile->ctx;
4173 AVFormatContext *os = ofile->ctx;
4176 for (i = 0; i < is->nb_chapters; i++) {
4177 AVChapter *in_ch = is->chapters[i], *out_ch;
4178 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
4179 AV_TIME_BASE_Q, in_ch->time_base);
4180 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
4181 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
4184 if (in_ch->end < ts_off)
4186 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
4189 out_ch = av_mallocz(sizeof(AVChapter));
4191 return AVERROR(ENOMEM);
4193 out_ch->id = in_ch->id;
4194 out_ch->time_base = in_ch->time_base;
4195 out_ch->start = FFMAX(0, in_ch->start - ts_off);
4196 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
4199 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
4202 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
4204 return AVERROR(ENOMEM);
4205 os->chapters[os->nb_chapters - 1] = out_ch;
4210 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
4213 AVFormatContext *ic = avformat_alloc_context();
4215 ic->interrupt_callback = int_cb;
4216 err = avformat_open_input(&ic, filename, NULL, NULL);
4219 /* copy stream format */
4220 for(i=0;i<ic->nb_streams;i++) {
4224 AVCodecContext *avctx;
4226 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
4227 ost = new_output_stream(o, s, codec->type);
4232 // FIXME: a more elegant solution is needed
4233 memcpy(st, ic->streams[i], sizeof(AVStream));
4234 st->info = av_malloc(sizeof(*st->info));
4235 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
4237 avcodec_copy_context(st->codec, ic->streams[i]->codec);
4239 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
4240 choose_sample_fmt(st, codec);
4241 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
4242 choose_pixel_fmt(st, codec);
4245 avformat_close_input(&ic);
4249 static void opt_output_file(void *optctx, const char *filename)
4251 OptionsContext *o = optctx;
4252 AVFormatContext *oc;
4254 AVOutputFormat *file_oformat;
4258 if (!strcmp(filename, "-"))
4261 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
4263 print_error(filename, err);
4266 file_oformat= oc->oformat;
4267 oc->interrupt_callback = int_cb;
4269 if (!strcmp(file_oformat->name, "ffm") &&
4270 av_strstart(filename, "http:", NULL)) {
4272 /* special case for files sent to ffserver: we get the stream
4273 parameters from ffserver */
4274 int err = read_ffserver_streams(o, oc, filename);
4276 print_error(filename, err);
4279 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
4280 ost = &output_streams[j];
4281 for (i = 0; i < nb_input_streams; i++) {
4282 ist = &input_streams[i];
4283 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
4285 ost->source_index= i;
4291 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));
4295 } else if (!o->nb_stream_maps) {
4296 /* pick the "best" stream of each type */
4297 #define NEW_STREAM(type, index)\
4299 ost = new_ ## type ## _stream(o, oc);\
4300 ost->source_index = index;\
4301 ost->sync_ist = &input_streams[index];\
4302 input_streams[index].discard = 0;\
4305 /* video: highest resolution */
4306 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
4307 int area = 0, idx = -1;
4308 for (i = 0; i < nb_input_streams; i++) {
4309 ist = &input_streams[i];
4310 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
4311 ist->st->codec->width * ist->st->codec->height > area) {
4312 area = ist->st->codec->width * ist->st->codec->height;
4316 NEW_STREAM(video, idx);
4319 /* audio: most channels */
4320 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
4321 int channels = 0, idx = -1;
4322 for (i = 0; i < nb_input_streams; i++) {
4323 ist = &input_streams[i];
4324 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
4325 ist->st->codec->channels > channels) {
4326 channels = ist->st->codec->channels;
4330 NEW_STREAM(audio, idx);
4333 /* subtitles: pick first */
4334 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
4335 for (i = 0; i < nb_input_streams; i++)
4336 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
4337 NEW_STREAM(subtitle, i);
4341 /* do something with data? */
4343 for (i = 0; i < o->nb_stream_maps; i++) {
4344 StreamMap *map = &o->stream_maps[i];
4349 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
4350 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
4352 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
4354 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
4356 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
4359 switch (ist->st->codec->codec_type) {
4360 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
4361 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
4362 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
4363 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
4364 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
4366 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
4367 map->file_index, map->stream_index);
4371 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
4372 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
4373 map->sync_stream_index];
4378 /* handle attached files */
4379 for (i = 0; i < o->nb_attachments; i++) {
4381 uint8_t *attachment;
4385 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
4386 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
4390 if ((len = avio_size(pb)) <= 0) {
4391 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
4395 if (!(attachment = av_malloc(len))) {
4396 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
4400 avio_read(pb, attachment, len);
4402 ost = new_attachment_stream(o, oc);
4403 ost->stream_copy = 0;
4404 ost->source_index = -1;
4405 ost->attachment_filename = o->attachments[i];
4406 ost->st->codec->extradata = attachment;
4407 ost->st->codec->extradata_size = len;
4409 p = strrchr(o->attachments[i], '/');
4410 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
4414 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
4415 output_files[nb_output_files - 1].ctx = oc;
4416 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
4417 output_files[nb_output_files - 1].recording_time = o->recording_time;
4418 output_files[nb_output_files - 1].start_time = o->start_time;
4419 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
4420 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
4422 /* check filename in case of an image number is expected */
4423 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
4424 if (!av_filename_number_test(oc->filename)) {
4425 print_error(oc->filename, AVERROR(EINVAL));
4430 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
4431 /* test if it already exists to avoid losing precious files */
4432 assert_file_overwrite(filename);
4435 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
4436 &oc->interrupt_callback,
4437 &output_files[nb_output_files - 1].opts)) < 0) {
4438 print_error(filename, err);
4443 if (o->mux_preload) {
4445 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
4446 av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
4448 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
4451 for (i = 0; i < o->nb_metadata_map; i++) {
4453 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
4455 if (in_file_index < 0)
4457 if (in_file_index >= nb_input_files) {
4458 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
4461 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, input_files[in_file_index].ctx, o);
4465 if (o->chapters_input_file >= nb_input_files) {
4466 if (o->chapters_input_file == INT_MAX) {
4467 /* copy chapters from the first input file that has them*/
4468 o->chapters_input_file = -1;
4469 for (i = 0; i < nb_input_files; i++)
4470 if (input_files[i].ctx->nb_chapters) {
4471 o->chapters_input_file = i;
4475 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
4476 o->chapters_input_file);
4480 if (o->chapters_input_file >= 0)
4481 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
4482 !o->metadata_chapters_manual);
4484 /* copy global metadata by default */
4485 if (!o->metadata_global_manual && nb_input_files){
4486 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
4487 AV_DICT_DONT_OVERWRITE);
4488 if(o->recording_time != INT64_MAX)
4489 av_dict_set(&oc->metadata, "duration", NULL, 0);
4491 if (!o->metadata_streams_manual)
4492 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
4494 if (output_streams[i].source_index < 0) /* this is true e.g. for attached files */
4496 ist = &input_streams[output_streams[i].source_index];
4497 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
4500 /* process manually set metadata */
4501 for (i = 0; i < o->nb_metadata; i++) {
4504 const char *stream_spec;
4505 int index = 0, j, ret = 0;
4507 val = strchr(o->metadata[i].u.str, '=');
4509 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
4510 o->metadata[i].u.str);
4515 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
4517 for (j = 0; j < oc->nb_streams; j++) {
4518 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
4519 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
4523 printf("ret %d, stream_spec %s\n", ret, stream_spec);
4531 if (index < 0 || index >= oc->nb_chapters) {
4532 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
4535 m = &oc->chapters[index]->metadata;
4538 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
4541 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
4545 reset_options(o, 0);
4548 /* same option as mencoder */
4549 static int opt_pass(const char *opt, const char *arg)
4551 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
4555 static int64_t getutime(void)
4558 struct rusage rusage;
4560 getrusage(RUSAGE_SELF, &rusage);
4561 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4562 #elif HAVE_GETPROCESSTIMES
4564 FILETIME c, e, k, u;
4565 proc = GetCurrentProcess();
4566 GetProcessTimes(proc, &c, &e, &k, &u);
4567 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4569 return av_gettime();
4573 static int64_t getmaxrss(void)
4575 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4576 struct rusage rusage;
4577 getrusage(RUSAGE_SELF, &rusage);
4578 return (int64_t)rusage.ru_maxrss * 1024;
4579 #elif HAVE_GETPROCESSMEMORYINFO
4581 PROCESS_MEMORY_COUNTERS memcounters;
4582 proc = GetCurrentProcess();
4583 memcounters.cb = sizeof(memcounters);
4584 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4585 return memcounters.PeakPagefileUsage;
4591 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
4593 return parse_option(o, "q:a", arg, options);
4596 static void show_usage(void)
4598 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
4599 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
4600 av_log(NULL, AV_LOG_INFO, "\n");
4603 static int opt_help(const char *opt, const char *arg)
4605 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
4606 av_log_set_callback(log_callback_help);
4608 show_help_options(options, "Main options:\n",
4609 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4610 show_help_options(options, "\nAdvanced options:\n",
4611 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4613 show_help_options(options, "\nVideo options:\n",
4614 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4616 show_help_options(options, "\nAdvanced Video options:\n",
4617 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4618 OPT_VIDEO | OPT_EXPERT);
4619 show_help_options(options, "\nAudio options:\n",
4620 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4622 show_help_options(options, "\nAdvanced Audio options:\n",
4623 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4624 OPT_AUDIO | OPT_EXPERT);
4625 show_help_options(options, "\nSubtitle options:\n",
4626 OPT_SUBTITLE | OPT_GRAB,
4628 show_help_options(options, "\nAudio/Video grab options:\n",
4632 show_help_children(avcodec_get_class(), flags);
4633 show_help_children(avformat_get_class(), flags);
4634 show_help_children(sws_get_class(), flags);
4639 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
4641 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4642 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
4644 if (!strncmp(arg, "pal-", 4)) {
4647 } else if (!strncmp(arg, "ntsc-", 5)) {
4650 } else if (!strncmp(arg, "film-", 5)) {
4654 /* Try to determine PAL/NTSC by peeking in the input files */
4655 if (nb_input_files) {
4657 for (j = 0; j < nb_input_files; j++) {
4658 for (i = 0; i < input_files[j].nb_streams; i++) {
4659 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4660 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
4662 fr = c->time_base.den * 1000 / c->time_base.num;
4666 } else if ((fr == 29970) || (fr == 23976)) {
4671 if (norm != UNKNOWN)
4675 if (norm != UNKNOWN)
4676 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4679 if (norm == UNKNOWN) {
4680 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4681 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4682 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
4686 if (!strcmp(arg, "vcd")) {
4687 opt_video_codec(o, "c:v", "mpeg1video");
4688 opt_audio_codec(o, "c:a", "mp2");
4689 parse_option(o, "f", "vcd", options);
4691 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
4692 parse_option(o, "r", frame_rates[norm], options);
4693 opt_default("g", norm == PAL ? "15" : "18");
4695 opt_default("b:v", "1150000");
4696 opt_default("maxrate", "1150000");
4697 opt_default("minrate", "1150000");
4698 opt_default("bufsize", "327680"); // 40*1024*8;
4700 opt_default("b:a", "224000");
4701 parse_option(o, "ar", "44100", options);
4702 parse_option(o, "ac", "2", options);
4704 opt_default("packetsize", "2324");
4705 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4707 /* We have to offset the PTS, so that it is consistent with the SCR.
4708 SCR starts at 36000, but the first two packs contain only padding
4709 and the first pack from the other stream, respectively, may also have
4710 been written before.
4711 So the real data starts at SCR 36000+3*1200. */
4712 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
4713 } else if (!strcmp(arg, "svcd")) {
4715 opt_video_codec(o, "c:v", "mpeg2video");
4716 opt_audio_codec(o, "c:a", "mp2");
4717 parse_option(o, "f", "svcd", options);
4719 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
4720 parse_option(o, "r", frame_rates[norm], options);
4721 parse_option(o, "pix_fmt", "yuv420p", options);
4722 opt_default("g", norm == PAL ? "15" : "18");
4724 opt_default("b:v", "2040000");
4725 opt_default("maxrate", "2516000");
4726 opt_default("minrate", "0"); // 1145000;
4727 opt_default("bufsize", "1835008"); // 224*1024*8;
4728 opt_default("flags", "+scan_offset");
4731 opt_default("b:a", "224000");
4732 parse_option(o, "ar", "44100", options);
4734 opt_default("packetsize", "2324");
4736 } else if (!strcmp(arg, "dvd")) {
4738 opt_video_codec(o, "c:v", "mpeg2video");
4739 opt_audio_codec(o, "c:a", "ac3");
4740 parse_option(o, "f", "dvd", options);
4742 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4743 parse_option(o, "r", frame_rates[norm], options);
4744 parse_option(o, "pix_fmt", "yuv420p", options);
4745 opt_default("g", norm == PAL ? "15" : "18");
4747 opt_default("b:v", "6000000");
4748 opt_default("maxrate", "9000000");
4749 opt_default("minrate", "0"); // 1500000;
4750 opt_default("bufsize", "1835008"); // 224*1024*8;
4752 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4753 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4755 opt_default("b:a", "448000");
4756 parse_option(o, "ar", "48000", options);
4758 } else if (!strncmp(arg, "dv", 2)) {
4760 parse_option(o, "f", "dv", options);
4762 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4763 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4764 norm == PAL ? "yuv420p" : "yuv411p", options);
4765 parse_option(o, "r", frame_rates[norm], options);
4767 parse_option(o, "ar", "48000", options);
4768 parse_option(o, "ac", "2", options);
4771 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
4772 return AVERROR(EINVAL);
4777 static int opt_vstats_file(const char *opt, const char *arg)
4779 av_free (vstats_filename);
4780 vstats_filename = av_strdup (arg);
4784 static int opt_vstats(const char *opt, const char *arg)
4787 time_t today2 = time(NULL);
4788 struct tm *today = localtime(&today2);
4790 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4792 return opt_vstats_file(opt, filename);
4795 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4797 return parse_option(o, "frames:v", arg, options);
4800 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4802 return parse_option(o, "frames:a", arg, options);
4805 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4807 return parse_option(o, "frames:d", arg, options);
4810 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
4813 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4814 const char *codec_name = *opt == 'v' ? video_codec_name :
4815 *opt == 'a' ? audio_codec_name :
4816 subtitle_codec_name;
4818 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4819 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
4820 av_log(0, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
4822 av_log(0, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
4827 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4828 if(line[0] == '#' && !e)
4830 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4832 av_log(0, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
4835 if(!strcmp(tmp, "acodec")){
4836 opt_audio_codec(o, tmp, tmp2);
4837 }else if(!strcmp(tmp, "vcodec")){
4838 opt_video_codec(o, tmp, tmp2);
4839 }else if(!strcmp(tmp, "scodec")){
4840 opt_subtitle_codec(o, tmp, tmp2);
4841 }else if(!strcmp(tmp, "dcodec")){
4842 opt_data_codec(o, tmp, tmp2);
4843 }else if(opt_default(tmp, tmp2) < 0){
4844 av_log(0, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4854 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
4858 static int opt_passlogfile(const char *opt, const char *arg)
4860 pass_logfilename_prefix = arg;
4861 #if CONFIG_LIBX264_ENCODER
4862 return opt_default("passlogfile", arg);
4868 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
4870 char *s = av_asprintf("%s:%c", opt + 1, *opt);
4871 int ret = parse_option(o, s, arg, options);
4876 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
4878 if(!strcmp(opt, "b")){
4879 av_log(0,AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
4880 return parse_option(o, "b:v", arg, options);
4882 return opt_default(opt, arg);
4885 static int opt_qscale(OptionsContext *o, const char *opt, const char *arg)
4889 if(!strcmp(opt, "qscale")){
4890 av_log(0,AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
4891 return parse_option(o, "q:v", arg, options);
4893 s = av_asprintf("q%s", opt + 6);
4894 ret = parse_option(o, s, arg, options);
4899 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4901 return parse_option(o, "filter:v", arg, options);
4904 static int opt_vsync(const char *opt, const char *arg)
4906 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
4907 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
4908 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
4909 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
4911 if (video_sync_method == VSYNC_AUTO)
4912 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
4916 static int opt_deinterlace(const char *opt, const char *arg)
4918 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
4923 #define OFFSET(x) offsetof(OptionsContext, x)
4924 static const OptionDef options[] = {
4926 #include "cmdutils_common_opts.h"
4927 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4928 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4929 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4930 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
4931 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4932 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4933 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
4934 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
4935 { "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]" },
4936 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
4937 "outfile[,metadata]:infile[,metadata]" },
4938 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4939 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4940 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4941 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4942 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4943 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4944 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4945 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4946 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4947 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4948 "add timings for benchmarking" },
4949 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4950 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4951 "dump each input packet" },
4952 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4953 "when dumping packets, also dump the payload" },
4954 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4955 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4956 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
4957 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4958 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4959 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4960 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying", "source" },
4961 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4962 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4963 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4964 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
4965 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4966 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4967 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4968 { "qscale", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_qscale}, "use fixed quality scale (VBR)", "q" },
4970 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4972 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
4973 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
4974 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
4977 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4978 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4979 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4980 { "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" },
4981 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4982 { "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" },
4983 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4984 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4985 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4986 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4987 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4988 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4989 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4990 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4991 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4992 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4993 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4994 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4995 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4996 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4997 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4998 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4999 "use same quantizer as source (implies VBR)" },
5000 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
5001 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
5002 { "deinterlace", OPT_EXPERT | OPT_VIDEO, {(void*)opt_deinterlace},
5003 "this option is deprecated, use the yadif filter instead" },
5004 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
5005 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
5006 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
5008 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
5010 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
5011 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
5012 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
5013 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
5014 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
5015 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
5016 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
5017 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
5018 { "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" },
5019 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
5022 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
5023 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
5024 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
5025 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
5026 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
5027 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
5028 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
5029 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
5030 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
5031 { "rmvol", HAS_ARG | OPT_AUDIO | OPT_FLOAT | OPT_SPEC, {.off = OFFSET(rematrix_volume)}, "rematrix volume (as factor)", "volume" },
5033 /* subtitle options */
5034 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
5035 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
5036 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
5039 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
5040 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
5041 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
5044 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
5045 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
5047 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
5048 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
5049 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
5051 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
5052 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
5053 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
5054 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
5055 /* data codec support */
5056 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
5057 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
5059 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
5063 int main(int argc, char **argv)
5065 OptionsContext o = { 0 };
5068 reset_options(&o, 0);
5070 av_log_set_flags(AV_LOG_SKIP_REPEATED);
5071 parse_loglevel(argc, argv, options);
5073 if(argc>1 && !strcmp(argv[1], "-d")){
5075 av_log_set_callback(log_callback_null);
5080 avcodec_register_all();
5082 avdevice_register_all();
5085 avfilter_register_all();
5088 avformat_network_init();
5090 show_banner(argc, argv, options);
5095 parse_options(&o, argc, argv, options, opt_output_file);
5097 if (nb_output_files <= 0 && nb_input_files == 0) {
5099 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
5103 /* file converter / grab */
5104 if (nb_output_files <= 0) {
5105 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
5109 if (nb_input_files == 0) {
5110 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
5115 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
5117 ti = getutime() - ti;
5119 int maxrss = getmaxrss() / 1024;
5120 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);