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
101 const char program_name[] = "ffmpeg";
102 const int program_birth_year = 2000;
104 /* select an input stream for an output stream */
105 typedef struct StreamMap {
106 int disabled; /** 1 is this mapping is disabled by a negative map */
110 int sync_stream_index;
114 int file_idx, stream_idx, channel_idx; // input
115 int ofile_idx, ostream_idx; // output
119 * select an input file for an output file
121 typedef struct MetadataMap {
122 int file; ///< file index
123 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
124 int index; ///< stream/chapter/program number
127 static const OptionDef options[];
129 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
131 static int frame_bits_per_raw_sample = 0;
132 static int video_discard = 0;
133 static int same_quant = 0;
134 static int do_deinterlace = 0;
135 static int intra_dc_precision = 8;
136 static int loop_input = 0;
137 static int loop_output = AVFMT_NOOUTPUTLOOP;
138 static int qp_hist = 0;
139 static int intra_only = 0;
140 static const char *video_codec_name = NULL;
141 static const char *audio_codec_name = NULL;
142 static const char *subtitle_codec_name = NULL;
144 static int file_overwrite = 0;
145 static int no_file_overwrite = 0;
146 static int do_benchmark = 0;
147 static int do_hex_dump = 0;
148 static int do_pkt_dump = 0;
149 static int do_psnr = 0;
150 static int do_pass = 0;
151 static const char *pass_logfilename_prefix;
152 static int video_sync_method = VSYNC_AUTO;
153 static int audio_sync_method = 0;
154 static float audio_drift_threshold = 0.1;
155 static int copy_ts = 0;
156 static int copy_tb = -1;
157 static int opt_shortest = 0;
158 static char *vstats_filename;
159 static FILE *vstats_file;
161 static int audio_volume = 256;
163 static int exit_on_error = 0;
164 static int using_stdin = 0;
165 static int run_as_daemon = 0;
166 static volatile int received_nb_signals = 0;
167 static int64_t video_size = 0;
168 static int64_t audio_size = 0;
169 static int64_t extra_size = 0;
170 static int nb_frames_dup = 0;
171 static int nb_frames_drop = 0;
172 static int input_sync;
174 static float dts_delta_threshold = 10;
176 static int print_stats = 1;
178 static uint8_t *audio_buf;
179 static unsigned int allocated_audio_buf_size;
181 static uint8_t *input_tmp= NULL;
183 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
185 typedef struct FrameBuffer {
191 enum PixelFormat pix_fmt;
194 struct InputStream *ist;
195 struct FrameBuffer *next;
198 typedef struct InputStream {
201 int discard; /* true if stream data should be discarded */
202 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
204 AVFrame *decoded_frame;
205 AVFrame *filtered_frame;
207 int64_t start; /* time when read started */
208 int64_t next_pts; /* synthetic pts for cases where pkt.pts
210 int64_t pts; /* current pts */
212 int is_start; /* is 1 at the start and after a discontinuity */
213 int showed_multi_packet_warning;
216 /* a pool of free buffers for decoded data */
217 FrameBuffer *buffer_pool;
221 typedef struct InputFile {
222 AVFormatContext *ctx;
223 int eof_reached; /* true if eof reached */
224 int ist_index; /* index of first stream in input_streams */
225 int buffer_size; /* current total buffer size */
227 int nb_streams; /* number of stream that ffmpeg is aware of; may be different
228 from ctx.nb_streams if new streams appear during av_read_frame() */
232 typedef struct OutputStream {
233 int file_index; /* file index */
234 int index; /* stream index in the output file */
235 int source_index; /* InputStream index */
236 AVStream *st; /* stream in the output file */
237 int encoding_needed; /* true if encoding needed for this stream */
239 /* input pts and corresponding output pts
241 // double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
242 struct InputStream *sync_ist; /* input stream to sync against */
243 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
244 AVBitStreamFilterContext *bitstream_filters;
247 AVFrame *output_frame;
251 AVFrame resample_frame; /* temporary frame for image resampling */
252 struct SwsContext *img_resample_ctx; /* for image resampling */
255 int resample_pix_fmt;
256 AVRational frame_rate;
260 float frame_aspect_ratio;
262 /* forced key frames */
263 int64_t *forced_kf_pts;
269 int audio_channels_map[SWR_CH_MAX]; ///< list of the channels id to pick from the source stream
270 int audio_channels_mapped; ///< number of channels in audio_channels_map
271 int resample_sample_fmt;
272 int resample_channels;
273 int resample_sample_rate;
274 float rematrix_volume;
275 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
278 struct SwrContext *swr;
281 AVFilterContext *output_video_filter;
282 AVFilterContext *input_video_filter;
283 AVFilterBufferRef *picref;
285 AVFilterGraph *graph;
290 int is_past_recording_time;
292 const char *attachment_filename;
293 int copy_initial_nonkeyframes;
299 /* init terminal so that we can grab keys */
300 static struct termios oldtty;
303 typedef struct OutputFile {
304 AVFormatContext *ctx;
306 int ost_index; /* index of the first stream in output_streams */
307 int64_t recording_time; /* desired length of the resulting file in microseconds */
308 int64_t start_time; /* start time in microseconds */
309 uint64_t limit_filesize;
312 static InputStream *input_streams = NULL;
313 static int nb_input_streams = 0;
314 static InputFile *input_files = NULL;
315 static int nb_input_files = 0;
317 static OutputStream *output_streams = NULL;
318 static int nb_output_streams = 0;
319 static OutputFile *output_files = NULL;
320 static int nb_output_files = 0;
322 typedef struct OptionsContext {
323 /* input/output options */
327 SpecifierOpt *codec_names;
329 SpecifierOpt *audio_channels;
330 int nb_audio_channels;
331 SpecifierOpt *audio_sample_rate;
332 int nb_audio_sample_rate;
333 SpecifierOpt *rematrix_volume;
334 int nb_rematrix_volume;
335 SpecifierOpt *frame_rates;
337 SpecifierOpt *frame_sizes;
339 SpecifierOpt *frame_pix_fmts;
340 int nb_frame_pix_fmts;
343 int64_t input_ts_offset;
346 SpecifierOpt *ts_scale;
348 SpecifierOpt *dump_attachment;
349 int nb_dump_attachment;
352 StreamMap *stream_maps;
354 AudioChannelMap *audio_channel_maps; ///< one info entry per -map_channel
355 int nb_audio_channel_maps; ///< number of (valid) -map_channel settings
356 /* first item specifies output metadata, second is input */
357 MetadataMap (*meta_data_maps)[2];
358 int nb_meta_data_maps;
359 int metadata_global_manual;
360 int metadata_streams_manual;
361 int metadata_chapters_manual;
362 const char **attachments;
365 int chapters_input_file;
367 int64_t recording_time;
368 uint64_t limit_filesize;
374 int subtitle_disable;
377 /* indexed by output file stream index */
381 SpecifierOpt *metadata;
383 SpecifierOpt *max_frames;
385 SpecifierOpt *bitstream_filters;
386 int nb_bitstream_filters;
387 SpecifierOpt *codec_tags;
389 SpecifierOpt *sample_fmts;
391 SpecifierOpt *qscale;
393 SpecifierOpt *forced_key_frames;
394 int nb_forced_key_frames;
395 SpecifierOpt *force_fps;
397 SpecifierOpt *frame_aspect_ratios;
398 int nb_frame_aspect_ratios;
399 SpecifierOpt *rc_overrides;
401 SpecifierOpt *intra_matrices;
402 int nb_intra_matrices;
403 SpecifierOpt *inter_matrices;
404 int nb_inter_matrices;
405 SpecifierOpt *top_field_first;
406 int nb_top_field_first;
407 SpecifierOpt *metadata_map;
409 SpecifierOpt *presets;
411 SpecifierOpt *copy_initial_nonkeyframes;
412 int nb_copy_initial_nonkeyframes;
414 SpecifierOpt *filters;
419 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
422 for (i = 0; i < o->nb_ ## name; i++) {\
423 char *spec = o->name[i].specifier;\
424 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
425 outvar = o->name[i].u.type;\
431 static void reset_options(OptionsContext *o, int is_input)
433 const OptionDef *po = options;
434 OptionsContext bak= *o;
436 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
438 void *dst = (uint8_t*)o + po->u.off;
440 if (po->flags & OPT_SPEC) {
441 SpecifierOpt **so = dst;
442 int i, *count = (int*)(so + 1);
443 for (i = 0; i < *count; i++) {
444 av_freep(&(*so)[i].specifier);
445 if (po->flags & OPT_STRING)
446 av_freep(&(*so)[i].u.str);
450 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
455 av_freep(&o->stream_maps);
456 av_freep(&o->audio_channel_maps);
457 av_freep(&o->meta_data_maps);
458 av_freep(&o->streamid_map);
460 memset(o, 0, sizeof(*o));
462 if(is_input) o->recording_time = bak.recording_time;
463 else o->recording_time = INT64_MAX;
464 o->mux_max_delay = 0.7;
465 o->limit_filesize = UINT64_MAX;
466 o->chapters_input_file = INT_MAX;
472 static int alloc_buffer(InputStream *ist, FrameBuffer **pbuf)
474 AVCodecContext *s = ist->st->codec;
475 FrameBuffer *buf = av_mallocz(sizeof(*buf));
477 const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1;
478 int h_chroma_shift, v_chroma_shift;
479 int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
480 int w = s->width, h = s->height;
483 return AVERROR(ENOMEM);
485 if (!(s->flags & CODEC_FLAG_EMU_EDGE)) {
490 avcodec_align_dimensions(s, &w, &h);
491 if ((ret = av_image_alloc(buf->base, buf->linesize, w, h,
492 s->pix_fmt, 32)) < 0) {
496 /* XXX this shouldn't be needed, but some tests break without this line
497 * those decoders are buggy and need to be fixed.
498 * the following tests fail:
499 * bethsoft-vid, cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
501 memset(buf->base[0], 128, ret);
503 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
504 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
505 const int h_shift = i==0 ? 0 : h_chroma_shift;
506 const int v_shift = i==0 ? 0 : v_chroma_shift;
507 if (s->flags & CODEC_FLAG_EMU_EDGE)
508 buf->data[i] = buf->base[i];
510 buf->data[i] = buf->base[i] +
511 FFALIGN((buf->linesize[i]*edge >> v_shift) +
512 (pixel_size*edge >> h_shift), 32);
516 buf->pix_fmt = s->pix_fmt;
523 static void free_buffer_pool(InputStream *ist)
525 FrameBuffer *buf = ist->buffer_pool;
527 ist->buffer_pool = buf->next;
528 av_freep(&buf->base[0]);
530 buf = ist->buffer_pool;
534 static void unref_buffer(InputStream *ist, FrameBuffer *buf)
536 av_assert0(buf->refcount);
538 if (!buf->refcount) {
539 buf->next = ist->buffer_pool;
540 ist->buffer_pool = buf;
544 static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
546 InputStream *ist = s->opaque;
550 if (!ist->buffer_pool && (ret = alloc_buffer(ist, &ist->buffer_pool)) < 0)
553 buf = ist->buffer_pool;
554 ist->buffer_pool = buf->next;
556 if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) {
557 av_freep(&buf->base[0]);
560 if ((ret = alloc_buffer(ist, &buf)) < 0)
566 frame->type = FF_BUFFER_TYPE_USER;
567 frame->extended_data = frame->data;
568 frame->pkt_pts = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE;
570 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
571 frame->base[i] = buf->base[i]; // XXX h264.c uses base though it shouldn't
572 frame->data[i] = buf->data[i];
573 frame->linesize[i] = buf->linesize[i];
579 static void codec_release_buffer(AVCodecContext *s, AVFrame *frame)
581 InputStream *ist = s->opaque;
582 FrameBuffer *buf = frame->opaque;
585 if(frame->type!=FF_BUFFER_TYPE_USER)
586 return avcodec_default_release_buffer(s, frame);
588 for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++)
589 frame->data[i] = NULL;
591 unref_buffer(ist, buf);
594 static void filter_release_buffer(AVFilterBuffer *fb)
596 FrameBuffer *buf = fb->priv;
598 unref_buffer(buf->ist, buf);
603 static int configure_video_filters(InputStream *ist, OutputStream *ost)
605 AVFilterContext *last_filter, *filter;
606 /** filter graph containing all filters including input & output */
607 AVCodecContext *codec = ost->st->codec;
608 AVCodecContext *icodec = ist->st->codec;
609 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
610 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
611 AVRational sample_aspect_ratio;
615 ost->graph = avfilter_graph_alloc();
617 if (ist->st->sample_aspect_ratio.num) {
618 sample_aspect_ratio = ist->st->sample_aspect_ratio;
620 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
622 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
623 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
624 sample_aspect_ratio.num, sample_aspect_ratio.den);
626 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
627 "src", args, NULL, ost->graph);
630 #if FF_API_OLD_VSINK_API
631 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
632 "out", NULL, pix_fmts, ost->graph);
634 buffersink_params->pixel_fmts = pix_fmts;
635 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
636 "out", NULL, buffersink_params, ost->graph);
638 av_freep(&buffersink_params);
641 last_filter = ost->input_video_filter;
643 if (codec->width != icodec->width || codec->height != icodec->height) {
644 snprintf(args, 255, "%d:%d:flags=0x%X",
647 (unsigned)ost->sws_flags);
648 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
649 NULL, args, NULL, ost->graph)) < 0)
651 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
653 last_filter = filter;
656 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
657 ost->graph->scale_sws_opts = av_strdup(args);
660 AVFilterInOut *outputs = avfilter_inout_alloc();
661 AVFilterInOut *inputs = avfilter_inout_alloc();
663 outputs->name = av_strdup("in");
664 outputs->filter_ctx = last_filter;
665 outputs->pad_idx = 0;
666 outputs->next = NULL;
668 inputs->name = av_strdup("out");
669 inputs->filter_ctx = ost->output_video_filter;
673 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
675 av_freep(&ost->avfilter);
677 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
681 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
684 codec->width = ost->output_video_filter->inputs[0]->w;
685 codec->height = ost->output_video_filter->inputs[0]->h;
686 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
687 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
688 av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
689 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
693 #endif /* CONFIG_AVFILTER */
695 static void term_exit(void)
697 av_log(NULL, AV_LOG_QUIET, "%s", "");
700 tcsetattr (0, TCSANOW, &oldtty);
704 static volatile int received_sigterm = 0;
706 static void sigterm_handler(int sig)
708 received_sigterm = sig;
709 received_nb_signals++;
711 if(received_nb_signals > 3)
715 static void term_init(void)
725 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
726 |INLCR|IGNCR|ICRNL|IXON);
727 tty.c_oflag |= OPOST;
728 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
729 tty.c_cflag &= ~(CSIZE|PARENB);
734 tcsetattr (0, TCSANOW, &tty);
735 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
738 avformat_network_deinit();
740 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
741 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
743 signal(SIGXCPU, sigterm_handler);
747 /* read a key without blocking */
748 static int read_key(void)
760 n = select(1, &rfds, NULL, NULL, &tv);
769 # if HAVE_PEEKNAMEDPIPE
771 static HANDLE input_handle;
774 input_handle = GetStdHandle(STD_INPUT_HANDLE);
775 is_pipe = !GetConsoleMode(input_handle, &dw);
778 if (stdin->_cnt > 0) {
783 /* When running under a GUI, you will end here. */
784 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
801 static int decode_interrupt_cb(void *ctx)
803 return received_nb_signals > 1;
806 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
808 void av_noreturn exit_program(int ret)
813 for (i = 0; i < nb_output_files; i++) {
814 AVFormatContext *s = output_files[i].ctx;
815 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
817 avformat_free_context(s);
818 av_dict_free(&output_files[i].opts);
820 for (i = 0; i < nb_output_streams; i++) {
821 AVBitStreamFilterContext *bsfc = output_streams[i].bitstream_filters;
823 AVBitStreamFilterContext *next = bsfc->next;
824 av_bitstream_filter_close(bsfc);
827 output_streams[i].bitstream_filters = NULL;
829 if (output_streams[i].output_frame) {
830 AVFrame *frame = output_streams[i].output_frame;
831 if (frame->extended_data != frame->data)
832 av_freep(&frame->extended_data);
836 for (i = 0; i < nb_input_files; i++) {
837 avformat_close_input(&input_files[i].ctx);
839 for (i = 0; i < nb_input_streams; i++) {
840 av_freep(&input_streams[i].decoded_frame);
841 av_freep(&input_streams[i].filtered_frame);
842 av_dict_free(&input_streams[i].opts);
843 free_buffer_pool(&input_streams[i]);
848 av_free(vstats_filename);
850 av_freep(&input_streams);
851 av_freep(&input_files);
852 av_freep(&output_streams);
853 av_freep(&output_files);
857 allocated_audio_buf_size = 0;
862 avformat_network_deinit();
864 av_freep(&input_tmp);
866 if (received_sigterm) {
867 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
868 (int) received_sigterm);
872 exit(ret); /* not all OS-es handle main() return value */
875 static void assert_avoptions(AVDictionary *m)
877 AVDictionaryEntry *t;
878 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
879 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
884 static void assert_codec_experimental(AVCodecContext *c, int encoder)
886 const char *codec_string = encoder ? "encoder" : "decoder";
888 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
889 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
890 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
891 "results.\nAdd '-strict experimental' if you want to use it.\n",
892 codec_string, c->codec->name);
893 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
894 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
895 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
896 codec_string, codec->name);
901 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
903 if (codec && codec->sample_fmts) {
904 const enum AVSampleFormat *p = codec->sample_fmts;
905 for (; *p != -1; p++) {
906 if (*p == st->codec->sample_fmt)
910 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
911 av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
912 if(av_get_sample_fmt_name(st->codec->sample_fmt))
913 av_log(NULL, AV_LOG_WARNING,
914 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
915 av_get_sample_fmt_name(st->codec->sample_fmt),
917 av_get_sample_fmt_name(codec->sample_fmts[0]));
918 st->codec->sample_fmt = codec->sample_fmts[0];
923 static void choose_sample_rate(AVStream *st, AVCodec *codec)
925 if (codec && codec->supported_samplerates) {
926 const int *p = codec->supported_samplerates;
928 int best_dist = INT_MAX;
930 int dist = abs(st->codec->sample_rate - *p);
931 if (dist < best_dist) {
937 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
939 st->codec->sample_rate = best;
943 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
945 if (codec && codec->pix_fmts) {
946 const enum PixelFormat *p = codec->pix_fmts;
947 int has_alpha= av_pix_fmt_descriptors[st->codec->pix_fmt].nb_components % 2 == 0;
948 enum PixelFormat best= PIX_FMT_NONE;
949 if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
950 if (st->codec->codec_id == CODEC_ID_MJPEG) {
951 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
952 } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
953 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
954 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
957 for (; *p != PIX_FMT_NONE; p++) {
958 best= avcodec_find_best_pix_fmt2(best, *p, st->codec->pix_fmt, has_alpha, NULL);
959 if (*p == st->codec->pix_fmt)
962 if (*p == PIX_FMT_NONE) {
963 if (st->codec->pix_fmt != PIX_FMT_NONE)
964 av_log(NULL, AV_LOG_WARNING,
965 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
966 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
968 av_pix_fmt_descriptors[best].name);
969 st->codec->pix_fmt = best;
974 static double get_sync_ipts(const OutputStream *ost)
976 const InputStream *ist = ost->sync_ist;
977 OutputFile *of = &output_files[ost->file_index];
978 return (double)(ist->pts - of->start_time) / AV_TIME_BASE;
981 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
983 AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
984 AVCodecContext *avctx = ost->st->codec;
988 AVPacket new_pkt = *pkt;
989 int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
990 &new_pkt.data, &new_pkt.size,
991 pkt->data, pkt->size,
992 pkt->flags & AV_PKT_FLAG_KEY);
995 new_pkt.destruct = av_destruct_packet;
997 av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
998 bsfc->filter->name, pkt->stream_index,
999 avctx->codec ? avctx->codec->name : "copy");
1009 ret = av_interleaved_write_frame(s, pkt);
1011 print_error("av_interleaved_write_frame()", ret);
1014 ost->frame_number++;
1017 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1019 int fill_char = 0x00;
1020 if (sample_fmt == AV_SAMPLE_FMT_U8)
1022 memset(buf, fill_char, size);
1025 static int encode_audio_frame(AVFormatContext *s, OutputStream *ost,
1026 const uint8_t *buf, int buf_size)
1028 AVCodecContext *enc = ost->st->codec;
1029 AVFrame *frame = NULL;
1031 int ret, got_packet;
1033 av_init_packet(&pkt);
1038 if (!ost->output_frame) {
1039 ost->output_frame = avcodec_alloc_frame();
1040 if (!ost->output_frame) {
1041 av_log(NULL, AV_LOG_FATAL, "out-of-memory in encode_audio_frame()\n");
1045 frame = ost->output_frame;
1046 if (frame->extended_data != frame->data)
1047 av_freep(&frame->extended_data);
1048 avcodec_get_frame_defaults(frame);
1050 frame->nb_samples = buf_size /
1051 (enc->channels * av_get_bytes_per_sample(enc->sample_fmt));
1052 if ((ret = avcodec_fill_audio_frame(frame, enc->channels, enc->sample_fmt,
1053 buf, buf_size, 1)) < 0) {
1054 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1060 if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
1061 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1066 pkt.stream_index = ost->index;
1067 if (pkt.pts != AV_NOPTS_VALUE)
1068 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1069 if (pkt.duration > 0)
1070 pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
1072 write_frame(s, &pkt, ost);
1074 audio_size += pkt.size;
1078 ost->sync_opts += frame->nb_samples;
1083 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
1084 InputStream *ist, AVFrame *decoded_frame)
1087 int64_t audio_buf_size, size_out;
1089 int frame_bytes, resample_changed;
1090 AVCodecContext *enc = ost->st->codec;
1091 AVCodecContext *dec = ist->st->codec;
1092 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1093 int isize = av_get_bytes_per_sample(dec->sample_fmt);
1094 uint8_t *buf = decoded_frame->data[0];
1095 int size = decoded_frame->nb_samples * dec->channels * isize;
1096 int64_t allocated_for_size = size;
1099 audio_buf_size = (allocated_for_size + isize * dec->channels - 1) / (isize * dec->channels);
1100 audio_buf_size = (audio_buf_size * enc->sample_rate + dec->sample_rate) / dec->sample_rate;
1101 audio_buf_size = audio_buf_size * 2 + 10000; // safety factors for the deprecated resampling API
1102 audio_buf_size = FFMAX(audio_buf_size, enc->frame_size);
1103 audio_buf_size *= osize * enc->channels;
1105 if (audio_buf_size > INT_MAX) {
1106 av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n");
1110 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
1112 av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
1116 if (enc->channels != dec->channels
1117 || enc->sample_fmt != dec->sample_fmt
1118 || enc->sample_rate!= dec->sample_rate
1120 ost->audio_resample = 1;
1122 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
1123 ost->resample_channels != dec->channels ||
1124 ost->resample_sample_rate != dec->sample_rate;
1126 if ((ost->audio_resample && !ost->swr) || resample_changed || ost->audio_channels_mapped) {
1127 if (resample_changed) {
1128 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",
1129 ist->file_index, ist->st->index,
1130 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
1131 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
1132 ost->resample_sample_fmt = dec->sample_fmt;
1133 ost->resample_channels = dec->channels;
1134 ost->resample_sample_rate = dec->sample_rate;
1135 swr_free(&ost->swr);
1137 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
1138 if (audio_sync_method <= 1 && !ost->audio_channels_mapped &&
1139 ost->resample_sample_fmt == enc->sample_fmt &&
1140 ost->resample_channels == enc->channels &&
1141 ost->resample_sample_rate == enc->sample_rate) {
1143 ost->audio_resample = 0;
1145 ost->swr = swr_alloc_set_opts(ost->swr,
1146 enc->channel_layout, enc->sample_fmt, enc->sample_rate,
1147 dec->channel_layout, dec->sample_fmt, dec->sample_rate,
1149 if (ost->audio_channels_mapped)
1150 swr_set_channel_mapping(ost->swr, ost->audio_channels_map);
1151 av_opt_set_double(ost->swr, "rmvol", ost->rematrix_volume, 0);
1152 if (ost->audio_channels_mapped) {
1153 av_opt_set_int(ost->swr, "icl", av_get_default_channel_layout(ost->audio_channels_mapped), 0);
1154 av_opt_set_int(ost->swr, "uch", ost->audio_channels_mapped, 0);
1156 if (av_opt_set_int(ost->swr, "ich", dec->channels, 0) < 0) {
1157 av_log(NULL, AV_LOG_FATAL, "Unsupported number of input channels\n");
1160 if (av_opt_set_int(ost->swr, "och", enc->channels, 0) < 0) {
1161 av_log(NULL, AV_LOG_FATAL, "Unsupported number of output channels\n");
1164 if(audio_sync_method>1) av_opt_set_int(ost->swr, "flags", SWR_FLAG_RESAMPLE, 0);
1165 if(ost->swr && swr_init(ost->swr) < 0){
1166 av_log(NULL, AV_LOG_FATAL, "swr_init() failed\n");
1167 swr_free(&ost->swr);
1171 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
1172 dec->channels, dec->sample_rate,
1173 enc->channels, enc->sample_rate);
1179 av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
1181 if (audio_sync_method) {
1182 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts -
1183 av_fifo_size(ost->fifo) / (enc->channels * osize);
1184 int idelta = delta * dec->sample_rate / enc->sample_rate;
1185 int byte_delta = idelta * isize * dec->channels;
1187 // FIXME resample delay
1188 if (fabs(delta) > 50) {
1189 if (ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate) {
1190 if (byte_delta < 0) {
1191 byte_delta = FFMAX(byte_delta, -size);
1194 av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n",
1195 -byte_delta / (isize * dec->channels));
1200 input_tmp = av_realloc(input_tmp, byte_delta + size);
1202 if (byte_delta > allocated_for_size - size) {
1203 allocated_for_size = byte_delta + (int64_t)size;
1208 generate_silence(input_tmp, dec->sample_fmt, byte_delta);
1209 memcpy(input_tmp + byte_delta, buf, size);
1212 av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
1214 } else if (audio_sync_method > 1) {
1215 int comp = av_clip(delta, -audio_sync_method, audio_sync_method);
1216 av_assert0(ost->audio_resample);
1217 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
1218 delta, comp, enc->sample_rate);
1219 // 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));
1220 swr_set_compensation(ost->swr, comp, enc->sample_rate);
1224 ost->sync_opts = lrintf(get_sync_ipts(ost) * enc->sample_rate) -
1225 av_fifo_size(ost->fifo) / (enc->channels * osize); // FIXME wrong
1227 if (ost->audio_resample) {
1229 size_out = swr_convert(ost->swr, ( uint8_t*[]){buftmp}, audio_buf_size / (enc->channels * osize),
1230 (const uint8_t*[]){buf }, size / (dec->channels * isize));
1231 size_out = size_out * enc->channels * osize;
1237 av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
1239 /* now encode as many frames as possible */
1240 if (!(enc->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)) {
1241 /* output resampled raw samples */
1242 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
1243 av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
1246 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
1248 frame_bytes = enc->frame_size * osize * enc->channels;
1250 while (av_fifo_size(ost->fifo) >= frame_bytes) {
1251 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
1252 encode_audio_frame(s, ost, audio_buf, frame_bytes);
1255 encode_audio_frame(s, ost, buftmp, size_out);
1259 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1261 AVCodecContext *dec;
1262 AVPicture *picture2;
1263 AVPicture picture_tmp;
1266 dec = ist->st->codec;
1268 /* deinterlace : must be done before any resize */
1269 if (do_deinterlace) {
1272 /* create temporary picture */
1273 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1274 buf = av_malloc(size);
1278 picture2 = &picture_tmp;
1279 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1281 if (avpicture_deinterlace(picture2, picture,
1282 dec->pix_fmt, dec->width, dec->height) < 0) {
1283 /* if error, do not deinterlace */
1284 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1293 if (picture != picture2)
1294 *picture = *picture2;
1298 static void do_subtitle_out(AVFormatContext *s,
1304 static uint8_t *subtitle_out = NULL;
1305 int subtitle_out_max_size = 1024 * 1024;
1306 int subtitle_out_size, nb, i;
1307 AVCodecContext *enc;
1310 if (pts == AV_NOPTS_VALUE) {
1311 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1317 enc = ost->st->codec;
1319 if (!subtitle_out) {
1320 subtitle_out = av_malloc(subtitle_out_max_size);
1323 /* Note: DVB subtitle need one packet to draw them and one other
1324 packet to clear them */
1325 /* XXX: signal it in the codec context ? */
1326 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1331 for (i = 0; i < nb; i++) {
1332 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1333 // start_display_time is required to be 0
1334 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1335 sub->end_display_time -= sub->start_display_time;
1336 sub->start_display_time = 0;
1337 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1338 subtitle_out_max_size, sub);
1339 if (subtitle_out_size < 0) {
1340 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1344 av_init_packet(&pkt);
1345 pkt.stream_index = ost->index;
1346 pkt.data = subtitle_out;
1347 pkt.size = subtitle_out_size;
1348 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1349 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1350 /* XXX: the pts correction is handled here. Maybe handling
1351 it in the codec would be better */
1353 pkt.pts += 90 * sub->start_display_time;
1355 pkt.pts += 90 * sub->end_display_time;
1357 write_frame(s, &pkt, ost);
1361 static int bit_buffer_size = 1024 * 256;
1362 static uint8_t *bit_buffer = NULL;
1364 static void do_video_resample(OutputStream *ost,
1366 AVFrame *in_picture,
1367 AVFrame **out_picture)
1370 *out_picture = in_picture;
1372 AVCodecContext *dec = ist->st->codec;
1373 AVCodecContext *enc = ost->st->codec;
1374 int resample_changed = ost->resample_width != in_picture->width ||
1375 ost->resample_height != in_picture->height ||
1376 ost->resample_pix_fmt != in_picture->format;
1378 *out_picture = in_picture;
1379 if (resample_changed) {
1380 av_log(NULL, AV_LOG_INFO,
1381 "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",
1382 ist->file_index, ist->st->index,
1383 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1384 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt),
1385 in_picture->width, in_picture->height, av_get_pix_fmt_name(in_picture->format));
1386 ost->resample_width = in_picture->width;
1387 ost->resample_height = in_picture->height;
1388 ost->resample_pix_fmt = in_picture->format;
1391 ost->video_resample = in_picture->width != enc->width ||
1392 in_picture->height != enc->height ||
1393 in_picture->format != enc->pix_fmt;
1395 if (ost->video_resample) {
1396 *out_picture = &ost->resample_frame;
1397 if (!ost->img_resample_ctx || resample_changed) {
1398 /* initialize the destination picture */
1399 if (!ost->resample_frame.data[0]) {
1400 avcodec_get_frame_defaults(&ost->resample_frame);
1401 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1402 enc->width, enc->height)) {
1403 av_log(NULL, AV_LOG_FATAL, "Cannot allocate temp picture, check pix fmt\n");
1407 /* initialize a new scaler context */
1408 sws_freeContext(ost->img_resample_ctx);
1409 ost->img_resample_ctx = sws_getContext(in_picture->width, in_picture->height, in_picture->format,
1410 enc->width, enc->height, enc->pix_fmt,
1411 ost->sws_flags, NULL, NULL, NULL);
1412 if (ost->img_resample_ctx == NULL) {
1413 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1417 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1418 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1424 static void do_video_out(AVFormatContext *s,
1427 AVFrame *in_picture,
1428 int *frame_size, float quality)
1430 int nb_frames, i, ret, format_video_sync;
1431 AVFrame *final_picture;
1432 AVCodecContext *enc;
1434 double duration = 0;
1436 enc = ost->st->codec;
1438 if (ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE) {
1439 duration = FFMAX(av_q2d(ist->st->time_base), av_q2d(ist->st->codec->time_base));
1440 if(ist->st->avg_frame_rate.num)
1441 duration= FFMAX(duration, 1/av_q2d(ist->st->avg_frame_rate));
1443 duration /= av_q2d(enc->time_base);
1446 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1448 /* by default, we output a single frame */
1453 format_video_sync = video_sync_method;
1454 if (format_video_sync == VSYNC_AUTO)
1455 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
1457 if (format_video_sync != VSYNC_PASSTHROUGH) {
1458 double vdelta = sync_ipts - ost->sync_opts + duration;
1459 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1462 else if (format_video_sync == VSYNC_VFR) {
1463 if (vdelta <= -0.6) {
1465 } else if (vdelta > 0.6)
1466 ost->sync_opts = lrintf(sync_ipts);
1467 } else if (vdelta > 1.1)
1468 nb_frames = lrintf(vdelta);
1469 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, get_sync_ipts(ost), nb_frames);
1470 if (nb_frames == 0) {
1472 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1473 } else if (nb_frames > 1) {
1474 nb_frames_dup += nb_frames - 1;
1475 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1478 ost->sync_opts = lrintf(sync_ipts);
1480 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1484 do_video_resample(ost, ist, in_picture, &final_picture);
1486 /* duplicates frame if needed */
1487 for (i = 0; i < nb_frames; i++) {
1489 av_init_packet(&pkt);
1490 pkt.stream_index = ost->index;
1492 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1493 enc->codec->id == CODEC_ID_RAWVIDEO) {
1494 /* raw pictures are written as AVPicture structure to
1495 avoid any copies. We support temporarily the older
1497 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1498 enc->coded_frame->top_field_first = in_picture->top_field_first;
1499 pkt.data = (uint8_t *)final_picture;
1500 pkt.size = sizeof(AVPicture);
1501 pkt.pts = av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1502 pkt.flags |= AV_PKT_FLAG_KEY;
1504 write_frame(s, &pkt, ost);
1506 AVFrame big_picture;
1508 big_picture = *final_picture;
1509 /* better than nothing: use input picture interlaced
1511 big_picture.interlaced_frame = in_picture->interlaced_frame;
1512 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1513 if (ost->top_field_first == -1)
1514 big_picture.top_field_first = in_picture->top_field_first;
1516 big_picture.top_field_first = !!ost->top_field_first;
1519 /* handles same_quant here. This is not correct because it may
1520 not be a global option */
1521 big_picture.quality = quality;
1522 if (!enc->me_threshold)
1523 big_picture.pict_type = 0;
1524 // big_picture.pts = AV_NOPTS_VALUE;
1525 big_picture.pts = ost->sync_opts;
1526 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1527 // av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1528 if (ost->forced_kf_index < ost->forced_kf_count &&
1529 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1530 big_picture.pict_type = AV_PICTURE_TYPE_I;
1531 ost->forced_kf_index++;
1533 ret = avcodec_encode_video(enc,
1534 bit_buffer, bit_buffer_size,
1537 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1542 pkt.data = bit_buffer;
1544 if (enc->coded_frame->pts != AV_NOPTS_VALUE)
1545 pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1546 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1547 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1548 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1550 if (enc->coded_frame->key_frame)
1551 pkt.flags |= AV_PKT_FLAG_KEY;
1552 write_frame(s, &pkt, ost);
1555 // fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1556 // enc->frame_number-1, ret, enc->pict_type);
1557 /* if two pass, output log */
1558 if (ost->logfile && enc->stats_out) {
1559 fprintf(ost->logfile, "%s", enc->stats_out);
1567 static double psnr(double d)
1569 return -10.0 * log(d) / log(10.0);
1572 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1575 AVCodecContext *enc;
1577 double ti1, bitrate, avg_bitrate;
1579 /* this is executed just the first time do_video_stats is called */
1581 vstats_file = fopen(vstats_filename, "w");
1588 enc = ost->st->codec;
1589 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1590 frame_number = ost->frame_number;
1591 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1592 if (enc->flags&CODEC_FLAG_PSNR)
1593 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1595 fprintf(vstats_file,"f_size= %6d ", frame_size);
1596 /* compute pts value */
1597 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1601 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1602 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1603 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1604 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1605 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1609 static void print_report(OutputFile *output_files,
1610 OutputStream *ost_table, int nb_ostreams,
1611 int is_last_report, int64_t timer_start, int64_t cur_time)
1615 AVFormatContext *oc;
1617 AVCodecContext *enc;
1618 int frame_number, vid, i;
1620 int64_t pts = INT64_MAX;
1621 static int64_t last_time = -1;
1622 static int qp_histogram[52];
1623 int hours, mins, secs, us;
1625 if (!print_stats && !is_last_report)
1628 if (!is_last_report) {
1629 if (last_time == -1) {
1630 last_time = cur_time;
1633 if ((cur_time - last_time) < 500000)
1635 last_time = cur_time;
1639 oc = output_files[0].ctx;
1641 total_size = avio_size(oc->pb);
1642 if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
1643 total_size = avio_tell(oc->pb);
1650 for (i = 0; i < nb_ostreams; i++) {
1652 ost = &ost_table[i];
1653 enc = ost->st->codec;
1654 if (!ost->stream_copy && enc->coded_frame)
1655 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
1656 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1657 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1659 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1660 float t = (cur_time-timer_start) / 1000000.0;
1662 frame_number = ost->frame_number;
1663 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1664 frame_number, (t > 1) ? (int)(frame_number / t + 0.5) : 0, q);
1666 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1670 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
1672 for (j = 0; j < 32; j++)
1673 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
1675 if (enc->flags&CODEC_FLAG_PSNR) {
1677 double error, error_sum = 0;
1678 double scale, scale_sum = 0;
1679 char type[3] = { 'Y','U','V' };
1680 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1681 for (j = 0; j < 3; j++) {
1682 if (is_last_report) {
1683 error = enc->error[j];
1684 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
1686 error = enc->coded_frame->error[j];
1687 scale = enc->width * enc->height * 255.0 * 255.0;
1693 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error / scale));
1695 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
1699 /* compute min output value */
1700 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1701 ost->st->time_base, AV_TIME_BASE_Q));
1704 secs = pts / AV_TIME_BASE;
1705 us = pts % AV_TIME_BASE;
1711 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1713 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1714 "size=%8.0fkB time=", total_size / 1024.0);
1715 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1716 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1717 (100 * us) / AV_TIME_BASE);
1718 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1719 "bitrate=%6.1fkbits/s", bitrate);
1721 if (nb_frames_dup || nb_frames_drop)
1722 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1723 nb_frames_dup, nb_frames_drop);
1725 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
1729 if (is_last_report) {
1730 int64_t raw= audio_size + video_size + extra_size;
1731 av_log(NULL, AV_LOG_INFO, "\n");
1732 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1733 video_size / 1024.0,
1734 audio_size / 1024.0,
1735 extra_size / 1024.0,
1736 100.0 * (total_size - raw) / raw
1738 if(video_size + audio_size + extra_size == 0){
1739 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
1744 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1748 for (i = 0; i < nb_ostreams; i++) {
1749 OutputStream *ost = &ost_table[i];
1750 AVCodecContext *enc = ost->st->codec;
1751 AVFormatContext *os = output_files[ost->file_index].ctx;
1752 int stop_encoding = 0;
1754 if (!ost->encoding_needed)
1757 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
1759 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
1765 av_init_packet(&pkt);
1769 switch (ost->st->codec->codec_type) {
1770 case AVMEDIA_TYPE_AUDIO:
1771 fifo_bytes = av_fifo_size(ost->fifo);
1772 if (fifo_bytes > 0) {
1773 /* encode any samples remaining in fifo */
1774 int frame_bytes = fifo_bytes;
1776 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1778 /* pad last frame with silence if needed */
1779 if (!(enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME)) {
1780 frame_bytes = enc->frame_size * enc->channels *
1781 av_get_bytes_per_sample(enc->sample_fmt);
1782 if (allocated_audio_buf_size < frame_bytes)
1784 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1786 encode_audio_frame(os, ost, audio_buf, frame_bytes);
1788 /* flush encoder with NULL frames until it is done
1789 returning packets */
1790 if (encode_audio_frame(os, ost, NULL, 0) == 0) {
1796 case AVMEDIA_TYPE_VIDEO:
1797 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1799 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1803 if (enc->coded_frame && enc->coded_frame->key_frame)
1804 pkt.flags |= AV_PKT_FLAG_KEY;
1805 if (ost->logfile && enc->stats_out) {
1806 fprintf(ost->logfile, "%s", enc->stats_out);
1812 pkt.stream_index = ost->index;
1813 pkt.data = bit_buffer;
1815 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1816 pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1817 write_frame(os, &pkt, ost);
1829 * Check whether a packet from ist should be written into ost at this time
1831 static int check_output_constraints(InputStream *ist, OutputStream *ost)
1833 OutputFile *of = &output_files[ost->file_index];
1834 int ist_index = ist - input_streams;
1836 if (ost->source_index != ist_index)
1839 if (of->start_time && ist->pts < of->start_time)
1842 if (of->recording_time != INT64_MAX &&
1843 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1844 (AVRational){ 1, 1000000 }) >= 0) {
1845 ost->is_past_recording_time = 1;
1852 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
1854 OutputFile *of = &output_files[ost->file_index];
1855 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1859 av_init_packet(&opkt);
1861 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
1862 !ost->copy_initial_nonkeyframes)
1865 /* force the input stream PTS */
1866 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1867 audio_size += pkt->size;
1868 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1869 video_size += pkt->size;
1873 opkt.stream_index = ost->index;
1874 if (pkt->pts != AV_NOPTS_VALUE)
1875 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1877 opkt.pts = AV_NOPTS_VALUE;
1879 if (pkt->dts == AV_NOPTS_VALUE)
1880 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1882 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1883 opkt.dts -= ost_tb_start_time;
1885 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1886 opkt.flags = pkt->flags;
1888 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1889 if ( ost->st->codec->codec_id != CODEC_ID_H264
1890 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1891 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1893 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
1894 opkt.destruct = av_destruct_packet;
1896 opkt.data = pkt->data;
1897 opkt.size = pkt->size;
1899 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
1900 /* store AVPicture in AVPacket, as expected by the output format */
1901 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1902 opkt.data = (uint8_t *)&pict;
1903 opkt.size = sizeof(AVPicture);
1904 opkt.flags |= AV_PKT_FLAG_KEY;
1907 write_frame(of->ctx, &opkt, ost);
1908 ost->st->codec->frame_number++;
1909 av_free_packet(&opkt);
1912 static void rate_emu_sleep(InputStream *ist)
1914 if (input_files[ist->file_index].rate_emu) {
1915 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1916 int64_t now = av_gettime() - ist->start;
1922 static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
1924 AVFrame *decoded_frame;
1925 AVCodecContext *avctx = ist->st->codec;
1926 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1929 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
1930 return AVERROR(ENOMEM);
1932 avcodec_get_frame_defaults(ist->decoded_frame);
1933 decoded_frame = ist->decoded_frame;
1935 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
1941 /* no audio frame */
1945 /* if the decoder provides a pts, use it instead of the last packet pts.
1946 the decoder could be delaying output by a packet or more. */
1947 if (decoded_frame->pts != AV_NOPTS_VALUE)
1948 ist->next_pts = decoded_frame->pts;
1950 /* increment next_pts to use for the case where the input stream does not
1951 have timestamps or there are multiple frames in the packet */
1952 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
1955 // preprocess audio (volume)
1956 if (audio_volume != 256) {
1957 int decoded_data_size = decoded_frame->nb_samples * avctx->channels * bps;
1958 void *samples = decoded_frame->data[0];
1959 switch (avctx->sample_fmt) {
1960 case AV_SAMPLE_FMT_U8:
1962 uint8_t *volp = samples;
1963 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1964 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
1965 *volp++ = av_clip_uint8(v);
1969 case AV_SAMPLE_FMT_S16:
1971 int16_t *volp = samples;
1972 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1973 int v = ((*volp) * audio_volume + 128) >> 8;
1974 *volp++ = av_clip_int16(v);
1978 case AV_SAMPLE_FMT_S32:
1980 int32_t *volp = samples;
1981 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1982 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
1983 *volp++ = av_clipl_int32(v);
1987 case AV_SAMPLE_FMT_FLT:
1989 float *volp = samples;
1990 float scale = audio_volume / 256.f;
1991 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1996 case AV_SAMPLE_FMT_DBL:
1998 double *volp = samples;
1999 double scale = audio_volume / 256.;
2000 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2006 av_log(NULL, AV_LOG_FATAL,
2007 "Audio volume adjustment on sample format %s is not supported.\n",
2008 av_get_sample_fmt_name(ist->st->codec->sample_fmt));
2013 rate_emu_sleep(ist);
2015 for (i = 0; i < nb_output_streams; i++) {
2016 OutputStream *ost = &output_streams[i];
2018 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2020 do_audio_out(output_files[ost->file_index].ctx, ost, ist, decoded_frame);
2026 static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *pkt_pts, int64_t *pkt_dts)
2028 AVFrame *decoded_frame, *filtered_frame = NULL;
2029 void *buffer_to_free = NULL;
2033 int frame_available = 1;
2036 int64_t *best_effort_timestamp;
2037 AVRational *frame_sample_aspect;
2039 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2040 return AVERROR(ENOMEM);
2042 avcodec_get_frame_defaults(ist->decoded_frame);
2043 decoded_frame = ist->decoded_frame;
2044 pkt->pts = *pkt_pts;
2045 pkt->dts = *pkt_dts;
2046 *pkt_pts = AV_NOPTS_VALUE;
2048 if (pkt->duration) {
2049 duration = av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2050 } else if(ist->st->codec->time_base.num != 0) {
2051 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2052 duration = ((int64_t)AV_TIME_BASE *
2053 ist->st->codec->time_base.num * ticks) /
2054 ist->st->codec->time_base.den;
2057 if(*pkt_dts != AV_NOPTS_VALUE && duration) {
2058 *pkt_dts += duration;
2060 *pkt_dts = AV_NOPTS_VALUE;
2062 ret = avcodec_decode_video2(ist->st->codec,
2063 decoded_frame, got_output, pkt);
2067 quality = same_quant ? decoded_frame->quality : 0;
2069 /* no picture yet */
2073 best_effort_timestamp= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "best_effort_timestamp");
2074 if(*best_effort_timestamp != AV_NOPTS_VALUE)
2075 ist->next_pts = ist->pts = *best_effort_timestamp;
2077 ist->next_pts += duration;
2080 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2083 frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
2084 for(i=0;i<nb_output_streams;i++) {
2085 OutputStream *ost = ost = &output_streams[i];
2086 if(check_output_constraints(ist, ost) && ost->encoding_needed){
2087 if (!frame_sample_aspect->num)
2088 *frame_sample_aspect = ist->st->sample_aspect_ratio;
2089 decoded_frame->pts = ist->pts;
2090 if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER) {
2091 FrameBuffer *buf = decoded_frame->opaque;
2092 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2093 decoded_frame->data, decoded_frame->linesize,
2094 AV_PERM_READ | AV_PERM_PRESERVE,
2095 ist->st->codec->width, ist->st->codec->height,
2096 ist->st->codec->pix_fmt);
2098 avfilter_copy_frame_props(fb, decoded_frame);
2100 fb->buf->priv = buf;
2101 fb->buf->free = filter_release_buffer;
2104 av_buffersrc_buffer(ost->input_video_filter, fb);
2106 if((av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame, AV_VSRC_BUF_FLAG_OVERWRITE)) < 0){
2107 av_log(0, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
2114 rate_emu_sleep(ist);
2116 for (i = 0; i < nb_output_streams; i++) {
2117 OutputStream *ost = &output_streams[i];
2120 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2124 if (ost->input_video_filter) {
2125 frame_available = av_buffersink_poll_frame(ost->output_video_filter);
2127 while (frame_available) {
2128 if (ost->output_video_filter) {
2129 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
2130 if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0){
2131 av_log(0, AV_LOG_WARNING, "AV Filter told us it has a frame available but failed to output one\n");
2134 if (!ist->filtered_frame && !(ist->filtered_frame = avcodec_alloc_frame())) {
2135 av_free(buffer_to_free);
2136 return AVERROR(ENOMEM);
2138 avcodec_get_frame_defaults(ist->filtered_frame);
2139 filtered_frame = ist->filtered_frame;
2140 *filtered_frame= *decoded_frame; //for me_threshold
2142 avfilter_fill_frame_from_video_buffer_ref(filtered_frame, ost->picref);
2143 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
2146 if (ost->picref->video && !ost->frame_aspect_ratio)
2147 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
2149 filtered_frame = decoded_frame;
2152 do_video_out(output_files[ost->file_index].ctx, ost, ist, filtered_frame, &frame_size,
2153 same_quant ? quality : ost->st->codec->global_quality);
2154 if (vstats_filename && frame_size)
2155 do_video_stats(output_files[ost->file_index].ctx, ost, frame_size);
2158 frame_available = ost->output_video_filter && av_buffersink_poll_frame(ost->output_video_filter);
2159 avfilter_unref_buffer(ost->picref);
2164 av_free(buffer_to_free);
2168 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2170 AVSubtitle subtitle;
2171 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2172 &subtitle, got_output, pkt);
2178 rate_emu_sleep(ist);
2180 for (i = 0; i < nb_output_streams; i++) {
2181 OutputStream *ost = &output_streams[i];
2183 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2186 do_subtitle_out(output_files[ost->file_index].ctx, ost, ist, &subtitle, pkt->pts);
2189 avsubtitle_free(&subtitle);
2193 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2194 static int output_packet(InputStream *ist,
2195 OutputStream *ost_table, int nb_ostreams,
2196 const AVPacket *pkt)
2200 int64_t pkt_dts = AV_NOPTS_VALUE;
2201 int64_t pkt_pts = AV_NOPTS_VALUE;
2205 if (ist->next_pts == AV_NOPTS_VALUE)
2206 ist->next_pts = ist->pts;
2210 av_init_packet(&avpkt);
2218 if (pkt->dts != AV_NOPTS_VALUE) {
2219 if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2220 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2221 pkt_dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2223 if(pkt->pts != AV_NOPTS_VALUE)
2224 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2226 // while we have more to decode or while the decoder did output something on EOF
2227 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2230 ist->pts = ist->next_pts;
2232 if (avpkt.size && avpkt.size != pkt->size) {
2233 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2234 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2235 ist->showed_multi_packet_warning = 1;
2238 switch (ist->st->codec->codec_type) {
2239 case AVMEDIA_TYPE_AUDIO:
2240 ret = transcode_audio (ist, &avpkt, &got_output);
2242 case AVMEDIA_TYPE_VIDEO:
2243 ret = transcode_video (ist, &avpkt, &got_output, &pkt_pts, &pkt_dts);
2245 case AVMEDIA_TYPE_SUBTITLE:
2246 ret = transcode_subtitles(ist, &avpkt, &got_output);
2256 avpkt.pts= AV_NOPTS_VALUE;
2258 // touch data and size only if not EOF
2260 if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2270 /* handle stream copy */
2271 if (!ist->decoding_needed) {
2272 rate_emu_sleep(ist);
2273 ist->pts = ist->next_pts;
2274 switch (ist->st->codec->codec_type) {
2275 case AVMEDIA_TYPE_AUDIO:
2276 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2277 ist->st->codec->sample_rate;
2279 case AVMEDIA_TYPE_VIDEO:
2280 if (pkt->duration) {
2281 ist->next_pts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2282 } else if(ist->st->codec->time_base.num != 0) {
2283 int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2284 ist->next_pts += ((int64_t)AV_TIME_BASE *
2285 ist->st->codec->time_base.num * ticks) /
2286 ist->st->codec->time_base.den;
2291 for (i = 0; pkt && i < nb_ostreams; i++) {
2292 OutputStream *ost = &ost_table[i];
2294 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2297 do_streamcopy(ist, ost, pkt);
2303 static void print_sdp(OutputFile *output_files, int n)
2307 AVFormatContext **avc = av_malloc(sizeof(*avc) * n);
2311 for (i = 0; i < n; i++)
2312 avc[i] = output_files[i].ctx;
2314 av_sdp_create(avc, n, sdp, sizeof(sdp));
2315 printf("SDP:\n%s\n", sdp);
2320 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
2321 char *error, int error_len)
2323 InputStream *ist = &input_streams[ist_index];
2324 if (ist->decoding_needed) {
2325 AVCodec *codec = ist->dec;
2327 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2328 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2329 return AVERROR(EINVAL);
2332 ist->dr1 = codec->capabilities & CODEC_CAP_DR1;
2333 if (codec->type == AVMEDIA_TYPE_VIDEO && ist->dr1) {
2334 ist->st->codec->get_buffer = codec_get_buffer;
2335 ist->st->codec->release_buffer = codec_release_buffer;
2336 ist->st->codec->opaque = ist;
2339 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2340 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2341 ist->file_index, ist->st->index);
2342 return AVERROR(EINVAL);
2344 assert_codec_experimental(ist->st->codec, 0);
2345 assert_avoptions(ist->opts);
2348 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;
2349 ist->next_pts = AV_NOPTS_VALUE;
2355 static int transcode_init(OutputFile *output_files, int nb_output_files,
2356 InputFile *input_files, int nb_input_files)
2358 int ret = 0, i, j, k;
2359 AVFormatContext *oc;
2360 AVCodecContext *codec, *icodec;
2366 /* init framerate emulation */
2367 for (i = 0; i < nb_input_files; i++) {
2368 InputFile *ifile = &input_files[i];
2369 if (ifile->rate_emu)
2370 for (j = 0; j < ifile->nb_streams; j++)
2371 input_streams[j + ifile->ist_index].start = av_gettime();
2374 /* output stream init */
2375 for (i = 0; i < nb_output_files; i++) {
2376 oc = output_files[i].ctx;
2377 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2378 av_dump_format(oc, i, oc->filename, 1);
2379 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2380 return AVERROR(EINVAL);
2384 /* for each output stream, we compute the right encoding parameters */
2385 for (i = 0; i < nb_output_streams; i++) {
2386 ost = &output_streams[i];
2387 oc = output_files[ost->file_index].ctx;
2388 ist = &input_streams[ost->source_index];
2390 if (ost->attachment_filename)
2393 codec = ost->st->codec;
2394 icodec = ist->st->codec;
2396 ost->st->disposition = ist->st->disposition;
2397 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2398 codec->chroma_sample_location = icodec->chroma_sample_location;
2400 if (ost->stream_copy) {
2401 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2403 if (extra_size > INT_MAX) {
2404 return AVERROR(EINVAL);
2407 /* if stream_copy is selected, no need to decode or encode */
2408 codec->codec_id = icodec->codec_id;
2409 codec->codec_type = icodec->codec_type;
2411 if (!codec->codec_tag) {
2412 if (!oc->oformat->codec_tag ||
2413 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2414 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2415 codec->codec_tag = icodec->codec_tag;
2418 codec->bit_rate = icodec->bit_rate;
2419 codec->rc_max_rate = icodec->rc_max_rate;
2420 codec->rc_buffer_size = icodec->rc_buffer_size;
2421 codec->field_order = icodec->field_order;
2422 codec->extradata = av_mallocz(extra_size);
2423 if (!codec->extradata) {
2424 return AVERROR(ENOMEM);
2426 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2427 codec->extradata_size= icodec->extradata_size;
2429 codec->time_base = ist->st->time_base;
2430 if(!strcmp(oc->oformat->name, "avi")) {
2431 if ( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
2432 && av_q2d(ist->st->time_base) < 1.0/500
2434 codec->time_base = icodec->time_base;
2435 codec->time_base.num *= icodec->ticks_per_frame;
2436 codec->time_base.den *= 2;
2438 } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
2439 && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
2440 && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
2442 if( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
2443 && av_q2d(ist->st->time_base) < 1.0/500
2445 codec->time_base = icodec->time_base;
2446 codec->time_base.num *= icodec->ticks_per_frame;
2449 av_reduce(&codec->time_base.num, &codec->time_base.den,
2450 codec->time_base.num, codec->time_base.den, INT_MAX);
2452 switch (codec->codec_type) {
2453 case AVMEDIA_TYPE_AUDIO:
2454 if (audio_volume != 256) {
2455 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2458 codec->channel_layout = icodec->channel_layout;
2459 codec->sample_rate = icodec->sample_rate;
2460 codec->channels = icodec->channels;
2461 codec->frame_size = icodec->frame_size;
2462 codec->audio_service_type = icodec->audio_service_type;
2463 codec->block_align = icodec->block_align;
2465 case AVMEDIA_TYPE_VIDEO:
2466 codec->pix_fmt = icodec->pix_fmt;
2467 codec->width = icodec->width;
2468 codec->height = icodec->height;
2469 codec->has_b_frames = icodec->has_b_frames;
2470 if (!codec->sample_aspect_ratio.num) {
2471 codec->sample_aspect_ratio =
2472 ost->st->sample_aspect_ratio =
2473 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2474 ist->st->codec->sample_aspect_ratio.num ?
2475 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2477 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
2479 case AVMEDIA_TYPE_SUBTITLE:
2480 codec->width = icodec->width;
2481 codec->height = icodec->height;
2483 case AVMEDIA_TYPE_DATA:
2484 case AVMEDIA_TYPE_ATTACHMENT:
2491 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2493 ist->decoding_needed = 1;
2494 ost->encoding_needed = 1;
2496 switch (codec->codec_type) {
2497 case AVMEDIA_TYPE_AUDIO:
2498 ost->fifo = av_fifo_alloc(1024);
2500 return AVERROR(ENOMEM);
2502 if (!codec->sample_rate)
2503 codec->sample_rate = icodec->sample_rate;
2504 choose_sample_rate(ost->st, ost->enc);
2505 codec->time_base = (AVRational){ 1, codec->sample_rate };
2507 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2508 codec->sample_fmt = icodec->sample_fmt;
2509 choose_sample_fmt(ost->st, ost->enc);
2511 if (ost->audio_channels_mapped) {
2512 /* the requested output channel is set to the number of
2513 * -map_channel only if no -ac are specified */
2514 if (!codec->channels) {
2515 codec->channels = ost->audio_channels_mapped;
2516 codec->channel_layout = av_get_default_channel_layout(codec->channels);
2517 if (!codec->channel_layout) {
2518 av_log(NULL, AV_LOG_FATAL, "Unable to find an appropriate channel layout for requested number of channel\n");
2522 /* fill unused channel mapping with -1 (which means a muted
2523 * channel in case the number of output channels is bigger
2524 * than the number of mapped channel) */
2525 for (j = ost->audio_channels_mapped; j < FF_ARRAY_ELEMS(ost->audio_channels_map); j++)
2526 ost->audio_channels_map[j] = -1;
2527 } else if (!codec->channels) {
2528 codec->channels = icodec->channels;
2529 codec->channel_layout = icodec->channel_layout;
2531 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2532 codec->channel_layout = 0;
2534 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2535 ost->audio_resample |= codec->sample_fmt != icodec->sample_fmt
2536 || codec->channel_layout != icodec->channel_layout;
2537 icodec->request_channels = codec->channels;
2538 ost->resample_sample_fmt = icodec->sample_fmt;
2539 ost->resample_sample_rate = icodec->sample_rate;
2540 ost->resample_channels = icodec->channels;
2542 case AVMEDIA_TYPE_VIDEO:
2543 if (codec->pix_fmt == PIX_FMT_NONE)
2544 codec->pix_fmt = icodec->pix_fmt;
2545 choose_pixel_fmt(ost->st, ost->enc);
2547 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2548 av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2552 if (!codec->width || !codec->height) {
2553 codec->width = icodec->width;
2554 codec->height = icodec->height;
2557 ost->video_resample = codec->width != icodec->width ||
2558 codec->height != icodec->height ||
2559 codec->pix_fmt != icodec->pix_fmt;
2560 if (ost->video_resample) {
2561 codec->bits_per_raw_sample = frame_bits_per_raw_sample;
2564 ost->resample_height = icodec->height;
2565 ost->resample_width = icodec->width;
2566 ost->resample_pix_fmt = icodec->pix_fmt;
2568 if (!ost->frame_rate.num)
2569 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational) { 25, 1 };
2570 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2571 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2572 ost->frame_rate = ost->enc->supported_framerates[idx];
2574 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2575 if ( av_q2d(codec->time_base) < 0.001 && video_sync_method
2576 && (video_sync_method==1 || (video_sync_method<0 && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
2577 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2578 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2580 for (j = 0; j < ost->forced_kf_count; j++)
2581 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
2586 if (configure_video_filters(ist, ost)) {
2587 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2592 case AVMEDIA_TYPE_SUBTITLE:
2599 if (codec->codec_id != CODEC_ID_H264 &&
2600 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2601 char logfilename[1024];
2604 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2605 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2607 if (codec->flags & CODEC_FLAG_PASS2) {
2609 size_t logbuffer_size;
2610 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2611 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2615 codec->stats_in = logbuffer;
2617 if (codec->flags & CODEC_FLAG_PASS1) {
2618 f = fopen(logfilename, "wb");
2620 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2621 logfilename, strerror(errno));
2628 if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2629 /* maximum video buffer size is 8-bytes per pixel, plus DPX header size (1664)*/
2630 int size = codec->width * codec->height;
2631 bit_buffer_size = FFMAX(bit_buffer_size, 9*size + 10000);
2636 bit_buffer = av_malloc(bit_buffer_size);
2638 av_log(NULL, AV_LOG_ERROR, "Cannot allocate %d bytes output buffer\n",
2640 return AVERROR(ENOMEM);
2643 /* open each encoder */
2644 for (i = 0; i < nb_output_streams; i++) {
2645 ost = &output_streams[i];
2646 if (ost->encoding_needed) {
2647 AVCodec *codec = ost->enc;
2648 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2650 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
2651 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2652 ret = AVERROR(EINVAL);
2655 if (dec->subtitle_header) {
2656 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2657 if (!ost->st->codec->subtitle_header) {
2658 ret = AVERROR(ENOMEM);
2661 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2662 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2664 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2665 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2666 ost->file_index, ost->index);
2667 ret = AVERROR(EINVAL);
2670 assert_codec_experimental(ost->st->codec, 1);
2671 assert_avoptions(ost->opts);
2672 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2673 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2674 " It takes bits/s as argument, not kbits/s\n");
2675 extra_size += ost->st->codec->extradata_size;
2677 if (ost->st->codec->me_threshold)
2678 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2682 /* init input streams */
2683 for (i = 0; i < nb_input_streams; i++)
2684 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2687 /* discard unused programs */
2688 for (i = 0; i < nb_input_files; i++) {
2689 InputFile *ifile = &input_files[i];
2690 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2691 AVProgram *p = ifile->ctx->programs[j];
2692 int discard = AVDISCARD_ALL;
2694 for (k = 0; k < p->nb_stream_indexes; k++)
2695 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2696 discard = AVDISCARD_DEFAULT;
2699 p->discard = discard;
2703 /* open files and write file headers */
2704 for (i = 0; i < nb_output_files; i++) {
2705 oc = output_files[i].ctx;
2706 oc->interrupt_callback = int_cb;
2707 if (avformat_write_header(oc, &output_files[i].opts) < 0) {
2708 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2709 ret = AVERROR(EINVAL);
2712 // assert_avoptions(output_files[i].opts);
2713 if (strcmp(oc->oformat->name, "rtp")) {
2719 /* dump the file output parameters - cannot be done before in case
2721 for (i = 0; i < nb_output_files; i++) {
2722 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2725 /* dump the stream mapping */
2726 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2727 for (i = 0; i < nb_output_streams; i++) {
2728 ost = &output_streams[i];
2730 if (ost->attachment_filename) {
2731 /* an attached file */
2732 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
2733 ost->attachment_filename, ost->file_index, ost->index);
2736 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
2737 input_streams[ost->source_index].file_index,
2738 input_streams[ost->source_index].st->index,
2741 if (ost->audio_channels_mapped) {
2742 av_log(NULL, AV_LOG_INFO, " [ch:");
2743 for (j = 0; j < ost->audio_channels_mapped; j++)
2744 if (ost->audio_channels_map[j] == -1)
2745 av_log(NULL, AV_LOG_INFO, " M");
2747 av_log(NULL, AV_LOG_INFO, " %d", ost->audio_channels_map[j]);
2748 av_log(NULL, AV_LOG_INFO, "]");
2750 if (ost->sync_ist != &input_streams[ost->source_index])
2751 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2752 ost->sync_ist->file_index,
2753 ost->sync_ist->st->index);
2754 if (ost->stream_copy)
2755 av_log(NULL, AV_LOG_INFO, " (copy)");
2757 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2758 input_streams[ost->source_index].dec->name : "?",
2759 ost->enc ? ost->enc->name : "?");
2760 av_log(NULL, AV_LOG_INFO, "\n");
2764 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2769 print_sdp(output_files, nb_output_files);
2776 * The following code is the main loop of the file converter
2778 static int transcode(OutputFile *output_files, int nb_output_files,
2779 InputFile *input_files, int nb_input_files)
2782 AVFormatContext *is, *os;
2786 int no_packet_count = 0;
2787 int64_t timer_start;
2790 if (!(no_packet = av_mallocz(nb_input_files)))
2793 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2798 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
2801 timer_start = av_gettime();
2803 for (; received_sigterm == 0;) {
2804 int file_index, ist_index;
2808 int64_t cur_time= av_gettime();
2810 ipts_min = INT64_MAX;
2812 /* if 'q' pressed, exits */
2814 static int64_t last_time;
2815 if (received_nb_signals)
2817 /* read_key() returns 0 on EOF */
2818 if(cur_time - last_time >= 100000 && !run_as_daemon){
2820 last_time = cur_time;
2825 if (key == '+') av_log_set_level(av_log_get_level()+10);
2826 if (key == '-') av_log_set_level(av_log_get_level()-10);
2827 if (key == 's') qp_hist ^= 1;
2830 do_hex_dump = do_pkt_dump = 0;
2831 } else if(do_pkt_dump){
2835 av_log_set_level(AV_LOG_DEBUG);
2838 if (key == 'c' || key == 'C'){
2839 char buf[4096], target[64], command[256], arg[256] = {0};
2842 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2844 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
2849 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
2850 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
2851 target, time, command, arg);
2852 for (i = 0; i < nb_output_streams; i++) {
2853 ost = &output_streams[i];
2856 ret = avfilter_graph_send_command(ost->graph, target, command, arg, buf, sizeof(buf),
2857 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
2858 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
2860 ret = avfilter_graph_queue_command(ost->graph, target, command, arg, 0, time);
2865 av_log(NULL, AV_LOG_ERROR,
2866 "Parse error, at least 3 arguments were expected, "
2867 "only %d given in string '%s'\n", n, buf);
2871 if (key == 'd' || key == 'D'){
2874 debug = input_streams[0].st->codec->debug<<1;
2875 if(!debug) debug = 1;
2876 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2879 if(scanf("%d", &debug)!=1)
2880 fprintf(stderr,"error parsing debug value\n");
2881 for(i=0;i<nb_input_streams;i++) {
2882 input_streams[i].st->codec->debug = debug;
2884 for(i=0;i<nb_output_streams;i++) {
2885 ost = &output_streams[i];
2886 ost->st->codec->debug = debug;
2888 if(debug) av_log_set_level(AV_LOG_DEBUG);
2889 fprintf(stderr,"debug=%d\n", debug);
2892 fprintf(stderr, "key function\n"
2893 "? show this help\n"
2894 "+ increase verbosity\n"
2895 "- decrease verbosity\n"
2896 "c Send command to filtergraph\n"
2897 "D cycle through available debug modes\n"
2898 "h dump packets/hex press to cycle through the 3 states\n"
2900 "s Show QP histogram\n"
2905 /* select the stream that we must read now by looking at the
2906 smallest output pts */
2908 for (i = 0; i < nb_output_streams; i++) {
2912 ost = &output_streams[i];
2913 of = &output_files[ost->file_index];
2914 os = output_files[ost->file_index].ctx;
2915 ist = &input_streams[ost->source_index];
2916 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2917 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2919 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2921 if (!input_files[ist->file_index].eof_reached) {
2922 if (ipts < ipts_min) {
2925 file_index = ist->file_index;
2927 if (opts < opts_min) {
2929 if (!input_sync) file_index = ist->file_index;
2932 if (ost->frame_number >= ost->max_frames) {
2934 for (j = 0; j < of->ctx->nb_streams; j++)
2935 output_streams[of->ost_index + j].is_past_recording_time = 1;
2939 /* if none, if is finished */
2940 if (file_index < 0) {
2941 if (no_packet_count) {
2942 no_packet_count = 0;
2943 memset(no_packet, 0, nb_input_files);
2950 /* read a frame from it and output it in the fifo */
2951 is = input_files[file_index].ctx;
2952 ret = av_read_frame(is, &pkt);
2953 if (ret == AVERROR(EAGAIN)) {
2954 no_packet[file_index] = 1;
2959 input_files[file_index].eof_reached = 1;
2966 no_packet_count = 0;
2967 memset(no_packet, 0, nb_input_files);
2970 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2971 is->streams[pkt.stream_index]);
2973 /* the following test is needed in case new streams appear
2974 dynamically in stream : we ignore them */
2975 if (pkt.stream_index >= input_files[file_index].nb_streams)
2976 goto discard_packet;
2977 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2978 ist = &input_streams[ist_index];
2980 goto discard_packet;
2982 if (pkt.dts != AV_NOPTS_VALUE)
2983 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2984 if (pkt.pts != AV_NOPTS_VALUE)
2985 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2987 if (pkt.pts != AV_NOPTS_VALUE)
2988 pkt.pts *= ist->ts_scale;
2989 if (pkt.dts != AV_NOPTS_VALUE)
2990 pkt.dts *= ist->ts_scale;
2992 //fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n",
2994 // pkt.dts, input_files[ist->file_index].ts_offset,
2995 // ist->st->codec->codec_type);
2996 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2997 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2998 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2999 int64_t delta = pkt_dts - ist->next_pts;
3000 if((delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
3001 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
3002 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3003 pkt_dts+1<ist->pts)&& !copy_ts){
3004 input_files[ist->file_index].ts_offset -= delta;
3005 av_log(NULL, AV_LOG_DEBUG,
3006 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
3007 delta, input_files[ist->file_index].ts_offset);
3008 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3009 if (pkt.pts != AV_NOPTS_VALUE)
3010 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3014 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
3015 if (output_packet(ist, output_streams, nb_output_streams, &pkt) < 0) {
3017 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
3018 ist->file_index, ist->st->index);
3021 av_free_packet(&pkt);
3026 av_free_packet(&pkt);
3028 /* dump report by using the output first video and audio streams */
3029 print_report(output_files, output_streams, nb_output_streams, 0, timer_start, cur_time);
3032 /* at the end of stream, we must flush the decoder buffers */
3033 for (i = 0; i < nb_input_streams; i++) {
3034 ist = &input_streams[i];
3035 if (ist->decoding_needed) {
3036 output_packet(ist, output_streams, nb_output_streams, NULL);
3039 flush_encoders(output_streams, nb_output_streams);
3043 /* write the trailer if needed and close file */
3044 for (i = 0; i < nb_output_files; i++) {
3045 os = output_files[i].ctx;
3046 av_write_trailer(os);
3049 /* dump report by using the first video and audio streams */
3050 print_report(output_files, output_streams, nb_output_streams, 1, timer_start, av_gettime());
3052 /* close each encoder */
3053 for (i = 0; i < nb_output_streams; i++) {
3054 ost = &output_streams[i];
3055 if (ost->encoding_needed) {
3056 av_freep(&ost->st->codec->stats_in);
3057 avcodec_close(ost->st->codec);
3060 avfilter_graph_free(&ost->graph);
3064 /* close each decoder */
3065 for (i = 0; i < nb_input_streams; i++) {
3066 ist = &input_streams[i];
3067 if (ist->decoding_needed) {
3068 avcodec_close(ist->st->codec);
3076 av_freep(&bit_buffer);
3077 av_freep(&no_packet);
3079 if (output_streams) {
3080 for (i = 0; i < nb_output_streams; i++) {
3081 ost = &output_streams[i];
3083 if (ost->stream_copy)
3084 av_freep(&ost->st->codec->extradata);
3086 fclose(ost->logfile);
3087 ost->logfile = NULL;
3089 av_fifo_free(ost->fifo); /* works even if fifo is not
3090 initialized but set to zero */
3091 av_freep(&ost->st->codec->subtitle_header);
3092 av_free(ost->resample_frame.data[0]);
3093 av_free(ost->forced_kf_pts);
3094 if (ost->video_resample)
3095 sws_freeContext(ost->img_resample_ctx);
3096 swr_free(&ost->swr);
3097 av_dict_free(&ost->opts);
3104 static int opt_frame_crop(const char *opt, const char *arg)
3106 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
3107 return AVERROR(EINVAL);
3110 static int opt_pad(const char *opt, const char *arg)
3112 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
3116 static double parse_frame_aspect_ratio(const char *arg)
3123 p = strchr(arg, ':');
3125 x = strtol(arg, &end, 10);
3127 y = strtol(end + 1, &end, 10);
3129 ar = (double)x / (double)y;
3131 ar = strtod(arg, NULL);
3134 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
3140 static int opt_video_channel(const char *opt, const char *arg)
3142 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
3143 return opt_default("channel", arg);
3146 static int opt_video_standard(const char *opt, const char *arg)
3148 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
3149 return opt_default("standard", arg);
3152 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
3154 audio_codec_name = arg;
3155 return parse_option(o, "codec:a", arg, options);
3158 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3160 video_codec_name = arg;
3161 return parse_option(o, "codec:v", arg, options);
3164 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3166 subtitle_codec_name = arg;
3167 return parse_option(o, "codec:s", arg, options);
3170 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3172 return parse_option(o, "codec:d", arg, options);
3175 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
3177 StreamMap *m = NULL;
3178 int i, negative = 0, file_idx;
3179 int sync_file_idx = -1, sync_stream_idx = 0;
3187 map = av_strdup(arg);
3189 /* parse sync stream first, just pick first matching stream */
3190 if (sync = strchr(map, ',')) {
3192 sync_file_idx = strtol(sync + 1, &sync, 0);
3193 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3194 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
3199 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
3200 if (check_stream_specifier(input_files[sync_file_idx].ctx,
3201 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
3202 sync_stream_idx = i;
3205 if (i == input_files[sync_file_idx].nb_streams) {
3206 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
3207 "match any streams.\n", arg);
3213 file_idx = strtol(map, &p, 0);
3214 if (file_idx >= nb_input_files || file_idx < 0) {
3215 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
3219 /* disable some already defined maps */
3220 for (i = 0; i < o->nb_stream_maps; i++) {
3221 m = &o->stream_maps[i];
3222 if (file_idx == m->file_index &&
3223 check_stream_specifier(input_files[m->file_index].ctx,
3224 input_files[m->file_index].ctx->streams[m->stream_index],
3225 *p == ':' ? p + 1 : p) > 0)
3229 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
3230 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
3231 *p == ':' ? p + 1 : p) <= 0)
3233 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3234 &o->nb_stream_maps, o->nb_stream_maps + 1);
3235 m = &o->stream_maps[o->nb_stream_maps - 1];
3237 m->file_index = file_idx;
3238 m->stream_index = i;
3240 if (sync_file_idx >= 0) {
3241 m->sync_file_index = sync_file_idx;
3242 m->sync_stream_index = sync_stream_idx;
3244 m->sync_file_index = file_idx;
3245 m->sync_stream_index = i;
3250 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3258 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3260 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3261 &o->nb_attachments, o->nb_attachments + 1);
3262 o->attachments[o->nb_attachments - 1] = arg;
3266 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
3272 o->audio_channel_maps =
3273 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
3274 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
3275 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
3277 /* muted channel syntax */
3278 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
3279 if ((n == 1 || n == 3) && m->channel_idx == -1) {
3280 m->file_idx = m->stream_idx = -1;
3282 m->ofile_idx = m->ostream_idx = -1;
3287 n = sscanf(arg, "%d.%d.%d:%d.%d",
3288 &m->file_idx, &m->stream_idx, &m->channel_idx,
3289 &m->ofile_idx, &m->ostream_idx);
3291 if (n != 3 && n != 5) {
3292 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
3293 "[file.stream.channel|-1][:syncfile:syncstream]\n");
3297 if (n != 5) // only file.stream.channel specified
3298 m->ofile_idx = m->ostream_idx = -1;
3301 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
3302 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
3306 if (m->stream_idx < 0 ||
3307 m->stream_idx >= input_files[m->file_idx].nb_streams) {
3308 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
3309 m->file_idx, m->stream_idx);
3312 st = input_files[m->file_idx].ctx->streams[m->stream_idx];
3313 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
3314 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
3315 m->file_idx, m->stream_idx);
3318 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
3319 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
3320 m->file_idx, m->stream_idx, m->channel_idx);
3327 * Parse a metadata specifier in arg.
3328 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
3329 * @param index for type c/p, chapter/program index is written here
3330 * @param stream_spec for type s, the stream specifier is written here
3332 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
3340 if (*(++arg) && *arg != ':') {
3341 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
3344 *stream_spec = *arg == ':' ? arg + 1 : "";
3348 if (*(++arg) == ':')
3349 *index = strtol(++arg, NULL, 0);
3352 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
3359 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
3361 AVDictionary **meta_in = NULL;
3362 AVDictionary **meta_out = NULL;
3364 char type_in, type_out;
3365 const char *istream_spec = NULL, *ostream_spec = NULL;
3366 int idx_in = 0, idx_out = 0;
3368 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
3369 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
3371 if (type_in == 'g' || type_out == 'g')
3372 o->metadata_global_manual = 1;
3373 if (type_in == 's' || type_out == 's')
3374 o->metadata_streams_manual = 1;
3375 if (type_in == 'c' || type_out == 'c')
3376 o->metadata_chapters_manual = 1;
3378 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3379 if ((index) < 0 || (index) >= (nb_elems)) {\
3380 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
3385 #define SET_DICT(type, meta, context, index)\
3388 meta = &context->metadata;\
3391 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
3392 meta = &context->chapters[index]->metadata;\
3395 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
3396 meta = &context->programs[index]->metadata;\
3400 SET_DICT(type_in, meta_in, ic, idx_in);
3401 SET_DICT(type_out, meta_out, oc, idx_out);
3403 /* for input streams choose first matching stream */
3404 if (type_in == 's') {
3405 for (i = 0; i < ic->nb_streams; i++) {
3406 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
3407 meta_in = &ic->streams[i]->metadata;
3413 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
3418 if (type_out == 's') {
3419 for (i = 0; i < oc->nb_streams; i++) {
3420 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
3421 meta_out = &oc->streams[i]->metadata;
3422 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3427 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3432 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
3435 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
3436 struct tm time = *gmtime((time_t*)&recording_timestamp);
3437 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
3438 parse_option(o, "metadata", buf, options);
3440 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
3441 "tag instead.\n", opt);
3445 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
3447 const char *codec_string = encoder ? "encoder" : "decoder";
3451 avcodec_find_encoder_by_name(name) :
3452 avcodec_find_decoder_by_name(name);
3454 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
3457 if (codec->type != type) {
3458 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
3464 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
3466 char *codec_name = NULL;
3468 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
3470 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
3471 st->codec->codec_id = codec->id;
3474 return avcodec_find_decoder(st->codec->codec_id);
3478 * Add all the streams from the given input file to the global
3479 * list of input streams.
3481 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
3484 char *next, *codec_tag = NULL;
3486 for (i = 0; i < ic->nb_streams; i++) {
3487 AVStream *st = ic->streams[i];
3488 AVCodecContext *dec = st->codec;
3491 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3492 ist = &input_streams[nb_input_streams - 1];
3494 ist->file_index = nb_input_files;
3496 ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), ic, st);
3498 ist->ts_scale = 1.0;
3499 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
3501 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
3503 uint32_t tag = strtol(codec_tag, &next, 0);
3505 tag = AV_RL32(codec_tag);
3506 st->codec->codec_tag = tag;
3509 ist->dec = choose_decoder(o, ic, st);
3511 switch (dec->codec_type) {
3512 case AVMEDIA_TYPE_AUDIO:
3514 ist->dec = avcodec_find_decoder(dec->codec_id);
3515 if (o->audio_disable)
3516 st->discard = AVDISCARD_ALL;
3518 case AVMEDIA_TYPE_VIDEO:
3520 ist->dec = avcodec_find_decoder(dec->codec_id);
3522 dec->flags |= CODEC_FLAG_EMU_EDGE;
3525 if (o->video_disable)
3526 st->discard = AVDISCARD_ALL;
3527 else if (video_discard)
3528 st->discard = video_discard;
3530 case AVMEDIA_TYPE_DATA:
3531 if (o->data_disable)
3532 st->discard= AVDISCARD_ALL;
3534 case AVMEDIA_TYPE_SUBTITLE:
3536 ist->dec = avcodec_find_decoder(dec->codec_id);
3537 if(o->subtitle_disable)
3538 st->discard = AVDISCARD_ALL;
3540 case AVMEDIA_TYPE_ATTACHMENT:
3541 case AVMEDIA_TYPE_UNKNOWN:
3549 static void assert_file_overwrite(const char *filename)
3551 if ((!file_overwrite || no_file_overwrite) &&
3552 (strchr(filename, ':') == NULL || filename[1] == ':' ||
3553 av_strstart(filename, "file:", NULL))) {
3554 if (avio_check(filename, 0) == 0) {
3555 if (!using_stdin && (!no_file_overwrite || file_overwrite)) {
3556 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3559 signal(SIGINT, SIG_DFL);
3560 if (!read_yesno()) {
3561 av_log(0, AV_LOG_FATAL, "Not overwriting - exiting\n");
3567 av_log(0, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
3574 static void dump_attachment(AVStream *st, const char *filename)
3577 AVIOContext *out = NULL;
3578 AVDictionaryEntry *e;
3580 if (!st->codec->extradata_size) {
3581 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
3582 nb_input_files - 1, st->index);
3585 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
3586 filename = e->value;
3588 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
3589 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
3593 assert_file_overwrite(filename);
3595 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
3596 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
3601 avio_write(out, st->codec->extradata, st->codec->extradata_size);
3606 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
3608 AVFormatContext *ic;
3609 AVInputFormat *file_iformat = NULL;
3613 AVDictionary **opts;
3614 int orig_nb_streams; // number of streams before avformat_find_stream_info
3617 if (!(file_iformat = av_find_input_format(o->format))) {
3618 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
3623 if (!strcmp(filename, "-"))
3626 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3627 !strcmp(filename, "/dev/stdin");
3629 /* get default parameters from command line */
3630 ic = avformat_alloc_context();
3632 print_error(filename, AVERROR(ENOMEM));
3635 if (o->nb_audio_sample_rate) {
3636 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
3637 av_dict_set(&format_opts, "sample_rate", buf, 0);
3639 if (o->nb_audio_channels) {
3640 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
3641 av_dict_set(&format_opts, "channels", buf, 0);
3643 if (o->nb_frame_rates) {
3644 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
3646 if (o->nb_frame_sizes) {
3647 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
3649 if (o->nb_frame_pix_fmts)
3650 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
3652 ic->video_codec_id = video_codec_name ?
3653 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
3654 ic->audio_codec_id = audio_codec_name ?
3655 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
3656 ic->subtitle_codec_id= subtitle_codec_name ?
3657 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
3658 ic->flags |= AVFMT_FLAG_NONBLOCK;
3659 ic->interrupt_callback = int_cb;
3662 av_log(NULL, AV_LOG_WARNING,
3663 "-loop_input is deprecated, use -loop 1\n"
3664 "Note, both loop options only work with -f image2\n"
3666 ic->loop_input = loop_input;
3669 /* open the input file with generic avformat function */
3670 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3672 print_error(filename, err);
3675 assert_avoptions(format_opts);
3677 /* apply forced codec ids */
3678 for (i = 0; i < ic->nb_streams; i++)
3679 choose_decoder(o, ic, ic->streams[i]);
3681 /* Set AVCodecContext options for avformat_find_stream_info */
3682 opts = setup_find_stream_info_opts(ic, codec_opts);
3683 orig_nb_streams = ic->nb_streams;
3685 /* If not enough info to get the stream parameters, we decode the
3686 first frames to get it. (used in mpeg case for example) */
3687 ret = avformat_find_stream_info(ic, opts);
3689 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
3690 avformat_close_input(&ic);
3694 timestamp = o->start_time;
3695 /* add the stream start time */
3696 if (ic->start_time != AV_NOPTS_VALUE)
3697 timestamp += ic->start_time;
3699 /* if seeking requested, we execute it */
3700 if (o->start_time != 0) {
3701 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3703 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
3704 filename, (double)timestamp / AV_TIME_BASE);
3708 /* update the current parameters so that they match the one of the input stream */
3709 add_input_streams(o, ic);
3711 /* dump the file content */
3712 av_dump_format(ic, nb_input_files, filename, 0);
3714 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3715 input_files[nb_input_files - 1].ctx = ic;
3716 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3717 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3718 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3719 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
3721 for (i = 0; i < o->nb_dump_attachment; i++) {
3724 for (j = 0; j < ic->nb_streams; j++) {
3725 AVStream *st = ic->streams[j];
3727 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
3728 dump_attachment(st, o->dump_attachment[i].u.str);
3732 for (i = 0; i < orig_nb_streams; i++)
3733 av_dict_free(&opts[i]);
3736 reset_options(o, 1);
3740 static void parse_forced_key_frames(char *kf, OutputStream *ost)
3745 for (p = kf; *p; p++)
3748 ost->forced_kf_count = n;
3749 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3750 if (!ost->forced_kf_pts) {
3751 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3754 for (i = 0; i < n; i++) {
3755 p = i ? strchr(p, ',') + 1 : kf;
3756 ost->forced_kf_pts[i] = parse_time_or_die("force_key_frames", p, 1);
3760 static uint8_t *get_line(AVIOContext *s)
3766 if (avio_open_dyn_buf(&line) < 0) {
3767 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
3771 while ((c = avio_r8(s)) && c != '\n')
3774 avio_close_dyn_buf(line, &buf);
3779 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
3782 char filename[1000];
3783 const char *base[3] = { getenv("AVCONV_DATADIR"),
3788 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
3792 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
3793 i != 1 ? "" : "/.avconv", codec_name, preset_name);
3794 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3797 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
3798 i != 1 ? "" : "/.avconv", preset_name);
3799 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3805 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
3807 char *codec_name = NULL;
3809 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
3811 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
3812 NULL, ost->st->codec->codec_type);
3813 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
3814 } else if (!strcmp(codec_name, "copy"))
3815 ost->stream_copy = 1;
3817 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
3818 ost->st->codec->codec_id = ost->enc->id;
3822 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3825 AVStream *st = avformat_new_stream(oc, NULL);
3826 int idx = oc->nb_streams - 1, ret = 0;
3827 char *bsf = NULL, *next, *codec_tag = NULL;
3828 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3830 char *buf = NULL, *arg = NULL, *preset = NULL;
3831 AVIOContext *s = NULL;
3834 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3838 if (oc->nb_streams - 1 < o->nb_streamid_map)
3839 st->id = o->streamid_map[oc->nb_streams - 1];
3841 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3842 nb_output_streams + 1);
3843 ost = &output_streams[nb_output_streams - 1];
3844 ost->file_index = nb_output_files;
3847 st->codec->codec_type = type;
3848 choose_encoder(o, oc, ost);
3850 ost->opts = filter_codec_opts(codec_opts, ost->enc, oc, st);
3853 avcodec_get_context_defaults3(st->codec, ost->enc);
3854 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3856 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
3857 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
3860 if (!buf[0] || buf[0] == '#') {
3864 if (!(arg = strchr(buf, '='))) {
3865 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
3869 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
3871 } while (!s->eof_reached);
3875 av_log(NULL, AV_LOG_FATAL,
3876 "Preset %s specified for stream %d:%d, but could not be opened.\n",
3877 preset, ost->file_index, ost->index);
3881 ost->max_frames = INT64_MAX;
3882 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
3884 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3886 if (next = strchr(bsf, ','))
3888 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3889 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3893 bsfc_prev->next = bsfc;
3895 ost->bitstream_filters = bsfc;
3901 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3903 uint32_t tag = strtol(codec_tag, &next, 0);
3905 tag = AV_RL32(codec_tag);
3906 st->codec->codec_tag = tag;
3909 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3910 if (qscale >= 0 || same_quant) {
3911 st->codec->flags |= CODEC_FLAG_QSCALE;
3912 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3915 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
3916 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3918 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3922 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3925 const char *p = str;
3932 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3939 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3943 AVCodecContext *video_enc;
3945 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3947 video_enc = st->codec;
3949 if (!ost->stream_copy) {
3950 const char *p = NULL;
3951 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3952 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3953 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3956 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3957 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3958 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3962 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3963 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3964 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3968 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3969 if (frame_aspect_ratio)
3970 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3972 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3973 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3974 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3975 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3978 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3981 video_enc->gop_size = 0;
3982 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3984 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3985 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
3988 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3990 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3992 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3993 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
3996 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
3999 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
4000 for (i = 0; p; i++) {
4002 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
4004 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
4007 /* FIXME realloc failure */
4008 video_enc->rc_override =
4009 av_realloc(video_enc->rc_override,
4010 sizeof(RcOverride) * (i + 1));
4011 video_enc->rc_override[i].start_frame = start;
4012 video_enc->rc_override[i].end_frame = end;
4014 video_enc->rc_override[i].qscale = q;
4015 video_enc->rc_override[i].quality_factor = 1.0;
4018 video_enc->rc_override[i].qscale = 0;
4019 video_enc->rc_override[i].quality_factor = -q/100.0;
4024 video_enc->rc_override_count = i;
4025 if (!video_enc->rc_initial_buffer_occupancy)
4026 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
4027 video_enc->intra_dc_precision = intra_dc_precision - 8;
4030 video_enc->flags|= CODEC_FLAG_PSNR;
4035 video_enc->flags |= CODEC_FLAG_PASS1;
4038 video_enc->flags |= CODEC_FLAG_PASS2;
4042 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
4043 if (forced_key_frames)
4044 parse_forced_key_frames(forced_key_frames, ost);
4046 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
4048 ost->top_field_first = -1;
4049 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
4052 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4054 ost->avfilter = av_strdup(filters);
4057 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
4063 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
4068 AVCodecContext *audio_enc;
4070 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
4073 audio_enc = st->codec;
4074 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
4076 if (!ost->stream_copy) {
4077 char *sample_fmt = NULL;
4079 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
4081 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
4083 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
4084 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
4088 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
4090 ost->rematrix_volume=1.0;
4091 MATCH_PER_STREAM_OPT(rematrix_volume, f, ost->rematrix_volume, oc, st);
4094 /* check for channel mapping for this audio stream */
4095 for (n = 0; n < o->nb_audio_channel_maps; n++) {
4096 AudioChannelMap *map = &o->audio_channel_maps[n];
4097 InputStream *ist = &input_streams[ost->source_index];
4098 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
4099 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
4100 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
4101 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
4102 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
4104 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
4105 ost->file_index, ost->st->index);
4112 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
4116 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
4117 if (!ost->stream_copy) {
4118 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
4125 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
4127 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
4128 ost->stream_copy = 1;
4132 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
4136 AVCodecContext *subtitle_enc;
4138 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
4140 subtitle_enc = st->codec;
4142 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
4147 /* arg format is "output-stream-index:streamid-value". */
4148 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
4154 av_strlcpy(idx_str, arg, sizeof(idx_str));
4155 p = strchr(idx_str, ':');
4157 av_log(NULL, AV_LOG_FATAL,
4158 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
4163 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
4164 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
4165 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
4169 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
4171 AVFormatContext *is = ifile->ctx;
4172 AVFormatContext *os = ofile->ctx;
4175 for (i = 0; i < is->nb_chapters; i++) {
4176 AVChapter *in_ch = is->chapters[i], *out_ch;
4177 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
4178 AV_TIME_BASE_Q, in_ch->time_base);
4179 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
4180 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
4183 if (in_ch->end < ts_off)
4185 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
4188 out_ch = av_mallocz(sizeof(AVChapter));
4190 return AVERROR(ENOMEM);
4192 out_ch->id = in_ch->id;
4193 out_ch->time_base = in_ch->time_base;
4194 out_ch->start = FFMAX(0, in_ch->start - ts_off);
4195 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
4198 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
4201 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
4203 return AVERROR(ENOMEM);
4204 os->chapters[os->nb_chapters - 1] = out_ch;
4209 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
4212 AVFormatContext *ic = avformat_alloc_context();
4214 ic->interrupt_callback = int_cb;
4215 err = avformat_open_input(&ic, filename, NULL, NULL);
4218 /* copy stream format */
4219 for(i=0;i<ic->nb_streams;i++) {
4223 AVCodecContext *avctx;
4225 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
4226 ost = new_output_stream(o, s, codec->type);
4231 // FIXME: a more elegant solution is needed
4232 memcpy(st, ic->streams[i], sizeof(AVStream));
4233 st->info = av_malloc(sizeof(*st->info));
4234 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
4236 avcodec_copy_context(st->codec, ic->streams[i]->codec);
4238 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
4239 choose_sample_fmt(st, codec);
4240 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
4241 choose_pixel_fmt(st, codec);
4244 avformat_close_input(&ic);
4248 static void opt_output_file(void *optctx, const char *filename)
4250 OptionsContext *o = optctx;
4251 AVFormatContext *oc;
4253 AVOutputFormat *file_oformat;
4257 if (!strcmp(filename, "-"))
4260 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
4262 print_error(filename, err);
4265 file_oformat= oc->oformat;
4266 oc->interrupt_callback = int_cb;
4268 if (!strcmp(file_oformat->name, "ffm") &&
4269 av_strstart(filename, "http:", NULL)) {
4271 /* special case for files sent to ffserver: we get the stream
4272 parameters from ffserver */
4273 int err = read_ffserver_streams(o, oc, filename);
4275 print_error(filename, err);
4278 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
4279 ost = &output_streams[j];
4280 for (i = 0; i < nb_input_streams; i++) {
4281 ist = &input_streams[i];
4282 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
4284 ost->source_index= i;
4290 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));
4294 } else if (!o->nb_stream_maps) {
4295 /* pick the "best" stream of each type */
4296 #define NEW_STREAM(type, index)\
4298 ost = new_ ## type ## _stream(o, oc);\
4299 ost->source_index = index;\
4300 ost->sync_ist = &input_streams[index];\
4301 input_streams[index].discard = 0;\
4304 /* video: highest resolution */
4305 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
4306 int area = 0, idx = -1;
4307 for (i = 0; i < nb_input_streams; i++) {
4308 ist = &input_streams[i];
4309 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
4310 ist->st->codec->width * ist->st->codec->height > area) {
4311 area = ist->st->codec->width * ist->st->codec->height;
4315 NEW_STREAM(video, idx);
4318 /* audio: most channels */
4319 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
4320 int channels = 0, idx = -1;
4321 for (i = 0; i < nb_input_streams; i++) {
4322 ist = &input_streams[i];
4323 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
4324 ist->st->codec->channels > channels) {
4325 channels = ist->st->codec->channels;
4329 NEW_STREAM(audio, idx);
4332 /* subtitles: pick first */
4333 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
4334 for (i = 0; i < nb_input_streams; i++)
4335 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
4336 NEW_STREAM(subtitle, i);
4340 /* do something with data? */
4342 for (i = 0; i < o->nb_stream_maps; i++) {
4343 StreamMap *map = &o->stream_maps[i];
4348 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
4349 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
4351 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
4353 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
4355 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
4358 switch (ist->st->codec->codec_type) {
4359 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
4360 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
4361 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
4362 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
4363 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
4365 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
4366 map->file_index, map->stream_index);
4370 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
4371 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
4372 map->sync_stream_index];
4377 /* handle attached files */
4378 for (i = 0; i < o->nb_attachments; i++) {
4380 uint8_t *attachment;
4384 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
4385 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
4389 if ((len = avio_size(pb)) <= 0) {
4390 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
4394 if (!(attachment = av_malloc(len))) {
4395 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
4399 avio_read(pb, attachment, len);
4401 ost = new_attachment_stream(o, oc);
4402 ost->stream_copy = 0;
4403 ost->source_index = -1;
4404 ost->attachment_filename = o->attachments[i];
4405 ost->st->codec->extradata = attachment;
4406 ost->st->codec->extradata_size = len;
4408 p = strrchr(o->attachments[i], '/');
4409 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
4413 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
4414 output_files[nb_output_files - 1].ctx = oc;
4415 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
4416 output_files[nb_output_files - 1].recording_time = o->recording_time;
4417 output_files[nb_output_files - 1].start_time = o->start_time;
4418 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
4419 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
4421 /* check filename in case of an image number is expected */
4422 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
4423 if (!av_filename_number_test(oc->filename)) {
4424 print_error(oc->filename, AVERROR(EINVAL));
4429 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
4430 /* test if it already exists to avoid losing precious files */
4431 assert_file_overwrite(filename);
4434 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
4435 &oc->interrupt_callback,
4436 &output_files[nb_output_files - 1].opts)) < 0) {
4437 print_error(filename, err);
4442 if (o->mux_preload) {
4444 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
4445 av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
4447 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
4449 if (loop_output >= 0) {
4450 av_log(NULL, AV_LOG_WARNING, "-loop_output is deprecated, use -loop\n");
4451 oc->loop_output = loop_output;
4455 for (i = 0; i < o->nb_metadata_map; i++) {
4457 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
4459 if (in_file_index < 0)
4461 if (in_file_index >= nb_input_files) {
4462 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
4465 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, input_files[in_file_index].ctx, o);
4469 if (o->chapters_input_file >= nb_input_files) {
4470 if (o->chapters_input_file == INT_MAX) {
4471 /* copy chapters from the first input file that has them*/
4472 o->chapters_input_file = -1;
4473 for (i = 0; i < nb_input_files; i++)
4474 if (input_files[i].ctx->nb_chapters) {
4475 o->chapters_input_file = i;
4479 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
4480 o->chapters_input_file);
4484 if (o->chapters_input_file >= 0)
4485 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
4486 !o->metadata_chapters_manual);
4488 /* copy global metadata by default */
4489 if (!o->metadata_global_manual && nb_input_files){
4490 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
4491 AV_DICT_DONT_OVERWRITE);
4492 if(o->recording_time != INT64_MAX)
4493 av_dict_set(&oc->metadata, "duration", NULL, 0);
4495 if (!o->metadata_streams_manual)
4496 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
4498 if (output_streams[i].source_index < 0) /* this is true e.g. for attached files */
4500 ist = &input_streams[output_streams[i].source_index];
4501 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
4504 /* process manually set metadata */
4505 for (i = 0; i < o->nb_metadata; i++) {
4508 const char *stream_spec;
4509 int index = 0, j, ret = 0;
4511 val = strchr(o->metadata[i].u.str, '=');
4513 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
4514 o->metadata[i].u.str);
4519 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
4521 for (j = 0; j < oc->nb_streams; j++) {
4522 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
4523 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
4527 printf("ret %d, stream_spec %s\n", ret, stream_spec);
4535 if (index < 0 || index >= oc->nb_chapters) {
4536 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
4539 m = &oc->chapters[index]->metadata;
4542 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
4545 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
4549 reset_options(o, 0);
4552 /* same option as mencoder */
4553 static int opt_pass(const char *opt, const char *arg)
4555 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
4559 static int64_t getutime(void)
4562 struct rusage rusage;
4564 getrusage(RUSAGE_SELF, &rusage);
4565 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4566 #elif HAVE_GETPROCESSTIMES
4568 FILETIME c, e, k, u;
4569 proc = GetCurrentProcess();
4570 GetProcessTimes(proc, &c, &e, &k, &u);
4571 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4573 return av_gettime();
4577 static int64_t getmaxrss(void)
4579 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4580 struct rusage rusage;
4581 getrusage(RUSAGE_SELF, &rusage);
4582 return (int64_t)rusage.ru_maxrss * 1024;
4583 #elif HAVE_GETPROCESSMEMORYINFO
4585 PROCESS_MEMORY_COUNTERS memcounters;
4586 proc = GetCurrentProcess();
4587 memcounters.cb = sizeof(memcounters);
4588 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4589 return memcounters.PeakPagefileUsage;
4595 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
4597 return parse_option(o, "q:a", arg, options);
4600 static void show_usage(void)
4602 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
4603 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
4604 av_log(NULL, AV_LOG_INFO, "\n");
4607 static int opt_help(const char *opt, const char *arg)
4609 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
4610 av_log_set_callback(log_callback_help);
4612 show_help_options(options, "Main options:\n",
4613 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4614 show_help_options(options, "\nAdvanced options:\n",
4615 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4617 show_help_options(options, "\nVideo options:\n",
4618 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4620 show_help_options(options, "\nAdvanced Video options:\n",
4621 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4622 OPT_VIDEO | OPT_EXPERT);
4623 show_help_options(options, "\nAudio options:\n",
4624 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4626 show_help_options(options, "\nAdvanced Audio options:\n",
4627 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4628 OPT_AUDIO | OPT_EXPERT);
4629 show_help_options(options, "\nSubtitle options:\n",
4630 OPT_SUBTITLE | OPT_GRAB,
4632 show_help_options(options, "\nAudio/Video grab options:\n",
4636 show_help_children(avcodec_get_class(), flags);
4637 show_help_children(avformat_get_class(), flags);
4638 show_help_children(sws_get_class(), flags);
4643 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
4645 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4646 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
4648 if (!strncmp(arg, "pal-", 4)) {
4651 } else if (!strncmp(arg, "ntsc-", 5)) {
4654 } else if (!strncmp(arg, "film-", 5)) {
4658 /* Try to determine PAL/NTSC by peeking in the input files */
4659 if (nb_input_files) {
4661 for (j = 0; j < nb_input_files; j++) {
4662 for (i = 0; i < input_files[j].nb_streams; i++) {
4663 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4664 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
4666 fr = c->time_base.den * 1000 / c->time_base.num;
4670 } else if ((fr == 29970) || (fr == 23976)) {
4675 if (norm != UNKNOWN)
4679 if (norm != UNKNOWN)
4680 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4683 if (norm == UNKNOWN) {
4684 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4685 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4686 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
4690 if (!strcmp(arg, "vcd")) {
4691 opt_video_codec(o, "c:v", "mpeg1video");
4692 opt_audio_codec(o, "c:a", "mp2");
4693 parse_option(o, "f", "vcd", options);
4695 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
4696 parse_option(o, "r", frame_rates[norm], options);
4697 opt_default("g", norm == PAL ? "15" : "18");
4699 opt_default("b:v", "1150000");
4700 opt_default("maxrate", "1150000");
4701 opt_default("minrate", "1150000");
4702 opt_default("bufsize", "327680"); // 40*1024*8;
4704 opt_default("b:a", "224000");
4705 parse_option(o, "ar", "44100", options);
4706 parse_option(o, "ac", "2", options);
4708 opt_default("packetsize", "2324");
4709 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4711 /* We have to offset the PTS, so that it is consistent with the SCR.
4712 SCR starts at 36000, but the first two packs contain only padding
4713 and the first pack from the other stream, respectively, may also have
4714 been written before.
4715 So the real data starts at SCR 36000+3*1200. */
4716 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
4717 } else if (!strcmp(arg, "svcd")) {
4719 opt_video_codec(o, "c:v", "mpeg2video");
4720 opt_audio_codec(o, "c:a", "mp2");
4721 parse_option(o, "f", "svcd", options);
4723 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
4724 parse_option(o, "r", frame_rates[norm], options);
4725 parse_option(o, "pix_fmt", "yuv420p", options);
4726 opt_default("g", norm == PAL ? "15" : "18");
4728 opt_default("b:v", "2040000");
4729 opt_default("maxrate", "2516000");
4730 opt_default("minrate", "0"); // 1145000;
4731 opt_default("bufsize", "1835008"); // 224*1024*8;
4732 opt_default("flags", "+scan_offset");
4735 opt_default("b:a", "224000");
4736 parse_option(o, "ar", "44100", options);
4738 opt_default("packetsize", "2324");
4740 } else if (!strcmp(arg, "dvd")) {
4742 opt_video_codec(o, "c:v", "mpeg2video");
4743 opt_audio_codec(o, "c:a", "ac3");
4744 parse_option(o, "f", "dvd", options);
4746 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4747 parse_option(o, "r", frame_rates[norm], options);
4748 parse_option(o, "pix_fmt", "yuv420p", options);
4749 opt_default("g", norm == PAL ? "15" : "18");
4751 opt_default("b:v", "6000000");
4752 opt_default("maxrate", "9000000");
4753 opt_default("minrate", "0"); // 1500000;
4754 opt_default("bufsize", "1835008"); // 224*1024*8;
4756 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4757 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4759 opt_default("b:a", "448000");
4760 parse_option(o, "ar", "48000", options);
4762 } else if (!strncmp(arg, "dv", 2)) {
4764 parse_option(o, "f", "dv", options);
4766 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4767 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4768 norm == PAL ? "yuv420p" : "yuv411p", options);
4769 parse_option(o, "r", frame_rates[norm], options);
4771 parse_option(o, "ar", "48000", options);
4772 parse_option(o, "ac", "2", options);
4775 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
4776 return AVERROR(EINVAL);
4781 static int opt_vstats_file(const char *opt, const char *arg)
4783 av_free (vstats_filename);
4784 vstats_filename = av_strdup (arg);
4788 static int opt_vstats(const char *opt, const char *arg)
4791 time_t today2 = time(NULL);
4792 struct tm *today = localtime(&today2);
4794 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4796 return opt_vstats_file(opt, filename);
4799 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4801 return parse_option(o, "frames:v", arg, options);
4804 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4806 return parse_option(o, "frames:a", arg, options);
4809 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4811 return parse_option(o, "frames:d", arg, options);
4814 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
4817 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4818 const char *codec_name = *opt == 'v' ? video_codec_name :
4819 *opt == 'a' ? audio_codec_name :
4820 subtitle_codec_name;
4822 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4823 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
4824 av_log(0, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
4826 av_log(0, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
4831 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4832 if(line[0] == '#' && !e)
4834 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4836 av_log(0, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
4839 if(!strcmp(tmp, "acodec")){
4840 opt_audio_codec(o, tmp, tmp2);
4841 }else if(!strcmp(tmp, "vcodec")){
4842 opt_video_codec(o, tmp, tmp2);
4843 }else if(!strcmp(tmp, "scodec")){
4844 opt_subtitle_codec(o, tmp, tmp2);
4845 }else if(!strcmp(tmp, "dcodec")){
4846 opt_data_codec(o, tmp, tmp2);
4847 }else if(opt_default(tmp, tmp2) < 0){
4848 av_log(0, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4858 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
4862 static int opt_passlogfile(const char *opt, const char *arg)
4864 pass_logfilename_prefix = arg;
4865 #if CONFIG_LIBX264_ENCODER
4866 return opt_default("passlogfile", arg);
4872 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
4874 char *s = av_asprintf("%s:%c", opt + 1, *opt);
4875 int ret = parse_option(o, s, arg, options);
4880 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
4882 if(!strcmp(opt, "b")){
4883 av_log(0,AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
4884 return parse_option(o, "b:v", arg, options);
4886 return opt_default(opt, arg);
4889 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4891 return parse_option(o, "filter:v", arg, options);
4894 static int opt_vsync(const char *opt, const char *arg)
4896 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
4897 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
4898 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
4900 if (video_sync_method == VSYNC_AUTO)
4901 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
4905 #define OFFSET(x) offsetof(OptionsContext, x)
4906 static const OptionDef options[] = {
4908 #include "cmdutils_common_opts.h"
4909 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4910 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4911 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4912 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
4913 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4914 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4915 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
4916 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
4917 { "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]" },
4918 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
4919 "outfile[,metadata]:infile[,metadata]" },
4920 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4921 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4922 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4923 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4924 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4925 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4926 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4927 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4928 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4929 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4930 "add timings for benchmarking" },
4931 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4932 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4933 "dump each input packet" },
4934 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4935 "when dumping packets, also dump the payload" },
4936 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4937 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "deprecated, use -loop" },
4938 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "deprecated, use -loop", "" },
4939 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4940 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
4941 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4942 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4943 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4944 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying", "source" },
4945 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4946 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4947 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4948 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
4949 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4950 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4951 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4952 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4954 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4956 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
4957 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
4958 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
4961 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4962 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4963 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4964 { "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" },
4965 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4966 { "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" },
4967 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4968 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4969 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4970 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4971 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4972 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4973 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4974 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4975 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4976 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4977 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4978 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4979 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4980 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4981 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4982 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4983 "use same quantizer as source (implies VBR)" },
4984 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4985 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4986 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4987 "deinterlace pictures" },
4988 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4989 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4990 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4992 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
4994 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
4995 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
4996 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
4997 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4998 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
4999 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
5000 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
5001 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
5002 { "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" },
5003 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
5006 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
5007 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
5008 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
5009 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
5010 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
5011 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
5012 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
5013 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
5014 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
5015 { "rmvol", HAS_ARG | OPT_AUDIO | OPT_FLOAT | OPT_SPEC, {.off = OFFSET(rematrix_volume)}, "rematrix volume (as factor)", "volume" },
5017 /* subtitle options */
5018 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
5019 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
5020 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
5023 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
5024 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
5025 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
5028 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
5029 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
5031 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
5032 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
5033 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
5035 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
5036 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
5037 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
5038 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
5039 /* data codec support */
5040 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
5041 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
5043 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
5047 int main(int argc, char **argv)
5049 OptionsContext o = { 0 };
5052 reset_options(&o, 0);
5054 av_log_set_flags(AV_LOG_SKIP_REPEATED);
5055 parse_loglevel(argc, argv, options);
5057 if(argc>1 && !strcmp(argv[1], "-d")){
5059 av_log_set_callback(log_callback_null);
5064 avcodec_register_all();
5066 avdevice_register_all();
5069 avfilter_register_all();
5072 avformat_network_init();
5074 show_banner(argc, argv, options);
5079 parse_options(&o, argc, argv, options, opt_output_file);
5081 if (nb_output_files <= 0 && nb_input_files == 0) {
5083 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
5087 /* file converter / grab */
5088 if (nb_output_files <= 0) {
5089 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
5093 if (nb_input_files == 0) {
5094 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
5099 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
5101 ti = getutime() - ti;
5103 int maxrss = getmaxrss() / 1024;
5104 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);