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 int64_t next_pts; /* synthetic pts for cases where pkt.pts
209 int64_t pts; /* current pts */
211 int is_start; /* is 1 at the start and after a discontinuity */
212 int showed_multi_packet_warning;
215 /* a pool of free buffers for decoded data */
216 FrameBuffer *buffer_pool;
220 typedef struct InputFile {
221 AVFormatContext *ctx;
222 int eof_reached; /* true if eof reached */
223 int ist_index; /* index of first stream in input_streams */
224 int buffer_size; /* current total buffer size */
226 int nb_streams; /* number of stream that ffmpeg is aware of; may be different
227 from ctx.nb_streams if new streams appear during av_read_frame() */
231 typedef struct OutputStream {
232 int file_index; /* file index */
233 int index; /* stream index in the output file */
234 int source_index; /* InputStream index */
235 AVStream *st; /* stream in the output file */
236 int encoding_needed; /* true if encoding needed for this stream */
238 /* input pts and corresponding output pts
240 struct InputStream *sync_ist; /* input stream to sync against */
241 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
242 AVBitStreamFilterContext *bitstream_filters;
245 AVFrame *output_frame;
249 AVFrame resample_frame; /* temporary frame for image resampling */
250 struct SwsContext *img_resample_ctx; /* for image resampling */
253 int resample_pix_fmt;
254 AVRational frame_rate;
258 float frame_aspect_ratio;
260 /* forced key frames */
261 int64_t *forced_kf_pts;
267 int audio_channels_map[SWR_CH_MAX]; ///< list of the channels id to pick from the source stream
268 int audio_channels_mapped; ///< number of channels in audio_channels_map
269 int resample_sample_fmt;
270 int resample_channels;
271 int resample_sample_rate;
272 float rematrix_volume;
273 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
276 struct SwrContext *swr;
279 AVFilterContext *output_video_filter;
280 AVFilterContext *input_video_filter;
281 AVFilterBufferRef *picref;
283 AVFilterGraph *graph;
288 int is_past_recording_time;
290 const char *attachment_filename;
291 int copy_initial_nonkeyframes;
297 /* init terminal so that we can grab keys */
298 static struct termios oldtty;
299 static int restore_tty;
302 typedef struct OutputFile {
303 AVFormatContext *ctx;
305 int ost_index; /* index of the first stream in output_streams */
306 int64_t recording_time; /* desired length of the resulting file in microseconds */
307 int64_t start_time; /* start time in microseconds */
308 uint64_t limit_filesize;
311 static InputStream *input_streams = NULL;
312 static int nb_input_streams = 0;
313 static InputFile *input_files = NULL;
314 static int nb_input_files = 0;
316 static OutputStream *output_streams = NULL;
317 static int nb_output_streams = 0;
318 static OutputFile *output_files = NULL;
319 static int nb_output_files = 0;
321 typedef struct OptionsContext {
322 /* input/output options */
326 SpecifierOpt *codec_names;
328 SpecifierOpt *audio_channels;
329 int nb_audio_channels;
330 SpecifierOpt *audio_sample_rate;
331 int nb_audio_sample_rate;
332 SpecifierOpt *rematrix_volume;
333 int nb_rematrix_volume;
334 SpecifierOpt *frame_rates;
336 SpecifierOpt *frame_sizes;
338 SpecifierOpt *frame_pix_fmts;
339 int nb_frame_pix_fmts;
342 int64_t input_ts_offset;
345 SpecifierOpt *ts_scale;
347 SpecifierOpt *dump_attachment;
348 int nb_dump_attachment;
351 StreamMap *stream_maps;
353 AudioChannelMap *audio_channel_maps; ///< one info entry per -map_channel
354 int nb_audio_channel_maps; ///< number of (valid) -map_channel settings
355 /* first item specifies output metadata, second is input */
356 MetadataMap (*meta_data_maps)[2];
357 int nb_meta_data_maps;
358 int metadata_global_manual;
359 int metadata_streams_manual;
360 int metadata_chapters_manual;
361 const char **attachments;
364 int chapters_input_file;
366 int64_t recording_time;
367 uint64_t limit_filesize;
373 int subtitle_disable;
376 /* indexed by output file stream index */
380 SpecifierOpt *metadata;
382 SpecifierOpt *max_frames;
384 SpecifierOpt *bitstream_filters;
385 int nb_bitstream_filters;
386 SpecifierOpt *codec_tags;
388 SpecifierOpt *sample_fmts;
390 SpecifierOpt *qscale;
392 SpecifierOpt *forced_key_frames;
393 int nb_forced_key_frames;
394 SpecifierOpt *force_fps;
396 SpecifierOpt *frame_aspect_ratios;
397 int nb_frame_aspect_ratios;
398 SpecifierOpt *rc_overrides;
400 SpecifierOpt *intra_matrices;
401 int nb_intra_matrices;
402 SpecifierOpt *inter_matrices;
403 int nb_inter_matrices;
404 SpecifierOpt *top_field_first;
405 int nb_top_field_first;
406 SpecifierOpt *metadata_map;
408 SpecifierOpt *presets;
410 SpecifierOpt *copy_initial_nonkeyframes;
411 int nb_copy_initial_nonkeyframes;
413 SpecifierOpt *filters;
418 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
421 for (i = 0; i < o->nb_ ## name; i++) {\
422 char *spec = o->name[i].specifier;\
423 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
424 outvar = o->name[i].u.type;\
430 static void reset_options(OptionsContext *o, int is_input)
432 const OptionDef *po = options;
433 OptionsContext bak= *o;
435 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
437 void *dst = (uint8_t*)o + po->u.off;
439 if (po->flags & OPT_SPEC) {
440 SpecifierOpt **so = dst;
441 int i, *count = (int*)(so + 1);
442 for (i = 0; i < *count; i++) {
443 av_freep(&(*so)[i].specifier);
444 if (po->flags & OPT_STRING)
445 av_freep(&(*so)[i].u.str);
449 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
454 av_freep(&o->stream_maps);
455 av_freep(&o->audio_channel_maps);
456 av_freep(&o->meta_data_maps);
457 av_freep(&o->streamid_map);
459 memset(o, 0, sizeof(*o));
461 if(is_input) o->recording_time = bak.recording_time;
462 else o->recording_time = INT64_MAX;
463 o->mux_max_delay = 0.7;
464 o->limit_filesize = UINT64_MAX;
465 o->chapters_input_file = INT_MAX;
471 static int alloc_buffer(AVCodecContext *s, InputStream *ist, FrameBuffer **pbuf)
473 FrameBuffer *buf = av_mallocz(sizeof(*buf));
475 const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1;
476 int h_chroma_shift, v_chroma_shift;
477 int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
478 int w = s->width, h = s->height;
481 return AVERROR(ENOMEM);
483 if (!(s->flags & CODEC_FLAG_EMU_EDGE)) {
488 avcodec_align_dimensions(s, &w, &h);
489 if ((ret = av_image_alloc(buf->base, buf->linesize, w, h,
490 s->pix_fmt, 32)) < 0) {
494 /* XXX this shouldn't be needed, but some tests break without this line
495 * those decoders are buggy and need to be fixed.
496 * the following tests fail:
497 * bethsoft-vid, cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
499 memset(buf->base[0], 128, ret);
501 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
502 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
503 const int h_shift = i==0 ? 0 : h_chroma_shift;
504 const int v_shift = i==0 ? 0 : v_chroma_shift;
505 if (s->flags & CODEC_FLAG_EMU_EDGE)
506 buf->data[i] = buf->base[i];
508 buf->data[i] = buf->base[i] +
509 FFALIGN((buf->linesize[i]*edge >> v_shift) +
510 (pixel_size*edge >> h_shift), 32);
514 buf->pix_fmt = s->pix_fmt;
521 static void free_buffer_pool(InputStream *ist)
523 FrameBuffer *buf = ist->buffer_pool;
525 ist->buffer_pool = buf->next;
526 av_freep(&buf->base[0]);
528 buf = ist->buffer_pool;
532 static void unref_buffer(InputStream *ist, FrameBuffer *buf)
534 av_assert0(buf->refcount);
536 if (!buf->refcount) {
537 buf->next = ist->buffer_pool;
538 ist->buffer_pool = buf;
542 static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
544 InputStream *ist = s->opaque;
548 if(av_image_check_size(s->width, s->height, 0, s))
551 if (!ist->buffer_pool && (ret = alloc_buffer(s, ist, &ist->buffer_pool)) < 0)
554 buf = ist->buffer_pool;
555 ist->buffer_pool = buf->next;
557 if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) {
558 av_freep(&buf->base[0]);
561 if ((ret = alloc_buffer(s, ist, &buf)) < 0)
567 frame->type = FF_BUFFER_TYPE_USER;
568 frame->extended_data = frame->data;
569 frame->pkt_pts = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE;
571 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
572 frame->base[i] = buf->base[i]; // XXX h264.c uses base though it shouldn't
573 frame->data[i] = buf->data[i];
574 frame->linesize[i] = buf->linesize[i];
580 static void codec_release_buffer(AVCodecContext *s, AVFrame *frame)
582 InputStream *ist = s->opaque;
583 FrameBuffer *buf = frame->opaque;
586 if(frame->type!=FF_BUFFER_TYPE_USER)
587 return avcodec_default_release_buffer(s, frame);
589 for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++)
590 frame->data[i] = NULL;
592 unref_buffer(ist, buf);
595 static void filter_release_buffer(AVFilterBuffer *fb)
597 FrameBuffer *buf = fb->priv;
599 unref_buffer(buf->ist, buf);
604 static int configure_video_filters(InputStream *ist, OutputStream *ost)
606 AVFilterContext *last_filter, *filter;
607 /** filter graph containing all filters including input & output */
608 AVCodecContext *codec = ost->st->codec;
609 AVCodecContext *icodec = ist->st->codec;
610 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
611 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
612 AVRational sample_aspect_ratio;
616 ost->graph = avfilter_graph_alloc();
618 if (ist->st->sample_aspect_ratio.num) {
619 sample_aspect_ratio = ist->st->sample_aspect_ratio;
621 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
623 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
624 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
625 sample_aspect_ratio.num, sample_aspect_ratio.den);
627 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
628 "src", args, NULL, ost->graph);
632 #if FF_API_OLD_VSINK_API
633 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
634 "out", NULL, pix_fmts, ost->graph);
636 buffersink_params->pixel_fmts = pix_fmts;
637 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
638 "out", NULL, buffersink_params, ost->graph);
640 av_freep(&buffersink_params);
644 last_filter = ost->input_video_filter;
646 if (codec->width != icodec->width || codec->height != icodec->height) {
647 snprintf(args, 255, "%d:%d:flags=0x%X",
650 (unsigned)ost->sws_flags);
651 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
652 NULL, args, NULL, ost->graph)) < 0)
654 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
656 last_filter = filter;
659 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
660 ost->graph->scale_sws_opts = av_strdup(args);
663 AVFilterInOut *outputs = avfilter_inout_alloc();
664 AVFilterInOut *inputs = avfilter_inout_alloc();
666 outputs->name = av_strdup("in");
667 outputs->filter_ctx = last_filter;
668 outputs->pad_idx = 0;
669 outputs->next = NULL;
671 inputs->name = av_strdup("out");
672 inputs->filter_ctx = ost->output_video_filter;
676 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
678 av_freep(&ost->avfilter);
680 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
684 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
687 codec->width = ost->output_video_filter->inputs[0]->w;
688 codec->height = ost->output_video_filter->inputs[0]->h;
689 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
690 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
691 av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
692 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
696 #endif /* CONFIG_AVFILTER */
698 static void term_exit(void)
700 av_log(NULL, AV_LOG_QUIET, "%s", "");
703 tcsetattr (0, TCSANOW, &oldtty);
707 static volatile int received_sigterm = 0;
709 static void sigterm_handler(int sig)
711 received_sigterm = sig;
712 received_nb_signals++;
714 if(received_nb_signals > 3)
718 static void term_init(void)
724 if (tcgetattr (0, &tty) == 0) {
729 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
730 |INLCR|IGNCR|ICRNL|IXON);
731 tty.c_oflag |= OPOST;
732 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
733 tty.c_cflag &= ~(CSIZE|PARENB);
738 tcsetattr (0, TCSANOW, &tty);
740 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
743 avformat_network_deinit();
745 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
746 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
748 signal(SIGXCPU, sigterm_handler);
752 /* read a key without blocking */
753 static int read_key(void)
765 n = select(1, &rfds, NULL, NULL, &tv);
774 # if HAVE_PEEKNAMEDPIPE
776 static HANDLE input_handle;
779 input_handle = GetStdHandle(STD_INPUT_HANDLE);
780 is_pipe = !GetConsoleMode(input_handle, &dw);
783 if (stdin->_cnt > 0) {
788 /* When running under a GUI, you will end here. */
789 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
806 static int decode_interrupt_cb(void *ctx)
808 return received_nb_signals > 1;
811 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
813 void av_noreturn exit_program(int ret)
818 for (i = 0; i < nb_output_files; i++) {
819 AVFormatContext *s = output_files[i].ctx;
820 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
822 avformat_free_context(s);
823 av_dict_free(&output_files[i].opts);
825 for (i = 0; i < nb_output_streams; i++) {
826 AVBitStreamFilterContext *bsfc = output_streams[i].bitstream_filters;
828 AVBitStreamFilterContext *next = bsfc->next;
829 av_bitstream_filter_close(bsfc);
832 output_streams[i].bitstream_filters = NULL;
834 if (output_streams[i].output_frame) {
835 AVFrame *frame = output_streams[i].output_frame;
836 if (frame->extended_data != frame->data)
837 av_freep(&frame->extended_data);
841 for (i = 0; i < nb_input_files; i++) {
842 avformat_close_input(&input_files[i].ctx);
844 for (i = 0; i < nb_input_streams; i++) {
845 av_freep(&input_streams[i].decoded_frame);
846 av_freep(&input_streams[i].filtered_frame);
847 av_dict_free(&input_streams[i].opts);
848 free_buffer_pool(&input_streams[i]);
853 av_free(vstats_filename);
855 av_freep(&input_streams);
856 av_freep(&input_files);
857 av_freep(&output_streams);
858 av_freep(&output_files);
862 allocated_audio_buf_size = 0;
867 avformat_network_deinit();
869 av_freep(&input_tmp);
871 if (received_sigterm) {
872 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
873 (int) received_sigterm);
877 exit(ret); /* not all OS-es handle main() return value */
880 static void assert_avoptions(AVDictionary *m)
882 AVDictionaryEntry *t;
883 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
884 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
889 static void assert_codec_experimental(AVCodecContext *c, int encoder)
891 const char *codec_string = encoder ? "encoder" : "decoder";
893 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
894 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
895 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
896 "results.\nAdd '-strict experimental' if you want to use it.\n",
897 codec_string, c->codec->name);
898 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
899 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
900 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
901 codec_string, codec->name);
906 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
908 if (codec && codec->sample_fmts) {
909 const enum AVSampleFormat *p = codec->sample_fmts;
910 for (; *p != -1; p++) {
911 if (*p == st->codec->sample_fmt)
915 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
916 av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
917 if(av_get_sample_fmt_name(st->codec->sample_fmt))
918 av_log(NULL, AV_LOG_WARNING,
919 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
920 av_get_sample_fmt_name(st->codec->sample_fmt),
922 av_get_sample_fmt_name(codec->sample_fmts[0]));
923 st->codec->sample_fmt = codec->sample_fmts[0];
928 static void choose_sample_rate(AVStream *st, AVCodec *codec)
930 if (codec && codec->supported_samplerates) {
931 const int *p = codec->supported_samplerates;
933 int best_dist = INT_MAX;
935 int dist = abs(st->codec->sample_rate - *p);
936 if (dist < best_dist) {
942 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
944 st->codec->sample_rate = best;
948 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
950 if (codec && codec->pix_fmts) {
951 const enum PixelFormat *p = codec->pix_fmts;
952 int has_alpha= av_pix_fmt_descriptors[st->codec->pix_fmt].nb_components % 2 == 0;
953 enum PixelFormat best= PIX_FMT_NONE;
954 if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
955 if (st->codec->codec_id == CODEC_ID_MJPEG) {
956 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
957 } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
958 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
959 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
962 for (; *p != PIX_FMT_NONE; p++) {
963 best= avcodec_find_best_pix_fmt2(best, *p, st->codec->pix_fmt, has_alpha, NULL);
964 if (*p == st->codec->pix_fmt)
967 if (*p == PIX_FMT_NONE) {
968 if (st->codec->pix_fmt != PIX_FMT_NONE)
969 av_log(NULL, AV_LOG_WARNING,
970 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
971 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
973 av_pix_fmt_descriptors[best].name);
974 st->codec->pix_fmt = best;
979 static double get_sync_ipts(const OutputStream *ost)
981 const InputStream *ist = ost->sync_ist;
982 OutputFile *of = &output_files[ost->file_index];
983 return (double)(ist->pts - of->start_time) / AV_TIME_BASE;
986 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
988 AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
989 AVCodecContext *avctx = ost->st->codec;
993 * Audio encoders may split the packets -- #frames in != #packets out.
994 * But there is no reordering, so we can limit the number of output packets
995 * by simply dropping them here.
996 * Counting encoded video frames needs to be done separately because of
997 * reordering, see do_video_out()
999 if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) {
1000 if (ost->frame_number >= ost->max_frames)
1002 ost->frame_number++;
1006 AVPacket new_pkt = *pkt;
1007 int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
1008 &new_pkt.data, &new_pkt.size,
1009 pkt->data, pkt->size,
1010 pkt->flags & AV_PKT_FLAG_KEY);
1012 av_free_packet(pkt);
1013 new_pkt.destruct = av_destruct_packet;
1015 av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
1016 bsfc->filter->name, pkt->stream_index,
1017 avctx->codec ? avctx->codec->name : "copy");
1027 ret = av_interleaved_write_frame(s, pkt);
1029 print_error("av_interleaved_write_frame()", ret);
1034 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1036 int fill_char = 0x00;
1037 if (sample_fmt == AV_SAMPLE_FMT_U8)
1039 memset(buf, fill_char, size);
1042 static int encode_audio_frame(AVFormatContext *s, OutputStream *ost,
1043 const uint8_t *buf, int buf_size)
1045 AVCodecContext *enc = ost->st->codec;
1046 AVFrame *frame = NULL;
1048 int ret, got_packet;
1050 av_init_packet(&pkt);
1055 if (!ost->output_frame) {
1056 ost->output_frame = avcodec_alloc_frame();
1057 if (!ost->output_frame) {
1058 av_log(NULL, AV_LOG_FATAL, "out-of-memory in encode_audio_frame()\n");
1062 frame = ost->output_frame;
1063 if (frame->extended_data != frame->data)
1064 av_freep(&frame->extended_data);
1065 avcodec_get_frame_defaults(frame);
1067 frame->nb_samples = buf_size /
1068 (enc->channels * av_get_bytes_per_sample(enc->sample_fmt));
1069 if ((ret = avcodec_fill_audio_frame(frame, enc->channels, enc->sample_fmt,
1070 buf, buf_size, 1)) < 0) {
1071 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1077 if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
1078 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1085 pkt.stream_index = ost->index;
1086 if (pkt.pts != AV_NOPTS_VALUE)
1087 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1088 if (pkt.duration > 0)
1089 pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
1091 write_frame(s, &pkt, ost);
1093 audio_size += pkt.size;
1095 av_free_packet(&pkt);
1099 ost->sync_opts += frame->nb_samples;
1104 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
1105 InputStream *ist, AVFrame *decoded_frame)
1108 int64_t audio_buf_size, size_out;
1110 int frame_bytes, resample_changed;
1111 AVCodecContext *enc = ost->st->codec;
1112 AVCodecContext *dec = ist->st->codec;
1113 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1114 int isize = av_get_bytes_per_sample(dec->sample_fmt);
1115 uint8_t *buf = decoded_frame->data[0];
1116 int size = decoded_frame->nb_samples * dec->channels * isize;
1117 int64_t allocated_for_size = size;
1120 audio_buf_size = (allocated_for_size + isize * dec->channels - 1) / (isize * dec->channels);
1121 audio_buf_size = (audio_buf_size * enc->sample_rate + dec->sample_rate) / dec->sample_rate;
1122 audio_buf_size = audio_buf_size * 2 + 10000; // safety factors for the deprecated resampling API
1123 audio_buf_size = FFMAX(audio_buf_size, enc->frame_size);
1124 audio_buf_size *= osize * enc->channels;
1126 if (audio_buf_size > INT_MAX) {
1127 av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n");
1131 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
1133 av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
1137 if (enc->channels != dec->channels
1138 || enc->sample_fmt != dec->sample_fmt
1139 || enc->sample_rate!= dec->sample_rate
1141 ost->audio_resample = 1;
1143 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
1144 ost->resample_channels != dec->channels ||
1145 ost->resample_sample_rate != dec->sample_rate;
1147 if ((ost->audio_resample && !ost->swr) || resample_changed || ost->audio_channels_mapped) {
1148 if (resample_changed) {
1149 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",
1150 ist->file_index, ist->st->index,
1151 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
1152 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
1153 ost->resample_sample_fmt = dec->sample_fmt;
1154 ost->resample_channels = dec->channels;
1155 ost->resample_sample_rate = dec->sample_rate;
1156 swr_free(&ost->swr);
1158 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
1159 if (audio_sync_method <= 1 && !ost->audio_channels_mapped &&
1160 ost->resample_sample_fmt == enc->sample_fmt &&
1161 ost->resample_channels == enc->channels &&
1162 ost->resample_sample_rate == enc->sample_rate) {
1164 ost->audio_resample = 0;
1166 ost->swr = swr_alloc_set_opts(ost->swr,
1167 enc->channel_layout, enc->sample_fmt, enc->sample_rate,
1168 dec->channel_layout, dec->sample_fmt, dec->sample_rate,
1170 if (ost->audio_channels_mapped)
1171 swr_set_channel_mapping(ost->swr, ost->audio_channels_map);
1172 av_opt_set_double(ost->swr, "rmvol", ost->rematrix_volume, 0);
1173 if (ost->audio_channels_mapped) {
1174 av_opt_set_int(ost->swr, "icl", av_get_default_channel_layout(ost->audio_channels_mapped), 0);
1175 av_opt_set_int(ost->swr, "uch", ost->audio_channels_mapped, 0);
1177 if (av_opt_set_int(ost->swr, "ich", dec->channels, 0) < 0) {
1178 av_log(NULL, AV_LOG_FATAL, "Unsupported number of input channels\n");
1181 if (av_opt_set_int(ost->swr, "och", enc->channels, 0) < 0) {
1182 av_log(NULL, AV_LOG_FATAL, "Unsupported number of output channels\n");
1185 if(audio_sync_method>1) av_opt_set_int(ost->swr, "flags", SWR_FLAG_RESAMPLE, 0);
1186 if(ost->swr && swr_init(ost->swr) < 0){
1187 av_log(NULL, AV_LOG_FATAL, "swr_init() failed\n");
1188 swr_free(&ost->swr);
1192 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
1193 dec->channels, dec->sample_rate,
1194 enc->channels, enc->sample_rate);
1200 av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
1202 if (audio_sync_method) {
1203 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts -
1204 av_fifo_size(ost->fifo) / (enc->channels * osize);
1205 int idelta = delta * dec->sample_rate / enc->sample_rate;
1206 int byte_delta = idelta * isize * dec->channels;
1208 // FIXME resample delay
1209 if (fabs(delta) > 50) {
1210 if (ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate) {
1211 if (byte_delta < 0) {
1212 byte_delta = FFMAX(byte_delta, -size);
1215 av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n",
1216 -byte_delta / (isize * dec->channels));
1221 input_tmp = av_realloc(input_tmp, byte_delta + size);
1223 if (byte_delta > allocated_for_size - size) {
1224 allocated_for_size = byte_delta + (int64_t)size;
1229 generate_silence(input_tmp, dec->sample_fmt, byte_delta);
1230 memcpy(input_tmp + byte_delta, buf, size);
1233 av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
1235 } else if (audio_sync_method > 1) {
1236 int comp = av_clip(delta, -audio_sync_method, audio_sync_method);
1237 av_assert0(ost->audio_resample);
1238 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
1239 delta, comp, enc->sample_rate);
1240 // 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));
1241 swr_set_compensation(ost->swr, comp, enc->sample_rate);
1245 ost->sync_opts = lrintf(get_sync_ipts(ost) * enc->sample_rate) -
1246 av_fifo_size(ost->fifo) / (enc->channels * osize); // FIXME wrong
1248 if (ost->audio_resample) {
1250 size_out = swr_convert(ost->swr, ( uint8_t*[]){buftmp}, audio_buf_size / (enc->channels * osize),
1251 (const uint8_t*[]){buf }, size / (dec->channels * isize));
1252 size_out = size_out * enc->channels * osize;
1258 av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
1260 /* now encode as many frames as possible */
1261 if (!(enc->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)) {
1262 /* output resampled raw samples */
1263 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
1264 av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
1267 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
1269 frame_bytes = enc->frame_size * osize * enc->channels;
1271 while (av_fifo_size(ost->fifo) >= frame_bytes) {
1272 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
1273 encode_audio_frame(s, ost, audio_buf, frame_bytes);
1276 encode_audio_frame(s, ost, buftmp, size_out);
1280 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1282 AVCodecContext *dec;
1283 AVPicture *picture2;
1284 AVPicture picture_tmp;
1287 dec = ist->st->codec;
1289 /* deinterlace : must be done before any resize */
1290 if (do_deinterlace) {
1293 /* create temporary picture */
1294 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1295 buf = av_malloc(size);
1299 picture2 = &picture_tmp;
1300 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1302 if (avpicture_deinterlace(picture2, picture,
1303 dec->pix_fmt, dec->width, dec->height) < 0) {
1304 /* if error, do not deinterlace */
1305 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1314 if (picture != picture2)
1315 *picture = *picture2;
1319 static void do_subtitle_out(AVFormatContext *s,
1325 static uint8_t *subtitle_out = NULL;
1326 int subtitle_out_max_size = 1024 * 1024;
1327 int subtitle_out_size, nb, i;
1328 AVCodecContext *enc;
1331 if (pts == AV_NOPTS_VALUE) {
1332 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1338 enc = ost->st->codec;
1340 if (!subtitle_out) {
1341 subtitle_out = av_malloc(subtitle_out_max_size);
1344 /* Note: DVB subtitle need one packet to draw them and one other
1345 packet to clear them */
1346 /* XXX: signal it in the codec context ? */
1347 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1352 for (i = 0; i < nb; i++) {
1353 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1354 // start_display_time is required to be 0
1355 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1356 sub->end_display_time -= sub->start_display_time;
1357 sub->start_display_time = 0;
1358 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1359 subtitle_out_max_size, sub);
1360 if (subtitle_out_size < 0) {
1361 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1365 av_init_packet(&pkt);
1366 pkt.stream_index = ost->index;
1367 pkt.data = subtitle_out;
1368 pkt.size = subtitle_out_size;
1369 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1370 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1371 /* XXX: the pts correction is handled here. Maybe handling
1372 it in the codec would be better */
1374 pkt.pts += 90 * sub->start_display_time;
1376 pkt.pts += 90 * sub->end_display_time;
1378 write_frame(s, &pkt, ost);
1382 static int bit_buffer_size = 1024 * 256;
1383 static uint8_t *bit_buffer = NULL;
1385 static void do_video_resample(OutputStream *ost,
1387 AVFrame *in_picture,
1388 AVFrame **out_picture)
1391 *out_picture = in_picture;
1393 AVCodecContext *dec = ist->st->codec;
1394 AVCodecContext *enc = ost->st->codec;
1395 int resample_changed = ost->resample_width != in_picture->width ||
1396 ost->resample_height != in_picture->height ||
1397 ost->resample_pix_fmt != in_picture->format;
1399 *out_picture = in_picture;
1400 if (resample_changed) {
1401 av_log(NULL, AV_LOG_INFO,
1402 "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",
1403 ist->file_index, ist->st->index,
1404 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1405 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt),
1406 in_picture->width, in_picture->height, av_get_pix_fmt_name(in_picture->format));
1407 ost->resample_width = in_picture->width;
1408 ost->resample_height = in_picture->height;
1409 ost->resample_pix_fmt = in_picture->format;
1412 ost->video_resample = in_picture->width != enc->width ||
1413 in_picture->height != enc->height ||
1414 in_picture->format != enc->pix_fmt;
1416 if (ost->video_resample) {
1417 *out_picture = &ost->resample_frame;
1418 if (!ost->img_resample_ctx || resample_changed) {
1419 /* initialize the destination picture */
1420 if (!ost->resample_frame.data[0]) {
1421 avcodec_get_frame_defaults(&ost->resample_frame);
1422 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1423 enc->width, enc->height)) {
1424 av_log(NULL, AV_LOG_FATAL, "Cannot allocate temp picture, check pix fmt\n");
1428 /* initialize a new scaler context */
1429 sws_freeContext(ost->img_resample_ctx);
1430 ost->img_resample_ctx = sws_getContext(in_picture->width, in_picture->height, in_picture->format,
1431 enc->width, enc->height, enc->pix_fmt,
1432 ost->sws_flags, NULL, NULL, NULL);
1433 if (ost->img_resample_ctx == NULL) {
1434 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1438 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1439 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1445 static void do_video_out(AVFormatContext *s,
1448 AVFrame *in_picture,
1449 int *frame_size, float quality)
1451 int nb_frames, i, ret, format_video_sync;
1452 AVFrame *final_picture;
1453 AVCodecContext *enc;
1455 double duration = 0;
1457 enc = ost->st->codec;
1459 if (ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE) {
1460 duration = FFMAX(av_q2d(ist->st->time_base), av_q2d(ist->st->codec->time_base));
1461 if(ist->st->avg_frame_rate.num)
1462 duration= FFMAX(duration, 1/av_q2d(ist->st->avg_frame_rate));
1464 duration /= av_q2d(enc->time_base);
1467 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1469 /* by default, we output a single frame */
1474 format_video_sync = video_sync_method;
1475 if (format_video_sync == VSYNC_AUTO)
1476 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
1478 if (format_video_sync != VSYNC_PASSTHROUGH && format_video_sync != VSYNC_DROP) {
1479 double vdelta = sync_ipts - ost->sync_opts + duration;
1480 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1483 else if (format_video_sync == VSYNC_VFR) {
1484 if (vdelta <= -0.6) {
1486 } else if (vdelta > 0.6)
1487 ost->sync_opts = lrintf(sync_ipts);
1488 } else if (vdelta > 1.1)
1489 nb_frames = lrintf(vdelta);
1490 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, get_sync_ipts(ost), nb_frames);
1491 if (nb_frames == 0) {
1493 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1494 } else if (nb_frames > 1) {
1495 nb_frames_dup += nb_frames - 1;
1496 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1499 ost->sync_opts = lrintf(sync_ipts);
1501 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1505 do_video_resample(ost, ist, in_picture, &final_picture);
1507 /* duplicates frame if needed */
1508 for (i = 0; i < nb_frames; i++) {
1510 av_init_packet(&pkt);
1511 pkt.stream_index = ost->index;
1513 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1514 enc->codec->id == CODEC_ID_RAWVIDEO) {
1515 /* raw pictures are written as AVPicture structure to
1516 avoid any copies. We support temporarily the older
1518 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1519 enc->coded_frame->top_field_first = in_picture->top_field_first;
1520 pkt.data = (uint8_t *)final_picture;
1521 pkt.size = sizeof(AVPicture);
1522 pkt.pts = av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1523 pkt.flags |= AV_PKT_FLAG_KEY;
1525 write_frame(s, &pkt, ost);
1527 AVFrame big_picture;
1529 big_picture = *final_picture;
1530 /* better than nothing: use input picture interlaced
1532 big_picture.interlaced_frame = in_picture->interlaced_frame;
1533 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1534 if (ost->top_field_first == -1)
1535 big_picture.top_field_first = in_picture->top_field_first;
1537 big_picture.top_field_first = !!ost->top_field_first;
1540 /* handles same_quant here. This is not correct because it may
1541 not be a global option */
1542 big_picture.quality = quality;
1543 if (!enc->me_threshold)
1544 big_picture.pict_type = 0;
1545 // big_picture.pts = AV_NOPTS_VALUE;
1546 big_picture.pts = ost->sync_opts;
1547 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1548 // av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", 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_video(enc,
1555 bit_buffer, bit_buffer_size,
1558 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1563 pkt.data = bit_buffer;
1565 if (enc->coded_frame->pts != AV_NOPTS_VALUE)
1566 pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1567 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1568 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1569 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1571 if (enc->coded_frame->key_frame)
1572 pkt.flags |= AV_PKT_FLAG_KEY;
1573 if (format_video_sync == VSYNC_DROP)
1574 pkt.pts = pkt.dts = AV_NOPTS_VALUE;
1575 write_frame(s, &pkt, ost);
1578 // fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1579 // enc->frame_number-1, ret, enc->pict_type);
1580 /* if two pass, output log */
1581 if (ost->logfile && enc->stats_out) {
1582 fprintf(ost->logfile, "%s", enc->stats_out);
1588 * For video, number of frames in == number of packets out.
1589 * But there may be reordering, so we can't throw away frames on encoder
1590 * flush, we need to limit them here, before they go into encoder.
1592 ost->frame_number++;
1596 static double psnr(double d)
1598 return -10.0 * log(d) / log(10.0);
1601 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1604 AVCodecContext *enc;
1606 double ti1, bitrate, avg_bitrate;
1608 /* this is executed just the first time do_video_stats is called */
1610 vstats_file = fopen(vstats_filename, "w");
1617 enc = ost->st->codec;
1618 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1619 frame_number = ost->frame_number;
1620 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1621 if (enc->flags&CODEC_FLAG_PSNR)
1622 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1624 fprintf(vstats_file,"f_size= %6d ", frame_size);
1625 /* compute pts value */
1626 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1630 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1631 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1632 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1633 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1634 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1638 static void print_report(OutputFile *output_files,
1639 OutputStream *ost_table, int nb_ostreams,
1640 int is_last_report, int64_t timer_start, int64_t cur_time)
1644 AVFormatContext *oc;
1646 AVCodecContext *enc;
1647 int frame_number, vid, i;
1649 int64_t pts = INT64_MAX;
1650 static int64_t last_time = -1;
1651 static int qp_histogram[52];
1652 int hours, mins, secs, us;
1654 if (!print_stats && !is_last_report)
1657 if (!is_last_report) {
1658 if (last_time == -1) {
1659 last_time = cur_time;
1662 if ((cur_time - last_time) < 500000)
1664 last_time = cur_time;
1668 oc = output_files[0].ctx;
1670 total_size = avio_size(oc->pb);
1671 if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
1672 total_size = avio_tell(oc->pb);
1679 for (i = 0; i < nb_ostreams; i++) {
1681 ost = &ost_table[i];
1682 enc = ost->st->codec;
1683 if (!ost->stream_copy && enc->coded_frame)
1684 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
1685 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1686 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1688 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1689 float t = (cur_time-timer_start) / 1000000.0;
1691 frame_number = ost->frame_number;
1692 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1693 frame_number, (t > 1) ? (int)(frame_number / t + 0.5) : 0, q);
1695 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1699 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
1701 for (j = 0; j < 32; j++)
1702 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
1704 if (enc->flags&CODEC_FLAG_PSNR) {
1706 double error, error_sum = 0;
1707 double scale, scale_sum = 0;
1708 char type[3] = { 'Y','U','V' };
1709 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1710 for (j = 0; j < 3; j++) {
1711 if (is_last_report) {
1712 error = enc->error[j];
1713 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
1715 error = enc->coded_frame->error[j];
1716 scale = enc->width * enc->height * 255.0 * 255.0;
1722 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error / scale));
1724 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
1728 /* compute min output value */
1729 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1730 ost->st->time_base, AV_TIME_BASE_Q));
1733 secs = pts / AV_TIME_BASE;
1734 us = pts % AV_TIME_BASE;
1740 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1742 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1743 "size=%8.0fkB time=", total_size / 1024.0);
1744 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1745 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1746 (100 * us) / AV_TIME_BASE);
1747 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1748 "bitrate=%6.1fkbits/s", bitrate);
1750 if (nb_frames_dup || nb_frames_drop)
1751 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1752 nb_frames_dup, nb_frames_drop);
1754 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
1758 if (is_last_report) {
1759 int64_t raw= audio_size + video_size + extra_size;
1760 av_log(NULL, AV_LOG_INFO, "\n");
1761 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1762 video_size / 1024.0,
1763 audio_size / 1024.0,
1764 extra_size / 1024.0,
1765 100.0 * (total_size - raw) / raw
1767 if(video_size + audio_size + extra_size == 0){
1768 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
1773 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1777 for (i = 0; i < nb_ostreams; i++) {
1778 OutputStream *ost = &ost_table[i];
1779 AVCodecContext *enc = ost->st->codec;
1780 AVFormatContext *os = output_files[ost->file_index].ctx;
1781 int stop_encoding = 0;
1783 if (!ost->encoding_needed)
1786 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
1788 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
1794 av_init_packet(&pkt);
1798 switch (ost->st->codec->codec_type) {
1799 case AVMEDIA_TYPE_AUDIO:
1800 fifo_bytes = av_fifo_size(ost->fifo);
1801 if (fifo_bytes > 0) {
1802 /* encode any samples remaining in fifo */
1803 int frame_bytes = fifo_bytes;
1805 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1807 /* pad last frame with silence if needed */
1808 if (!(enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME)) {
1809 frame_bytes = enc->frame_size * enc->channels *
1810 av_get_bytes_per_sample(enc->sample_fmt);
1811 if (allocated_audio_buf_size < frame_bytes)
1813 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1815 encode_audio_frame(os, ost, audio_buf, frame_bytes);
1817 /* flush encoder with NULL frames until it is done
1818 returning packets */
1819 if (encode_audio_frame(os, ost, NULL, 0) == 0) {
1825 case AVMEDIA_TYPE_VIDEO:
1826 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1828 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1832 if (enc->coded_frame && enc->coded_frame->key_frame)
1833 pkt.flags |= AV_PKT_FLAG_KEY;
1834 if (ost->logfile && enc->stats_out) {
1835 fprintf(ost->logfile, "%s", enc->stats_out);
1841 pkt.stream_index = ost->index;
1842 pkt.data = bit_buffer;
1844 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1845 pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1846 write_frame(os, &pkt, ost);
1858 * Check whether a packet from ist should be written into ost at this time
1860 static int check_output_constraints(InputStream *ist, OutputStream *ost)
1862 OutputFile *of = &output_files[ost->file_index];
1863 int ist_index = ist - input_streams;
1865 if (ost->source_index != ist_index)
1868 if (of->start_time && ist->pts < of->start_time)
1871 if (of->recording_time != INT64_MAX &&
1872 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1873 (AVRational){ 1, 1000000 }) >= 0) {
1874 ost->is_past_recording_time = 1;
1881 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
1883 OutputFile *of = &output_files[ost->file_index];
1884 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1888 av_init_packet(&opkt);
1890 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
1891 !ost->copy_initial_nonkeyframes)
1894 /* force the input stream PTS */
1895 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1896 audio_size += pkt->size;
1897 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1898 video_size += pkt->size;
1902 opkt.stream_index = ost->index;
1903 if (pkt->pts != AV_NOPTS_VALUE)
1904 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1906 opkt.pts = AV_NOPTS_VALUE;
1908 if (pkt->dts == AV_NOPTS_VALUE)
1909 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1911 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1912 opkt.dts -= ost_tb_start_time;
1914 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1915 opkt.flags = pkt->flags;
1917 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1918 if ( ost->st->codec->codec_id != CODEC_ID_H264
1919 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1920 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1922 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
1923 opkt.destruct = av_destruct_packet;
1925 opkt.data = pkt->data;
1926 opkt.size = pkt->size;
1928 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
1929 /* store AVPicture in AVPacket, as expected by the output format */
1930 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1931 opkt.data = (uint8_t *)&pict;
1932 opkt.size = sizeof(AVPicture);
1933 opkt.flags |= AV_PKT_FLAG_KEY;
1936 write_frame(of->ctx, &opkt, ost);
1937 ost->st->codec->frame_number++;
1938 av_free_packet(&opkt);
1941 static void rate_emu_sleep(InputStream *ist)
1943 if (input_files[ist->file_index].rate_emu) {
1944 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1945 int64_t now = av_gettime() - ist->start;
1951 static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
1953 AVFrame *decoded_frame;
1954 AVCodecContext *avctx = ist->st->codec;
1955 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1958 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
1959 return AVERROR(ENOMEM);
1961 avcodec_get_frame_defaults(ist->decoded_frame);
1962 decoded_frame = ist->decoded_frame;
1964 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
1970 /* no audio frame */
1974 /* if the decoder provides a pts, use it instead of the last packet pts.
1975 the decoder could be delaying output by a packet or more. */
1976 if (decoded_frame->pts != AV_NOPTS_VALUE)
1977 ist->next_pts = decoded_frame->pts;
1979 /* increment next_pts to use for the case where the input stream does not
1980 have timestamps or there are multiple frames in the packet */
1981 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
1984 // preprocess audio (volume)
1985 if (audio_volume != 256) {
1986 int decoded_data_size = decoded_frame->nb_samples * avctx->channels * bps;
1987 void *samples = decoded_frame->data[0];
1988 switch (avctx->sample_fmt) {
1989 case AV_SAMPLE_FMT_U8:
1991 uint8_t *volp = samples;
1992 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1993 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
1994 *volp++ = av_clip_uint8(v);
1998 case AV_SAMPLE_FMT_S16:
2000 int16_t *volp = samples;
2001 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2002 int v = ((*volp) * audio_volume + 128) >> 8;
2003 *volp++ = av_clip_int16(v);
2007 case AV_SAMPLE_FMT_S32:
2009 int32_t *volp = samples;
2010 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2011 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
2012 *volp++ = av_clipl_int32(v);
2016 case AV_SAMPLE_FMT_FLT:
2018 float *volp = samples;
2019 float scale = audio_volume / 256.f;
2020 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2025 case AV_SAMPLE_FMT_DBL:
2027 double *volp = samples;
2028 double scale = audio_volume / 256.;
2029 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2035 av_log(NULL, AV_LOG_FATAL,
2036 "Audio volume adjustment on sample format %s is not supported.\n",
2037 av_get_sample_fmt_name(ist->st->codec->sample_fmt));
2042 rate_emu_sleep(ist);
2044 for (i = 0; i < nb_output_streams; i++) {
2045 OutputStream *ost = &output_streams[i];
2047 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2049 do_audio_out(output_files[ost->file_index].ctx, ost, ist, decoded_frame);
2055 static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *pkt_pts, int64_t *pkt_dts)
2057 AVFrame *decoded_frame, *filtered_frame = NULL;
2058 void *buffer_to_free = NULL;
2062 int frame_available = 1;
2065 int64_t *best_effort_timestamp;
2066 AVRational *frame_sample_aspect;
2068 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2069 return AVERROR(ENOMEM);
2071 avcodec_get_frame_defaults(ist->decoded_frame);
2072 decoded_frame = ist->decoded_frame;
2073 pkt->pts = *pkt_pts;
2074 pkt->dts = *pkt_dts;
2075 *pkt_pts = AV_NOPTS_VALUE;
2077 if (pkt->duration) {
2078 duration = av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2079 } else if(ist->st->codec->time_base.num != 0) {
2080 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2081 duration = ((int64_t)AV_TIME_BASE *
2082 ist->st->codec->time_base.num * ticks) /
2083 ist->st->codec->time_base.den;
2086 if(*pkt_dts != AV_NOPTS_VALUE && duration) {
2087 *pkt_dts += duration;
2089 *pkt_dts = AV_NOPTS_VALUE;
2091 ret = avcodec_decode_video2(ist->st->codec,
2092 decoded_frame, got_output, pkt);
2096 quality = same_quant ? decoded_frame->quality : 0;
2098 /* no picture yet */
2102 best_effort_timestamp= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "best_effort_timestamp");
2103 if(*best_effort_timestamp != AV_NOPTS_VALUE)
2104 ist->next_pts = ist->pts = *best_effort_timestamp;
2106 ist->next_pts += duration;
2109 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2112 frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
2113 for(i=0;i<nb_output_streams;i++) {
2114 OutputStream *ost = ost = &output_streams[i];
2115 if(check_output_constraints(ist, ost) && ost->encoding_needed){
2116 if (!frame_sample_aspect->num)
2117 *frame_sample_aspect = ist->st->sample_aspect_ratio;
2118 decoded_frame->pts = ist->pts;
2119 if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER) {
2120 FrameBuffer *buf = decoded_frame->opaque;
2121 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2122 decoded_frame->data, decoded_frame->linesize,
2123 AV_PERM_READ | AV_PERM_PRESERVE,
2124 ist->st->codec->width, ist->st->codec->height,
2125 ist->st->codec->pix_fmt);
2127 avfilter_copy_frame_props(fb, decoded_frame);
2129 fb->buf->priv = buf;
2130 fb->buf->free = filter_release_buffer;
2133 av_buffersrc_buffer(ost->input_video_filter, fb);
2135 if((av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame, AV_VSRC_BUF_FLAG_OVERWRITE)) < 0){
2136 av_log(0, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
2143 rate_emu_sleep(ist);
2145 for (i = 0; i < nb_output_streams; i++) {
2146 OutputStream *ost = &output_streams[i];
2149 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2153 if (ost->input_video_filter) {
2154 frame_available = av_buffersink_poll_frame(ost->output_video_filter);
2156 while (frame_available) {
2157 if (ost->output_video_filter) {
2158 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
2159 if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0){
2160 av_log(0, AV_LOG_WARNING, "AV Filter told us it has a frame available but failed to output one\n");
2163 if (!ist->filtered_frame && !(ist->filtered_frame = avcodec_alloc_frame())) {
2164 av_free(buffer_to_free);
2165 return AVERROR(ENOMEM);
2167 avcodec_get_frame_defaults(ist->filtered_frame);
2168 filtered_frame = ist->filtered_frame;
2169 *filtered_frame= *decoded_frame; //for me_threshold
2171 avfilter_fill_frame_from_video_buffer_ref(filtered_frame, ost->picref);
2172 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
2175 if (ost->picref->video && !ost->frame_aspect_ratio)
2176 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
2178 filtered_frame = decoded_frame;
2181 do_video_out(output_files[ost->file_index].ctx, ost, ist, filtered_frame, &frame_size,
2182 same_quant ? quality : ost->st->codec->global_quality);
2183 if (vstats_filename && frame_size)
2184 do_video_stats(output_files[ost->file_index].ctx, ost, frame_size);
2187 frame_available = ost->output_video_filter && av_buffersink_poll_frame(ost->output_video_filter);
2188 avfilter_unref_buffer(ost->picref);
2193 av_free(buffer_to_free);
2197 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2199 AVSubtitle subtitle;
2200 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2201 &subtitle, got_output, pkt);
2207 rate_emu_sleep(ist);
2209 for (i = 0; i < nb_output_streams; i++) {
2210 OutputStream *ost = &output_streams[i];
2212 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2215 do_subtitle_out(output_files[ost->file_index].ctx, ost, ist, &subtitle, pkt->pts);
2218 avsubtitle_free(&subtitle);
2222 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2223 static int output_packet(InputStream *ist,
2224 OutputStream *ost_table, int nb_ostreams,
2225 const AVPacket *pkt)
2229 int64_t pkt_dts = AV_NOPTS_VALUE;
2230 int64_t pkt_pts = AV_NOPTS_VALUE;
2234 if (ist->next_pts == AV_NOPTS_VALUE)
2235 ist->next_pts = ist->pts;
2239 av_init_packet(&avpkt);
2247 if (pkt->dts != AV_NOPTS_VALUE) {
2248 if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2249 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2250 pkt_dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2252 if(pkt->pts != AV_NOPTS_VALUE)
2253 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2255 // while we have more to decode or while the decoder did output something on EOF
2256 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2259 ist->pts = ist->next_pts;
2261 if (avpkt.size && avpkt.size != pkt->size) {
2262 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2263 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2264 ist->showed_multi_packet_warning = 1;
2267 switch (ist->st->codec->codec_type) {
2268 case AVMEDIA_TYPE_AUDIO:
2269 ret = transcode_audio (ist, &avpkt, &got_output);
2271 case AVMEDIA_TYPE_VIDEO:
2272 ret = transcode_video (ist, &avpkt, &got_output, &pkt_pts, &pkt_dts);
2274 case AVMEDIA_TYPE_SUBTITLE:
2275 ret = transcode_subtitles(ist, &avpkt, &got_output);
2285 avpkt.pts= AV_NOPTS_VALUE;
2287 // touch data and size only if not EOF
2289 if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2299 /* handle stream copy */
2300 if (!ist->decoding_needed) {
2301 rate_emu_sleep(ist);
2302 ist->pts = ist->next_pts;
2303 switch (ist->st->codec->codec_type) {
2304 case AVMEDIA_TYPE_AUDIO:
2305 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2306 ist->st->codec->sample_rate;
2308 case AVMEDIA_TYPE_VIDEO:
2309 if (pkt->duration) {
2310 ist->next_pts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2311 } else if(ist->st->codec->time_base.num != 0) {
2312 int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2313 ist->next_pts += ((int64_t)AV_TIME_BASE *
2314 ist->st->codec->time_base.num * ticks) /
2315 ist->st->codec->time_base.den;
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->pts = 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;
2386 static int transcode_init(OutputFile *output_files, int nb_output_files,
2387 InputFile *input_files, int nb_input_files)
2389 int ret = 0, i, j, k;
2390 AVFormatContext *oc;
2391 AVCodecContext *codec, *icodec;
2397 /* init framerate emulation */
2398 for (i = 0; i < nb_input_files; i++) {
2399 InputFile *ifile = &input_files[i];
2400 if (ifile->rate_emu)
2401 for (j = 0; j < ifile->nb_streams; j++)
2402 input_streams[j + ifile->ist_index].start = av_gettime();
2405 /* output stream init */
2406 for (i = 0; i < nb_output_files; i++) {
2407 oc = output_files[i].ctx;
2408 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2409 av_dump_format(oc, i, oc->filename, 1);
2410 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2411 return AVERROR(EINVAL);
2415 /* for each output stream, we compute the right encoding parameters */
2416 for (i = 0; i < nb_output_streams; i++) {
2417 ost = &output_streams[i];
2418 oc = output_files[ost->file_index].ctx;
2419 ist = &input_streams[ost->source_index];
2421 if (ost->attachment_filename)
2424 codec = ost->st->codec;
2425 icodec = ist->st->codec;
2427 ost->st->disposition = ist->st->disposition;
2428 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2429 codec->chroma_sample_location = icodec->chroma_sample_location;
2431 if (ost->stream_copy) {
2432 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2434 if (extra_size > INT_MAX) {
2435 return AVERROR(EINVAL);
2438 /* if stream_copy is selected, no need to decode or encode */
2439 codec->codec_id = icodec->codec_id;
2440 codec->codec_type = icodec->codec_type;
2442 if (!codec->codec_tag) {
2443 if (!oc->oformat->codec_tag ||
2444 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2445 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2446 codec->codec_tag = icodec->codec_tag;
2449 codec->bit_rate = icodec->bit_rate;
2450 codec->rc_max_rate = icodec->rc_max_rate;
2451 codec->rc_buffer_size = icodec->rc_buffer_size;
2452 codec->field_order = icodec->field_order;
2453 codec->extradata = av_mallocz(extra_size);
2454 if (!codec->extradata) {
2455 return AVERROR(ENOMEM);
2457 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2458 codec->extradata_size= icodec->extradata_size;
2460 codec->time_base = ist->st->time_base;
2461 if(!strcmp(oc->oformat->name, "avi")) {
2462 if ( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
2463 && av_q2d(ist->st->time_base) < 1.0/500
2465 codec->time_base = icodec->time_base;
2466 codec->time_base.num *= icodec->ticks_per_frame;
2467 codec->time_base.den *= 2;
2469 } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
2470 && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
2471 && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
2473 if( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
2474 && av_q2d(ist->st->time_base) < 1.0/500
2476 codec->time_base = icodec->time_base;
2477 codec->time_base.num *= icodec->ticks_per_frame;
2480 av_reduce(&codec->time_base.num, &codec->time_base.den,
2481 codec->time_base.num, codec->time_base.den, INT_MAX);
2483 switch (codec->codec_type) {
2484 case AVMEDIA_TYPE_AUDIO:
2485 if (audio_volume != 256) {
2486 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2489 codec->channel_layout = icodec->channel_layout;
2490 codec->sample_rate = icodec->sample_rate;
2491 codec->channels = icodec->channels;
2492 codec->frame_size = icodec->frame_size;
2493 codec->audio_service_type = icodec->audio_service_type;
2494 codec->block_align = icodec->block_align;
2496 case AVMEDIA_TYPE_VIDEO:
2497 codec->pix_fmt = icodec->pix_fmt;
2498 codec->width = icodec->width;
2499 codec->height = icodec->height;
2500 codec->has_b_frames = icodec->has_b_frames;
2501 if (!codec->sample_aspect_ratio.num) {
2502 codec->sample_aspect_ratio =
2503 ost->st->sample_aspect_ratio =
2504 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2505 ist->st->codec->sample_aspect_ratio.num ?
2506 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2508 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
2510 case AVMEDIA_TYPE_SUBTITLE:
2511 codec->width = icodec->width;
2512 codec->height = icodec->height;
2514 case AVMEDIA_TYPE_DATA:
2515 case AVMEDIA_TYPE_ATTACHMENT:
2522 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2524 ist->decoding_needed = 1;
2525 ost->encoding_needed = 1;
2527 switch (codec->codec_type) {
2528 case AVMEDIA_TYPE_AUDIO:
2529 ost->fifo = av_fifo_alloc(1024);
2531 return AVERROR(ENOMEM);
2533 if (!codec->sample_rate)
2534 codec->sample_rate = icodec->sample_rate;
2535 choose_sample_rate(ost->st, ost->enc);
2536 codec->time_base = (AVRational){ 1, codec->sample_rate };
2538 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2539 codec->sample_fmt = icodec->sample_fmt;
2540 choose_sample_fmt(ost->st, ost->enc);
2542 if (ost->audio_channels_mapped) {
2543 /* the requested output channel is set to the number of
2544 * -map_channel only if no -ac are specified */
2545 if (!codec->channels) {
2546 codec->channels = ost->audio_channels_mapped;
2547 codec->channel_layout = av_get_default_channel_layout(codec->channels);
2548 if (!codec->channel_layout) {
2549 av_log(NULL, AV_LOG_FATAL, "Unable to find an appropriate channel layout for requested number of channel\n");
2553 /* fill unused channel mapping with -1 (which means a muted
2554 * channel in case the number of output channels is bigger
2555 * than the number of mapped channel) */
2556 for (j = ost->audio_channels_mapped; j < FF_ARRAY_ELEMS(ost->audio_channels_map); j++)
2557 ost->audio_channels_map[j] = -1;
2558 } else if (!codec->channels) {
2559 codec->channels = icodec->channels;
2560 codec->channel_layout = icodec->channel_layout;
2562 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2563 codec->channel_layout = 0;
2565 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2566 ost->audio_resample |= codec->sample_fmt != icodec->sample_fmt
2567 || codec->channel_layout != icodec->channel_layout;
2568 icodec->request_channels = codec->channels;
2569 ost->resample_sample_fmt = icodec->sample_fmt;
2570 ost->resample_sample_rate = icodec->sample_rate;
2571 ost->resample_channels = icodec->channels;
2573 case AVMEDIA_TYPE_VIDEO:
2574 if (codec->pix_fmt == PIX_FMT_NONE)
2575 codec->pix_fmt = icodec->pix_fmt;
2576 choose_pixel_fmt(ost->st, ost->enc);
2578 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2579 av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2583 if (!codec->width || !codec->height) {
2584 codec->width = icodec->width;
2585 codec->height = icodec->height;
2588 ost->video_resample = codec->width != icodec->width ||
2589 codec->height != icodec->height ||
2590 codec->pix_fmt != icodec->pix_fmt;
2591 if (ost->video_resample) {
2592 codec->bits_per_raw_sample = frame_bits_per_raw_sample;
2595 ost->resample_height = icodec->height;
2596 ost->resample_width = icodec->width;
2597 ost->resample_pix_fmt = icodec->pix_fmt;
2599 if (!ost->frame_rate.num)
2600 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational) { 25, 1 };
2601 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2602 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2603 ost->frame_rate = ost->enc->supported_framerates[idx];
2605 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2606 if ( av_q2d(codec->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
2607 && (video_sync_method == VSYNC_CFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
2608 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2609 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2611 for (j = 0; j < ost->forced_kf_count; j++)
2612 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
2617 if (configure_video_filters(ist, ost)) {
2618 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2623 case AVMEDIA_TYPE_SUBTITLE:
2630 if (codec->codec_id != CODEC_ID_H264 &&
2631 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2632 char logfilename[1024];
2635 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2636 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2638 if (codec->flags & CODEC_FLAG_PASS2) {
2640 size_t logbuffer_size;
2641 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2642 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2646 codec->stats_in = logbuffer;
2648 if (codec->flags & CODEC_FLAG_PASS1) {
2649 f = fopen(logfilename, "wb");
2651 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2652 logfilename, strerror(errno));
2659 if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2660 /* maximum video buffer size is 8-bytes per pixel, plus DPX header size (1664)*/
2661 int size = codec->width * codec->height;
2662 bit_buffer_size = FFMAX(bit_buffer_size, 9*size + 10000);
2667 bit_buffer = av_malloc(bit_buffer_size);
2669 av_log(NULL, AV_LOG_ERROR, "Cannot allocate %d bytes output buffer\n",
2671 return AVERROR(ENOMEM);
2674 /* open each encoder */
2675 for (i = 0; i < nb_output_streams; i++) {
2676 ost = &output_streams[i];
2677 if (ost->encoding_needed) {
2678 AVCodec *codec = ost->enc;
2679 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2681 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
2682 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2683 ret = AVERROR(EINVAL);
2686 if (dec->subtitle_header) {
2687 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2688 if (!ost->st->codec->subtitle_header) {
2689 ret = AVERROR(ENOMEM);
2692 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2693 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2695 if (!av_dict_get(ost->opts, "threads", NULL, 0))
2696 av_dict_set(&ost->opts, "threads", "auto", 0);
2697 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2698 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2699 ost->file_index, ost->index);
2700 ret = AVERROR(EINVAL);
2703 assert_codec_experimental(ost->st->codec, 1);
2704 assert_avoptions(ost->opts);
2705 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2706 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2707 " It takes bits/s as argument, not kbits/s\n");
2708 extra_size += ost->st->codec->extradata_size;
2710 if (ost->st->codec->me_threshold)
2711 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2715 /* init input streams */
2716 for (i = 0; i < nb_input_streams; i++)
2717 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2720 /* discard unused programs */
2721 for (i = 0; i < nb_input_files; i++) {
2722 InputFile *ifile = &input_files[i];
2723 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2724 AVProgram *p = ifile->ctx->programs[j];
2725 int discard = AVDISCARD_ALL;
2727 for (k = 0; k < p->nb_stream_indexes; k++)
2728 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2729 discard = AVDISCARD_DEFAULT;
2732 p->discard = discard;
2736 /* open files and write file headers */
2737 for (i = 0; i < nb_output_files; i++) {
2738 oc = output_files[i].ctx;
2739 oc->interrupt_callback = int_cb;
2740 if (avformat_write_header(oc, &output_files[i].opts) < 0) {
2741 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2742 ret = AVERROR(EINVAL);
2745 // assert_avoptions(output_files[i].opts);
2746 if (strcmp(oc->oformat->name, "rtp")) {
2752 /* dump the file output parameters - cannot be done before in case
2754 for (i = 0; i < nb_output_files; i++) {
2755 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2758 /* dump the stream mapping */
2759 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2760 for (i = 0; i < nb_output_streams; i++) {
2761 ost = &output_streams[i];
2763 if (ost->attachment_filename) {
2764 /* an attached file */
2765 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
2766 ost->attachment_filename, ost->file_index, ost->index);
2769 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
2770 input_streams[ost->source_index].file_index,
2771 input_streams[ost->source_index].st->index,
2774 if (ost->audio_channels_mapped) {
2775 av_log(NULL, AV_LOG_INFO, " [ch:");
2776 for (j = 0; j < ost->audio_channels_mapped; j++)
2777 if (ost->audio_channels_map[j] == -1)
2778 av_log(NULL, AV_LOG_INFO, " M");
2780 av_log(NULL, AV_LOG_INFO, " %d", ost->audio_channels_map[j]);
2781 av_log(NULL, AV_LOG_INFO, "]");
2783 if (ost->sync_ist != &input_streams[ost->source_index])
2784 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2785 ost->sync_ist->file_index,
2786 ost->sync_ist->st->index);
2787 if (ost->stream_copy)
2788 av_log(NULL, AV_LOG_INFO, " (copy)");
2790 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2791 input_streams[ost->source_index].dec->name : "?",
2792 ost->enc ? ost->enc->name : "?");
2793 av_log(NULL, AV_LOG_INFO, "\n");
2797 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2802 print_sdp(output_files, nb_output_files);
2809 * The following code is the main loop of the file converter
2811 static int transcode(OutputFile *output_files, int nb_output_files,
2812 InputFile *input_files, int nb_input_files)
2815 AVFormatContext *is, *os;
2819 int no_packet_count = 0;
2820 int64_t timer_start;
2823 if (!(no_packet = av_mallocz(nb_input_files)))
2826 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2831 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
2834 timer_start = av_gettime();
2836 for (; received_sigterm == 0;) {
2837 int file_index, ist_index;
2841 int64_t cur_time= av_gettime();
2843 ipts_min = INT64_MAX;
2845 /* if 'q' pressed, exits */
2847 static int64_t last_time;
2848 if (received_nb_signals)
2850 /* read_key() returns 0 on EOF */
2851 if(cur_time - last_time >= 100000 && !run_as_daemon){
2853 last_time = cur_time;
2858 if (key == '+') av_log_set_level(av_log_get_level()+10);
2859 if (key == '-') av_log_set_level(av_log_get_level()-10);
2860 if (key == 's') qp_hist ^= 1;
2863 do_hex_dump = do_pkt_dump = 0;
2864 } else if(do_pkt_dump){
2868 av_log_set_level(AV_LOG_DEBUG);
2871 if (key == 'c' || key == 'C'){
2872 char buf[4096], target[64], command[256], arg[256] = {0};
2875 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2877 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
2882 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
2883 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
2884 target, time, command, arg);
2885 for (i = 0; i < nb_output_streams; i++) {
2886 ost = &output_streams[i];
2889 ret = avfilter_graph_send_command(ost->graph, target, command, arg, buf, sizeof(buf),
2890 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
2891 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
2893 ret = avfilter_graph_queue_command(ost->graph, target, command, arg, 0, time);
2898 av_log(NULL, AV_LOG_ERROR,
2899 "Parse error, at least 3 arguments were expected, "
2900 "only %d given in string '%s'\n", n, buf);
2904 if (key == 'd' || key == 'D'){
2907 debug = input_streams[0].st->codec->debug<<1;
2908 if(!debug) debug = 1;
2909 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2912 if(scanf("%d", &debug)!=1)
2913 fprintf(stderr,"error parsing debug value\n");
2914 for(i=0;i<nb_input_streams;i++) {
2915 input_streams[i].st->codec->debug = debug;
2917 for(i=0;i<nb_output_streams;i++) {
2918 ost = &output_streams[i];
2919 ost->st->codec->debug = debug;
2921 if(debug) av_log_set_level(AV_LOG_DEBUG);
2922 fprintf(stderr,"debug=%d\n", debug);
2925 fprintf(stderr, "key function\n"
2926 "? show this help\n"
2927 "+ increase verbosity\n"
2928 "- decrease verbosity\n"
2929 "c Send command to filtergraph\n"
2930 "D cycle through available debug modes\n"
2931 "h dump packets/hex press to cycle through the 3 states\n"
2933 "s Show QP histogram\n"
2938 /* select the stream that we must read now by looking at the
2939 smallest output pts */
2941 for (i = 0; i < nb_output_streams; i++) {
2945 ost = &output_streams[i];
2946 of = &output_files[ost->file_index];
2947 os = output_files[ost->file_index].ctx;
2948 ist = &input_streams[ost->source_index];
2949 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2950 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2952 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2954 if (!input_files[ist->file_index].eof_reached) {
2955 if (ipts < ipts_min) {
2958 file_index = ist->file_index;
2960 if (opts < opts_min) {
2962 if (!input_sync) file_index = ist->file_index;
2965 if (ost->frame_number >= ost->max_frames) {
2967 for (j = 0; j < of->ctx->nb_streams; j++)
2968 output_streams[of->ost_index + j].is_past_recording_time = 1;
2972 /* if none, if is finished */
2973 if (file_index < 0) {
2974 if (no_packet_count) {
2975 no_packet_count = 0;
2976 memset(no_packet, 0, nb_input_files);
2983 /* read a frame from it and output it in the fifo */
2984 is = input_files[file_index].ctx;
2985 ret = av_read_frame(is, &pkt);
2986 if (ret == AVERROR(EAGAIN)) {
2987 no_packet[file_index] = 1;
2992 input_files[file_index].eof_reached = 1;
2999 no_packet_count = 0;
3000 memset(no_packet, 0, nb_input_files);
3003 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
3004 is->streams[pkt.stream_index]);
3006 /* the following test is needed in case new streams appear
3007 dynamically in stream : we ignore them */
3008 if (pkt.stream_index >= input_files[file_index].nb_streams)
3009 goto discard_packet;
3010 ist_index = input_files[file_index].ist_index + pkt.stream_index;
3011 ist = &input_streams[ist_index];
3013 goto discard_packet;
3015 if (pkt.dts != AV_NOPTS_VALUE)
3016 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3017 if (pkt.pts != AV_NOPTS_VALUE)
3018 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3020 if (pkt.pts != AV_NOPTS_VALUE)
3021 pkt.pts *= ist->ts_scale;
3022 if (pkt.dts != AV_NOPTS_VALUE)
3023 pkt.dts *= ist->ts_scale;
3025 //fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n",
3027 // pkt.dts, input_files[ist->file_index].ts_offset,
3028 // ist->st->codec->codec_type);
3029 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
3030 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
3031 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
3032 int64_t delta = pkt_dts - ist->next_pts;
3033 if((delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
3034 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
3035 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3036 pkt_dts+1<ist->pts)&& !copy_ts){
3037 input_files[ist->file_index].ts_offset -= delta;
3038 av_log(NULL, AV_LOG_DEBUG,
3039 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
3040 delta, input_files[ist->file_index].ts_offset);
3041 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3042 if (pkt.pts != AV_NOPTS_VALUE)
3043 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3047 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
3048 if (output_packet(ist, output_streams, nb_output_streams, &pkt) < 0) {
3050 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
3051 ist->file_index, ist->st->index);
3054 av_free_packet(&pkt);
3059 av_free_packet(&pkt);
3061 /* dump report by using the output first video and audio streams */
3062 print_report(output_files, output_streams, nb_output_streams, 0, timer_start, cur_time);
3065 /* at the end of stream, we must flush the decoder buffers */
3066 for (i = 0; i < nb_input_streams; i++) {
3067 ist = &input_streams[i];
3068 if (ist->decoding_needed) {
3069 output_packet(ist, output_streams, nb_output_streams, NULL);
3072 flush_encoders(output_streams, nb_output_streams);
3076 /* write the trailer if needed and close file */
3077 for (i = 0; i < nb_output_files; i++) {
3078 os = output_files[i].ctx;
3079 av_write_trailer(os);
3082 /* dump report by using the first video and audio streams */
3083 print_report(output_files, output_streams, nb_output_streams, 1, timer_start, av_gettime());
3085 /* close each encoder */
3086 for (i = 0; i < nb_output_streams; i++) {
3087 ost = &output_streams[i];
3088 if (ost->encoding_needed) {
3089 av_freep(&ost->st->codec->stats_in);
3090 avcodec_close(ost->st->codec);
3093 avfilter_graph_free(&ost->graph);
3097 /* close each decoder */
3098 for (i = 0; i < nb_input_streams; i++) {
3099 ist = &input_streams[i];
3100 if (ist->decoding_needed) {
3101 avcodec_close(ist->st->codec);
3109 av_freep(&bit_buffer);
3110 av_freep(&no_packet);
3112 if (output_streams) {
3113 for (i = 0; i < nb_output_streams; i++) {
3114 ost = &output_streams[i];
3116 if (ost->stream_copy)
3117 av_freep(&ost->st->codec->extradata);
3119 fclose(ost->logfile);
3120 ost->logfile = NULL;
3122 av_fifo_free(ost->fifo); /* works even if fifo is not
3123 initialized but set to zero */
3124 av_freep(&ost->st->codec->subtitle_header);
3125 av_free(ost->resample_frame.data[0]);
3126 av_free(ost->forced_kf_pts);
3127 if (ost->video_resample)
3128 sws_freeContext(ost->img_resample_ctx);
3129 swr_free(&ost->swr);
3130 av_dict_free(&ost->opts);
3137 static int opt_frame_crop(const char *opt, const char *arg)
3139 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
3140 return AVERROR(EINVAL);
3143 static int opt_pad(const char *opt, const char *arg)
3145 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
3149 static double parse_frame_aspect_ratio(const char *arg)
3156 p = strchr(arg, ':');
3158 x = strtol(arg, &end, 10);
3160 y = strtol(end + 1, &end, 10);
3162 ar = (double)x / (double)y;
3164 ar = strtod(arg, NULL);
3167 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
3173 static int opt_video_channel(const char *opt, const char *arg)
3175 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
3176 return opt_default("channel", arg);
3179 static int opt_video_standard(const char *opt, const char *arg)
3181 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
3182 return opt_default("standard", arg);
3185 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
3187 audio_codec_name = arg;
3188 return parse_option(o, "codec:a", arg, options);
3191 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3193 video_codec_name = arg;
3194 return parse_option(o, "codec:v", arg, options);
3197 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3199 subtitle_codec_name = arg;
3200 return parse_option(o, "codec:s", arg, options);
3203 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3205 return parse_option(o, "codec:d", arg, options);
3208 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
3210 StreamMap *m = NULL;
3211 int i, negative = 0, file_idx;
3212 int sync_file_idx = -1, sync_stream_idx = 0;
3220 map = av_strdup(arg);
3222 /* parse sync stream first, just pick first matching stream */
3223 if (sync = strchr(map, ',')) {
3225 sync_file_idx = strtol(sync + 1, &sync, 0);
3226 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3227 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
3232 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
3233 if (check_stream_specifier(input_files[sync_file_idx].ctx,
3234 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
3235 sync_stream_idx = i;
3238 if (i == input_files[sync_file_idx].nb_streams) {
3239 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
3240 "match any streams.\n", arg);
3246 file_idx = strtol(map, &p, 0);
3247 if (file_idx >= nb_input_files || file_idx < 0) {
3248 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
3252 /* disable some already defined maps */
3253 for (i = 0; i < o->nb_stream_maps; i++) {
3254 m = &o->stream_maps[i];
3255 if (file_idx == m->file_index &&
3256 check_stream_specifier(input_files[m->file_index].ctx,
3257 input_files[m->file_index].ctx->streams[m->stream_index],
3258 *p == ':' ? p + 1 : p) > 0)
3262 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
3263 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
3264 *p == ':' ? p + 1 : p) <= 0)
3266 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3267 &o->nb_stream_maps, o->nb_stream_maps + 1);
3268 m = &o->stream_maps[o->nb_stream_maps - 1];
3270 m->file_index = file_idx;
3271 m->stream_index = i;
3273 if (sync_file_idx >= 0) {
3274 m->sync_file_index = sync_file_idx;
3275 m->sync_stream_index = sync_stream_idx;
3277 m->sync_file_index = file_idx;
3278 m->sync_stream_index = i;
3283 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3291 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3293 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3294 &o->nb_attachments, o->nb_attachments + 1);
3295 o->attachments[o->nb_attachments - 1] = arg;
3299 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
3305 o->audio_channel_maps =
3306 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
3307 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
3308 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
3310 /* muted channel syntax */
3311 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
3312 if ((n == 1 || n == 3) && m->channel_idx == -1) {
3313 m->file_idx = m->stream_idx = -1;
3315 m->ofile_idx = m->ostream_idx = -1;
3320 n = sscanf(arg, "%d.%d.%d:%d.%d",
3321 &m->file_idx, &m->stream_idx, &m->channel_idx,
3322 &m->ofile_idx, &m->ostream_idx);
3324 if (n != 3 && n != 5) {
3325 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
3326 "[file.stream.channel|-1][:syncfile:syncstream]\n");
3330 if (n != 5) // only file.stream.channel specified
3331 m->ofile_idx = m->ostream_idx = -1;
3334 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
3335 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
3339 if (m->stream_idx < 0 ||
3340 m->stream_idx >= input_files[m->file_idx].nb_streams) {
3341 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
3342 m->file_idx, m->stream_idx);
3345 st = input_files[m->file_idx].ctx->streams[m->stream_idx];
3346 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
3347 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
3348 m->file_idx, m->stream_idx);
3351 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
3352 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
3353 m->file_idx, m->stream_idx, m->channel_idx);
3360 * Parse a metadata specifier in arg.
3361 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
3362 * @param index for type c/p, chapter/program index is written here
3363 * @param stream_spec for type s, the stream specifier is written here
3365 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
3373 if (*(++arg) && *arg != ':') {
3374 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
3377 *stream_spec = *arg == ':' ? arg + 1 : "";
3381 if (*(++arg) == ':')
3382 *index = strtol(++arg, NULL, 0);
3385 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
3392 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
3394 AVDictionary **meta_in = NULL;
3395 AVDictionary **meta_out = NULL;
3397 char type_in, type_out;
3398 const char *istream_spec = NULL, *ostream_spec = NULL;
3399 int idx_in = 0, idx_out = 0;
3401 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
3402 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
3404 if (type_in == 'g' || type_out == 'g')
3405 o->metadata_global_manual = 1;
3406 if (type_in == 's' || type_out == 's')
3407 o->metadata_streams_manual = 1;
3408 if (type_in == 'c' || type_out == 'c')
3409 o->metadata_chapters_manual = 1;
3411 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3412 if ((index) < 0 || (index) >= (nb_elems)) {\
3413 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
3418 #define SET_DICT(type, meta, context, index)\
3421 meta = &context->metadata;\
3424 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
3425 meta = &context->chapters[index]->metadata;\
3428 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
3429 meta = &context->programs[index]->metadata;\
3433 SET_DICT(type_in, meta_in, ic, idx_in);
3434 SET_DICT(type_out, meta_out, oc, idx_out);
3436 /* for input streams choose first matching stream */
3437 if (type_in == 's') {
3438 for (i = 0; i < ic->nb_streams; i++) {
3439 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
3440 meta_in = &ic->streams[i]->metadata;
3446 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
3451 if (type_out == 's') {
3452 for (i = 0; i < oc->nb_streams; i++) {
3453 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
3454 meta_out = &oc->streams[i]->metadata;
3455 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3460 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3465 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
3468 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
3469 struct tm time = *gmtime((time_t*)&recording_timestamp);
3470 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
3471 parse_option(o, "metadata", buf, options);
3473 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
3474 "tag instead.\n", opt);
3478 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
3480 const char *codec_string = encoder ? "encoder" : "decoder";
3484 avcodec_find_encoder_by_name(name) :
3485 avcodec_find_decoder_by_name(name);
3487 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
3490 if (codec->type != type) {
3491 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
3497 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
3499 char *codec_name = NULL;
3501 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
3503 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
3504 st->codec->codec_id = codec->id;
3507 return avcodec_find_decoder(st->codec->codec_id);
3511 * Add all the streams from the given input file to the global
3512 * list of input streams.
3514 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
3517 char *next, *codec_tag = NULL;
3519 for (i = 0; i < ic->nb_streams; i++) {
3520 AVStream *st = ic->streams[i];
3521 AVCodecContext *dec = st->codec;
3524 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3525 ist = &input_streams[nb_input_streams - 1];
3527 ist->file_index = nb_input_files;
3529 ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), ic, st);
3531 ist->ts_scale = 1.0;
3532 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
3534 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
3536 uint32_t tag = strtol(codec_tag, &next, 0);
3538 tag = AV_RL32(codec_tag);
3539 st->codec->codec_tag = tag;
3542 ist->dec = choose_decoder(o, ic, st);
3544 switch (dec->codec_type) {
3545 case AVMEDIA_TYPE_AUDIO:
3547 ist->dec = avcodec_find_decoder(dec->codec_id);
3548 if (o->audio_disable)
3549 st->discard = AVDISCARD_ALL;
3551 case AVMEDIA_TYPE_VIDEO:
3553 ist->dec = avcodec_find_decoder(dec->codec_id);
3555 dec->flags |= CODEC_FLAG_EMU_EDGE;
3558 if (o->video_disable)
3559 st->discard = AVDISCARD_ALL;
3560 else if (video_discard)
3561 st->discard = video_discard;
3563 case AVMEDIA_TYPE_DATA:
3564 if (o->data_disable)
3565 st->discard= AVDISCARD_ALL;
3567 case AVMEDIA_TYPE_SUBTITLE:
3569 ist->dec = avcodec_find_decoder(dec->codec_id);
3570 if(o->subtitle_disable)
3571 st->discard = AVDISCARD_ALL;
3573 case AVMEDIA_TYPE_ATTACHMENT:
3574 case AVMEDIA_TYPE_UNKNOWN:
3582 static void assert_file_overwrite(const char *filename)
3584 if ((!file_overwrite || no_file_overwrite) &&
3585 (strchr(filename, ':') == NULL || filename[1] == ':' ||
3586 av_strstart(filename, "file:", NULL))) {
3587 if (avio_check(filename, 0) == 0) {
3588 if (!using_stdin && (!no_file_overwrite || file_overwrite)) {
3589 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3592 signal(SIGINT, SIG_DFL);
3593 if (!read_yesno()) {
3594 av_log(0, AV_LOG_FATAL, "Not overwriting - exiting\n");
3600 av_log(0, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
3607 static void dump_attachment(AVStream *st, const char *filename)
3610 AVIOContext *out = NULL;
3611 AVDictionaryEntry *e;
3613 if (!st->codec->extradata_size) {
3614 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
3615 nb_input_files - 1, st->index);
3618 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
3619 filename = e->value;
3621 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
3622 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
3626 assert_file_overwrite(filename);
3628 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
3629 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
3634 avio_write(out, st->codec->extradata, st->codec->extradata_size);
3639 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
3641 AVFormatContext *ic;
3642 AVInputFormat *file_iformat = NULL;
3646 AVDictionary **opts;
3647 int orig_nb_streams; // number of streams before avformat_find_stream_info
3650 if (!(file_iformat = av_find_input_format(o->format))) {
3651 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
3656 if (!strcmp(filename, "-"))
3659 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3660 !strcmp(filename, "/dev/stdin");
3662 /* get default parameters from command line */
3663 ic = avformat_alloc_context();
3665 print_error(filename, AVERROR(ENOMEM));
3668 if (o->nb_audio_sample_rate) {
3669 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
3670 av_dict_set(&format_opts, "sample_rate", buf, 0);
3672 if (o->nb_audio_channels) {
3673 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
3674 av_dict_set(&format_opts, "channels", buf, 0);
3676 if (o->nb_frame_rates) {
3677 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
3679 if (o->nb_frame_sizes) {
3680 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
3682 if (o->nb_frame_pix_fmts)
3683 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
3685 ic->video_codec_id = video_codec_name ?
3686 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
3687 ic->audio_codec_id = audio_codec_name ?
3688 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
3689 ic->subtitle_codec_id= subtitle_codec_name ?
3690 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
3691 ic->flags |= AVFMT_FLAG_NONBLOCK;
3692 ic->interrupt_callback = int_cb;
3694 /* open the input file with generic avformat function */
3695 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3697 print_error(filename, err);
3700 assert_avoptions(format_opts);
3702 /* apply forced codec ids */
3703 for (i = 0; i < ic->nb_streams; i++)
3704 choose_decoder(o, ic, ic->streams[i]);
3706 /* Set AVCodecContext options for avformat_find_stream_info */
3707 opts = setup_find_stream_info_opts(ic, codec_opts);
3708 orig_nb_streams = ic->nb_streams;
3710 /* If not enough info to get the stream parameters, we decode the
3711 first frames to get it. (used in mpeg case for example) */
3712 ret = avformat_find_stream_info(ic, opts);
3714 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
3715 avformat_close_input(&ic);
3719 timestamp = o->start_time;
3720 /* add the stream start time */
3721 if (ic->start_time != AV_NOPTS_VALUE)
3722 timestamp += ic->start_time;
3724 /* if seeking requested, we execute it */
3725 if (o->start_time != 0) {
3726 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3728 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
3729 filename, (double)timestamp / AV_TIME_BASE);
3733 /* update the current parameters so that they match the one of the input stream */
3734 add_input_streams(o, ic);
3736 /* dump the file content */
3737 av_dump_format(ic, nb_input_files, filename, 0);
3739 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3740 input_files[nb_input_files - 1].ctx = ic;
3741 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3742 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3743 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3744 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
3746 for (i = 0; i < o->nb_dump_attachment; i++) {
3749 for (j = 0; j < ic->nb_streams; j++) {
3750 AVStream *st = ic->streams[j];
3752 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
3753 dump_attachment(st, o->dump_attachment[i].u.str);
3757 for (i = 0; i < orig_nb_streams; i++)
3758 av_dict_free(&opts[i]);
3761 reset_options(o, 1);
3765 static void parse_forced_key_frames(char *kf, OutputStream *ost)
3770 for (p = kf; *p; p++)
3773 ost->forced_kf_count = n;
3774 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3775 if (!ost->forced_kf_pts) {
3776 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3779 for (i = 0; i < n; i++) {
3780 p = i ? strchr(p, ',') + 1 : kf;
3781 ost->forced_kf_pts[i] = parse_time_or_die("force_key_frames", p, 1);
3785 static uint8_t *get_line(AVIOContext *s)
3791 if (avio_open_dyn_buf(&line) < 0) {
3792 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
3796 while ((c = avio_r8(s)) && c != '\n')
3799 avio_close_dyn_buf(line, &buf);
3804 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
3807 char filename[1000];
3808 const char *base[3] = { getenv("AVCONV_DATADIR"),
3813 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
3817 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
3818 i != 1 ? "" : "/.avconv", codec_name, preset_name);
3819 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3822 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
3823 i != 1 ? "" : "/.avconv", preset_name);
3824 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3830 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
3832 char *codec_name = NULL;
3834 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
3836 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
3837 NULL, ost->st->codec->codec_type);
3838 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
3839 } else if (!strcmp(codec_name, "copy"))
3840 ost->stream_copy = 1;
3842 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
3843 ost->st->codec->codec_id = ost->enc->id;
3847 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3850 AVStream *st = avformat_new_stream(oc, NULL);
3851 int idx = oc->nb_streams - 1, ret = 0;
3852 char *bsf = NULL, *next, *codec_tag = NULL;
3853 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3855 char *buf = NULL, *arg = NULL, *preset = NULL;
3856 AVIOContext *s = NULL;
3859 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3863 if (oc->nb_streams - 1 < o->nb_streamid_map)
3864 st->id = o->streamid_map[oc->nb_streams - 1];
3866 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3867 nb_output_streams + 1);
3868 ost = &output_streams[nb_output_streams - 1];
3869 ost->file_index = nb_output_files;
3872 st->codec->codec_type = type;
3873 choose_encoder(o, oc, ost);
3875 ost->opts = filter_codec_opts(codec_opts, ost->enc, oc, st);
3878 avcodec_get_context_defaults3(st->codec, ost->enc);
3879 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3881 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
3882 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
3885 if (!buf[0] || buf[0] == '#') {
3889 if (!(arg = strchr(buf, '='))) {
3890 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
3894 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
3896 } while (!s->eof_reached);
3900 av_log(NULL, AV_LOG_FATAL,
3901 "Preset %s specified for stream %d:%d, but could not be opened.\n",
3902 preset, ost->file_index, ost->index);
3906 ost->max_frames = INT64_MAX;
3907 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
3909 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3911 if (next = strchr(bsf, ','))
3913 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3914 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3918 bsfc_prev->next = bsfc;
3920 ost->bitstream_filters = bsfc;
3926 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3928 uint32_t tag = strtol(codec_tag, &next, 0);
3930 tag = AV_RL32(codec_tag);
3931 st->codec->codec_tag = tag;
3934 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3935 if (qscale >= 0 || same_quant) {
3936 st->codec->flags |= CODEC_FLAG_QSCALE;
3937 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3940 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
3941 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3943 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3947 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3950 const char *p = str;
3957 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3964 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3968 AVCodecContext *video_enc;
3970 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3972 video_enc = st->codec;
3974 if (!ost->stream_copy) {
3975 const char *p = NULL;
3976 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3977 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3978 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3981 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3982 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3983 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3987 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3988 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3989 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3993 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3994 if (frame_aspect_ratio)
3995 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3997 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3998 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3999 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
4000 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
4003 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
4006 video_enc->gop_size = 0;
4007 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
4009 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
4010 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
4013 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
4015 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
4017 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
4018 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
4021 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
4024 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
4025 for (i = 0; p; i++) {
4027 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
4029 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
4032 /* FIXME realloc failure */
4033 video_enc->rc_override =
4034 av_realloc(video_enc->rc_override,
4035 sizeof(RcOverride) * (i + 1));
4036 video_enc->rc_override[i].start_frame = start;
4037 video_enc->rc_override[i].end_frame = end;
4039 video_enc->rc_override[i].qscale = q;
4040 video_enc->rc_override[i].quality_factor = 1.0;
4043 video_enc->rc_override[i].qscale = 0;
4044 video_enc->rc_override[i].quality_factor = -q/100.0;
4049 video_enc->rc_override_count = i;
4050 if (!video_enc->rc_initial_buffer_occupancy)
4051 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
4052 video_enc->intra_dc_precision = intra_dc_precision - 8;
4055 video_enc->flags|= CODEC_FLAG_PSNR;
4060 video_enc->flags |= CODEC_FLAG_PASS1;
4063 video_enc->flags |= CODEC_FLAG_PASS2;
4067 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
4068 if (forced_key_frames)
4069 parse_forced_key_frames(forced_key_frames, ost);
4071 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
4073 ost->top_field_first = -1;
4074 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
4077 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4079 ost->avfilter = av_strdup(filters);
4082 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
4088 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
4093 AVCodecContext *audio_enc;
4095 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
4098 audio_enc = st->codec;
4099 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
4101 if (!ost->stream_copy) {
4102 char *sample_fmt = NULL;
4104 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
4106 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
4108 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
4109 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
4113 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
4115 ost->rematrix_volume=1.0;
4116 MATCH_PER_STREAM_OPT(rematrix_volume, f, ost->rematrix_volume, oc, st);
4119 /* check for channel mapping for this audio stream */
4120 for (n = 0; n < o->nb_audio_channel_maps; n++) {
4121 AudioChannelMap *map = &o->audio_channel_maps[n];
4122 InputStream *ist = &input_streams[ost->source_index];
4123 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
4124 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
4125 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
4126 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
4127 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
4129 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
4130 ost->file_index, ost->st->index);
4137 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
4141 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
4142 if (!ost->stream_copy) {
4143 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
4150 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
4152 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
4153 ost->stream_copy = 1;
4157 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
4161 AVCodecContext *subtitle_enc;
4163 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
4165 subtitle_enc = st->codec;
4167 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
4172 /* arg format is "output-stream-index:streamid-value". */
4173 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
4179 av_strlcpy(idx_str, arg, sizeof(idx_str));
4180 p = strchr(idx_str, ':');
4182 av_log(NULL, AV_LOG_FATAL,
4183 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
4188 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
4189 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
4190 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
4194 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
4196 AVFormatContext *is = ifile->ctx;
4197 AVFormatContext *os = ofile->ctx;
4200 for (i = 0; i < is->nb_chapters; i++) {
4201 AVChapter *in_ch = is->chapters[i], *out_ch;
4202 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
4203 AV_TIME_BASE_Q, in_ch->time_base);
4204 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
4205 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
4208 if (in_ch->end < ts_off)
4210 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
4213 out_ch = av_mallocz(sizeof(AVChapter));
4215 return AVERROR(ENOMEM);
4217 out_ch->id = in_ch->id;
4218 out_ch->time_base = in_ch->time_base;
4219 out_ch->start = FFMAX(0, in_ch->start - ts_off);
4220 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
4223 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
4226 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
4228 return AVERROR(ENOMEM);
4229 os->chapters[os->nb_chapters - 1] = out_ch;
4234 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
4237 AVFormatContext *ic = avformat_alloc_context();
4239 ic->interrupt_callback = int_cb;
4240 err = avformat_open_input(&ic, filename, NULL, NULL);
4243 /* copy stream format */
4244 for(i=0;i<ic->nb_streams;i++) {
4248 AVCodecContext *avctx;
4250 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
4251 ost = new_output_stream(o, s, codec->type);
4256 // FIXME: a more elegant solution is needed
4257 memcpy(st, ic->streams[i], sizeof(AVStream));
4258 st->info = av_malloc(sizeof(*st->info));
4259 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
4261 avcodec_copy_context(st->codec, ic->streams[i]->codec);
4263 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
4264 choose_sample_fmt(st, codec);
4265 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
4266 choose_pixel_fmt(st, codec);
4269 avformat_close_input(&ic);
4273 static void opt_output_file(void *optctx, const char *filename)
4275 OptionsContext *o = optctx;
4276 AVFormatContext *oc;
4278 AVOutputFormat *file_oformat;
4282 if (!strcmp(filename, "-"))
4285 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
4287 print_error(filename, err);
4290 file_oformat= oc->oformat;
4291 oc->interrupt_callback = int_cb;
4293 if (!strcmp(file_oformat->name, "ffm") &&
4294 av_strstart(filename, "http:", NULL)) {
4296 /* special case for files sent to ffserver: we get the stream
4297 parameters from ffserver */
4298 int err = read_ffserver_streams(o, oc, filename);
4300 print_error(filename, err);
4303 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
4304 ost = &output_streams[j];
4305 for (i = 0; i < nb_input_streams; i++) {
4306 ist = &input_streams[i];
4307 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
4309 ost->source_index= i;
4315 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));
4319 } else if (!o->nb_stream_maps) {
4320 /* pick the "best" stream of each type */
4321 #define NEW_STREAM(type, index)\
4323 ost = new_ ## type ## _stream(o, oc);\
4324 ost->source_index = index;\
4325 ost->sync_ist = &input_streams[index];\
4326 input_streams[index].discard = 0;\
4329 /* video: highest resolution */
4330 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
4331 int area = 0, idx = -1;
4332 for (i = 0; i < nb_input_streams; i++) {
4333 ist = &input_streams[i];
4334 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
4335 ist->st->codec->width * ist->st->codec->height > area) {
4336 area = ist->st->codec->width * ist->st->codec->height;
4340 NEW_STREAM(video, idx);
4343 /* audio: most channels */
4344 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
4345 int channels = 0, idx = -1;
4346 for (i = 0; i < nb_input_streams; i++) {
4347 ist = &input_streams[i];
4348 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
4349 ist->st->codec->channels > channels) {
4350 channels = ist->st->codec->channels;
4354 NEW_STREAM(audio, idx);
4357 /* subtitles: pick first */
4358 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
4359 for (i = 0; i < nb_input_streams; i++)
4360 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
4361 NEW_STREAM(subtitle, i);
4365 /* do something with data? */
4367 for (i = 0; i < o->nb_stream_maps; i++) {
4368 StreamMap *map = &o->stream_maps[i];
4373 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
4374 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
4376 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
4378 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
4380 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
4383 switch (ist->st->codec->codec_type) {
4384 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
4385 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
4386 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
4387 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
4388 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
4390 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
4391 map->file_index, map->stream_index);
4395 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
4396 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
4397 map->sync_stream_index];
4402 /* handle attached files */
4403 for (i = 0; i < o->nb_attachments; i++) {
4405 uint8_t *attachment;
4409 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
4410 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
4414 if ((len = avio_size(pb)) <= 0) {
4415 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
4419 if (!(attachment = av_malloc(len))) {
4420 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
4424 avio_read(pb, attachment, len);
4426 ost = new_attachment_stream(o, oc);
4427 ost->stream_copy = 0;
4428 ost->source_index = -1;
4429 ost->attachment_filename = o->attachments[i];
4430 ost->st->codec->extradata = attachment;
4431 ost->st->codec->extradata_size = len;
4433 p = strrchr(o->attachments[i], '/');
4434 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
4438 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
4439 output_files[nb_output_files - 1].ctx = oc;
4440 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
4441 output_files[nb_output_files - 1].recording_time = o->recording_time;
4442 output_files[nb_output_files - 1].start_time = o->start_time;
4443 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
4444 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
4446 /* check filename in case of an image number is expected */
4447 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
4448 if (!av_filename_number_test(oc->filename)) {
4449 print_error(oc->filename, AVERROR(EINVAL));
4454 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
4455 /* test if it already exists to avoid losing precious files */
4456 assert_file_overwrite(filename);
4459 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
4460 &oc->interrupt_callback,
4461 &output_files[nb_output_files - 1].opts)) < 0) {
4462 print_error(filename, err);
4467 if (o->mux_preload) {
4469 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
4470 av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
4472 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
4475 for (i = 0; i < o->nb_metadata_map; i++) {
4477 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
4479 if (in_file_index < 0)
4481 if (in_file_index >= nb_input_files) {
4482 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
4485 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, input_files[in_file_index].ctx, o);
4489 if (o->chapters_input_file >= nb_input_files) {
4490 if (o->chapters_input_file == INT_MAX) {
4491 /* copy chapters from the first input file that has them*/
4492 o->chapters_input_file = -1;
4493 for (i = 0; i < nb_input_files; i++)
4494 if (input_files[i].ctx->nb_chapters) {
4495 o->chapters_input_file = i;
4499 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
4500 o->chapters_input_file);
4504 if (o->chapters_input_file >= 0)
4505 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
4506 !o->metadata_chapters_manual);
4508 /* copy global metadata by default */
4509 if (!o->metadata_global_manual && nb_input_files){
4510 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
4511 AV_DICT_DONT_OVERWRITE);
4512 if(o->recording_time != INT64_MAX)
4513 av_dict_set(&oc->metadata, "duration", NULL, 0);
4515 if (!o->metadata_streams_manual)
4516 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
4518 if (output_streams[i].source_index < 0) /* this is true e.g. for attached files */
4520 ist = &input_streams[output_streams[i].source_index];
4521 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
4524 /* process manually set metadata */
4525 for (i = 0; i < o->nb_metadata; i++) {
4528 const char *stream_spec;
4529 int index = 0, j, ret = 0;
4531 val = strchr(o->metadata[i].u.str, '=');
4533 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
4534 o->metadata[i].u.str);
4539 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
4541 for (j = 0; j < oc->nb_streams; j++) {
4542 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
4543 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
4547 printf("ret %d, stream_spec %s\n", ret, stream_spec);
4555 if (index < 0 || index >= oc->nb_chapters) {
4556 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
4559 m = &oc->chapters[index]->metadata;
4562 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
4565 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
4569 reset_options(o, 0);
4572 /* same option as mencoder */
4573 static int opt_pass(const char *opt, const char *arg)
4575 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
4579 static int64_t getutime(void)
4582 struct rusage rusage;
4584 getrusage(RUSAGE_SELF, &rusage);
4585 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4586 #elif HAVE_GETPROCESSTIMES
4588 FILETIME c, e, k, u;
4589 proc = GetCurrentProcess();
4590 GetProcessTimes(proc, &c, &e, &k, &u);
4591 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4593 return av_gettime();
4597 static int64_t getmaxrss(void)
4599 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4600 struct rusage rusage;
4601 getrusage(RUSAGE_SELF, &rusage);
4602 return (int64_t)rusage.ru_maxrss * 1024;
4603 #elif HAVE_GETPROCESSMEMORYINFO
4605 PROCESS_MEMORY_COUNTERS memcounters;
4606 proc = GetCurrentProcess();
4607 memcounters.cb = sizeof(memcounters);
4608 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4609 return memcounters.PeakPagefileUsage;
4615 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
4617 return parse_option(o, "q:a", arg, options);
4620 static void show_usage(void)
4622 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
4623 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
4624 av_log(NULL, AV_LOG_INFO, "\n");
4627 static int opt_help(const char *opt, const char *arg)
4629 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
4630 av_log_set_callback(log_callback_help);
4632 show_help_options(options, "Main options:\n",
4633 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4634 show_help_options(options, "\nAdvanced options:\n",
4635 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4637 show_help_options(options, "\nVideo options:\n",
4638 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4640 show_help_options(options, "\nAdvanced Video options:\n",
4641 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4642 OPT_VIDEO | OPT_EXPERT);
4643 show_help_options(options, "\nAudio options:\n",
4644 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4646 show_help_options(options, "\nAdvanced Audio options:\n",
4647 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4648 OPT_AUDIO | OPT_EXPERT);
4649 show_help_options(options, "\nSubtitle options:\n",
4650 OPT_SUBTITLE | OPT_GRAB,
4652 show_help_options(options, "\nAudio/Video grab options:\n",
4656 show_help_children(avcodec_get_class(), flags);
4657 show_help_children(avformat_get_class(), flags);
4658 show_help_children(sws_get_class(), flags);
4663 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
4665 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4666 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
4668 if (!strncmp(arg, "pal-", 4)) {
4671 } else if (!strncmp(arg, "ntsc-", 5)) {
4674 } else if (!strncmp(arg, "film-", 5)) {
4678 /* Try to determine PAL/NTSC by peeking in the input files */
4679 if (nb_input_files) {
4681 for (j = 0; j < nb_input_files; j++) {
4682 for (i = 0; i < input_files[j].nb_streams; i++) {
4683 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4684 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
4686 fr = c->time_base.den * 1000 / c->time_base.num;
4690 } else if ((fr == 29970) || (fr == 23976)) {
4695 if (norm != UNKNOWN)
4699 if (norm != UNKNOWN)
4700 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4703 if (norm == UNKNOWN) {
4704 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4705 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4706 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
4710 if (!strcmp(arg, "vcd")) {
4711 opt_video_codec(o, "c:v", "mpeg1video");
4712 opt_audio_codec(o, "c:a", "mp2");
4713 parse_option(o, "f", "vcd", options);
4715 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
4716 parse_option(o, "r", frame_rates[norm], options);
4717 opt_default("g", norm == PAL ? "15" : "18");
4719 opt_default("b:v", "1150000");
4720 opt_default("maxrate", "1150000");
4721 opt_default("minrate", "1150000");
4722 opt_default("bufsize", "327680"); // 40*1024*8;
4724 opt_default("b:a", "224000");
4725 parse_option(o, "ar", "44100", options);
4726 parse_option(o, "ac", "2", options);
4728 opt_default("packetsize", "2324");
4729 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4731 /* We have to offset the PTS, so that it is consistent with the SCR.
4732 SCR starts at 36000, but the first two packs contain only padding
4733 and the first pack from the other stream, respectively, may also have
4734 been written before.
4735 So the real data starts at SCR 36000+3*1200. */
4736 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
4737 } else if (!strcmp(arg, "svcd")) {
4739 opt_video_codec(o, "c:v", "mpeg2video");
4740 opt_audio_codec(o, "c:a", "mp2");
4741 parse_option(o, "f", "svcd", options);
4743 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
4744 parse_option(o, "r", frame_rates[norm], options);
4745 parse_option(o, "pix_fmt", "yuv420p", options);
4746 opt_default("g", norm == PAL ? "15" : "18");
4748 opt_default("b:v", "2040000");
4749 opt_default("maxrate", "2516000");
4750 opt_default("minrate", "0"); // 1145000;
4751 opt_default("bufsize", "1835008"); // 224*1024*8;
4752 opt_default("flags", "+scan_offset");
4755 opt_default("b:a", "224000");
4756 parse_option(o, "ar", "44100", options);
4758 opt_default("packetsize", "2324");
4760 } else if (!strcmp(arg, "dvd")) {
4762 opt_video_codec(o, "c:v", "mpeg2video");
4763 opt_audio_codec(o, "c:a", "ac3");
4764 parse_option(o, "f", "dvd", options);
4766 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4767 parse_option(o, "r", frame_rates[norm], options);
4768 parse_option(o, "pix_fmt", "yuv420p", options);
4769 opt_default("g", norm == PAL ? "15" : "18");
4771 opt_default("b:v", "6000000");
4772 opt_default("maxrate", "9000000");
4773 opt_default("minrate", "0"); // 1500000;
4774 opt_default("bufsize", "1835008"); // 224*1024*8;
4776 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4777 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4779 opt_default("b:a", "448000");
4780 parse_option(o, "ar", "48000", options);
4782 } else if (!strncmp(arg, "dv", 2)) {
4784 parse_option(o, "f", "dv", options);
4786 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4787 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4788 norm == PAL ? "yuv420p" : "yuv411p", options);
4789 parse_option(o, "r", frame_rates[norm], options);
4791 parse_option(o, "ar", "48000", options);
4792 parse_option(o, "ac", "2", options);
4795 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
4796 return AVERROR(EINVAL);
4801 static int opt_vstats_file(const char *opt, const char *arg)
4803 av_free (vstats_filename);
4804 vstats_filename = av_strdup (arg);
4808 static int opt_vstats(const char *opt, const char *arg)
4811 time_t today2 = time(NULL);
4812 struct tm *today = localtime(&today2);
4814 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4816 return opt_vstats_file(opt, filename);
4819 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4821 return parse_option(o, "frames:v", arg, options);
4824 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4826 return parse_option(o, "frames:a", arg, options);
4829 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4831 return parse_option(o, "frames:d", arg, options);
4834 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
4837 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4838 const char *codec_name = *opt == 'v' ? video_codec_name :
4839 *opt == 'a' ? audio_codec_name :
4840 subtitle_codec_name;
4842 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4843 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
4844 av_log(0, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
4846 av_log(0, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
4851 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4852 if(line[0] == '#' && !e)
4854 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4856 av_log(0, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
4859 if(!strcmp(tmp, "acodec")){
4860 opt_audio_codec(o, tmp, tmp2);
4861 }else if(!strcmp(tmp, "vcodec")){
4862 opt_video_codec(o, tmp, tmp2);
4863 }else if(!strcmp(tmp, "scodec")){
4864 opt_subtitle_codec(o, tmp, tmp2);
4865 }else if(!strcmp(tmp, "dcodec")){
4866 opt_data_codec(o, tmp, tmp2);
4867 }else if(opt_default(tmp, tmp2) < 0){
4868 av_log(0, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4878 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
4882 static int opt_passlogfile(const char *opt, const char *arg)
4884 pass_logfilename_prefix = arg;
4885 #if CONFIG_LIBX264_ENCODER
4886 return opt_default("passlogfile", arg);
4892 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
4894 char *s = av_asprintf("%s:%c", opt + 1, *opt);
4895 int ret = parse_option(o, s, arg, options);
4900 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
4902 if(!strcmp(opt, "b")){
4903 av_log(0,AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
4904 return parse_option(o, "b:v", arg, options);
4906 return opt_default(opt, arg);
4909 static int opt_qscale(OptionsContext *o, const char *opt, const char *arg)
4913 if(!strcmp(opt, "qscale")){
4914 av_log(0,AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
4915 return parse_option(o, "q:v", arg, options);
4917 s = av_asprintf("q%s", opt + 6);
4918 ret = parse_option(o, s, arg, options);
4923 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4925 return parse_option(o, "filter:v", arg, options);
4928 static int opt_vsync(const char *opt, const char *arg)
4930 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
4931 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
4932 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
4933 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
4935 if (video_sync_method == VSYNC_AUTO)
4936 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
4940 #define OFFSET(x) offsetof(OptionsContext, x)
4941 static const OptionDef options[] = {
4943 #include "cmdutils_common_opts.h"
4944 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4945 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4946 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4947 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
4948 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4949 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4950 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
4951 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
4952 { "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]" },
4953 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
4954 "outfile[,metadata]:infile[,metadata]" },
4955 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4956 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4957 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4958 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4959 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4960 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4961 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4962 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4963 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4964 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4965 "add timings for benchmarking" },
4966 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4967 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4968 "dump each input packet" },
4969 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4970 "when dumping packets, also dump the payload" },
4971 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4972 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4973 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
4974 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4975 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4976 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4977 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying", "source" },
4978 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4979 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4980 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4981 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
4982 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4983 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4984 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4985 { "qscale", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_qscale}, "use fixed quality scale (VBR)", "q" },
4987 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4989 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
4990 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
4991 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
4994 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4995 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4996 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4997 { "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" },
4998 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4999 { "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" },
5000 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5001 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5002 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5003 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5004 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5005 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5006 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5007 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5008 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
5009 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
5010 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
5011 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
5012 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
5013 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
5014 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
5015 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
5016 "use same quantizer as source (implies VBR)" },
5017 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
5018 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
5019 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
5020 "deinterlace pictures" },
5021 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
5022 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
5023 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
5025 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
5027 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
5028 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
5029 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
5030 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
5031 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
5032 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
5033 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
5034 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
5035 { "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" },
5036 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
5039 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
5040 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
5041 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
5042 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
5043 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
5044 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
5045 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
5046 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
5047 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
5048 { "rmvol", HAS_ARG | OPT_AUDIO | OPT_FLOAT | OPT_SPEC, {.off = OFFSET(rematrix_volume)}, "rematrix volume (as factor)", "volume" },
5050 /* subtitle options */
5051 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
5052 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
5053 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
5056 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
5057 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
5058 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
5061 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
5062 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
5064 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
5065 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
5066 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
5068 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
5069 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
5070 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
5071 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
5072 /* data codec support */
5073 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
5074 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
5076 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
5080 int main(int argc, char **argv)
5082 OptionsContext o = { 0 };
5085 reset_options(&o, 0);
5087 av_log_set_flags(AV_LOG_SKIP_REPEATED);
5088 parse_loglevel(argc, argv, options);
5090 if(argc>1 && !strcmp(argv[1], "-d")){
5092 av_log_set_callback(log_callback_null);
5097 avcodec_register_all();
5099 avdevice_register_all();
5102 avfilter_register_all();
5105 avformat_network_init();
5107 show_banner(argc, argv, options);
5112 parse_options(&o, argc, argv, options, opt_output_file);
5114 if (nb_output_files <= 0 && nb_input_files == 0) {
5116 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
5120 /* file converter / grab */
5121 if (nb_output_files <= 0) {
5122 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
5126 if (nb_input_files == 0) {
5127 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
5132 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
5134 ti = getutime() - ti;
5136 int maxrss = getmaxrss() / 1024;
5137 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);