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; /* filesize limit expressed in bytes */
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 pkt->stream_index = ost->index;
1028 ret = av_interleaved_write_frame(s, pkt);
1030 print_error("av_interleaved_write_frame()", ret);
1035 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1037 int fill_char = 0x00;
1038 if (sample_fmt == AV_SAMPLE_FMT_U8)
1040 memset(buf, fill_char, size);
1043 static int encode_audio_frame(AVFormatContext *s, OutputStream *ost,
1044 const uint8_t *buf, int buf_size)
1046 AVCodecContext *enc = ost->st->codec;
1047 AVFrame *frame = NULL;
1049 int ret, got_packet;
1051 av_init_packet(&pkt);
1056 if (!ost->output_frame) {
1057 ost->output_frame = avcodec_alloc_frame();
1058 if (!ost->output_frame) {
1059 av_log(NULL, AV_LOG_FATAL, "out-of-memory in encode_audio_frame()\n");
1063 frame = ost->output_frame;
1064 if (frame->extended_data != frame->data)
1065 av_freep(&frame->extended_data);
1066 avcodec_get_frame_defaults(frame);
1068 frame->nb_samples = buf_size /
1069 (enc->channels * av_get_bytes_per_sample(enc->sample_fmt));
1070 if ((ret = avcodec_fill_audio_frame(frame, enc->channels, enc->sample_fmt,
1071 buf, buf_size, 1)) < 0) {
1072 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1078 if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
1079 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
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 || ost->audio_channels_mapped) {
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.data = subtitle_out;
1367 pkt.size = subtitle_out_size;
1368 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1369 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1370 /* XXX: the pts correction is handled here. Maybe handling
1371 it in the codec would be better */
1373 pkt.pts += 90 * sub->start_display_time;
1375 pkt.pts += 90 * sub->end_display_time;
1377 write_frame(s, &pkt, ost);
1381 static int bit_buffer_size = 1024 * 256;
1382 static uint8_t *bit_buffer = NULL;
1384 static void do_video_resample(OutputStream *ost,
1386 AVFrame *in_picture,
1387 AVFrame **out_picture)
1390 *out_picture = in_picture;
1392 AVCodecContext *dec = ist->st->codec;
1393 AVCodecContext *enc = ost->st->codec;
1394 int resample_changed = ost->resample_width != in_picture->width ||
1395 ost->resample_height != in_picture->height ||
1396 ost->resample_pix_fmt != in_picture->format;
1398 *out_picture = in_picture;
1399 if (resample_changed) {
1400 av_log(NULL, AV_LOG_INFO,
1401 "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",
1402 ist->file_index, ist->st->index,
1403 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1404 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt),
1405 in_picture->width, in_picture->height, av_get_pix_fmt_name(in_picture->format));
1406 ost->resample_width = in_picture->width;
1407 ost->resample_height = in_picture->height;
1408 ost->resample_pix_fmt = in_picture->format;
1411 ost->video_resample = in_picture->width != enc->width ||
1412 in_picture->height != enc->height ||
1413 in_picture->format != enc->pix_fmt;
1415 if (ost->video_resample) {
1416 *out_picture = &ost->resample_frame;
1417 if (!ost->img_resample_ctx || resample_changed) {
1418 /* initialize the destination picture */
1419 if (!ost->resample_frame.data[0]) {
1420 avcodec_get_frame_defaults(&ost->resample_frame);
1421 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1422 enc->width, enc->height)) {
1423 av_log(NULL, AV_LOG_FATAL, "Cannot allocate temp picture, check pix fmt\n");
1427 /* initialize a new scaler context */
1428 sws_freeContext(ost->img_resample_ctx);
1429 ost->img_resample_ctx = sws_getContext(in_picture->width, in_picture->height, in_picture->format,
1430 enc->width, enc->height, enc->pix_fmt,
1431 ost->sws_flags, NULL, NULL, NULL);
1432 if (ost->img_resample_ctx == NULL) {
1433 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1437 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1438 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1444 static void do_video_out(AVFormatContext *s,
1447 AVFrame *in_picture,
1448 int *frame_size, float quality)
1450 int nb_frames, i, ret, format_video_sync;
1451 AVFrame *final_picture;
1452 AVCodecContext *enc;
1454 double duration = 0;
1456 enc = ost->st->codec;
1458 if (ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE) {
1459 duration = FFMAX(av_q2d(ist->st->time_base), av_q2d(ist->st->codec->time_base));
1460 if(ist->st->avg_frame_rate.num)
1461 duration= FFMAX(duration, 1/av_q2d(ist->st->avg_frame_rate));
1463 duration /= av_q2d(enc->time_base);
1466 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1468 /* by default, we output a single frame */
1473 format_video_sync = video_sync_method;
1474 if (format_video_sync == VSYNC_AUTO)
1475 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
1477 if (format_video_sync != VSYNC_PASSTHROUGH && format_video_sync != VSYNC_DROP) {
1478 double vdelta = sync_ipts - ost->sync_opts + duration;
1479 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1482 else if (format_video_sync == VSYNC_VFR) {
1483 if (vdelta <= -0.6) {
1485 } else if (vdelta > 0.6)
1486 ost->sync_opts = lrintf(sync_ipts);
1487 } else if (vdelta > 1.1)
1488 nb_frames = lrintf(vdelta);
1489 if (nb_frames == 0) {
1491 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1492 } else if (nb_frames > 1) {
1493 nb_frames_dup += nb_frames - 1;
1494 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1497 ost->sync_opts = lrintf(sync_ipts);
1499 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1503 do_video_resample(ost, ist, in_picture, &final_picture);
1505 /* duplicates frame if needed */
1506 for (i = 0; i < nb_frames; i++) {
1508 av_init_packet(&pkt);
1510 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1511 enc->codec->id == CODEC_ID_RAWVIDEO) {
1512 /* raw pictures are written as AVPicture structure to
1513 avoid any copies. We support temporarily the older
1515 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1516 enc->coded_frame->top_field_first = in_picture->top_field_first;
1517 pkt.data = (uint8_t *)final_picture;
1518 pkt.size = sizeof(AVPicture);
1519 pkt.pts = av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1520 pkt.flags |= AV_PKT_FLAG_KEY;
1522 write_frame(s, &pkt, ost);
1524 AVFrame big_picture;
1526 big_picture = *final_picture;
1527 /* better than nothing: use input picture interlaced
1529 big_picture.interlaced_frame = in_picture->interlaced_frame;
1530 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1531 if (ost->top_field_first == -1)
1532 big_picture.top_field_first = in_picture->top_field_first;
1534 big_picture.top_field_first = !!ost->top_field_first;
1537 /* handles same_quant here. This is not correct because it may
1538 not be a global option */
1539 big_picture.quality = quality;
1540 if (!enc->me_threshold)
1541 big_picture.pict_type = 0;
1542 big_picture.pts = ost->sync_opts;
1543 if (ost->forced_kf_index < ost->forced_kf_count &&
1544 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1545 big_picture.pict_type = AV_PICTURE_TYPE_I;
1546 ost->forced_kf_index++;
1548 ret = avcodec_encode_video(enc,
1549 bit_buffer, bit_buffer_size,
1552 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1557 pkt.data = bit_buffer;
1559 if (!(enc->codec->capabilities & CODEC_CAP_DELAY))
1560 pkt.pts = av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1561 if (enc->coded_frame->pts != AV_NOPTS_VALUE)
1562 pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1564 if (enc->coded_frame->key_frame)
1565 pkt.flags |= AV_PKT_FLAG_KEY;
1566 if (format_video_sync == VSYNC_DROP)
1567 pkt.pts = pkt.dts = AV_NOPTS_VALUE;
1568 write_frame(s, &pkt, ost);
1572 /* if two pass, output log */
1573 if (ost->logfile && enc->stats_out) {
1574 fprintf(ost->logfile, "%s", enc->stats_out);
1580 * For video, number of frames in == number of packets out.
1581 * But there may be reordering, so we can't throw away frames on encoder
1582 * flush, we need to limit them here, before they go into encoder.
1584 ost->frame_number++;
1588 static double psnr(double d)
1590 return -10.0 * log(d) / log(10.0);
1593 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1596 AVCodecContext *enc;
1598 double ti1, bitrate, avg_bitrate;
1600 /* this is executed just the first time do_video_stats is called */
1602 vstats_file = fopen(vstats_filename, "w");
1609 enc = ost->st->codec;
1610 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1611 frame_number = ost->frame_number;
1612 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1613 if (enc->flags&CODEC_FLAG_PSNR)
1614 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1616 fprintf(vstats_file,"f_size= %6d ", frame_size);
1617 /* compute pts value */
1618 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1622 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1623 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1624 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1625 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1626 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1630 static void print_report(OutputFile *output_files,
1631 OutputStream *ost_table, int nb_ostreams,
1632 int is_last_report, int64_t timer_start, int64_t cur_time)
1636 AVFormatContext *oc;
1638 AVCodecContext *enc;
1639 int frame_number, vid, i;
1641 int64_t pts = INT64_MAX;
1642 static int64_t last_time = -1;
1643 static int qp_histogram[52];
1644 int hours, mins, secs, us;
1646 if (!print_stats && !is_last_report)
1649 if (!is_last_report) {
1650 if (last_time == -1) {
1651 last_time = cur_time;
1654 if ((cur_time - last_time) < 500000)
1656 last_time = cur_time;
1660 oc = output_files[0].ctx;
1662 total_size = avio_size(oc->pb);
1663 if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
1664 total_size = avio_tell(oc->pb);
1671 for (i = 0; i < nb_ostreams; i++) {
1673 ost = &ost_table[i];
1674 enc = ost->st->codec;
1675 if (!ost->stream_copy && enc->coded_frame)
1676 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
1677 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1678 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1680 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1681 float t = (cur_time-timer_start) / 1000000.0;
1683 frame_number = ost->frame_number;
1684 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1685 frame_number, (t > 1) ? (int)(frame_number / t + 0.5) : 0, q);
1687 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1691 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
1693 for (j = 0; j < 32; j++)
1694 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
1696 if (enc->flags&CODEC_FLAG_PSNR) {
1698 double error, error_sum = 0;
1699 double scale, scale_sum = 0;
1700 char type[3] = { 'Y','U','V' };
1701 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1702 for (j = 0; j < 3; j++) {
1703 if (is_last_report) {
1704 error = enc->error[j];
1705 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
1707 error = enc->coded_frame->error[j];
1708 scale = enc->width * enc->height * 255.0 * 255.0;
1714 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error / scale));
1716 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
1720 /* compute min output value */
1721 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1722 ost->st->time_base, AV_TIME_BASE_Q));
1725 secs = pts / AV_TIME_BASE;
1726 us = pts % AV_TIME_BASE;
1732 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1734 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1735 "size=%8.0fkB time=", total_size / 1024.0);
1736 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1737 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1738 (100 * us) / AV_TIME_BASE);
1739 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1740 "bitrate=%6.1fkbits/s", bitrate);
1742 if (nb_frames_dup || nb_frames_drop)
1743 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1744 nb_frames_dup, nb_frames_drop);
1746 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
1750 if (is_last_report) {
1751 int64_t raw= audio_size + video_size + extra_size;
1752 av_log(NULL, AV_LOG_INFO, "\n");
1753 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1754 video_size / 1024.0,
1755 audio_size / 1024.0,
1756 extra_size / 1024.0,
1757 100.0 * (total_size - raw) / raw
1759 if(video_size + audio_size + extra_size == 0){
1760 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
1765 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1769 for (i = 0; i < nb_ostreams; i++) {
1770 OutputStream *ost = &ost_table[i];
1771 AVCodecContext *enc = ost->st->codec;
1772 AVFormatContext *os = output_files[ost->file_index].ctx;
1773 int stop_encoding = 0;
1775 if (!ost->encoding_needed)
1778 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
1780 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
1786 av_init_packet(&pkt);
1790 switch (ost->st->codec->codec_type) {
1791 case AVMEDIA_TYPE_AUDIO:
1792 fifo_bytes = av_fifo_size(ost->fifo);
1793 if (fifo_bytes > 0) {
1794 /* encode any samples remaining in fifo */
1795 int frame_bytes = fifo_bytes;
1797 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1799 /* pad last frame with silence if needed */
1800 if (!(enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME)) {
1801 frame_bytes = enc->frame_size * enc->channels *
1802 av_get_bytes_per_sample(enc->sample_fmt);
1803 if (allocated_audio_buf_size < frame_bytes)
1805 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1807 encode_audio_frame(os, ost, audio_buf, frame_bytes);
1809 /* flush encoder with NULL frames until it is done
1810 returning packets */
1811 if (encode_audio_frame(os, ost, NULL, 0) == 0) {
1817 case AVMEDIA_TYPE_VIDEO:
1818 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1820 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1824 if (enc->coded_frame && enc->coded_frame->key_frame)
1825 pkt.flags |= AV_PKT_FLAG_KEY;
1826 if (ost->logfile && enc->stats_out) {
1827 fprintf(ost->logfile, "%s", enc->stats_out);
1833 pkt.data = bit_buffer;
1835 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1836 pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1837 write_frame(os, &pkt, ost);
1849 * Check whether a packet from ist should be written into ost at this time
1851 static int check_output_constraints(InputStream *ist, OutputStream *ost)
1853 OutputFile *of = &output_files[ost->file_index];
1854 int ist_index = ist - input_streams;
1856 if (ost->source_index != ist_index)
1859 if (of->start_time && ist->pts < of->start_time)
1862 if (of->recording_time != INT64_MAX &&
1863 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1864 (AVRational){ 1, 1000000 }) >= 0) {
1865 ost->is_past_recording_time = 1;
1872 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
1874 OutputFile *of = &output_files[ost->file_index];
1875 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1879 av_init_packet(&opkt);
1881 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
1882 !ost->copy_initial_nonkeyframes)
1885 /* force the input stream PTS */
1886 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1887 audio_size += pkt->size;
1888 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1889 video_size += pkt->size;
1893 if (pkt->pts != AV_NOPTS_VALUE)
1894 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1896 opkt.pts = AV_NOPTS_VALUE;
1898 if (pkt->dts == AV_NOPTS_VALUE)
1899 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1901 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1902 opkt.dts -= ost_tb_start_time;
1904 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1905 opkt.flags = pkt->flags;
1907 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1908 if ( ost->st->codec->codec_id != CODEC_ID_H264
1909 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1910 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1912 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
1913 opkt.destruct = av_destruct_packet;
1915 opkt.data = pkt->data;
1916 opkt.size = pkt->size;
1918 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
1919 /* store AVPicture in AVPacket, as expected by the output format */
1920 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1921 opkt.data = (uint8_t *)&pict;
1922 opkt.size = sizeof(AVPicture);
1923 opkt.flags |= AV_PKT_FLAG_KEY;
1926 write_frame(of->ctx, &opkt, ost);
1927 ost->st->codec->frame_number++;
1928 av_free_packet(&opkt);
1931 static void rate_emu_sleep(InputStream *ist)
1933 if (input_files[ist->file_index].rate_emu) {
1934 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1935 int64_t now = av_gettime() - ist->start;
1941 static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
1943 AVFrame *decoded_frame;
1944 AVCodecContext *avctx = ist->st->codec;
1945 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1948 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
1949 return AVERROR(ENOMEM);
1951 avcodec_get_frame_defaults(ist->decoded_frame);
1952 decoded_frame = ist->decoded_frame;
1954 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
1960 /* no audio frame */
1964 /* if the decoder provides a pts, use it instead of the last packet pts.
1965 the decoder could be delaying output by a packet or more. */
1966 if (decoded_frame->pts != AV_NOPTS_VALUE)
1967 ist->next_pts = decoded_frame->pts;
1969 /* increment next_pts to use for the case where the input stream does not
1970 have timestamps or there are multiple frames in the packet */
1971 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
1974 // preprocess audio (volume)
1975 if (audio_volume != 256) {
1976 int decoded_data_size = decoded_frame->nb_samples * avctx->channels * bps;
1977 void *samples = decoded_frame->data[0];
1978 switch (avctx->sample_fmt) {
1979 case AV_SAMPLE_FMT_U8:
1981 uint8_t *volp = samples;
1982 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1983 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
1984 *volp++ = av_clip_uint8(v);
1988 case AV_SAMPLE_FMT_S16:
1990 int16_t *volp = samples;
1991 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1992 int v = ((*volp) * audio_volume + 128) >> 8;
1993 *volp++ = av_clip_int16(v);
1997 case AV_SAMPLE_FMT_S32:
1999 int32_t *volp = samples;
2000 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2001 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
2002 *volp++ = av_clipl_int32(v);
2006 case AV_SAMPLE_FMT_FLT:
2008 float *volp = samples;
2009 float scale = audio_volume / 256.f;
2010 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2015 case AV_SAMPLE_FMT_DBL:
2017 double *volp = samples;
2018 double scale = audio_volume / 256.;
2019 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2025 av_log(NULL, AV_LOG_FATAL,
2026 "Audio volume adjustment on sample format %s is not supported.\n",
2027 av_get_sample_fmt_name(ist->st->codec->sample_fmt));
2032 rate_emu_sleep(ist);
2034 for (i = 0; i < nb_output_streams; i++) {
2035 OutputStream *ost = &output_streams[i];
2037 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2039 do_audio_out(output_files[ost->file_index].ctx, ost, ist, decoded_frame);
2045 static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *pkt_pts, int64_t *pkt_dts)
2047 AVFrame *decoded_frame, *filtered_frame = NULL;
2048 void *buffer_to_free = NULL;
2052 int frame_available = 1;
2055 int64_t *best_effort_timestamp;
2056 AVRational *frame_sample_aspect;
2058 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2059 return AVERROR(ENOMEM);
2061 avcodec_get_frame_defaults(ist->decoded_frame);
2062 decoded_frame = ist->decoded_frame;
2063 pkt->pts = *pkt_pts;
2064 pkt->dts = *pkt_dts;
2065 *pkt_pts = AV_NOPTS_VALUE;
2067 if (pkt->duration) {
2068 duration = av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2069 } else if(ist->st->codec->time_base.num != 0) {
2070 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2071 duration = ((int64_t)AV_TIME_BASE *
2072 ist->st->codec->time_base.num * ticks) /
2073 ist->st->codec->time_base.den;
2076 if(*pkt_dts != AV_NOPTS_VALUE && duration) {
2077 *pkt_dts += duration;
2079 *pkt_dts = AV_NOPTS_VALUE;
2081 ret = avcodec_decode_video2(ist->st->codec,
2082 decoded_frame, got_output, pkt);
2086 quality = same_quant ? decoded_frame->quality : 0;
2088 /* no picture yet */
2092 best_effort_timestamp= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "best_effort_timestamp");
2093 if(*best_effort_timestamp != AV_NOPTS_VALUE)
2094 ist->next_pts = ist->pts = *best_effort_timestamp;
2096 ist->next_pts += duration;
2099 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2102 frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
2103 for(i=0;i<nb_output_streams;i++) {
2104 OutputStream *ost = ost = &output_streams[i];
2105 if(check_output_constraints(ist, ost) && ost->encoding_needed){
2106 if (!frame_sample_aspect->num)
2107 *frame_sample_aspect = ist->st->sample_aspect_ratio;
2108 decoded_frame->pts = ist->pts;
2109 if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER) {
2110 FrameBuffer *buf = decoded_frame->opaque;
2111 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2112 decoded_frame->data, decoded_frame->linesize,
2113 AV_PERM_READ | AV_PERM_PRESERVE,
2114 ist->st->codec->width, ist->st->codec->height,
2115 ist->st->codec->pix_fmt);
2117 avfilter_copy_frame_props(fb, decoded_frame);
2119 fb->buf->priv = buf;
2120 fb->buf->free = filter_release_buffer;
2123 av_buffersrc_buffer(ost->input_video_filter, fb);
2125 if((av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame, AV_VSRC_BUF_FLAG_OVERWRITE)) < 0){
2126 av_log(0, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
2133 rate_emu_sleep(ist);
2135 for (i = 0; i < nb_output_streams; i++) {
2136 OutputStream *ost = &output_streams[i];
2139 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2143 if (ost->input_video_filter) {
2144 frame_available = av_buffersink_poll_frame(ost->output_video_filter);
2146 while (frame_available) {
2147 if (ost->output_video_filter) {
2148 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
2149 if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0){
2150 av_log(0, AV_LOG_WARNING, "AV Filter told us it has a frame available but failed to output one\n");
2153 if (!ist->filtered_frame && !(ist->filtered_frame = avcodec_alloc_frame())) {
2154 av_free(buffer_to_free);
2155 return AVERROR(ENOMEM);
2157 avcodec_get_frame_defaults(ist->filtered_frame);
2158 filtered_frame = ist->filtered_frame;
2159 *filtered_frame= *decoded_frame; //for me_threshold
2161 avfilter_fill_frame_from_video_buffer_ref(filtered_frame, ost->picref);
2162 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
2165 if (ost->picref->video && !ost->frame_aspect_ratio)
2166 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
2168 filtered_frame = decoded_frame;
2171 do_video_out(output_files[ost->file_index].ctx, ost, ist, filtered_frame, &frame_size,
2172 same_quant ? quality : ost->st->codec->global_quality);
2173 if (vstats_filename && frame_size)
2174 do_video_stats(output_files[ost->file_index].ctx, ost, frame_size);
2177 frame_available = ost->output_video_filter && av_buffersink_poll_frame(ost->output_video_filter);
2178 avfilter_unref_buffer(ost->picref);
2183 av_free(buffer_to_free);
2187 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2189 AVSubtitle subtitle;
2190 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2191 &subtitle, got_output, pkt);
2197 rate_emu_sleep(ist);
2199 for (i = 0; i < nb_output_streams; i++) {
2200 OutputStream *ost = &output_streams[i];
2202 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2205 do_subtitle_out(output_files[ost->file_index].ctx, ost, ist, &subtitle, pkt->pts);
2208 avsubtitle_free(&subtitle);
2212 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2213 static int output_packet(InputStream *ist,
2214 OutputStream *ost_table, int nb_ostreams,
2215 const AVPacket *pkt)
2219 int64_t pkt_dts = AV_NOPTS_VALUE;
2220 int64_t pkt_pts = AV_NOPTS_VALUE;
2224 if (ist->next_pts == AV_NOPTS_VALUE)
2225 ist->next_pts = ist->pts;
2229 av_init_packet(&avpkt);
2237 if (pkt->dts != AV_NOPTS_VALUE) {
2238 if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2239 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2240 pkt_dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2242 if(pkt->pts != AV_NOPTS_VALUE)
2243 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2245 // while we have more to decode or while the decoder did output something on EOF
2246 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2249 ist->pts = ist->next_pts;
2251 if (avpkt.size && avpkt.size != pkt->size) {
2252 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2253 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2254 ist->showed_multi_packet_warning = 1;
2257 switch (ist->st->codec->codec_type) {
2258 case AVMEDIA_TYPE_AUDIO:
2259 ret = transcode_audio (ist, &avpkt, &got_output);
2261 case AVMEDIA_TYPE_VIDEO:
2262 ret = transcode_video (ist, &avpkt, &got_output, &pkt_pts, &pkt_dts);
2264 case AVMEDIA_TYPE_SUBTITLE:
2265 ret = transcode_subtitles(ist, &avpkt, &got_output);
2275 avpkt.pts= AV_NOPTS_VALUE;
2277 // touch data and size only if not EOF
2279 if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2289 /* handle stream copy */
2290 if (!ist->decoding_needed) {
2291 rate_emu_sleep(ist);
2292 ist->pts = ist->next_pts;
2293 switch (ist->st->codec->codec_type) {
2294 case AVMEDIA_TYPE_AUDIO:
2295 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2296 ist->st->codec->sample_rate;
2298 case AVMEDIA_TYPE_VIDEO:
2299 if (pkt->duration) {
2300 ist->next_pts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2301 } else if(ist->st->codec->time_base.num != 0) {
2302 int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2303 ist->next_pts += ((int64_t)AV_TIME_BASE *
2304 ist->st->codec->time_base.num * ticks) /
2305 ist->st->codec->time_base.den;
2310 for (i = 0; pkt && i < nb_ostreams; i++) {
2311 OutputStream *ost = &ost_table[i];
2313 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2316 do_streamcopy(ist, ost, pkt);
2322 static void print_sdp(OutputFile *output_files, int n)
2326 AVFormatContext **avc = av_malloc(sizeof(*avc) * n);
2330 for (i = 0; i < n; i++)
2331 avc[i] = output_files[i].ctx;
2333 av_sdp_create(avc, n, sdp, sizeof(sdp));
2334 printf("SDP:\n%s\n", sdp);
2339 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
2340 char *error, int error_len)
2342 InputStream *ist = &input_streams[ist_index];
2343 if (ist->decoding_needed) {
2344 AVCodec *codec = ist->dec;
2346 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2347 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2348 return AVERROR(EINVAL);
2351 ist->dr1 = codec->capabilities & CODEC_CAP_DR1;
2352 if (codec->type == AVMEDIA_TYPE_VIDEO && ist->dr1) {
2353 ist->st->codec->get_buffer = codec_get_buffer;
2354 ist->st->codec->release_buffer = codec_release_buffer;
2355 ist->st->codec->opaque = ist;
2358 if (!av_dict_get(ist->opts, "threads", NULL, 0))
2359 av_dict_set(&ist->opts, "threads", "auto", 0);
2360 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2361 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2362 ist->file_index, ist->st->index);
2363 return AVERROR(EINVAL);
2365 assert_codec_experimental(ist->st->codec, 0);
2366 assert_avoptions(ist->opts);
2369 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;
2370 ist->next_pts = AV_NOPTS_VALUE;
2376 static int transcode_init(OutputFile *output_files, int nb_output_files,
2377 InputFile *input_files, int nb_input_files)
2379 int ret = 0, i, j, k;
2380 AVFormatContext *oc;
2381 AVCodecContext *codec, *icodec;
2387 /* init framerate emulation */
2388 for (i = 0; i < nb_input_files; i++) {
2389 InputFile *ifile = &input_files[i];
2390 if (ifile->rate_emu)
2391 for (j = 0; j < ifile->nb_streams; j++)
2392 input_streams[j + ifile->ist_index].start = av_gettime();
2395 /* output stream init */
2396 for (i = 0; i < nb_output_files; i++) {
2397 oc = output_files[i].ctx;
2398 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2399 av_dump_format(oc, i, oc->filename, 1);
2400 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2401 return AVERROR(EINVAL);
2405 /* for each output stream, we compute the right encoding parameters */
2406 for (i = 0; i < nb_output_streams; i++) {
2407 ost = &output_streams[i];
2408 oc = output_files[ost->file_index].ctx;
2409 ist = &input_streams[ost->source_index];
2411 if (ost->attachment_filename)
2414 codec = ost->st->codec;
2415 icodec = ist->st->codec;
2417 ost->st->disposition = ist->st->disposition;
2418 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2419 codec->chroma_sample_location = icodec->chroma_sample_location;
2421 if (ost->stream_copy) {
2422 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2424 if (extra_size > INT_MAX) {
2425 return AVERROR(EINVAL);
2428 /* if stream_copy is selected, no need to decode or encode */
2429 codec->codec_id = icodec->codec_id;
2430 codec->codec_type = icodec->codec_type;
2432 if (!codec->codec_tag) {
2433 if (!oc->oformat->codec_tag ||
2434 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2435 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2436 codec->codec_tag = icodec->codec_tag;
2439 codec->bit_rate = icodec->bit_rate;
2440 codec->rc_max_rate = icodec->rc_max_rate;
2441 codec->rc_buffer_size = icodec->rc_buffer_size;
2442 codec->field_order = icodec->field_order;
2443 codec->extradata = av_mallocz(extra_size);
2444 if (!codec->extradata) {
2445 return AVERROR(ENOMEM);
2447 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2448 codec->extradata_size= icodec->extradata_size;
2450 codec->time_base = ist->st->time_base;
2452 * Avi is a special case here because it supports variable fps but
2453 * having the fps and timebase differe significantly adds quite some
2456 if(!strcmp(oc->oformat->name, "avi")) {
2457 if ( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
2458 && av_q2d(ist->st->time_base) < 1.0/500
2460 codec->time_base = icodec->time_base;
2461 codec->time_base.num *= icodec->ticks_per_frame;
2462 codec->time_base.den *= 2;
2464 } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
2465 && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
2466 && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
2468 if( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
2469 && av_q2d(ist->st->time_base) < 1.0/500
2471 codec->time_base = icodec->time_base;
2472 codec->time_base.num *= icodec->ticks_per_frame;
2475 av_reduce(&codec->time_base.num, &codec->time_base.den,
2476 codec->time_base.num, codec->time_base.den, INT_MAX);
2478 switch (codec->codec_type) {
2479 case AVMEDIA_TYPE_AUDIO:
2480 if (audio_volume != 256) {
2481 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2484 codec->channel_layout = icodec->channel_layout;
2485 codec->sample_rate = icodec->sample_rate;
2486 codec->channels = icodec->channels;
2487 codec->frame_size = icodec->frame_size;
2488 codec->audio_service_type = icodec->audio_service_type;
2489 codec->block_align = icodec->block_align;
2491 case AVMEDIA_TYPE_VIDEO:
2492 codec->pix_fmt = icodec->pix_fmt;
2493 codec->width = icodec->width;
2494 codec->height = icodec->height;
2495 codec->has_b_frames = icodec->has_b_frames;
2496 if (!codec->sample_aspect_ratio.num) {
2497 codec->sample_aspect_ratio =
2498 ost->st->sample_aspect_ratio =
2499 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2500 ist->st->codec->sample_aspect_ratio.num ?
2501 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2503 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
2505 case AVMEDIA_TYPE_SUBTITLE:
2506 codec->width = icodec->width;
2507 codec->height = icodec->height;
2509 case AVMEDIA_TYPE_DATA:
2510 case AVMEDIA_TYPE_ATTACHMENT:
2517 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2519 ist->decoding_needed = 1;
2520 ost->encoding_needed = 1;
2522 switch (codec->codec_type) {
2523 case AVMEDIA_TYPE_AUDIO:
2524 ost->fifo = av_fifo_alloc(1024);
2526 return AVERROR(ENOMEM);
2528 if (!codec->sample_rate)
2529 codec->sample_rate = icodec->sample_rate;
2530 choose_sample_rate(ost->st, ost->enc);
2531 codec->time_base = (AVRational){ 1, codec->sample_rate };
2533 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2534 codec->sample_fmt = icodec->sample_fmt;
2535 choose_sample_fmt(ost->st, ost->enc);
2537 if (ost->audio_channels_mapped) {
2538 /* the requested output channel is set to the number of
2539 * -map_channel only if no -ac are specified */
2540 if (!codec->channels) {
2541 codec->channels = ost->audio_channels_mapped;
2542 codec->channel_layout = av_get_default_channel_layout(codec->channels);
2543 if (!codec->channel_layout) {
2544 av_log(NULL, AV_LOG_FATAL, "Unable to find an appropriate channel layout for requested number of channel\n");
2548 /* fill unused channel mapping with -1 (which means a muted
2549 * channel in case the number of output channels is bigger
2550 * than the number of mapped channel) */
2551 for (j = ost->audio_channels_mapped; j < FF_ARRAY_ELEMS(ost->audio_channels_map); j++)
2552 ost->audio_channels_map[j] = -1;
2553 } else if (!codec->channels) {
2554 codec->channels = icodec->channels;
2555 codec->channel_layout = icodec->channel_layout;
2557 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2558 codec->channel_layout = 0;
2560 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2561 ost->audio_resample |= codec->sample_fmt != icodec->sample_fmt
2562 || codec->channel_layout != icodec->channel_layout;
2563 icodec->request_channels = codec->channels;
2564 ost->resample_sample_fmt = icodec->sample_fmt;
2565 ost->resample_sample_rate = icodec->sample_rate;
2566 ost->resample_channels = icodec->channels;
2568 case AVMEDIA_TYPE_VIDEO:
2569 if (codec->pix_fmt == PIX_FMT_NONE)
2570 codec->pix_fmt = icodec->pix_fmt;
2571 choose_pixel_fmt(ost->st, ost->enc);
2573 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2574 av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2578 if (!codec->width || !codec->height) {
2579 codec->width = icodec->width;
2580 codec->height = icodec->height;
2583 ost->video_resample = codec->width != icodec->width ||
2584 codec->height != icodec->height ||
2585 codec->pix_fmt != icodec->pix_fmt;
2586 if (ost->video_resample) {
2587 codec->bits_per_raw_sample = frame_bits_per_raw_sample;
2590 ost->resample_height = icodec->height;
2591 ost->resample_width = icodec->width;
2592 ost->resample_pix_fmt = icodec->pix_fmt;
2594 if (!ost->frame_rate.num)
2595 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational) { 25, 1 };
2596 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2597 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2598 ost->frame_rate = ost->enc->supported_framerates[idx];
2600 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2601 if ( av_q2d(codec->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
2602 && (video_sync_method == VSYNC_CFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
2603 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2604 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2606 for (j = 0; j < ost->forced_kf_count; j++)
2607 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
2612 if (configure_video_filters(ist, ost)) {
2613 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2618 case AVMEDIA_TYPE_SUBTITLE:
2625 if (codec->codec_id != CODEC_ID_H264 &&
2626 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2627 char logfilename[1024];
2630 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2631 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2633 if (codec->flags & CODEC_FLAG_PASS2) {
2635 size_t logbuffer_size;
2636 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2637 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2641 codec->stats_in = logbuffer;
2643 if (codec->flags & CODEC_FLAG_PASS1) {
2644 f = fopen(logfilename, "wb");
2646 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2647 logfilename, strerror(errno));
2654 if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2655 /* maximum video buffer size is 8-bytes per pixel, plus DPX header size (1664)*/
2656 int size = codec->width * codec->height;
2657 bit_buffer_size = FFMAX(bit_buffer_size, 9*size + 10000);
2662 bit_buffer = av_malloc(bit_buffer_size);
2664 av_log(NULL, AV_LOG_ERROR, "Cannot allocate %d bytes output buffer\n",
2666 return AVERROR(ENOMEM);
2669 /* open each encoder */
2670 for (i = 0; i < nb_output_streams; i++) {
2671 ost = &output_streams[i];
2672 if (ost->encoding_needed) {
2673 AVCodec *codec = ost->enc;
2674 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2676 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
2677 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2678 ret = AVERROR(EINVAL);
2681 if (dec->subtitle_header) {
2682 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2683 if (!ost->st->codec->subtitle_header) {
2684 ret = AVERROR(ENOMEM);
2687 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2688 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2690 if (!av_dict_get(ost->opts, "threads", NULL, 0))
2691 av_dict_set(&ost->opts, "threads", "auto", 0);
2692 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2693 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2694 ost->file_index, ost->index);
2695 ret = AVERROR(EINVAL);
2698 assert_codec_experimental(ost->st->codec, 1);
2699 assert_avoptions(ost->opts);
2700 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2701 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2702 " It takes bits/s as argument, not kbits/s\n");
2703 extra_size += ost->st->codec->extradata_size;
2705 if (ost->st->codec->me_threshold)
2706 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2710 /* init input streams */
2711 for (i = 0; i < nb_input_streams; i++)
2712 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2715 /* discard unused programs */
2716 for (i = 0; i < nb_input_files; i++) {
2717 InputFile *ifile = &input_files[i];
2718 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2719 AVProgram *p = ifile->ctx->programs[j];
2720 int discard = AVDISCARD_ALL;
2722 for (k = 0; k < p->nb_stream_indexes; k++)
2723 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2724 discard = AVDISCARD_DEFAULT;
2727 p->discard = discard;
2731 /* open files and write file headers */
2732 for (i = 0; i < nb_output_files; i++) {
2733 oc = output_files[i].ctx;
2734 oc->interrupt_callback = int_cb;
2735 if (avformat_write_header(oc, &output_files[i].opts) < 0) {
2736 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2737 ret = AVERROR(EINVAL);
2740 // assert_avoptions(output_files[i].opts);
2741 if (strcmp(oc->oformat->name, "rtp")) {
2747 /* dump the file output parameters - cannot be done before in case
2749 for (i = 0; i < nb_output_files; i++) {
2750 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2753 /* dump the stream mapping */
2754 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2755 for (i = 0; i < nb_output_streams; i++) {
2756 ost = &output_streams[i];
2758 if (ost->attachment_filename) {
2759 /* an attached file */
2760 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
2761 ost->attachment_filename, ost->file_index, ost->index);
2764 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
2765 input_streams[ost->source_index].file_index,
2766 input_streams[ost->source_index].st->index,
2769 if (ost->audio_channels_mapped) {
2770 av_log(NULL, AV_LOG_INFO, " [ch:");
2771 for (j = 0; j < ost->audio_channels_mapped; j++)
2772 if (ost->audio_channels_map[j] == -1)
2773 av_log(NULL, AV_LOG_INFO, " M");
2775 av_log(NULL, AV_LOG_INFO, " %d", ost->audio_channels_map[j]);
2776 av_log(NULL, AV_LOG_INFO, "]");
2778 if (ost->sync_ist != &input_streams[ost->source_index])
2779 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2780 ost->sync_ist->file_index,
2781 ost->sync_ist->st->index);
2782 if (ost->stream_copy)
2783 av_log(NULL, AV_LOG_INFO, " (copy)");
2785 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2786 input_streams[ost->source_index].dec->name : "?",
2787 ost->enc ? ost->enc->name : "?");
2788 av_log(NULL, AV_LOG_INFO, "\n");
2792 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2797 print_sdp(output_files, nb_output_files);
2804 * The following code is the main loop of the file converter
2806 static int transcode(OutputFile *output_files, int nb_output_files,
2807 InputFile *input_files, int nb_input_files)
2810 AVFormatContext *is, *os;
2814 int no_packet_count = 0;
2815 int64_t timer_start;
2818 if (!(no_packet = av_mallocz(nb_input_files)))
2821 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2826 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
2829 timer_start = av_gettime();
2831 for (; received_sigterm == 0;) {
2832 int file_index, ist_index;
2836 int64_t cur_time= av_gettime();
2838 ipts_min = INT64_MAX;
2840 /* if 'q' pressed, exits */
2842 static int64_t last_time;
2843 if (received_nb_signals)
2845 /* read_key() returns 0 on EOF */
2846 if(cur_time - last_time >= 100000 && !run_as_daemon){
2848 last_time = cur_time;
2853 if (key == '+') av_log_set_level(av_log_get_level()+10);
2854 if (key == '-') av_log_set_level(av_log_get_level()-10);
2855 if (key == 's') qp_hist ^= 1;
2858 do_hex_dump = do_pkt_dump = 0;
2859 } else if(do_pkt_dump){
2863 av_log_set_level(AV_LOG_DEBUG);
2866 if (key == 'c' || key == 'C'){
2867 char buf[4096], target[64], command[256], arg[256] = {0};
2870 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2872 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
2877 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
2878 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
2879 target, time, command, arg);
2880 for (i = 0; i < nb_output_streams; i++) {
2881 ost = &output_streams[i];
2884 ret = avfilter_graph_send_command(ost->graph, target, command, arg, buf, sizeof(buf),
2885 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
2886 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
2888 ret = avfilter_graph_queue_command(ost->graph, target, command, arg, 0, time);
2893 av_log(NULL, AV_LOG_ERROR,
2894 "Parse error, at least 3 arguments were expected, "
2895 "only %d given in string '%s'\n", n, buf);
2899 if (key == 'd' || key == 'D'){
2902 debug = input_streams[0].st->codec->debug<<1;
2903 if(!debug) debug = 1;
2904 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2907 if(scanf("%d", &debug)!=1)
2908 fprintf(stderr,"error parsing debug value\n");
2909 for(i=0;i<nb_input_streams;i++) {
2910 input_streams[i].st->codec->debug = debug;
2912 for(i=0;i<nb_output_streams;i++) {
2913 ost = &output_streams[i];
2914 ost->st->codec->debug = debug;
2916 if(debug) av_log_set_level(AV_LOG_DEBUG);
2917 fprintf(stderr,"debug=%d\n", debug);
2920 fprintf(stderr, "key function\n"
2921 "? show this help\n"
2922 "+ increase verbosity\n"
2923 "- decrease verbosity\n"
2924 "c Send command to filtergraph\n"
2925 "D cycle through available debug modes\n"
2926 "h dump packets/hex press to cycle through the 3 states\n"
2928 "s Show QP histogram\n"
2933 /* select the stream that we must read now by looking at the
2934 smallest output pts */
2936 for (i = 0; i < nb_output_streams; i++) {
2940 ost = &output_streams[i];
2941 of = &output_files[ost->file_index];
2942 os = output_files[ost->file_index].ctx;
2943 ist = &input_streams[ost->source_index];
2944 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2945 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2947 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2949 if (!input_files[ist->file_index].eof_reached) {
2950 if (ipts < ipts_min) {
2953 file_index = ist->file_index;
2955 if (opts < opts_min) {
2957 if (!input_sync) file_index = ist->file_index;
2960 if (ost->frame_number >= ost->max_frames) {
2962 for (j = 0; j < of->ctx->nb_streams; j++)
2963 output_streams[of->ost_index + j].is_past_recording_time = 1;
2967 /* if none, if is finished */
2968 if (file_index < 0) {
2969 if (no_packet_count) {
2970 no_packet_count = 0;
2971 memset(no_packet, 0, nb_input_files);
2978 /* read a frame from it and output it in the fifo */
2979 is = input_files[file_index].ctx;
2980 ret = av_read_frame(is, &pkt);
2981 if (ret == AVERROR(EAGAIN)) {
2982 no_packet[file_index] = 1;
2987 input_files[file_index].eof_reached = 1;
2994 no_packet_count = 0;
2995 memset(no_packet, 0, nb_input_files);
2998 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2999 is->streams[pkt.stream_index]);
3001 /* the following test is needed in case new streams appear
3002 dynamically in stream : we ignore them */
3003 if (pkt.stream_index >= input_files[file_index].nb_streams)
3004 goto discard_packet;
3005 ist_index = input_files[file_index].ist_index + pkt.stream_index;
3006 ist = &input_streams[ist_index];
3008 goto discard_packet;
3010 if (pkt.dts != AV_NOPTS_VALUE)
3011 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3012 if (pkt.pts != AV_NOPTS_VALUE)
3013 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3015 if (pkt.pts != AV_NOPTS_VALUE)
3016 pkt.pts *= ist->ts_scale;
3017 if (pkt.dts != AV_NOPTS_VALUE)
3018 pkt.dts *= ist->ts_scale;
3020 //fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n",
3022 // pkt.dts, input_files[ist->file_index].ts_offset,
3023 // ist->st->codec->codec_type);
3024 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
3025 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
3026 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
3027 int64_t delta = pkt_dts - ist->next_pts;
3028 if((delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
3029 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
3030 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3031 pkt_dts+1<ist->pts)&& !copy_ts){
3032 input_files[ist->file_index].ts_offset -= delta;
3033 av_log(NULL, AV_LOG_DEBUG,
3034 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
3035 delta, input_files[ist->file_index].ts_offset);
3036 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3037 if (pkt.pts != AV_NOPTS_VALUE)
3038 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3042 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
3043 if (output_packet(ist, output_streams, nb_output_streams, &pkt) < 0) {
3045 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
3046 ist->file_index, ist->st->index);
3049 av_free_packet(&pkt);
3054 av_free_packet(&pkt);
3056 /* dump report by using the output first video and audio streams */
3057 print_report(output_files, output_streams, nb_output_streams, 0, timer_start, cur_time);
3060 /* at the end of stream, we must flush the decoder buffers */
3061 for (i = 0; i < nb_input_streams; i++) {
3062 ist = &input_streams[i];
3063 if (ist->decoding_needed) {
3064 output_packet(ist, output_streams, nb_output_streams, NULL);
3067 flush_encoders(output_streams, nb_output_streams);
3071 /* write the trailer if needed and close file */
3072 for (i = 0; i < nb_output_files; i++) {
3073 os = output_files[i].ctx;
3074 av_write_trailer(os);
3077 /* dump report by using the first video and audio streams */
3078 print_report(output_files, output_streams, nb_output_streams, 1, timer_start, av_gettime());
3080 /* close each encoder */
3081 for (i = 0; i < nb_output_streams; i++) {
3082 ost = &output_streams[i];
3083 if (ost->encoding_needed) {
3084 av_freep(&ost->st->codec->stats_in);
3085 avcodec_close(ost->st->codec);
3088 avfilter_graph_free(&ost->graph);
3092 /* close each decoder */
3093 for (i = 0; i < nb_input_streams; i++) {
3094 ist = &input_streams[i];
3095 if (ist->decoding_needed) {
3096 avcodec_close(ist->st->codec);
3104 av_freep(&bit_buffer);
3105 av_freep(&no_packet);
3107 if (output_streams) {
3108 for (i = 0; i < nb_output_streams; i++) {
3109 ost = &output_streams[i];
3111 if (ost->stream_copy)
3112 av_freep(&ost->st->codec->extradata);
3114 fclose(ost->logfile);
3115 ost->logfile = NULL;
3117 av_fifo_free(ost->fifo); /* works even if fifo is not
3118 initialized but set to zero */
3119 av_freep(&ost->st->codec->subtitle_header);
3120 av_free(ost->resample_frame.data[0]);
3121 av_free(ost->forced_kf_pts);
3122 if (ost->video_resample)
3123 sws_freeContext(ost->img_resample_ctx);
3124 swr_free(&ost->swr);
3125 av_dict_free(&ost->opts);
3132 static int opt_frame_crop(const char *opt, const char *arg)
3134 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
3135 return AVERROR(EINVAL);
3138 static int opt_pad(const char *opt, const char *arg)
3140 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
3144 static int opt_video_channel(const char *opt, const char *arg)
3146 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
3147 return opt_default("channel", arg);
3150 static int opt_video_standard(const char *opt, const char *arg)
3152 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
3153 return opt_default("standard", arg);
3156 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
3158 audio_codec_name = arg;
3159 return parse_option(o, "codec:a", arg, options);
3162 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3164 video_codec_name = arg;
3165 return parse_option(o, "codec:v", arg, options);
3168 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3170 subtitle_codec_name = arg;
3171 return parse_option(o, "codec:s", arg, options);
3174 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3176 return parse_option(o, "codec:d", arg, options);
3179 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
3181 StreamMap *m = NULL;
3182 int i, negative = 0, file_idx;
3183 int sync_file_idx = -1, sync_stream_idx = 0;
3191 map = av_strdup(arg);
3193 /* parse sync stream first, just pick first matching stream */
3194 if (sync = strchr(map, ',')) {
3196 sync_file_idx = strtol(sync + 1, &sync, 0);
3197 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3198 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
3203 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
3204 if (check_stream_specifier(input_files[sync_file_idx].ctx,
3205 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
3206 sync_stream_idx = i;
3209 if (i == input_files[sync_file_idx].nb_streams) {
3210 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
3211 "match any streams.\n", arg);
3217 file_idx = strtol(map, &p, 0);
3218 if (file_idx >= nb_input_files || file_idx < 0) {
3219 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
3223 /* disable some already defined maps */
3224 for (i = 0; i < o->nb_stream_maps; i++) {
3225 m = &o->stream_maps[i];
3226 if (file_idx == m->file_index &&
3227 check_stream_specifier(input_files[m->file_index].ctx,
3228 input_files[m->file_index].ctx->streams[m->stream_index],
3229 *p == ':' ? p + 1 : p) > 0)
3233 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
3234 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
3235 *p == ':' ? p + 1 : p) <= 0)
3237 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3238 &o->nb_stream_maps, o->nb_stream_maps + 1);
3239 m = &o->stream_maps[o->nb_stream_maps - 1];
3241 m->file_index = file_idx;
3242 m->stream_index = i;
3244 if (sync_file_idx >= 0) {
3245 m->sync_file_index = sync_file_idx;
3246 m->sync_stream_index = sync_stream_idx;
3248 m->sync_file_index = file_idx;
3249 m->sync_stream_index = i;
3254 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3262 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3264 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3265 &o->nb_attachments, o->nb_attachments + 1);
3266 o->attachments[o->nb_attachments - 1] = arg;
3270 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
3276 o->audio_channel_maps =
3277 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
3278 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
3279 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
3281 /* muted channel syntax */
3282 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
3283 if ((n == 1 || n == 3) && m->channel_idx == -1) {
3284 m->file_idx = m->stream_idx = -1;
3286 m->ofile_idx = m->ostream_idx = -1;
3291 n = sscanf(arg, "%d.%d.%d:%d.%d",
3292 &m->file_idx, &m->stream_idx, &m->channel_idx,
3293 &m->ofile_idx, &m->ostream_idx);
3295 if (n != 3 && n != 5) {
3296 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
3297 "[file.stream.channel|-1][:syncfile:syncstream]\n");
3301 if (n != 5) // only file.stream.channel specified
3302 m->ofile_idx = m->ostream_idx = -1;
3305 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
3306 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
3310 if (m->stream_idx < 0 ||
3311 m->stream_idx >= input_files[m->file_idx].nb_streams) {
3312 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
3313 m->file_idx, m->stream_idx);
3316 st = input_files[m->file_idx].ctx->streams[m->stream_idx];
3317 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
3318 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
3319 m->file_idx, m->stream_idx);
3322 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
3323 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
3324 m->file_idx, m->stream_idx, m->channel_idx);
3331 * Parse a metadata specifier in arg.
3332 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
3333 * @param index for type c/p, chapter/program index is written here
3334 * @param stream_spec for type s, the stream specifier is written here
3336 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
3344 if (*(++arg) && *arg != ':') {
3345 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
3348 *stream_spec = *arg == ':' ? arg + 1 : "";
3352 if (*(++arg) == ':')
3353 *index = strtol(++arg, NULL, 0);
3356 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
3363 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
3365 AVDictionary **meta_in = NULL;
3366 AVDictionary **meta_out = NULL;
3368 char type_in, type_out;
3369 const char *istream_spec = NULL, *ostream_spec = NULL;
3370 int idx_in = 0, idx_out = 0;
3372 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
3373 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
3375 if (type_in == 'g' || type_out == 'g')
3376 o->metadata_global_manual = 1;
3377 if (type_in == 's' || type_out == 's')
3378 o->metadata_streams_manual = 1;
3379 if (type_in == 'c' || type_out == 'c')
3380 o->metadata_chapters_manual = 1;
3382 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3383 if ((index) < 0 || (index) >= (nb_elems)) {\
3384 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
3389 #define SET_DICT(type, meta, context, index)\
3392 meta = &context->metadata;\
3395 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
3396 meta = &context->chapters[index]->metadata;\
3399 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
3400 meta = &context->programs[index]->metadata;\
3404 SET_DICT(type_in, meta_in, ic, idx_in);
3405 SET_DICT(type_out, meta_out, oc, idx_out);
3407 /* for input streams choose first matching stream */
3408 if (type_in == 's') {
3409 for (i = 0; i < ic->nb_streams; i++) {
3410 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
3411 meta_in = &ic->streams[i]->metadata;
3417 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
3422 if (type_out == 's') {
3423 for (i = 0; i < oc->nb_streams; i++) {
3424 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
3425 meta_out = &oc->streams[i]->metadata;
3426 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3431 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3436 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
3439 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
3440 struct tm time = *gmtime((time_t*)&recording_timestamp);
3441 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
3442 parse_option(o, "metadata", buf, options);
3444 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
3445 "tag instead.\n", opt);
3449 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
3451 const char *codec_string = encoder ? "encoder" : "decoder";
3455 avcodec_find_encoder_by_name(name) :
3456 avcodec_find_decoder_by_name(name);
3458 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
3461 if (codec->type != type) {
3462 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
3468 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
3470 char *codec_name = NULL;
3472 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
3474 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
3475 st->codec->codec_id = codec->id;
3478 return avcodec_find_decoder(st->codec->codec_id);
3482 * Add all the streams from the given input file to the global
3483 * list of input streams.
3485 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
3488 char *next, *codec_tag = NULL;
3490 for (i = 0; i < ic->nb_streams; i++) {
3491 AVStream *st = ic->streams[i];
3492 AVCodecContext *dec = st->codec;
3495 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3496 ist = &input_streams[nb_input_streams - 1];
3498 ist->file_index = nb_input_files;
3500 ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), ic, st);
3502 ist->ts_scale = 1.0;
3503 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
3505 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
3507 uint32_t tag = strtol(codec_tag, &next, 0);
3509 tag = AV_RL32(codec_tag);
3510 st->codec->codec_tag = tag;
3513 ist->dec = choose_decoder(o, ic, st);
3515 switch (dec->codec_type) {
3516 case AVMEDIA_TYPE_AUDIO:
3518 ist->dec = avcodec_find_decoder(dec->codec_id);
3519 if (o->audio_disable)
3520 st->discard = AVDISCARD_ALL;
3522 case AVMEDIA_TYPE_VIDEO:
3524 ist->dec = avcodec_find_decoder(dec->codec_id);
3526 dec->flags |= CODEC_FLAG_EMU_EDGE;
3529 if (o->video_disable)
3530 st->discard = AVDISCARD_ALL;
3531 else if (video_discard)
3532 st->discard = video_discard;
3534 case AVMEDIA_TYPE_DATA:
3535 if (o->data_disable)
3536 st->discard= AVDISCARD_ALL;
3538 case AVMEDIA_TYPE_SUBTITLE:
3540 ist->dec = avcodec_find_decoder(dec->codec_id);
3541 if(o->subtitle_disable)
3542 st->discard = AVDISCARD_ALL;
3544 case AVMEDIA_TYPE_ATTACHMENT:
3545 case AVMEDIA_TYPE_UNKNOWN:
3553 static void assert_file_overwrite(const char *filename)
3555 if ((!file_overwrite || no_file_overwrite) &&
3556 (strchr(filename, ':') == NULL || filename[1] == ':' ||
3557 av_strstart(filename, "file:", NULL))) {
3558 if (avio_check(filename, 0) == 0) {
3559 if (!using_stdin && (!no_file_overwrite || file_overwrite)) {
3560 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3563 signal(SIGINT, SIG_DFL);
3564 if (!read_yesno()) {
3565 av_log(0, AV_LOG_FATAL, "Not overwriting - exiting\n");
3571 av_log(0, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
3578 static void dump_attachment(AVStream *st, const char *filename)
3581 AVIOContext *out = NULL;
3582 AVDictionaryEntry *e;
3584 if (!st->codec->extradata_size) {
3585 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
3586 nb_input_files - 1, st->index);
3589 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
3590 filename = e->value;
3592 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
3593 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
3597 assert_file_overwrite(filename);
3599 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
3600 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
3605 avio_write(out, st->codec->extradata, st->codec->extradata_size);
3610 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
3612 AVFormatContext *ic;
3613 AVInputFormat *file_iformat = NULL;
3617 AVDictionary **opts;
3618 int orig_nb_streams; // number of streams before avformat_find_stream_info
3621 if (!(file_iformat = av_find_input_format(o->format))) {
3622 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
3627 if (!strcmp(filename, "-"))
3630 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3631 !strcmp(filename, "/dev/stdin");
3633 /* get default parameters from command line */
3634 ic = avformat_alloc_context();
3636 print_error(filename, AVERROR(ENOMEM));
3639 if (o->nb_audio_sample_rate) {
3640 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
3641 av_dict_set(&format_opts, "sample_rate", buf, 0);
3643 if (o->nb_audio_channels) {
3644 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
3645 av_dict_set(&format_opts, "channels", buf, 0);
3647 if (o->nb_frame_rates) {
3648 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
3650 if (o->nb_frame_sizes) {
3651 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
3653 if (o->nb_frame_pix_fmts)
3654 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
3656 ic->video_codec_id = video_codec_name ?
3657 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
3658 ic->audio_codec_id = audio_codec_name ?
3659 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
3660 ic->subtitle_codec_id= subtitle_codec_name ?
3661 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
3662 ic->flags |= AVFMT_FLAG_NONBLOCK;
3663 ic->interrupt_callback = int_cb;
3665 /* open the input file with generic avformat function */
3666 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3668 print_error(filename, err);
3671 assert_avoptions(format_opts);
3673 /* apply forced codec ids */
3674 for (i = 0; i < ic->nb_streams; i++)
3675 choose_decoder(o, ic, ic->streams[i]);
3677 /* Set AVCodecContext options for avformat_find_stream_info */
3678 opts = setup_find_stream_info_opts(ic, codec_opts);
3679 orig_nb_streams = ic->nb_streams;
3681 /* If not enough info to get the stream parameters, we decode the
3682 first frames to get it. (used in mpeg case for example) */
3683 ret = avformat_find_stream_info(ic, opts);
3685 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
3686 avformat_close_input(&ic);
3690 timestamp = o->start_time;
3691 /* add the stream start time */
3692 if (ic->start_time != AV_NOPTS_VALUE)
3693 timestamp += ic->start_time;
3695 /* if seeking requested, we execute it */
3696 if (o->start_time != 0) {
3697 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3699 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
3700 filename, (double)timestamp / AV_TIME_BASE);
3704 /* update the current parameters so that they match the one of the input stream */
3705 add_input_streams(o, ic);
3707 /* dump the file content */
3708 av_dump_format(ic, nb_input_files, filename, 0);
3710 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3711 input_files[nb_input_files - 1].ctx = ic;
3712 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3713 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3714 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3715 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
3717 for (i = 0; i < o->nb_dump_attachment; i++) {
3720 for (j = 0; j < ic->nb_streams; j++) {
3721 AVStream *st = ic->streams[j];
3723 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
3724 dump_attachment(st, o->dump_attachment[i].u.str);
3728 for (i = 0; i < orig_nb_streams; i++)
3729 av_dict_free(&opts[i]);
3732 reset_options(o, 1);
3736 static void parse_forced_key_frames(char *kf, OutputStream *ost)
3741 for (p = kf; *p; p++)
3744 ost->forced_kf_count = n;
3745 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3746 if (!ost->forced_kf_pts) {
3747 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3750 for (i = 0; i < n; i++) {
3751 p = i ? strchr(p, ',') + 1 : kf;
3752 ost->forced_kf_pts[i] = parse_time_or_die("force_key_frames", p, 1);
3756 static uint8_t *get_line(AVIOContext *s)
3762 if (avio_open_dyn_buf(&line) < 0) {
3763 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
3767 while ((c = avio_r8(s)) && c != '\n')
3770 avio_close_dyn_buf(line, &buf);
3775 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
3778 char filename[1000];
3779 const char *base[3] = { getenv("AVCONV_DATADIR"),
3784 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
3788 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
3789 i != 1 ? "" : "/.avconv", codec_name, preset_name);
3790 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3793 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
3794 i != 1 ? "" : "/.avconv", preset_name);
3795 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3801 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
3803 char *codec_name = NULL;
3805 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
3807 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
3808 NULL, ost->st->codec->codec_type);
3809 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
3810 } else if (!strcmp(codec_name, "copy"))
3811 ost->stream_copy = 1;
3813 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
3814 ost->st->codec->codec_id = ost->enc->id;
3818 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3821 AVStream *st = avformat_new_stream(oc, NULL);
3822 int idx = oc->nb_streams - 1, ret = 0;
3823 char *bsf = NULL, *next, *codec_tag = NULL;
3824 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3826 char *buf = NULL, *arg = NULL, *preset = NULL;
3827 AVIOContext *s = NULL;
3830 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3834 if (oc->nb_streams - 1 < o->nb_streamid_map)
3835 st->id = o->streamid_map[oc->nb_streams - 1];
3837 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3838 nb_output_streams + 1);
3839 ost = &output_streams[nb_output_streams - 1];
3840 ost->file_index = nb_output_files;
3843 st->codec->codec_type = type;
3844 choose_encoder(o, oc, ost);
3846 ost->opts = filter_codec_opts(codec_opts, ost->enc, oc, st);
3849 avcodec_get_context_defaults3(st->codec, ost->enc);
3850 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3852 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
3853 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
3856 if (!buf[0] || buf[0] == '#') {
3860 if (!(arg = strchr(buf, '='))) {
3861 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
3865 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
3867 } while (!s->eof_reached);
3871 av_log(NULL, AV_LOG_FATAL,
3872 "Preset %s specified for stream %d:%d, but could not be opened.\n",
3873 preset, ost->file_index, ost->index);
3877 ost->max_frames = INT64_MAX;
3878 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
3880 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3882 if (next = strchr(bsf, ','))
3884 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3885 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3889 bsfc_prev->next = bsfc;
3891 ost->bitstream_filters = bsfc;
3897 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3899 uint32_t tag = strtol(codec_tag, &next, 0);
3901 tag = AV_RL32(codec_tag);
3902 st->codec->codec_tag = tag;
3905 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3906 if (qscale >= 0 || same_quant) {
3907 st->codec->flags |= CODEC_FLAG_QSCALE;
3908 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3911 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
3912 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3914 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3918 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3921 const char *p = str;
3928 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3935 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3939 AVCodecContext *video_enc;
3941 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3943 video_enc = st->codec;
3945 if (!ost->stream_copy) {
3946 const char *p = NULL;
3947 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3948 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3949 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3952 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3953 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3954 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3958 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3959 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3960 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3964 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3965 if (frame_aspect_ratio) {
3967 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
3968 q.num <= 0 || q.den <= 0) {
3969 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
3972 ost->frame_aspect_ratio = av_q2d(q);
3975 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3976 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3977 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3978 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3981 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3984 video_enc->gop_size = 0;
3985 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3987 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3988 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
3991 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3993 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3995 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3996 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
3999 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
4002 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
4003 for (i = 0; p; i++) {
4005 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
4007 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
4010 /* FIXME realloc failure */
4011 video_enc->rc_override =
4012 av_realloc(video_enc->rc_override,
4013 sizeof(RcOverride) * (i + 1));
4014 video_enc->rc_override[i].start_frame = start;
4015 video_enc->rc_override[i].end_frame = end;
4017 video_enc->rc_override[i].qscale = q;
4018 video_enc->rc_override[i].quality_factor = 1.0;
4021 video_enc->rc_override[i].qscale = 0;
4022 video_enc->rc_override[i].quality_factor = -q/100.0;
4027 video_enc->rc_override_count = i;
4028 if (!video_enc->rc_initial_buffer_occupancy)
4029 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
4030 video_enc->intra_dc_precision = intra_dc_precision - 8;
4033 video_enc->flags|= CODEC_FLAG_PSNR;
4038 video_enc->flags |= CODEC_FLAG_PASS1;
4041 video_enc->flags |= CODEC_FLAG_PASS2;
4045 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
4046 if (forced_key_frames)
4047 parse_forced_key_frames(forced_key_frames, ost);
4049 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
4051 ost->top_field_first = -1;
4052 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
4055 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4057 ost->avfilter = av_strdup(filters);
4060 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
4066 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
4071 AVCodecContext *audio_enc;
4073 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
4076 audio_enc = st->codec;
4077 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
4079 if (!ost->stream_copy) {
4080 char *sample_fmt = NULL;
4082 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
4084 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
4086 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
4087 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
4091 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
4093 ost->rematrix_volume=1.0;
4094 MATCH_PER_STREAM_OPT(rematrix_volume, f, ost->rematrix_volume, oc, st);
4097 /* check for channel mapping for this audio stream */
4098 for (n = 0; n < o->nb_audio_channel_maps; n++) {
4099 AudioChannelMap *map = &o->audio_channel_maps[n];
4100 InputStream *ist = &input_streams[ost->source_index];
4101 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
4102 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
4103 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
4104 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
4105 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
4107 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
4108 ost->file_index, ost->st->index);
4115 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
4119 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
4120 if (!ost->stream_copy) {
4121 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
4128 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
4130 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
4131 ost->stream_copy = 1;
4135 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
4139 AVCodecContext *subtitle_enc;
4141 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
4143 subtitle_enc = st->codec;
4145 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
4150 /* arg format is "output-stream-index:streamid-value". */
4151 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
4157 av_strlcpy(idx_str, arg, sizeof(idx_str));
4158 p = strchr(idx_str, ':');
4160 av_log(NULL, AV_LOG_FATAL,
4161 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
4166 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
4167 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
4168 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
4172 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
4174 AVFormatContext *is = ifile->ctx;
4175 AVFormatContext *os = ofile->ctx;
4178 for (i = 0; i < is->nb_chapters; i++) {
4179 AVChapter *in_ch = is->chapters[i], *out_ch;
4180 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
4181 AV_TIME_BASE_Q, in_ch->time_base);
4182 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
4183 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
4186 if (in_ch->end < ts_off)
4188 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
4191 out_ch = av_mallocz(sizeof(AVChapter));
4193 return AVERROR(ENOMEM);
4195 out_ch->id = in_ch->id;
4196 out_ch->time_base = in_ch->time_base;
4197 out_ch->start = FFMAX(0, in_ch->start - ts_off);
4198 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
4201 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
4204 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
4206 return AVERROR(ENOMEM);
4207 os->chapters[os->nb_chapters - 1] = out_ch;
4212 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
4215 AVFormatContext *ic = avformat_alloc_context();
4217 ic->interrupt_callback = int_cb;
4218 err = avformat_open_input(&ic, filename, NULL, NULL);
4221 /* copy stream format */
4222 for(i=0;i<ic->nb_streams;i++) {
4226 AVCodecContext *avctx;
4228 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
4229 ost = new_output_stream(o, s, codec->type);
4234 // FIXME: a more elegant solution is needed
4235 memcpy(st, ic->streams[i], sizeof(AVStream));
4236 st->info = av_malloc(sizeof(*st->info));
4237 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
4239 avcodec_copy_context(st->codec, ic->streams[i]->codec);
4241 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
4242 choose_sample_fmt(st, codec);
4243 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
4244 choose_pixel_fmt(st, codec);
4247 avformat_close_input(&ic);
4251 static void opt_output_file(void *optctx, const char *filename)
4253 OptionsContext *o = optctx;
4254 AVFormatContext *oc;
4256 AVOutputFormat *file_oformat;
4260 if (!strcmp(filename, "-"))
4263 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
4265 print_error(filename, err);
4268 file_oformat= oc->oformat;
4269 oc->interrupt_callback = int_cb;
4271 if (!strcmp(file_oformat->name, "ffm") &&
4272 av_strstart(filename, "http:", NULL)) {
4274 /* special case for files sent to ffserver: we get the stream
4275 parameters from ffserver */
4276 int err = read_ffserver_streams(o, oc, filename);
4278 print_error(filename, err);
4281 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
4282 ost = &output_streams[j];
4283 for (i = 0; i < nb_input_streams; i++) {
4284 ist = &input_streams[i];
4285 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
4287 ost->source_index= i;
4293 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));
4297 } else if (!o->nb_stream_maps) {
4298 /* pick the "best" stream of each type */
4299 #define NEW_STREAM(type, index)\
4301 ost = new_ ## type ## _stream(o, oc);\
4302 ost->source_index = index;\
4303 ost->sync_ist = &input_streams[index];\
4304 input_streams[index].discard = 0;\
4307 /* video: highest resolution */
4308 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
4309 int area = 0, idx = -1;
4310 for (i = 0; i < nb_input_streams; i++) {
4311 ist = &input_streams[i];
4312 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
4313 ist->st->codec->width * ist->st->codec->height > area) {
4314 area = ist->st->codec->width * ist->st->codec->height;
4318 NEW_STREAM(video, idx);
4321 /* audio: most channels */
4322 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
4323 int channels = 0, idx = -1;
4324 for (i = 0; i < nb_input_streams; i++) {
4325 ist = &input_streams[i];
4326 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
4327 ist->st->codec->channels > channels) {
4328 channels = ist->st->codec->channels;
4332 NEW_STREAM(audio, idx);
4335 /* subtitles: pick first */
4336 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
4337 for (i = 0; i < nb_input_streams; i++)
4338 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
4339 NEW_STREAM(subtitle, i);
4343 /* do something with data? */
4345 for (i = 0; i < o->nb_stream_maps; i++) {
4346 StreamMap *map = &o->stream_maps[i];
4351 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
4352 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
4354 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
4356 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
4358 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
4361 switch (ist->st->codec->codec_type) {
4362 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
4363 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
4364 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
4365 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
4366 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
4368 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
4369 map->file_index, map->stream_index);
4373 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
4374 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
4375 map->sync_stream_index];
4380 /* handle attached files */
4381 for (i = 0; i < o->nb_attachments; i++) {
4383 uint8_t *attachment;
4387 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
4388 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
4392 if ((len = avio_size(pb)) <= 0) {
4393 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
4397 if (!(attachment = av_malloc(len))) {
4398 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
4402 avio_read(pb, attachment, len);
4404 ost = new_attachment_stream(o, oc);
4405 ost->stream_copy = 0;
4406 ost->source_index = -1;
4407 ost->attachment_filename = o->attachments[i];
4408 ost->st->codec->extradata = attachment;
4409 ost->st->codec->extradata_size = len;
4411 p = strrchr(o->attachments[i], '/');
4412 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
4416 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
4417 output_files[nb_output_files - 1].ctx = oc;
4418 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
4419 output_files[nb_output_files - 1].recording_time = o->recording_time;
4420 output_files[nb_output_files - 1].start_time = o->start_time;
4421 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
4422 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
4424 /* check filename in case of an image number is expected */
4425 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
4426 if (!av_filename_number_test(oc->filename)) {
4427 print_error(oc->filename, AVERROR(EINVAL));
4432 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
4433 /* test if it already exists to avoid losing precious files */
4434 assert_file_overwrite(filename);
4437 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
4438 &oc->interrupt_callback,
4439 &output_files[nb_output_files - 1].opts)) < 0) {
4440 print_error(filename, err);
4445 if (o->mux_preload) {
4447 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
4448 av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
4450 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
4453 for (i = 0; i < o->nb_metadata_map; i++) {
4455 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
4457 if (in_file_index < 0)
4459 if (in_file_index >= nb_input_files) {
4460 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
4463 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, input_files[in_file_index].ctx, o);
4467 if (o->chapters_input_file >= nb_input_files) {
4468 if (o->chapters_input_file == INT_MAX) {
4469 /* copy chapters from the first input file that has them*/
4470 o->chapters_input_file = -1;
4471 for (i = 0; i < nb_input_files; i++)
4472 if (input_files[i].ctx->nb_chapters) {
4473 o->chapters_input_file = i;
4477 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
4478 o->chapters_input_file);
4482 if (o->chapters_input_file >= 0)
4483 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
4484 !o->metadata_chapters_manual);
4486 /* copy global metadata by default */
4487 if (!o->metadata_global_manual && nb_input_files){
4488 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
4489 AV_DICT_DONT_OVERWRITE);
4490 if(o->recording_time != INT64_MAX)
4491 av_dict_set(&oc->metadata, "duration", NULL, 0);
4493 if (!o->metadata_streams_manual)
4494 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
4496 if (output_streams[i].source_index < 0) /* this is true e.g. for attached files */
4498 ist = &input_streams[output_streams[i].source_index];
4499 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
4502 /* process manually set metadata */
4503 for (i = 0; i < o->nb_metadata; i++) {
4506 const char *stream_spec;
4507 int index = 0, j, ret = 0;
4509 val = strchr(o->metadata[i].u.str, '=');
4511 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
4512 o->metadata[i].u.str);
4517 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
4519 for (j = 0; j < oc->nb_streams; j++) {
4520 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
4521 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
4525 printf("ret %d, stream_spec %s\n", ret, stream_spec);
4533 if (index < 0 || index >= oc->nb_chapters) {
4534 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
4537 m = &oc->chapters[index]->metadata;
4540 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
4543 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
4547 reset_options(o, 0);
4550 /* same option as mencoder */
4551 static int opt_pass(const char *opt, const char *arg)
4553 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
4557 static int64_t getutime(void)
4560 struct rusage rusage;
4562 getrusage(RUSAGE_SELF, &rusage);
4563 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4564 #elif HAVE_GETPROCESSTIMES
4566 FILETIME c, e, k, u;
4567 proc = GetCurrentProcess();
4568 GetProcessTimes(proc, &c, &e, &k, &u);
4569 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4571 return av_gettime();
4575 static int64_t getmaxrss(void)
4577 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4578 struct rusage rusage;
4579 getrusage(RUSAGE_SELF, &rusage);
4580 return (int64_t)rusage.ru_maxrss * 1024;
4581 #elif HAVE_GETPROCESSMEMORYINFO
4583 PROCESS_MEMORY_COUNTERS memcounters;
4584 proc = GetCurrentProcess();
4585 memcounters.cb = sizeof(memcounters);
4586 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4587 return memcounters.PeakPagefileUsage;
4593 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
4595 return parse_option(o, "q:a", arg, options);
4598 static void show_usage(void)
4600 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
4601 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
4602 av_log(NULL, AV_LOG_INFO, "\n");
4605 static int opt_help(const char *opt, const char *arg)
4607 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
4608 av_log_set_callback(log_callback_help);
4610 show_help_options(options, "Main options:\n",
4611 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4612 show_help_options(options, "\nAdvanced options:\n",
4613 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4615 show_help_options(options, "\nVideo options:\n",
4616 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4618 show_help_options(options, "\nAdvanced Video options:\n",
4619 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4620 OPT_VIDEO | OPT_EXPERT);
4621 show_help_options(options, "\nAudio options:\n",
4622 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4624 show_help_options(options, "\nAdvanced Audio options:\n",
4625 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4626 OPT_AUDIO | OPT_EXPERT);
4627 show_help_options(options, "\nSubtitle options:\n",
4628 OPT_SUBTITLE | OPT_GRAB,
4630 show_help_options(options, "\nAudio/Video grab options:\n",
4634 show_help_children(avcodec_get_class(), flags);
4635 show_help_children(avformat_get_class(), flags);
4636 show_help_children(sws_get_class(), flags);
4641 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
4643 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4644 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
4646 if (!strncmp(arg, "pal-", 4)) {
4649 } else if (!strncmp(arg, "ntsc-", 5)) {
4652 } else if (!strncmp(arg, "film-", 5)) {
4656 /* Try to determine PAL/NTSC by peeking in the input files */
4657 if (nb_input_files) {
4659 for (j = 0; j < nb_input_files; j++) {
4660 for (i = 0; i < input_files[j].nb_streams; i++) {
4661 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4662 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
4664 fr = c->time_base.den * 1000 / c->time_base.num;
4668 } else if ((fr == 29970) || (fr == 23976)) {
4673 if (norm != UNKNOWN)
4677 if (norm != UNKNOWN)
4678 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4681 if (norm == UNKNOWN) {
4682 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4683 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4684 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
4688 if (!strcmp(arg, "vcd")) {
4689 opt_video_codec(o, "c:v", "mpeg1video");
4690 opt_audio_codec(o, "c:a", "mp2");
4691 parse_option(o, "f", "vcd", options);
4693 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
4694 parse_option(o, "r", frame_rates[norm], options);
4695 opt_default("g", norm == PAL ? "15" : "18");
4697 opt_default("b:v", "1150000");
4698 opt_default("maxrate", "1150000");
4699 opt_default("minrate", "1150000");
4700 opt_default("bufsize", "327680"); // 40*1024*8;
4702 opt_default("b:a", "224000");
4703 parse_option(o, "ar", "44100", options);
4704 parse_option(o, "ac", "2", options);
4706 opt_default("packetsize", "2324");
4707 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4709 /* We have to offset the PTS, so that it is consistent with the SCR.
4710 SCR starts at 36000, but the first two packs contain only padding
4711 and the first pack from the other stream, respectively, may also have
4712 been written before.
4713 So the real data starts at SCR 36000+3*1200. */
4714 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
4715 } else if (!strcmp(arg, "svcd")) {
4717 opt_video_codec(o, "c:v", "mpeg2video");
4718 opt_audio_codec(o, "c:a", "mp2");
4719 parse_option(o, "f", "svcd", options);
4721 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
4722 parse_option(o, "r", frame_rates[norm], options);
4723 parse_option(o, "pix_fmt", "yuv420p", options);
4724 opt_default("g", norm == PAL ? "15" : "18");
4726 opt_default("b:v", "2040000");
4727 opt_default("maxrate", "2516000");
4728 opt_default("minrate", "0"); // 1145000;
4729 opt_default("bufsize", "1835008"); // 224*1024*8;
4730 opt_default("flags", "+scan_offset");
4733 opt_default("b:a", "224000");
4734 parse_option(o, "ar", "44100", options);
4736 opt_default("packetsize", "2324");
4738 } else if (!strcmp(arg, "dvd")) {
4740 opt_video_codec(o, "c:v", "mpeg2video");
4741 opt_audio_codec(o, "c:a", "ac3");
4742 parse_option(o, "f", "dvd", options);
4744 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4745 parse_option(o, "r", frame_rates[norm], options);
4746 parse_option(o, "pix_fmt", "yuv420p", options);
4747 opt_default("g", norm == PAL ? "15" : "18");
4749 opt_default("b:v", "6000000");
4750 opt_default("maxrate", "9000000");
4751 opt_default("minrate", "0"); // 1500000;
4752 opt_default("bufsize", "1835008"); // 224*1024*8;
4754 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4755 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4757 opt_default("b:a", "448000");
4758 parse_option(o, "ar", "48000", options);
4760 } else if (!strncmp(arg, "dv", 2)) {
4762 parse_option(o, "f", "dv", options);
4764 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4765 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4766 norm == PAL ? "yuv420p" : "yuv411p", options);
4767 parse_option(o, "r", frame_rates[norm], options);
4769 parse_option(o, "ar", "48000", options);
4770 parse_option(o, "ac", "2", options);
4773 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
4774 return AVERROR(EINVAL);
4779 static int opt_vstats_file(const char *opt, const char *arg)
4781 av_free (vstats_filename);
4782 vstats_filename = av_strdup (arg);
4786 static int opt_vstats(const char *opt, const char *arg)
4789 time_t today2 = time(NULL);
4790 struct tm *today = localtime(&today2);
4792 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4794 return opt_vstats_file(opt, filename);
4797 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4799 return parse_option(o, "frames:v", arg, options);
4802 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4804 return parse_option(o, "frames:a", arg, options);
4807 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4809 return parse_option(o, "frames:d", arg, options);
4812 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
4815 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4816 const char *codec_name = *opt == 'v' ? video_codec_name :
4817 *opt == 'a' ? audio_codec_name :
4818 subtitle_codec_name;
4820 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4821 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
4822 av_log(0, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
4824 av_log(0, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
4829 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4830 if(line[0] == '#' && !e)
4832 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4834 av_log(0, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
4837 if(!strcmp(tmp, "acodec")){
4838 opt_audio_codec(o, tmp, tmp2);
4839 }else if(!strcmp(tmp, "vcodec")){
4840 opt_video_codec(o, tmp, tmp2);
4841 }else if(!strcmp(tmp, "scodec")){
4842 opt_subtitle_codec(o, tmp, tmp2);
4843 }else if(!strcmp(tmp, "dcodec")){
4844 opt_data_codec(o, tmp, tmp2);
4845 }else if(opt_default(tmp, tmp2) < 0){
4846 av_log(0, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4856 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
4860 static int opt_passlogfile(const char *opt, const char *arg)
4862 pass_logfilename_prefix = arg;
4863 #if CONFIG_LIBX264_ENCODER
4864 return opt_default("passlogfile", arg);
4870 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
4872 char *s = av_asprintf("%s:%c", opt + 1, *opt);
4873 int ret = parse_option(o, s, arg, options);
4878 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
4880 if(!strcmp(opt, "b")){
4881 av_log(0,AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
4882 return parse_option(o, "b:v", arg, options);
4884 return opt_default(opt, arg);
4887 static int opt_qscale(OptionsContext *o, const char *opt, const char *arg)
4891 if(!strcmp(opt, "qscale")){
4892 av_log(0,AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
4893 return parse_option(o, "q:v", arg, options);
4895 s = av_asprintf("q%s", opt + 6);
4896 ret = parse_option(o, s, arg, options);
4901 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4903 return parse_option(o, "filter:v", arg, options);
4906 static int opt_vsync(const char *opt, const char *arg)
4908 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
4909 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
4910 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
4911 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
4913 if (video_sync_method == VSYNC_AUTO)
4914 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
4918 static int opt_deinterlace(const char *opt, const char *arg)
4920 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
4925 #define OFFSET(x) offsetof(OptionsContext, x)
4926 static const OptionDef options[] = {
4928 #include "cmdutils_common_opts.h"
4929 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4930 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4931 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4932 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
4933 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4934 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4935 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
4936 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
4937 { "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]" },
4938 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
4939 "outfile[,metadata]:infile[,metadata]" },
4940 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4941 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4942 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4943 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4944 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4945 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4946 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4947 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4948 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4949 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4950 "add timings for benchmarking" },
4951 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4952 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4953 "dump each input packet" },
4954 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4955 "when dumping packets, also dump the payload" },
4956 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4957 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4958 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
4959 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4960 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4961 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4962 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying", "source" },
4963 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4964 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4965 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4966 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
4967 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4968 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4969 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4970 { "qscale", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_qscale}, "use fixed quality scale (VBR)", "q" },
4972 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4974 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
4975 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
4976 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
4979 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4980 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4981 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4982 { "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" },
4983 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4984 { "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" },
4985 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4986 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4987 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4988 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4989 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4990 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4991 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4992 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4993 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4994 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4995 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4996 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4997 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4998 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4999 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
5000 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
5001 "use same quantizer as source (implies VBR)" },
5002 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
5003 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
5004 { "deinterlace", OPT_EXPERT | OPT_VIDEO, {(void*)opt_deinterlace},
5005 "this option is deprecated, use the yadif filter instead" },
5006 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
5007 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
5008 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
5010 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
5012 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
5013 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
5014 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
5015 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
5016 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
5017 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
5018 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
5019 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
5020 { "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" },
5021 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
5024 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
5025 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
5026 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
5027 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
5028 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
5029 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
5030 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
5031 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
5032 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
5033 { "rmvol", HAS_ARG | OPT_AUDIO | OPT_FLOAT | OPT_SPEC, {.off = OFFSET(rematrix_volume)}, "rematrix volume (as factor)", "volume" },
5035 /* subtitle options */
5036 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
5037 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
5038 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
5041 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
5042 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
5043 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
5046 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
5047 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
5049 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
5050 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
5051 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
5053 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
5054 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
5055 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
5056 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
5057 /* data codec support */
5058 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
5059 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
5061 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
5065 int main(int argc, char **argv)
5067 OptionsContext o = { 0 };
5070 reset_options(&o, 0);
5072 av_log_set_flags(AV_LOG_SKIP_REPEATED);
5073 parse_loglevel(argc, argv, options);
5075 if(argc>1 && !strcmp(argv[1], "-d")){
5077 av_log_set_callback(log_callback_null);
5082 avcodec_register_all();
5084 avdevice_register_all();
5087 avfilter_register_all();
5090 avformat_network_init();
5092 show_banner(argc, argv, options);
5097 parse_options(&o, argc, argv, options, opt_output_file);
5099 if (nb_output_files <= 0 && nb_input_files == 0) {
5101 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
5105 /* file converter / grab */
5106 if (nb_output_files <= 0) {
5107 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
5111 if (nb_input_files == 0) {
5112 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
5117 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
5119 ti = getutime() - ti;
5121 int maxrss = getmaxrss() / 1024;
5122 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);