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;
301 static int restore_tty;
304 typedef struct OutputFile {
305 AVFormatContext *ctx;
307 int ost_index; /* index of the first stream in output_streams */
308 int64_t recording_time; /* desired length of the resulting file in microseconds */
309 int64_t start_time; /* start time in microseconds */
310 uint64_t limit_filesize;
313 static InputStream *input_streams = NULL;
314 static int nb_input_streams = 0;
315 static InputFile *input_files = NULL;
316 static int nb_input_files = 0;
318 static OutputStream *output_streams = NULL;
319 static int nb_output_streams = 0;
320 static OutputFile *output_files = NULL;
321 static int nb_output_files = 0;
323 typedef struct OptionsContext {
324 /* input/output options */
328 SpecifierOpt *codec_names;
330 SpecifierOpt *audio_channels;
331 int nb_audio_channels;
332 SpecifierOpt *audio_sample_rate;
333 int nb_audio_sample_rate;
334 SpecifierOpt *rematrix_volume;
335 int nb_rematrix_volume;
336 SpecifierOpt *frame_rates;
338 SpecifierOpt *frame_sizes;
340 SpecifierOpt *frame_pix_fmts;
341 int nb_frame_pix_fmts;
344 int64_t input_ts_offset;
347 SpecifierOpt *ts_scale;
349 SpecifierOpt *dump_attachment;
350 int nb_dump_attachment;
353 StreamMap *stream_maps;
355 AudioChannelMap *audio_channel_maps; ///< one info entry per -map_channel
356 int nb_audio_channel_maps; ///< number of (valid) -map_channel settings
357 /* first item specifies output metadata, second is input */
358 MetadataMap (*meta_data_maps)[2];
359 int nb_meta_data_maps;
360 int metadata_global_manual;
361 int metadata_streams_manual;
362 int metadata_chapters_manual;
363 const char **attachments;
366 int chapters_input_file;
368 int64_t recording_time;
369 uint64_t limit_filesize;
375 int subtitle_disable;
378 /* indexed by output file stream index */
382 SpecifierOpt *metadata;
384 SpecifierOpt *max_frames;
386 SpecifierOpt *bitstream_filters;
387 int nb_bitstream_filters;
388 SpecifierOpt *codec_tags;
390 SpecifierOpt *sample_fmts;
392 SpecifierOpt *qscale;
394 SpecifierOpt *forced_key_frames;
395 int nb_forced_key_frames;
396 SpecifierOpt *force_fps;
398 SpecifierOpt *frame_aspect_ratios;
399 int nb_frame_aspect_ratios;
400 SpecifierOpt *rc_overrides;
402 SpecifierOpt *intra_matrices;
403 int nb_intra_matrices;
404 SpecifierOpt *inter_matrices;
405 int nb_inter_matrices;
406 SpecifierOpt *top_field_first;
407 int nb_top_field_first;
408 SpecifierOpt *metadata_map;
410 SpecifierOpt *presets;
412 SpecifierOpt *copy_initial_nonkeyframes;
413 int nb_copy_initial_nonkeyframes;
415 SpecifierOpt *filters;
420 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
423 for (i = 0; i < o->nb_ ## name; i++) {\
424 char *spec = o->name[i].specifier;\
425 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
426 outvar = o->name[i].u.type;\
432 static void reset_options(OptionsContext *o, int is_input)
434 const OptionDef *po = options;
435 OptionsContext bak= *o;
437 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
439 void *dst = (uint8_t*)o + po->u.off;
441 if (po->flags & OPT_SPEC) {
442 SpecifierOpt **so = dst;
443 int i, *count = (int*)(so + 1);
444 for (i = 0; i < *count; i++) {
445 av_freep(&(*so)[i].specifier);
446 if (po->flags & OPT_STRING)
447 av_freep(&(*so)[i].u.str);
451 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
456 av_freep(&o->stream_maps);
457 av_freep(&o->audio_channel_maps);
458 av_freep(&o->meta_data_maps);
459 av_freep(&o->streamid_map);
461 memset(o, 0, sizeof(*o));
463 if(is_input) o->recording_time = bak.recording_time;
464 else o->recording_time = INT64_MAX;
465 o->mux_max_delay = 0.7;
466 o->limit_filesize = UINT64_MAX;
467 o->chapters_input_file = INT_MAX;
473 static int alloc_buffer(InputStream *ist, FrameBuffer **pbuf)
475 AVCodecContext *s = ist->st->codec;
476 FrameBuffer *buf = av_mallocz(sizeof(*buf));
478 const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1;
479 int h_chroma_shift, v_chroma_shift;
480 int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
481 int w = s->width, h = s->height;
484 return AVERROR(ENOMEM);
486 if (!(s->flags & CODEC_FLAG_EMU_EDGE)) {
491 avcodec_align_dimensions(s, &w, &h);
492 if ((ret = av_image_alloc(buf->base, buf->linesize, w, h,
493 s->pix_fmt, 32)) < 0) {
497 /* XXX this shouldn't be needed, but some tests break without this line
498 * those decoders are buggy and need to be fixed.
499 * the following tests fail:
500 * bethsoft-vid, cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
502 memset(buf->base[0], 128, ret);
504 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
505 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
506 const int h_shift = i==0 ? 0 : h_chroma_shift;
507 const int v_shift = i==0 ? 0 : v_chroma_shift;
508 if (s->flags & CODEC_FLAG_EMU_EDGE)
509 buf->data[i] = buf->base[i];
511 buf->data[i] = buf->base[i] +
512 FFALIGN((buf->linesize[i]*edge >> v_shift) +
513 (pixel_size*edge >> h_shift), 32);
517 buf->pix_fmt = s->pix_fmt;
524 static void free_buffer_pool(InputStream *ist)
526 FrameBuffer *buf = ist->buffer_pool;
528 ist->buffer_pool = buf->next;
529 av_freep(&buf->base[0]);
531 buf = ist->buffer_pool;
535 static void unref_buffer(InputStream *ist, FrameBuffer *buf)
537 av_assert0(buf->refcount);
539 if (!buf->refcount) {
540 buf->next = ist->buffer_pool;
541 ist->buffer_pool = buf;
545 static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
547 InputStream *ist = s->opaque;
551 if (!ist->buffer_pool && (ret = alloc_buffer(ist, &ist->buffer_pool)) < 0)
554 buf = ist->buffer_pool;
555 ist->buffer_pool = buf->next;
557 if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) {
558 av_freep(&buf->base[0]);
561 if ((ret = alloc_buffer(ist, &buf)) < 0)
567 frame->type = FF_BUFFER_TYPE_USER;
568 frame->extended_data = frame->data;
569 frame->pkt_pts = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE;
571 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
572 frame->base[i] = buf->base[i]; // XXX h264.c uses base though it shouldn't
573 frame->data[i] = buf->data[i];
574 frame->linesize[i] = buf->linesize[i];
580 static void codec_release_buffer(AVCodecContext *s, AVFrame *frame)
582 InputStream *ist = s->opaque;
583 FrameBuffer *buf = frame->opaque;
586 if(frame->type!=FF_BUFFER_TYPE_USER)
587 return avcodec_default_release_buffer(s, frame);
589 for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++)
590 frame->data[i] = NULL;
592 unref_buffer(ist, buf);
595 static void filter_release_buffer(AVFilterBuffer *fb)
597 FrameBuffer *buf = fb->priv;
599 unref_buffer(buf->ist, buf);
604 static int configure_video_filters(InputStream *ist, OutputStream *ost)
606 AVFilterContext *last_filter, *filter;
607 /** filter graph containing all filters including input & output */
608 AVCodecContext *codec = ost->st->codec;
609 AVCodecContext *icodec = ist->st->codec;
610 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
611 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
612 AVRational sample_aspect_ratio;
616 ost->graph = avfilter_graph_alloc();
618 if (ist->st->sample_aspect_ratio.num) {
619 sample_aspect_ratio = ist->st->sample_aspect_ratio;
621 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
623 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
624 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
625 sample_aspect_ratio.num, sample_aspect_ratio.den);
627 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
628 "src", args, NULL, ost->graph);
631 #if FF_API_OLD_VSINK_API
632 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
633 "out", NULL, pix_fmts, ost->graph);
635 buffersink_params->pixel_fmts = pix_fmts;
636 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
637 "out", NULL, buffersink_params, ost->graph);
639 av_freep(&buffersink_params);
642 last_filter = ost->input_video_filter;
644 if (codec->width != icodec->width || codec->height != icodec->height) {
645 snprintf(args, 255, "%d:%d:flags=0x%X",
648 (unsigned)ost->sws_flags);
649 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
650 NULL, args, NULL, ost->graph)) < 0)
652 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
654 last_filter = filter;
657 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
658 ost->graph->scale_sws_opts = av_strdup(args);
661 AVFilterInOut *outputs = avfilter_inout_alloc();
662 AVFilterInOut *inputs = avfilter_inout_alloc();
664 outputs->name = av_strdup("in");
665 outputs->filter_ctx = last_filter;
666 outputs->pad_idx = 0;
667 outputs->next = NULL;
669 inputs->name = av_strdup("out");
670 inputs->filter_ctx = ost->output_video_filter;
674 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
676 av_freep(&ost->avfilter);
678 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
682 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
685 codec->width = ost->output_video_filter->inputs[0]->w;
686 codec->height = ost->output_video_filter->inputs[0]->h;
687 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
688 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
689 av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
690 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
694 #endif /* CONFIG_AVFILTER */
696 static void term_exit(void)
698 av_log(NULL, AV_LOG_QUIET, "%s", "");
701 tcsetattr (0, TCSANOW, &oldtty);
705 static volatile int received_sigterm = 0;
707 static void sigterm_handler(int sig)
709 received_sigterm = sig;
710 received_nb_signals++;
712 if(received_nb_signals > 3)
716 static void term_init(void)
722 if (tcgetattr (0, &tty) == 0) {
727 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
728 |INLCR|IGNCR|ICRNL|IXON);
729 tty.c_oflag |= OPOST;
730 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
731 tty.c_cflag &= ~(CSIZE|PARENB);
736 tcsetattr (0, TCSANOW, &tty);
738 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
741 avformat_network_deinit();
743 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
744 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
746 signal(SIGXCPU, sigterm_handler);
750 /* read a key without blocking */
751 static int read_key(void)
763 n = select(1, &rfds, NULL, NULL, &tv);
772 # if HAVE_PEEKNAMEDPIPE
774 static HANDLE input_handle;
777 input_handle = GetStdHandle(STD_INPUT_HANDLE);
778 is_pipe = !GetConsoleMode(input_handle, &dw);
781 if (stdin->_cnt > 0) {
786 /* When running under a GUI, you will end here. */
787 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
804 static int decode_interrupt_cb(void *ctx)
806 return received_nb_signals > 1;
809 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
811 void av_noreturn exit_program(int ret)
816 for (i = 0; i < nb_output_files; i++) {
817 AVFormatContext *s = output_files[i].ctx;
818 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
820 avformat_free_context(s);
821 av_dict_free(&output_files[i].opts);
823 for (i = 0; i < nb_output_streams; i++) {
824 AVBitStreamFilterContext *bsfc = output_streams[i].bitstream_filters;
826 AVBitStreamFilterContext *next = bsfc->next;
827 av_bitstream_filter_close(bsfc);
830 output_streams[i].bitstream_filters = NULL;
832 if (output_streams[i].output_frame) {
833 AVFrame *frame = output_streams[i].output_frame;
834 if (frame->extended_data != frame->data)
835 av_freep(&frame->extended_data);
839 for (i = 0; i < nb_input_files; i++) {
840 avformat_close_input(&input_files[i].ctx);
842 for (i = 0; i < nb_input_streams; i++) {
843 av_freep(&input_streams[i].decoded_frame);
844 av_freep(&input_streams[i].filtered_frame);
845 av_dict_free(&input_streams[i].opts);
846 free_buffer_pool(&input_streams[i]);
851 av_free(vstats_filename);
853 av_freep(&input_streams);
854 av_freep(&input_files);
855 av_freep(&output_streams);
856 av_freep(&output_files);
860 allocated_audio_buf_size = 0;
865 avformat_network_deinit();
867 av_freep(&input_tmp);
869 if (received_sigterm) {
870 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
871 (int) received_sigterm);
875 exit(ret); /* not all OS-es handle main() return value */
878 static void assert_avoptions(AVDictionary *m)
880 AVDictionaryEntry *t;
881 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
882 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
887 static void assert_codec_experimental(AVCodecContext *c, int encoder)
889 const char *codec_string = encoder ? "encoder" : "decoder";
891 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
892 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
893 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
894 "results.\nAdd '-strict experimental' if you want to use it.\n",
895 codec_string, c->codec->name);
896 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
897 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
898 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
899 codec_string, codec->name);
904 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
906 if (codec && codec->sample_fmts) {
907 const enum AVSampleFormat *p = codec->sample_fmts;
908 for (; *p != -1; p++) {
909 if (*p == st->codec->sample_fmt)
913 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
914 av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
915 if(av_get_sample_fmt_name(st->codec->sample_fmt))
916 av_log(NULL, AV_LOG_WARNING,
917 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
918 av_get_sample_fmt_name(st->codec->sample_fmt),
920 av_get_sample_fmt_name(codec->sample_fmts[0]));
921 st->codec->sample_fmt = codec->sample_fmts[0];
926 static void choose_sample_rate(AVStream *st, AVCodec *codec)
928 if (codec && codec->supported_samplerates) {
929 const int *p = codec->supported_samplerates;
931 int best_dist = INT_MAX;
933 int dist = abs(st->codec->sample_rate - *p);
934 if (dist < best_dist) {
940 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
942 st->codec->sample_rate = best;
946 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
948 if (codec && codec->pix_fmts) {
949 const enum PixelFormat *p = codec->pix_fmts;
950 int has_alpha= av_pix_fmt_descriptors[st->codec->pix_fmt].nb_components % 2 == 0;
951 enum PixelFormat best= PIX_FMT_NONE;
952 if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
953 if (st->codec->codec_id == CODEC_ID_MJPEG) {
954 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
955 } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
956 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
957 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
960 for (; *p != PIX_FMT_NONE; p++) {
961 best= avcodec_find_best_pix_fmt2(best, *p, st->codec->pix_fmt, has_alpha, NULL);
962 if (*p == st->codec->pix_fmt)
965 if (*p == PIX_FMT_NONE) {
966 if (st->codec->pix_fmt != PIX_FMT_NONE)
967 av_log(NULL, AV_LOG_WARNING,
968 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
969 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
971 av_pix_fmt_descriptors[best].name);
972 st->codec->pix_fmt = best;
977 static double get_sync_ipts(const OutputStream *ost)
979 const InputStream *ist = ost->sync_ist;
980 OutputFile *of = &output_files[ost->file_index];
981 return (double)(ist->pts - of->start_time) / AV_TIME_BASE;
984 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
986 AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
987 AVCodecContext *avctx = ost->st->codec;
991 AVPacket new_pkt = *pkt;
992 int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
993 &new_pkt.data, &new_pkt.size,
994 pkt->data, pkt->size,
995 pkt->flags & AV_PKT_FLAG_KEY);
998 new_pkt.destruct = av_destruct_packet;
1000 av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
1001 bsfc->filter->name, pkt->stream_index,
1002 avctx->codec ? avctx->codec->name : "copy");
1012 ret = av_interleaved_write_frame(s, pkt);
1014 print_error("av_interleaved_write_frame()", ret);
1017 ost->frame_number++;
1020 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1022 int fill_char = 0x00;
1023 if (sample_fmt == AV_SAMPLE_FMT_U8)
1025 memset(buf, fill_char, size);
1028 static int encode_audio_frame(AVFormatContext *s, OutputStream *ost,
1029 const uint8_t *buf, int buf_size)
1031 AVCodecContext *enc = ost->st->codec;
1032 AVFrame *frame = NULL;
1034 int ret, got_packet;
1036 av_init_packet(&pkt);
1041 if (!ost->output_frame) {
1042 ost->output_frame = avcodec_alloc_frame();
1043 if (!ost->output_frame) {
1044 av_log(NULL, AV_LOG_FATAL, "out-of-memory in encode_audio_frame()\n");
1048 frame = ost->output_frame;
1049 if (frame->extended_data != frame->data)
1050 av_freep(&frame->extended_data);
1051 avcodec_get_frame_defaults(frame);
1053 frame->nb_samples = buf_size /
1054 (enc->channels * av_get_bytes_per_sample(enc->sample_fmt));
1055 if ((ret = avcodec_fill_audio_frame(frame, enc->channels, enc->sample_fmt,
1056 buf, buf_size, 1)) < 0) {
1057 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1063 if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
1064 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1071 pkt.stream_index = ost->index;
1072 if (pkt.pts != AV_NOPTS_VALUE)
1073 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1074 if (pkt.duration > 0)
1075 pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
1077 write_frame(s, &pkt, ost);
1079 audio_size += pkt.size;
1081 av_free_packet(&pkt);
1085 ost->sync_opts += frame->nb_samples;
1090 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
1091 InputStream *ist, AVFrame *decoded_frame)
1094 int64_t audio_buf_size, size_out;
1096 int frame_bytes, resample_changed;
1097 AVCodecContext *enc = ost->st->codec;
1098 AVCodecContext *dec = ist->st->codec;
1099 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1100 int isize = av_get_bytes_per_sample(dec->sample_fmt);
1101 uint8_t *buf = decoded_frame->data[0];
1102 int size = decoded_frame->nb_samples * dec->channels * isize;
1103 int64_t allocated_for_size = size;
1106 audio_buf_size = (allocated_for_size + isize * dec->channels - 1) / (isize * dec->channels);
1107 audio_buf_size = (audio_buf_size * enc->sample_rate + dec->sample_rate) / dec->sample_rate;
1108 audio_buf_size = audio_buf_size * 2 + 10000; // safety factors for the deprecated resampling API
1109 audio_buf_size = FFMAX(audio_buf_size, enc->frame_size);
1110 audio_buf_size *= osize * enc->channels;
1112 if (audio_buf_size > INT_MAX) {
1113 av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n");
1117 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
1119 av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
1123 if (enc->channels != dec->channels
1124 || enc->sample_fmt != dec->sample_fmt
1125 || enc->sample_rate!= dec->sample_rate
1127 ost->audio_resample = 1;
1129 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
1130 ost->resample_channels != dec->channels ||
1131 ost->resample_sample_rate != dec->sample_rate;
1133 if ((ost->audio_resample && !ost->swr) || resample_changed || ost->audio_channels_mapped) {
1134 if (resample_changed) {
1135 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",
1136 ist->file_index, ist->st->index,
1137 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
1138 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
1139 ost->resample_sample_fmt = dec->sample_fmt;
1140 ost->resample_channels = dec->channels;
1141 ost->resample_sample_rate = dec->sample_rate;
1142 swr_free(&ost->swr);
1144 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
1145 if (audio_sync_method <= 1 && !ost->audio_channels_mapped &&
1146 ost->resample_sample_fmt == enc->sample_fmt &&
1147 ost->resample_channels == enc->channels &&
1148 ost->resample_sample_rate == enc->sample_rate) {
1150 ost->audio_resample = 0;
1152 ost->swr = swr_alloc_set_opts(ost->swr,
1153 enc->channel_layout, enc->sample_fmt, enc->sample_rate,
1154 dec->channel_layout, dec->sample_fmt, dec->sample_rate,
1156 if (ost->audio_channels_mapped)
1157 swr_set_channel_mapping(ost->swr, ost->audio_channels_map);
1158 av_opt_set_double(ost->swr, "rmvol", ost->rematrix_volume, 0);
1159 if (ost->audio_channels_mapped) {
1160 av_opt_set_int(ost->swr, "icl", av_get_default_channel_layout(ost->audio_channels_mapped), 0);
1161 av_opt_set_int(ost->swr, "uch", ost->audio_channels_mapped, 0);
1163 if (av_opt_set_int(ost->swr, "ich", dec->channels, 0) < 0) {
1164 av_log(NULL, AV_LOG_FATAL, "Unsupported number of input channels\n");
1167 if (av_opt_set_int(ost->swr, "och", enc->channels, 0) < 0) {
1168 av_log(NULL, AV_LOG_FATAL, "Unsupported number of output channels\n");
1171 if(audio_sync_method>1) av_opt_set_int(ost->swr, "flags", SWR_FLAG_RESAMPLE, 0);
1172 if(ost->swr && swr_init(ost->swr) < 0){
1173 av_log(NULL, AV_LOG_FATAL, "swr_init() failed\n");
1174 swr_free(&ost->swr);
1178 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
1179 dec->channels, dec->sample_rate,
1180 enc->channels, enc->sample_rate);
1186 av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
1188 if (audio_sync_method) {
1189 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts -
1190 av_fifo_size(ost->fifo) / (enc->channels * osize);
1191 int idelta = delta * dec->sample_rate / enc->sample_rate;
1192 int byte_delta = idelta * isize * dec->channels;
1194 // FIXME resample delay
1195 if (fabs(delta) > 50) {
1196 if (ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate) {
1197 if (byte_delta < 0) {
1198 byte_delta = FFMAX(byte_delta, -size);
1201 av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n",
1202 -byte_delta / (isize * dec->channels));
1207 input_tmp = av_realloc(input_tmp, byte_delta + size);
1209 if (byte_delta > allocated_for_size - size) {
1210 allocated_for_size = byte_delta + (int64_t)size;
1215 generate_silence(input_tmp, dec->sample_fmt, byte_delta);
1216 memcpy(input_tmp + byte_delta, buf, size);
1219 av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
1221 } else if (audio_sync_method > 1) {
1222 int comp = av_clip(delta, -audio_sync_method, audio_sync_method);
1223 av_assert0(ost->audio_resample);
1224 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
1225 delta, comp, enc->sample_rate);
1226 // 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));
1227 swr_set_compensation(ost->swr, comp, enc->sample_rate);
1231 ost->sync_opts = lrintf(get_sync_ipts(ost) * enc->sample_rate) -
1232 av_fifo_size(ost->fifo) / (enc->channels * osize); // FIXME wrong
1234 if (ost->audio_resample) {
1236 size_out = swr_convert(ost->swr, ( uint8_t*[]){buftmp}, audio_buf_size / (enc->channels * osize),
1237 (const uint8_t*[]){buf }, size / (dec->channels * isize));
1238 size_out = size_out * enc->channels * osize;
1244 av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
1246 /* now encode as many frames as possible */
1247 if (!(enc->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)) {
1248 /* output resampled raw samples */
1249 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
1250 av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
1253 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
1255 frame_bytes = enc->frame_size * osize * enc->channels;
1257 while (av_fifo_size(ost->fifo) >= frame_bytes) {
1258 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
1259 encode_audio_frame(s, ost, audio_buf, frame_bytes);
1262 encode_audio_frame(s, ost, buftmp, size_out);
1266 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1268 AVCodecContext *dec;
1269 AVPicture *picture2;
1270 AVPicture picture_tmp;
1273 dec = ist->st->codec;
1275 /* deinterlace : must be done before any resize */
1276 if (do_deinterlace) {
1279 /* create temporary picture */
1280 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1281 buf = av_malloc(size);
1285 picture2 = &picture_tmp;
1286 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1288 if (avpicture_deinterlace(picture2, picture,
1289 dec->pix_fmt, dec->width, dec->height) < 0) {
1290 /* if error, do not deinterlace */
1291 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1300 if (picture != picture2)
1301 *picture = *picture2;
1305 static void do_subtitle_out(AVFormatContext *s,
1311 static uint8_t *subtitle_out = NULL;
1312 int subtitle_out_max_size = 1024 * 1024;
1313 int subtitle_out_size, nb, i;
1314 AVCodecContext *enc;
1317 if (pts == AV_NOPTS_VALUE) {
1318 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1324 enc = ost->st->codec;
1326 if (!subtitle_out) {
1327 subtitle_out = av_malloc(subtitle_out_max_size);
1330 /* Note: DVB subtitle need one packet to draw them and one other
1331 packet to clear them */
1332 /* XXX: signal it in the codec context ? */
1333 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1338 for (i = 0; i < nb; i++) {
1339 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1340 // start_display_time is required to be 0
1341 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1342 sub->end_display_time -= sub->start_display_time;
1343 sub->start_display_time = 0;
1344 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1345 subtitle_out_max_size, sub);
1346 if (subtitle_out_size < 0) {
1347 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1351 av_init_packet(&pkt);
1352 pkt.stream_index = ost->index;
1353 pkt.data = subtitle_out;
1354 pkt.size = subtitle_out_size;
1355 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1356 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1357 /* XXX: the pts correction is handled here. Maybe handling
1358 it in the codec would be better */
1360 pkt.pts += 90 * sub->start_display_time;
1362 pkt.pts += 90 * sub->end_display_time;
1364 write_frame(s, &pkt, ost);
1368 static int bit_buffer_size = 1024 * 256;
1369 static uint8_t *bit_buffer = NULL;
1371 static void do_video_resample(OutputStream *ost,
1373 AVFrame *in_picture,
1374 AVFrame **out_picture)
1377 *out_picture = in_picture;
1379 AVCodecContext *dec = ist->st->codec;
1380 AVCodecContext *enc = ost->st->codec;
1381 int resample_changed = ost->resample_width != in_picture->width ||
1382 ost->resample_height != in_picture->height ||
1383 ost->resample_pix_fmt != in_picture->format;
1385 *out_picture = in_picture;
1386 if (resample_changed) {
1387 av_log(NULL, AV_LOG_INFO,
1388 "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",
1389 ist->file_index, ist->st->index,
1390 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1391 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt),
1392 in_picture->width, in_picture->height, av_get_pix_fmt_name(in_picture->format));
1393 ost->resample_width = in_picture->width;
1394 ost->resample_height = in_picture->height;
1395 ost->resample_pix_fmt = in_picture->format;
1398 ost->video_resample = in_picture->width != enc->width ||
1399 in_picture->height != enc->height ||
1400 in_picture->format != enc->pix_fmt;
1402 if (ost->video_resample) {
1403 *out_picture = &ost->resample_frame;
1404 if (!ost->img_resample_ctx || resample_changed) {
1405 /* initialize the destination picture */
1406 if (!ost->resample_frame.data[0]) {
1407 avcodec_get_frame_defaults(&ost->resample_frame);
1408 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1409 enc->width, enc->height)) {
1410 av_log(NULL, AV_LOG_FATAL, "Cannot allocate temp picture, check pix fmt\n");
1414 /* initialize a new scaler context */
1415 sws_freeContext(ost->img_resample_ctx);
1416 ost->img_resample_ctx = sws_getContext(in_picture->width, in_picture->height, in_picture->format,
1417 enc->width, enc->height, enc->pix_fmt,
1418 ost->sws_flags, NULL, NULL, NULL);
1419 if (ost->img_resample_ctx == NULL) {
1420 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1424 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1425 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1431 static void do_video_out(AVFormatContext *s,
1434 AVFrame *in_picture,
1435 int *frame_size, float quality)
1437 int nb_frames, i, ret, format_video_sync;
1438 AVFrame *final_picture;
1439 AVCodecContext *enc;
1441 double duration = 0;
1443 enc = ost->st->codec;
1445 if (ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE) {
1446 duration = FFMAX(av_q2d(ist->st->time_base), av_q2d(ist->st->codec->time_base));
1447 if(ist->st->avg_frame_rate.num)
1448 duration= FFMAX(duration, 1/av_q2d(ist->st->avg_frame_rate));
1450 duration /= av_q2d(enc->time_base);
1453 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1455 /* by default, we output a single frame */
1460 format_video_sync = video_sync_method;
1461 if (format_video_sync == VSYNC_AUTO)
1462 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
1464 if (format_video_sync != VSYNC_PASSTHROUGH) {
1465 double vdelta = sync_ipts - ost->sync_opts + duration;
1466 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1469 else if (format_video_sync == VSYNC_VFR) {
1470 if (vdelta <= -0.6) {
1472 } else if (vdelta > 0.6)
1473 ost->sync_opts = lrintf(sync_ipts);
1474 } else if (vdelta > 1.1)
1475 nb_frames = lrintf(vdelta);
1476 //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);
1477 if (nb_frames == 0) {
1479 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1480 } else if (nb_frames > 1) {
1481 nb_frames_dup += nb_frames - 1;
1482 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1485 ost->sync_opts = lrintf(sync_ipts);
1487 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1491 do_video_resample(ost, ist, in_picture, &final_picture);
1493 /* duplicates frame if needed */
1494 for (i = 0; i < nb_frames; i++) {
1496 av_init_packet(&pkt);
1497 pkt.stream_index = ost->index;
1499 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1500 enc->codec->id == CODEC_ID_RAWVIDEO) {
1501 /* raw pictures are written as AVPicture structure to
1502 avoid any copies. We support temporarily the older
1504 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1505 enc->coded_frame->top_field_first = in_picture->top_field_first;
1506 pkt.data = (uint8_t *)final_picture;
1507 pkt.size = sizeof(AVPicture);
1508 pkt.pts = av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1509 pkt.flags |= AV_PKT_FLAG_KEY;
1511 write_frame(s, &pkt, ost);
1513 AVFrame big_picture;
1515 big_picture = *final_picture;
1516 /* better than nothing: use input picture interlaced
1518 big_picture.interlaced_frame = in_picture->interlaced_frame;
1519 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1520 if (ost->top_field_first == -1)
1521 big_picture.top_field_first = in_picture->top_field_first;
1523 big_picture.top_field_first = !!ost->top_field_first;
1526 /* handles same_quant here. This is not correct because it may
1527 not be a global option */
1528 big_picture.quality = quality;
1529 if (!enc->me_threshold)
1530 big_picture.pict_type = 0;
1531 // big_picture.pts = AV_NOPTS_VALUE;
1532 big_picture.pts = ost->sync_opts;
1533 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1534 // av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1535 if (ost->forced_kf_index < ost->forced_kf_count &&
1536 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1537 big_picture.pict_type = AV_PICTURE_TYPE_I;
1538 ost->forced_kf_index++;
1540 ret = avcodec_encode_video(enc,
1541 bit_buffer, bit_buffer_size,
1544 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1549 pkt.data = bit_buffer;
1551 if (enc->coded_frame->pts != AV_NOPTS_VALUE)
1552 pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1553 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1554 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1555 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1557 if (enc->coded_frame->key_frame)
1558 pkt.flags |= AV_PKT_FLAG_KEY;
1559 write_frame(s, &pkt, ost);
1562 // fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1563 // enc->frame_number-1, ret, enc->pict_type);
1564 /* if two pass, output log */
1565 if (ost->logfile && enc->stats_out) {
1566 fprintf(ost->logfile, "%s", enc->stats_out);
1574 static double psnr(double d)
1576 return -10.0 * log(d) / log(10.0);
1579 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1582 AVCodecContext *enc;
1584 double ti1, bitrate, avg_bitrate;
1586 /* this is executed just the first time do_video_stats is called */
1588 vstats_file = fopen(vstats_filename, "w");
1595 enc = ost->st->codec;
1596 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1597 frame_number = ost->frame_number;
1598 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1599 if (enc->flags&CODEC_FLAG_PSNR)
1600 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1602 fprintf(vstats_file,"f_size= %6d ", frame_size);
1603 /* compute pts value */
1604 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1608 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1609 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1610 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1611 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1612 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1616 static void print_report(OutputFile *output_files,
1617 OutputStream *ost_table, int nb_ostreams,
1618 int is_last_report, int64_t timer_start, int64_t cur_time)
1622 AVFormatContext *oc;
1624 AVCodecContext *enc;
1625 int frame_number, vid, i;
1627 int64_t pts = INT64_MAX;
1628 static int64_t last_time = -1;
1629 static int qp_histogram[52];
1630 int hours, mins, secs, us;
1632 if (!print_stats && !is_last_report)
1635 if (!is_last_report) {
1636 if (last_time == -1) {
1637 last_time = cur_time;
1640 if ((cur_time - last_time) < 500000)
1642 last_time = cur_time;
1646 oc = output_files[0].ctx;
1648 total_size = avio_size(oc->pb);
1649 if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
1650 total_size = avio_tell(oc->pb);
1657 for (i = 0; i < nb_ostreams; i++) {
1659 ost = &ost_table[i];
1660 enc = ost->st->codec;
1661 if (!ost->stream_copy && enc->coded_frame)
1662 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
1663 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1664 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1666 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1667 float t = (cur_time-timer_start) / 1000000.0;
1669 frame_number = ost->frame_number;
1670 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1671 frame_number, (t > 1) ? (int)(frame_number / t + 0.5) : 0, q);
1673 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1677 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
1679 for (j = 0; j < 32; j++)
1680 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
1682 if (enc->flags&CODEC_FLAG_PSNR) {
1684 double error, error_sum = 0;
1685 double scale, scale_sum = 0;
1686 char type[3] = { 'Y','U','V' };
1687 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1688 for (j = 0; j < 3; j++) {
1689 if (is_last_report) {
1690 error = enc->error[j];
1691 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
1693 error = enc->coded_frame->error[j];
1694 scale = enc->width * enc->height * 255.0 * 255.0;
1700 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error / scale));
1702 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
1706 /* compute min output value */
1707 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1708 ost->st->time_base, AV_TIME_BASE_Q));
1711 secs = pts / AV_TIME_BASE;
1712 us = pts % AV_TIME_BASE;
1718 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1720 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1721 "size=%8.0fkB time=", total_size / 1024.0);
1722 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1723 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1724 (100 * us) / AV_TIME_BASE);
1725 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1726 "bitrate=%6.1fkbits/s", bitrate);
1728 if (nb_frames_dup || nb_frames_drop)
1729 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1730 nb_frames_dup, nb_frames_drop);
1732 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
1736 if (is_last_report) {
1737 int64_t raw= audio_size + video_size + extra_size;
1738 av_log(NULL, AV_LOG_INFO, "\n");
1739 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1740 video_size / 1024.0,
1741 audio_size / 1024.0,
1742 extra_size / 1024.0,
1743 100.0 * (total_size - raw) / raw
1745 if(video_size + audio_size + extra_size == 0){
1746 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
1751 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1755 for (i = 0; i < nb_ostreams; i++) {
1756 OutputStream *ost = &ost_table[i];
1757 AVCodecContext *enc = ost->st->codec;
1758 AVFormatContext *os = output_files[ost->file_index].ctx;
1759 int stop_encoding = 0;
1761 if (!ost->encoding_needed)
1764 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
1766 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
1772 av_init_packet(&pkt);
1776 switch (ost->st->codec->codec_type) {
1777 case AVMEDIA_TYPE_AUDIO:
1778 fifo_bytes = av_fifo_size(ost->fifo);
1779 if (fifo_bytes > 0) {
1780 /* encode any samples remaining in fifo */
1781 int frame_bytes = fifo_bytes;
1783 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1785 /* pad last frame with silence if needed */
1786 if (!(enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME)) {
1787 frame_bytes = enc->frame_size * enc->channels *
1788 av_get_bytes_per_sample(enc->sample_fmt);
1789 if (allocated_audio_buf_size < frame_bytes)
1791 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1793 encode_audio_frame(os, ost, audio_buf, frame_bytes);
1795 /* flush encoder with NULL frames until it is done
1796 returning packets */
1797 if (encode_audio_frame(os, ost, NULL, 0) == 0) {
1803 case AVMEDIA_TYPE_VIDEO:
1804 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1806 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1810 if (enc->coded_frame && enc->coded_frame->key_frame)
1811 pkt.flags |= AV_PKT_FLAG_KEY;
1812 if (ost->logfile && enc->stats_out) {
1813 fprintf(ost->logfile, "%s", enc->stats_out);
1819 pkt.stream_index = ost->index;
1820 pkt.data = bit_buffer;
1822 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1823 pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1824 write_frame(os, &pkt, ost);
1836 * Check whether a packet from ist should be written into ost at this time
1838 static int check_output_constraints(InputStream *ist, OutputStream *ost)
1840 OutputFile *of = &output_files[ost->file_index];
1841 int ist_index = ist - input_streams;
1843 if (ost->source_index != ist_index)
1846 if (of->start_time && ist->pts < of->start_time)
1849 if (of->recording_time != INT64_MAX &&
1850 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1851 (AVRational){ 1, 1000000 }) >= 0) {
1852 ost->is_past_recording_time = 1;
1859 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
1861 OutputFile *of = &output_files[ost->file_index];
1862 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1866 av_init_packet(&opkt);
1868 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
1869 !ost->copy_initial_nonkeyframes)
1872 /* force the input stream PTS */
1873 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1874 audio_size += pkt->size;
1875 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1876 video_size += pkt->size;
1880 opkt.stream_index = ost->index;
1881 if (pkt->pts != AV_NOPTS_VALUE)
1882 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1884 opkt.pts = AV_NOPTS_VALUE;
1886 if (pkt->dts == AV_NOPTS_VALUE)
1887 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1889 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1890 opkt.dts -= ost_tb_start_time;
1892 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1893 opkt.flags = pkt->flags;
1895 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1896 if ( ost->st->codec->codec_id != CODEC_ID_H264
1897 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1898 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1900 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
1901 opkt.destruct = av_destruct_packet;
1903 opkt.data = pkt->data;
1904 opkt.size = pkt->size;
1906 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
1907 /* store AVPicture in AVPacket, as expected by the output format */
1908 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1909 opkt.data = (uint8_t *)&pict;
1910 opkt.size = sizeof(AVPicture);
1911 opkt.flags |= AV_PKT_FLAG_KEY;
1914 write_frame(of->ctx, &opkt, ost);
1915 ost->st->codec->frame_number++;
1916 av_free_packet(&opkt);
1919 static void rate_emu_sleep(InputStream *ist)
1921 if (input_files[ist->file_index].rate_emu) {
1922 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1923 int64_t now = av_gettime() - ist->start;
1929 static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
1931 AVFrame *decoded_frame;
1932 AVCodecContext *avctx = ist->st->codec;
1933 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1936 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
1937 return AVERROR(ENOMEM);
1939 avcodec_get_frame_defaults(ist->decoded_frame);
1940 decoded_frame = ist->decoded_frame;
1942 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
1948 /* no audio frame */
1952 /* if the decoder provides a pts, use it instead of the last packet pts.
1953 the decoder could be delaying output by a packet or more. */
1954 if (decoded_frame->pts != AV_NOPTS_VALUE)
1955 ist->next_pts = decoded_frame->pts;
1957 /* increment next_pts to use for the case where the input stream does not
1958 have timestamps or there are multiple frames in the packet */
1959 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
1962 // preprocess audio (volume)
1963 if (audio_volume != 256) {
1964 int decoded_data_size = decoded_frame->nb_samples * avctx->channels * bps;
1965 void *samples = decoded_frame->data[0];
1966 switch (avctx->sample_fmt) {
1967 case AV_SAMPLE_FMT_U8:
1969 uint8_t *volp = samples;
1970 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1971 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
1972 *volp++ = av_clip_uint8(v);
1976 case AV_SAMPLE_FMT_S16:
1978 int16_t *volp = samples;
1979 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1980 int v = ((*volp) * audio_volume + 128) >> 8;
1981 *volp++ = av_clip_int16(v);
1985 case AV_SAMPLE_FMT_S32:
1987 int32_t *volp = samples;
1988 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1989 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
1990 *volp++ = av_clipl_int32(v);
1994 case AV_SAMPLE_FMT_FLT:
1996 float *volp = samples;
1997 float scale = audio_volume / 256.f;
1998 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2003 case AV_SAMPLE_FMT_DBL:
2005 double *volp = samples;
2006 double scale = audio_volume / 256.;
2007 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2013 av_log(NULL, AV_LOG_FATAL,
2014 "Audio volume adjustment on sample format %s is not supported.\n",
2015 av_get_sample_fmt_name(ist->st->codec->sample_fmt));
2020 rate_emu_sleep(ist);
2022 for (i = 0; i < nb_output_streams; i++) {
2023 OutputStream *ost = &output_streams[i];
2025 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2027 do_audio_out(output_files[ost->file_index].ctx, ost, ist, decoded_frame);
2033 static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *pkt_pts, int64_t *pkt_dts)
2035 AVFrame *decoded_frame, *filtered_frame = NULL;
2036 void *buffer_to_free = NULL;
2040 int frame_available = 1;
2043 int64_t *best_effort_timestamp;
2044 AVRational *frame_sample_aspect;
2046 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2047 return AVERROR(ENOMEM);
2049 avcodec_get_frame_defaults(ist->decoded_frame);
2050 decoded_frame = ist->decoded_frame;
2051 pkt->pts = *pkt_pts;
2052 pkt->dts = *pkt_dts;
2053 *pkt_pts = AV_NOPTS_VALUE;
2055 if (pkt->duration) {
2056 duration = av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2057 } else if(ist->st->codec->time_base.num != 0) {
2058 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2059 duration = ((int64_t)AV_TIME_BASE *
2060 ist->st->codec->time_base.num * ticks) /
2061 ist->st->codec->time_base.den;
2064 if(*pkt_dts != AV_NOPTS_VALUE && duration) {
2065 *pkt_dts += duration;
2067 *pkt_dts = AV_NOPTS_VALUE;
2069 ret = avcodec_decode_video2(ist->st->codec,
2070 decoded_frame, got_output, pkt);
2074 quality = same_quant ? decoded_frame->quality : 0;
2076 /* no picture yet */
2080 best_effort_timestamp= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "best_effort_timestamp");
2081 if(*best_effort_timestamp != AV_NOPTS_VALUE)
2082 ist->next_pts = ist->pts = *best_effort_timestamp;
2084 ist->next_pts += duration;
2087 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2090 frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
2091 for(i=0;i<nb_output_streams;i++) {
2092 OutputStream *ost = ost = &output_streams[i];
2093 if(check_output_constraints(ist, ost) && ost->encoding_needed){
2094 if (!frame_sample_aspect->num)
2095 *frame_sample_aspect = ist->st->sample_aspect_ratio;
2096 decoded_frame->pts = ist->pts;
2097 if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER) {
2098 FrameBuffer *buf = decoded_frame->opaque;
2099 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2100 decoded_frame->data, decoded_frame->linesize,
2101 AV_PERM_READ | AV_PERM_PRESERVE,
2102 ist->st->codec->width, ist->st->codec->height,
2103 ist->st->codec->pix_fmt);
2105 avfilter_copy_frame_props(fb, decoded_frame);
2107 fb->buf->priv = buf;
2108 fb->buf->free = filter_release_buffer;
2111 av_buffersrc_buffer(ost->input_video_filter, fb);
2113 if((av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame, AV_VSRC_BUF_FLAG_OVERWRITE)) < 0){
2114 av_log(0, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
2121 rate_emu_sleep(ist);
2123 for (i = 0; i < nb_output_streams; i++) {
2124 OutputStream *ost = &output_streams[i];
2127 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2131 if (ost->input_video_filter) {
2132 frame_available = av_buffersink_poll_frame(ost->output_video_filter);
2134 while (frame_available) {
2135 if (ost->output_video_filter) {
2136 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
2137 if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0){
2138 av_log(0, AV_LOG_WARNING, "AV Filter told us it has a frame available but failed to output one\n");
2141 if (!ist->filtered_frame && !(ist->filtered_frame = avcodec_alloc_frame())) {
2142 av_free(buffer_to_free);
2143 return AVERROR(ENOMEM);
2145 avcodec_get_frame_defaults(ist->filtered_frame);
2146 filtered_frame = ist->filtered_frame;
2147 *filtered_frame= *decoded_frame; //for me_threshold
2149 avfilter_fill_frame_from_video_buffer_ref(filtered_frame, ost->picref);
2150 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
2153 if (ost->picref->video && !ost->frame_aspect_ratio)
2154 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
2156 filtered_frame = decoded_frame;
2159 do_video_out(output_files[ost->file_index].ctx, ost, ist, filtered_frame, &frame_size,
2160 same_quant ? quality : ost->st->codec->global_quality);
2161 if (vstats_filename && frame_size)
2162 do_video_stats(output_files[ost->file_index].ctx, ost, frame_size);
2165 frame_available = ost->output_video_filter && av_buffersink_poll_frame(ost->output_video_filter);
2166 avfilter_unref_buffer(ost->picref);
2171 av_free(buffer_to_free);
2175 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2177 AVSubtitle subtitle;
2178 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2179 &subtitle, got_output, pkt);
2185 rate_emu_sleep(ist);
2187 for (i = 0; i < nb_output_streams; i++) {
2188 OutputStream *ost = &output_streams[i];
2190 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2193 do_subtitle_out(output_files[ost->file_index].ctx, ost, ist, &subtitle, pkt->pts);
2196 avsubtitle_free(&subtitle);
2200 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2201 static int output_packet(InputStream *ist,
2202 OutputStream *ost_table, int nb_ostreams,
2203 const AVPacket *pkt)
2207 int64_t pkt_dts = AV_NOPTS_VALUE;
2208 int64_t pkt_pts = AV_NOPTS_VALUE;
2212 if (ist->next_pts == AV_NOPTS_VALUE)
2213 ist->next_pts = ist->pts;
2217 av_init_packet(&avpkt);
2225 if (pkt->dts != AV_NOPTS_VALUE) {
2226 if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2227 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2228 pkt_dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2230 if(pkt->pts != AV_NOPTS_VALUE)
2231 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2233 // while we have more to decode or while the decoder did output something on EOF
2234 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2237 ist->pts = ist->next_pts;
2239 if (avpkt.size && avpkt.size != pkt->size) {
2240 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2241 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2242 ist->showed_multi_packet_warning = 1;
2245 switch (ist->st->codec->codec_type) {
2246 case AVMEDIA_TYPE_AUDIO:
2247 ret = transcode_audio (ist, &avpkt, &got_output);
2249 case AVMEDIA_TYPE_VIDEO:
2250 ret = transcode_video (ist, &avpkt, &got_output, &pkt_pts, &pkt_dts);
2252 case AVMEDIA_TYPE_SUBTITLE:
2253 ret = transcode_subtitles(ist, &avpkt, &got_output);
2263 avpkt.pts= AV_NOPTS_VALUE;
2265 // touch data and size only if not EOF
2267 if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2277 /* handle stream copy */
2278 if (!ist->decoding_needed) {
2279 rate_emu_sleep(ist);
2280 ist->pts = ist->next_pts;
2281 switch (ist->st->codec->codec_type) {
2282 case AVMEDIA_TYPE_AUDIO:
2283 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2284 ist->st->codec->sample_rate;
2286 case AVMEDIA_TYPE_VIDEO:
2287 if (pkt->duration) {
2288 ist->next_pts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2289 } else if(ist->st->codec->time_base.num != 0) {
2290 int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2291 ist->next_pts += ((int64_t)AV_TIME_BASE *
2292 ist->st->codec->time_base.num * ticks) /
2293 ist->st->codec->time_base.den;
2298 for (i = 0; pkt && i < nb_ostreams; i++) {
2299 OutputStream *ost = &ost_table[i];
2301 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2304 do_streamcopy(ist, ost, pkt);
2310 static void print_sdp(OutputFile *output_files, int n)
2314 AVFormatContext **avc = av_malloc(sizeof(*avc) * n);
2318 for (i = 0; i < n; i++)
2319 avc[i] = output_files[i].ctx;
2321 av_sdp_create(avc, n, sdp, sizeof(sdp));
2322 printf("SDP:\n%s\n", sdp);
2327 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
2328 char *error, int error_len)
2330 InputStream *ist = &input_streams[ist_index];
2331 if (ist->decoding_needed) {
2332 AVCodec *codec = ist->dec;
2334 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2335 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2336 return AVERROR(EINVAL);
2339 ist->dr1 = codec->capabilities & CODEC_CAP_DR1;
2340 if (codec->type == AVMEDIA_TYPE_VIDEO && ist->dr1) {
2341 ist->st->codec->get_buffer = codec_get_buffer;
2342 ist->st->codec->release_buffer = codec_release_buffer;
2343 ist->st->codec->opaque = ist;
2346 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2347 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2348 ist->file_index, ist->st->index);
2349 return AVERROR(EINVAL);
2351 assert_codec_experimental(ist->st->codec, 0);
2352 assert_avoptions(ist->opts);
2355 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;
2356 ist->next_pts = AV_NOPTS_VALUE;
2362 static int transcode_init(OutputFile *output_files, int nb_output_files,
2363 InputFile *input_files, int nb_input_files)
2365 int ret = 0, i, j, k;
2366 AVFormatContext *oc;
2367 AVCodecContext *codec, *icodec;
2373 /* init framerate emulation */
2374 for (i = 0; i < nb_input_files; i++) {
2375 InputFile *ifile = &input_files[i];
2376 if (ifile->rate_emu)
2377 for (j = 0; j < ifile->nb_streams; j++)
2378 input_streams[j + ifile->ist_index].start = av_gettime();
2381 /* output stream init */
2382 for (i = 0; i < nb_output_files; i++) {
2383 oc = output_files[i].ctx;
2384 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2385 av_dump_format(oc, i, oc->filename, 1);
2386 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2387 return AVERROR(EINVAL);
2391 /* for each output stream, we compute the right encoding parameters */
2392 for (i = 0; i < nb_output_streams; i++) {
2393 ost = &output_streams[i];
2394 oc = output_files[ost->file_index].ctx;
2395 ist = &input_streams[ost->source_index];
2397 if (ost->attachment_filename)
2400 codec = ost->st->codec;
2401 icodec = ist->st->codec;
2403 ost->st->disposition = ist->st->disposition;
2404 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2405 codec->chroma_sample_location = icodec->chroma_sample_location;
2407 if (ost->stream_copy) {
2408 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2410 if (extra_size > INT_MAX) {
2411 return AVERROR(EINVAL);
2414 /* if stream_copy is selected, no need to decode or encode */
2415 codec->codec_id = icodec->codec_id;
2416 codec->codec_type = icodec->codec_type;
2418 if (!codec->codec_tag) {
2419 if (!oc->oformat->codec_tag ||
2420 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2421 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2422 codec->codec_tag = icodec->codec_tag;
2425 codec->bit_rate = icodec->bit_rate;
2426 codec->rc_max_rate = icodec->rc_max_rate;
2427 codec->rc_buffer_size = icodec->rc_buffer_size;
2428 codec->field_order = icodec->field_order;
2429 codec->extradata = av_mallocz(extra_size);
2430 if (!codec->extradata) {
2431 return AVERROR(ENOMEM);
2433 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2434 codec->extradata_size= icodec->extradata_size;
2436 codec->time_base = ist->st->time_base;
2437 if(!strcmp(oc->oformat->name, "avi")) {
2438 if ( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
2439 && av_q2d(ist->st->time_base) < 1.0/500
2441 codec->time_base = icodec->time_base;
2442 codec->time_base.num *= icodec->ticks_per_frame;
2443 codec->time_base.den *= 2;
2445 } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
2446 && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
2447 && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
2449 if( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
2450 && av_q2d(ist->st->time_base) < 1.0/500
2452 codec->time_base = icodec->time_base;
2453 codec->time_base.num *= icodec->ticks_per_frame;
2456 av_reduce(&codec->time_base.num, &codec->time_base.den,
2457 codec->time_base.num, codec->time_base.den, INT_MAX);
2459 switch (codec->codec_type) {
2460 case AVMEDIA_TYPE_AUDIO:
2461 if (audio_volume != 256) {
2462 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2465 codec->channel_layout = icodec->channel_layout;
2466 codec->sample_rate = icodec->sample_rate;
2467 codec->channels = icodec->channels;
2468 codec->frame_size = icodec->frame_size;
2469 codec->audio_service_type = icodec->audio_service_type;
2470 codec->block_align = icodec->block_align;
2472 case AVMEDIA_TYPE_VIDEO:
2473 codec->pix_fmt = icodec->pix_fmt;
2474 codec->width = icodec->width;
2475 codec->height = icodec->height;
2476 codec->has_b_frames = icodec->has_b_frames;
2477 if (!codec->sample_aspect_ratio.num) {
2478 codec->sample_aspect_ratio =
2479 ost->st->sample_aspect_ratio =
2480 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2481 ist->st->codec->sample_aspect_ratio.num ?
2482 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2484 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
2486 case AVMEDIA_TYPE_SUBTITLE:
2487 codec->width = icodec->width;
2488 codec->height = icodec->height;
2490 case AVMEDIA_TYPE_DATA:
2491 case AVMEDIA_TYPE_ATTACHMENT:
2498 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2500 ist->decoding_needed = 1;
2501 ost->encoding_needed = 1;
2503 switch (codec->codec_type) {
2504 case AVMEDIA_TYPE_AUDIO:
2505 ost->fifo = av_fifo_alloc(1024);
2507 return AVERROR(ENOMEM);
2509 if (!codec->sample_rate)
2510 codec->sample_rate = icodec->sample_rate;
2511 choose_sample_rate(ost->st, ost->enc);
2512 codec->time_base = (AVRational){ 1, codec->sample_rate };
2514 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2515 codec->sample_fmt = icodec->sample_fmt;
2516 choose_sample_fmt(ost->st, ost->enc);
2518 if (ost->audio_channels_mapped) {
2519 /* the requested output channel is set to the number of
2520 * -map_channel only if no -ac are specified */
2521 if (!codec->channels) {
2522 codec->channels = ost->audio_channels_mapped;
2523 codec->channel_layout = av_get_default_channel_layout(codec->channels);
2524 if (!codec->channel_layout) {
2525 av_log(NULL, AV_LOG_FATAL, "Unable to find an appropriate channel layout for requested number of channel\n");
2529 /* fill unused channel mapping with -1 (which means a muted
2530 * channel in case the number of output channels is bigger
2531 * than the number of mapped channel) */
2532 for (j = ost->audio_channels_mapped; j < FF_ARRAY_ELEMS(ost->audio_channels_map); j++)
2533 ost->audio_channels_map[j] = -1;
2534 } else if (!codec->channels) {
2535 codec->channels = icodec->channels;
2536 codec->channel_layout = icodec->channel_layout;
2538 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2539 codec->channel_layout = 0;
2541 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2542 ost->audio_resample |= codec->sample_fmt != icodec->sample_fmt
2543 || codec->channel_layout != icodec->channel_layout;
2544 icodec->request_channels = codec->channels;
2545 ost->resample_sample_fmt = icodec->sample_fmt;
2546 ost->resample_sample_rate = icodec->sample_rate;
2547 ost->resample_channels = icodec->channels;
2549 case AVMEDIA_TYPE_VIDEO:
2550 if (codec->pix_fmt == PIX_FMT_NONE)
2551 codec->pix_fmt = icodec->pix_fmt;
2552 choose_pixel_fmt(ost->st, ost->enc);
2554 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2555 av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2559 if (!codec->width || !codec->height) {
2560 codec->width = icodec->width;
2561 codec->height = icodec->height;
2564 ost->video_resample = codec->width != icodec->width ||
2565 codec->height != icodec->height ||
2566 codec->pix_fmt != icodec->pix_fmt;
2567 if (ost->video_resample) {
2568 codec->bits_per_raw_sample = frame_bits_per_raw_sample;
2571 ost->resample_height = icodec->height;
2572 ost->resample_width = icodec->width;
2573 ost->resample_pix_fmt = icodec->pix_fmt;
2575 if (!ost->frame_rate.num)
2576 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational) { 25, 1 };
2577 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2578 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2579 ost->frame_rate = ost->enc->supported_framerates[idx];
2581 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2582 if ( av_q2d(codec->time_base) < 0.001 && video_sync_method
2583 && (video_sync_method==1 || (video_sync_method<0 && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
2584 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2585 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2587 for (j = 0; j < ost->forced_kf_count; j++)
2588 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
2593 if (configure_video_filters(ist, ost)) {
2594 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2599 case AVMEDIA_TYPE_SUBTITLE:
2606 if (codec->codec_id != CODEC_ID_H264 &&
2607 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2608 char logfilename[1024];
2611 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2612 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2614 if (codec->flags & CODEC_FLAG_PASS2) {
2616 size_t logbuffer_size;
2617 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2618 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2622 codec->stats_in = logbuffer;
2624 if (codec->flags & CODEC_FLAG_PASS1) {
2625 f = fopen(logfilename, "wb");
2627 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2628 logfilename, strerror(errno));
2635 if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2636 /* maximum video buffer size is 8-bytes per pixel, plus DPX header size (1664)*/
2637 int size = codec->width * codec->height;
2638 bit_buffer_size = FFMAX(bit_buffer_size, 9*size + 10000);
2643 bit_buffer = av_malloc(bit_buffer_size);
2645 av_log(NULL, AV_LOG_ERROR, "Cannot allocate %d bytes output buffer\n",
2647 return AVERROR(ENOMEM);
2650 /* open each encoder */
2651 for (i = 0; i < nb_output_streams; i++) {
2652 ost = &output_streams[i];
2653 if (ost->encoding_needed) {
2654 AVCodec *codec = ost->enc;
2655 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2657 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
2658 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2659 ret = AVERROR(EINVAL);
2662 if (dec->subtitle_header) {
2663 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2664 if (!ost->st->codec->subtitle_header) {
2665 ret = AVERROR(ENOMEM);
2668 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2669 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2671 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2672 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2673 ost->file_index, ost->index);
2674 ret = AVERROR(EINVAL);
2677 assert_codec_experimental(ost->st->codec, 1);
2678 assert_avoptions(ost->opts);
2679 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2680 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2681 " It takes bits/s as argument, not kbits/s\n");
2682 extra_size += ost->st->codec->extradata_size;
2684 if (ost->st->codec->me_threshold)
2685 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2689 /* init input streams */
2690 for (i = 0; i < nb_input_streams; i++)
2691 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2694 /* discard unused programs */
2695 for (i = 0; i < nb_input_files; i++) {
2696 InputFile *ifile = &input_files[i];
2697 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2698 AVProgram *p = ifile->ctx->programs[j];
2699 int discard = AVDISCARD_ALL;
2701 for (k = 0; k < p->nb_stream_indexes; k++)
2702 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2703 discard = AVDISCARD_DEFAULT;
2706 p->discard = discard;
2710 /* open files and write file headers */
2711 for (i = 0; i < nb_output_files; i++) {
2712 oc = output_files[i].ctx;
2713 oc->interrupt_callback = int_cb;
2714 if (avformat_write_header(oc, &output_files[i].opts) < 0) {
2715 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2716 ret = AVERROR(EINVAL);
2719 // assert_avoptions(output_files[i].opts);
2720 if (strcmp(oc->oformat->name, "rtp")) {
2726 /* dump the file output parameters - cannot be done before in case
2728 for (i = 0; i < nb_output_files; i++) {
2729 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2732 /* dump the stream mapping */
2733 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2734 for (i = 0; i < nb_output_streams; i++) {
2735 ost = &output_streams[i];
2737 if (ost->attachment_filename) {
2738 /* an attached file */
2739 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
2740 ost->attachment_filename, ost->file_index, ost->index);
2743 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
2744 input_streams[ost->source_index].file_index,
2745 input_streams[ost->source_index].st->index,
2748 if (ost->audio_channels_mapped) {
2749 av_log(NULL, AV_LOG_INFO, " [ch:");
2750 for (j = 0; j < ost->audio_channels_mapped; j++)
2751 if (ost->audio_channels_map[j] == -1)
2752 av_log(NULL, AV_LOG_INFO, " M");
2754 av_log(NULL, AV_LOG_INFO, " %d", ost->audio_channels_map[j]);
2755 av_log(NULL, AV_LOG_INFO, "]");
2757 if (ost->sync_ist != &input_streams[ost->source_index])
2758 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2759 ost->sync_ist->file_index,
2760 ost->sync_ist->st->index);
2761 if (ost->stream_copy)
2762 av_log(NULL, AV_LOG_INFO, " (copy)");
2764 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2765 input_streams[ost->source_index].dec->name : "?",
2766 ost->enc ? ost->enc->name : "?");
2767 av_log(NULL, AV_LOG_INFO, "\n");
2771 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2776 print_sdp(output_files, nb_output_files);
2783 * The following code is the main loop of the file converter
2785 static int transcode(OutputFile *output_files, int nb_output_files,
2786 InputFile *input_files, int nb_input_files)
2789 AVFormatContext *is, *os;
2793 int no_packet_count = 0;
2794 int64_t timer_start;
2797 if (!(no_packet = av_mallocz(nb_input_files)))
2800 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2805 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
2808 timer_start = av_gettime();
2810 for (; received_sigterm == 0;) {
2811 int file_index, ist_index;
2815 int64_t cur_time= av_gettime();
2817 ipts_min = INT64_MAX;
2819 /* if 'q' pressed, exits */
2821 static int64_t last_time;
2822 if (received_nb_signals)
2824 /* read_key() returns 0 on EOF */
2825 if(cur_time - last_time >= 100000 && !run_as_daemon){
2827 last_time = cur_time;
2832 if (key == '+') av_log_set_level(av_log_get_level()+10);
2833 if (key == '-') av_log_set_level(av_log_get_level()-10);
2834 if (key == 's') qp_hist ^= 1;
2837 do_hex_dump = do_pkt_dump = 0;
2838 } else if(do_pkt_dump){
2842 av_log_set_level(AV_LOG_DEBUG);
2845 if (key == 'c' || key == 'C'){
2846 char buf[4096], target[64], command[256], arg[256] = {0};
2849 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2851 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
2856 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
2857 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
2858 target, time, command, arg);
2859 for (i = 0; i < nb_output_streams; i++) {
2860 ost = &output_streams[i];
2863 ret = avfilter_graph_send_command(ost->graph, target, command, arg, buf, sizeof(buf),
2864 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
2865 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
2867 ret = avfilter_graph_queue_command(ost->graph, target, command, arg, 0, time);
2872 av_log(NULL, AV_LOG_ERROR,
2873 "Parse error, at least 3 arguments were expected, "
2874 "only %d given in string '%s'\n", n, buf);
2878 if (key == 'd' || key == 'D'){
2881 debug = input_streams[0].st->codec->debug<<1;
2882 if(!debug) debug = 1;
2883 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2886 if(scanf("%d", &debug)!=1)
2887 fprintf(stderr,"error parsing debug value\n");
2888 for(i=0;i<nb_input_streams;i++) {
2889 input_streams[i].st->codec->debug = debug;
2891 for(i=0;i<nb_output_streams;i++) {
2892 ost = &output_streams[i];
2893 ost->st->codec->debug = debug;
2895 if(debug) av_log_set_level(AV_LOG_DEBUG);
2896 fprintf(stderr,"debug=%d\n", debug);
2899 fprintf(stderr, "key function\n"
2900 "? show this help\n"
2901 "+ increase verbosity\n"
2902 "- decrease verbosity\n"
2903 "c Send command to filtergraph\n"
2904 "D cycle through available debug modes\n"
2905 "h dump packets/hex press to cycle through the 3 states\n"
2907 "s Show QP histogram\n"
2912 /* select the stream that we must read now by looking at the
2913 smallest output pts */
2915 for (i = 0; i < nb_output_streams; i++) {
2919 ost = &output_streams[i];
2920 of = &output_files[ost->file_index];
2921 os = output_files[ost->file_index].ctx;
2922 ist = &input_streams[ost->source_index];
2923 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2924 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2926 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2928 if (!input_files[ist->file_index].eof_reached) {
2929 if (ipts < ipts_min) {
2932 file_index = ist->file_index;
2934 if (opts < opts_min) {
2936 if (!input_sync) file_index = ist->file_index;
2939 if (ost->frame_number >= ost->max_frames) {
2941 for (j = 0; j < of->ctx->nb_streams; j++)
2942 output_streams[of->ost_index + j].is_past_recording_time = 1;
2946 /* if none, if is finished */
2947 if (file_index < 0) {
2948 if (no_packet_count) {
2949 no_packet_count = 0;
2950 memset(no_packet, 0, nb_input_files);
2957 /* read a frame from it and output it in the fifo */
2958 is = input_files[file_index].ctx;
2959 ret = av_read_frame(is, &pkt);
2960 if (ret == AVERROR(EAGAIN)) {
2961 no_packet[file_index] = 1;
2966 input_files[file_index].eof_reached = 1;
2973 no_packet_count = 0;
2974 memset(no_packet, 0, nb_input_files);
2977 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2978 is->streams[pkt.stream_index]);
2980 /* the following test is needed in case new streams appear
2981 dynamically in stream : we ignore them */
2982 if (pkt.stream_index >= input_files[file_index].nb_streams)
2983 goto discard_packet;
2984 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2985 ist = &input_streams[ist_index];
2987 goto discard_packet;
2989 if (pkt.dts != AV_NOPTS_VALUE)
2990 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2991 if (pkt.pts != AV_NOPTS_VALUE)
2992 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2994 if (pkt.pts != AV_NOPTS_VALUE)
2995 pkt.pts *= ist->ts_scale;
2996 if (pkt.dts != AV_NOPTS_VALUE)
2997 pkt.dts *= ist->ts_scale;
2999 //fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n",
3001 // pkt.dts, input_files[ist->file_index].ts_offset,
3002 // ist->st->codec->codec_type);
3003 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
3004 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
3005 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
3006 int64_t delta = pkt_dts - ist->next_pts;
3007 if((delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
3008 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
3009 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3010 pkt_dts+1<ist->pts)&& !copy_ts){
3011 input_files[ist->file_index].ts_offset -= delta;
3012 av_log(NULL, AV_LOG_DEBUG,
3013 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
3014 delta, input_files[ist->file_index].ts_offset);
3015 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3016 if (pkt.pts != AV_NOPTS_VALUE)
3017 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3021 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
3022 if (output_packet(ist, output_streams, nb_output_streams, &pkt) < 0) {
3024 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
3025 ist->file_index, ist->st->index);
3028 av_free_packet(&pkt);
3033 av_free_packet(&pkt);
3035 /* dump report by using the output first video and audio streams */
3036 print_report(output_files, output_streams, nb_output_streams, 0, timer_start, cur_time);
3039 /* at the end of stream, we must flush the decoder buffers */
3040 for (i = 0; i < nb_input_streams; i++) {
3041 ist = &input_streams[i];
3042 if (ist->decoding_needed) {
3043 output_packet(ist, output_streams, nb_output_streams, NULL);
3046 flush_encoders(output_streams, nb_output_streams);
3050 /* write the trailer if needed and close file */
3051 for (i = 0; i < nb_output_files; i++) {
3052 os = output_files[i].ctx;
3053 av_write_trailer(os);
3056 /* dump report by using the first video and audio streams */
3057 print_report(output_files, output_streams, nb_output_streams, 1, timer_start, av_gettime());
3059 /* close each encoder */
3060 for (i = 0; i < nb_output_streams; i++) {
3061 ost = &output_streams[i];
3062 if (ost->encoding_needed) {
3063 av_freep(&ost->st->codec->stats_in);
3064 avcodec_close(ost->st->codec);
3067 avfilter_graph_free(&ost->graph);
3071 /* close each decoder */
3072 for (i = 0; i < nb_input_streams; i++) {
3073 ist = &input_streams[i];
3074 if (ist->decoding_needed) {
3075 avcodec_close(ist->st->codec);
3083 av_freep(&bit_buffer);
3084 av_freep(&no_packet);
3086 if (output_streams) {
3087 for (i = 0; i < nb_output_streams; i++) {
3088 ost = &output_streams[i];
3090 if (ost->stream_copy)
3091 av_freep(&ost->st->codec->extradata);
3093 fclose(ost->logfile);
3094 ost->logfile = NULL;
3096 av_fifo_free(ost->fifo); /* works even if fifo is not
3097 initialized but set to zero */
3098 av_freep(&ost->st->codec->subtitle_header);
3099 av_free(ost->resample_frame.data[0]);
3100 av_free(ost->forced_kf_pts);
3101 if (ost->video_resample)
3102 sws_freeContext(ost->img_resample_ctx);
3103 swr_free(&ost->swr);
3104 av_dict_free(&ost->opts);
3111 static int opt_frame_crop(const char *opt, const char *arg)
3113 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
3114 return AVERROR(EINVAL);
3117 static int opt_pad(const char *opt, const char *arg)
3119 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
3123 static double parse_frame_aspect_ratio(const char *arg)
3130 p = strchr(arg, ':');
3132 x = strtol(arg, &end, 10);
3134 y = strtol(end + 1, &end, 10);
3136 ar = (double)x / (double)y;
3138 ar = strtod(arg, NULL);
3141 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
3147 static int opt_video_channel(const char *opt, const char *arg)
3149 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
3150 return opt_default("channel", arg);
3153 static int opt_video_standard(const char *opt, const char *arg)
3155 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
3156 return opt_default("standard", arg);
3159 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
3161 audio_codec_name = arg;
3162 return parse_option(o, "codec:a", arg, options);
3165 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3167 video_codec_name = arg;
3168 return parse_option(o, "codec:v", arg, options);
3171 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3173 subtitle_codec_name = arg;
3174 return parse_option(o, "codec:s", arg, options);
3177 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3179 return parse_option(o, "codec:d", arg, options);
3182 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
3184 StreamMap *m = NULL;
3185 int i, negative = 0, file_idx;
3186 int sync_file_idx = -1, sync_stream_idx = 0;
3194 map = av_strdup(arg);
3196 /* parse sync stream first, just pick first matching stream */
3197 if (sync = strchr(map, ',')) {
3199 sync_file_idx = strtol(sync + 1, &sync, 0);
3200 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3201 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
3206 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
3207 if (check_stream_specifier(input_files[sync_file_idx].ctx,
3208 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
3209 sync_stream_idx = i;
3212 if (i == input_files[sync_file_idx].nb_streams) {
3213 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
3214 "match any streams.\n", arg);
3220 file_idx = strtol(map, &p, 0);
3221 if (file_idx >= nb_input_files || file_idx < 0) {
3222 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
3226 /* disable some already defined maps */
3227 for (i = 0; i < o->nb_stream_maps; i++) {
3228 m = &o->stream_maps[i];
3229 if (file_idx == m->file_index &&
3230 check_stream_specifier(input_files[m->file_index].ctx,
3231 input_files[m->file_index].ctx->streams[m->stream_index],
3232 *p == ':' ? p + 1 : p) > 0)
3236 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
3237 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
3238 *p == ':' ? p + 1 : p) <= 0)
3240 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3241 &o->nb_stream_maps, o->nb_stream_maps + 1);
3242 m = &o->stream_maps[o->nb_stream_maps - 1];
3244 m->file_index = file_idx;
3245 m->stream_index = i;
3247 if (sync_file_idx >= 0) {
3248 m->sync_file_index = sync_file_idx;
3249 m->sync_stream_index = sync_stream_idx;
3251 m->sync_file_index = file_idx;
3252 m->sync_stream_index = i;
3257 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3265 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3267 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3268 &o->nb_attachments, o->nb_attachments + 1);
3269 o->attachments[o->nb_attachments - 1] = arg;
3273 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
3279 o->audio_channel_maps =
3280 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
3281 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
3282 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
3284 /* muted channel syntax */
3285 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
3286 if ((n == 1 || n == 3) && m->channel_idx == -1) {
3287 m->file_idx = m->stream_idx = -1;
3289 m->ofile_idx = m->ostream_idx = -1;
3294 n = sscanf(arg, "%d.%d.%d:%d.%d",
3295 &m->file_idx, &m->stream_idx, &m->channel_idx,
3296 &m->ofile_idx, &m->ostream_idx);
3298 if (n != 3 && n != 5) {
3299 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
3300 "[file.stream.channel|-1][:syncfile:syncstream]\n");
3304 if (n != 5) // only file.stream.channel specified
3305 m->ofile_idx = m->ostream_idx = -1;
3308 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
3309 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
3313 if (m->stream_idx < 0 ||
3314 m->stream_idx >= input_files[m->file_idx].nb_streams) {
3315 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
3316 m->file_idx, m->stream_idx);
3319 st = input_files[m->file_idx].ctx->streams[m->stream_idx];
3320 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
3321 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
3322 m->file_idx, m->stream_idx);
3325 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
3326 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
3327 m->file_idx, m->stream_idx, m->channel_idx);
3334 * Parse a metadata specifier in arg.
3335 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
3336 * @param index for type c/p, chapter/program index is written here
3337 * @param stream_spec for type s, the stream specifier is written here
3339 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
3347 if (*(++arg) && *arg != ':') {
3348 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
3351 *stream_spec = *arg == ':' ? arg + 1 : "";
3355 if (*(++arg) == ':')
3356 *index = strtol(++arg, NULL, 0);
3359 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
3366 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
3368 AVDictionary **meta_in = NULL;
3369 AVDictionary **meta_out = NULL;
3371 char type_in, type_out;
3372 const char *istream_spec = NULL, *ostream_spec = NULL;
3373 int idx_in = 0, idx_out = 0;
3375 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
3376 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
3378 if (type_in == 'g' || type_out == 'g')
3379 o->metadata_global_manual = 1;
3380 if (type_in == 's' || type_out == 's')
3381 o->metadata_streams_manual = 1;
3382 if (type_in == 'c' || type_out == 'c')
3383 o->metadata_chapters_manual = 1;
3385 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3386 if ((index) < 0 || (index) >= (nb_elems)) {\
3387 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
3392 #define SET_DICT(type, meta, context, index)\
3395 meta = &context->metadata;\
3398 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
3399 meta = &context->chapters[index]->metadata;\
3402 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
3403 meta = &context->programs[index]->metadata;\
3407 SET_DICT(type_in, meta_in, ic, idx_in);
3408 SET_DICT(type_out, meta_out, oc, idx_out);
3410 /* for input streams choose first matching stream */
3411 if (type_in == 's') {
3412 for (i = 0; i < ic->nb_streams; i++) {
3413 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
3414 meta_in = &ic->streams[i]->metadata;
3420 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
3425 if (type_out == 's') {
3426 for (i = 0; i < oc->nb_streams; i++) {
3427 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
3428 meta_out = &oc->streams[i]->metadata;
3429 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3434 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3439 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
3442 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
3443 struct tm time = *gmtime((time_t*)&recording_timestamp);
3444 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
3445 parse_option(o, "metadata", buf, options);
3447 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
3448 "tag instead.\n", opt);
3452 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
3454 const char *codec_string = encoder ? "encoder" : "decoder";
3458 avcodec_find_encoder_by_name(name) :
3459 avcodec_find_decoder_by_name(name);
3461 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
3464 if (codec->type != type) {
3465 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
3471 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
3473 char *codec_name = NULL;
3475 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
3477 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
3478 st->codec->codec_id = codec->id;
3481 return avcodec_find_decoder(st->codec->codec_id);
3485 * Add all the streams from the given input file to the global
3486 * list of input streams.
3488 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
3491 char *next, *codec_tag = NULL;
3493 for (i = 0; i < ic->nb_streams; i++) {
3494 AVStream *st = ic->streams[i];
3495 AVCodecContext *dec = st->codec;
3498 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3499 ist = &input_streams[nb_input_streams - 1];
3501 ist->file_index = nb_input_files;
3503 ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), ic, st);
3505 ist->ts_scale = 1.0;
3506 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
3508 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
3510 uint32_t tag = strtol(codec_tag, &next, 0);
3512 tag = AV_RL32(codec_tag);
3513 st->codec->codec_tag = tag;
3516 ist->dec = choose_decoder(o, ic, st);
3518 switch (dec->codec_type) {
3519 case AVMEDIA_TYPE_AUDIO:
3521 ist->dec = avcodec_find_decoder(dec->codec_id);
3522 if (o->audio_disable)
3523 st->discard = AVDISCARD_ALL;
3525 case AVMEDIA_TYPE_VIDEO:
3527 ist->dec = avcodec_find_decoder(dec->codec_id);
3529 dec->flags |= CODEC_FLAG_EMU_EDGE;
3532 if (o->video_disable)
3533 st->discard = AVDISCARD_ALL;
3534 else if (video_discard)
3535 st->discard = video_discard;
3537 case AVMEDIA_TYPE_DATA:
3538 if (o->data_disable)
3539 st->discard= AVDISCARD_ALL;
3541 case AVMEDIA_TYPE_SUBTITLE:
3543 ist->dec = avcodec_find_decoder(dec->codec_id);
3544 if(o->subtitle_disable)
3545 st->discard = AVDISCARD_ALL;
3547 case AVMEDIA_TYPE_ATTACHMENT:
3548 case AVMEDIA_TYPE_UNKNOWN:
3556 static void assert_file_overwrite(const char *filename)
3558 if ((!file_overwrite || no_file_overwrite) &&
3559 (strchr(filename, ':') == NULL || filename[1] == ':' ||
3560 av_strstart(filename, "file:", NULL))) {
3561 if (avio_check(filename, 0) == 0) {
3562 if (!using_stdin && (!no_file_overwrite || file_overwrite)) {
3563 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3566 signal(SIGINT, SIG_DFL);
3567 if (!read_yesno()) {
3568 av_log(0, AV_LOG_FATAL, "Not overwriting - exiting\n");
3574 av_log(0, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
3581 static void dump_attachment(AVStream *st, const char *filename)
3584 AVIOContext *out = NULL;
3585 AVDictionaryEntry *e;
3587 if (!st->codec->extradata_size) {
3588 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
3589 nb_input_files - 1, st->index);
3592 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
3593 filename = e->value;
3595 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
3596 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
3600 assert_file_overwrite(filename);
3602 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
3603 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
3608 avio_write(out, st->codec->extradata, st->codec->extradata_size);
3613 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
3615 AVFormatContext *ic;
3616 AVInputFormat *file_iformat = NULL;
3620 AVDictionary **opts;
3621 int orig_nb_streams; // number of streams before avformat_find_stream_info
3624 if (!(file_iformat = av_find_input_format(o->format))) {
3625 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
3630 if (!strcmp(filename, "-"))
3633 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3634 !strcmp(filename, "/dev/stdin");
3636 /* get default parameters from command line */
3637 ic = avformat_alloc_context();
3639 print_error(filename, AVERROR(ENOMEM));
3642 if (o->nb_audio_sample_rate) {
3643 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
3644 av_dict_set(&format_opts, "sample_rate", buf, 0);
3646 if (o->nb_audio_channels) {
3647 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
3648 av_dict_set(&format_opts, "channels", buf, 0);
3650 if (o->nb_frame_rates) {
3651 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
3653 if (o->nb_frame_sizes) {
3654 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
3656 if (o->nb_frame_pix_fmts)
3657 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
3659 ic->video_codec_id = video_codec_name ?
3660 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
3661 ic->audio_codec_id = audio_codec_name ?
3662 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
3663 ic->subtitle_codec_id= subtitle_codec_name ?
3664 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
3665 ic->flags |= AVFMT_FLAG_NONBLOCK;
3666 ic->interrupt_callback = int_cb;
3669 av_log(NULL, AV_LOG_WARNING,
3670 "-loop_input is deprecated, use -loop 1\n"
3671 "Note, both loop options only work with -f image2\n"
3673 ic->loop_input = loop_input;
3676 /* open the input file with generic avformat function */
3677 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3679 print_error(filename, err);
3682 assert_avoptions(format_opts);
3684 /* apply forced codec ids */
3685 for (i = 0; i < ic->nb_streams; i++)
3686 choose_decoder(o, ic, ic->streams[i]);
3688 /* Set AVCodecContext options for avformat_find_stream_info */
3689 opts = setup_find_stream_info_opts(ic, codec_opts);
3690 orig_nb_streams = ic->nb_streams;
3692 /* If not enough info to get the stream parameters, we decode the
3693 first frames to get it. (used in mpeg case for example) */
3694 ret = avformat_find_stream_info(ic, opts);
3696 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
3697 avformat_close_input(&ic);
3701 timestamp = o->start_time;
3702 /* add the stream start time */
3703 if (ic->start_time != AV_NOPTS_VALUE)
3704 timestamp += ic->start_time;
3706 /* if seeking requested, we execute it */
3707 if (o->start_time != 0) {
3708 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3710 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
3711 filename, (double)timestamp / AV_TIME_BASE);
3715 /* update the current parameters so that they match the one of the input stream */
3716 add_input_streams(o, ic);
3718 /* dump the file content */
3719 av_dump_format(ic, nb_input_files, filename, 0);
3721 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3722 input_files[nb_input_files - 1].ctx = ic;
3723 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3724 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3725 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3726 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
3728 for (i = 0; i < o->nb_dump_attachment; i++) {
3731 for (j = 0; j < ic->nb_streams; j++) {
3732 AVStream *st = ic->streams[j];
3734 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
3735 dump_attachment(st, o->dump_attachment[i].u.str);
3739 for (i = 0; i < orig_nb_streams; i++)
3740 av_dict_free(&opts[i]);
3743 reset_options(o, 1);
3747 static void parse_forced_key_frames(char *kf, OutputStream *ost)
3752 for (p = kf; *p; p++)
3755 ost->forced_kf_count = n;
3756 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3757 if (!ost->forced_kf_pts) {
3758 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3761 for (i = 0; i < n; i++) {
3762 p = i ? strchr(p, ',') + 1 : kf;
3763 ost->forced_kf_pts[i] = parse_time_or_die("force_key_frames", p, 1);
3767 static uint8_t *get_line(AVIOContext *s)
3773 if (avio_open_dyn_buf(&line) < 0) {
3774 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
3778 while ((c = avio_r8(s)) && c != '\n')
3781 avio_close_dyn_buf(line, &buf);
3786 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
3789 char filename[1000];
3790 const char *base[3] = { getenv("AVCONV_DATADIR"),
3795 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
3799 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
3800 i != 1 ? "" : "/.avconv", codec_name, preset_name);
3801 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3804 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
3805 i != 1 ? "" : "/.avconv", preset_name);
3806 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3812 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
3814 char *codec_name = NULL;
3816 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
3818 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
3819 NULL, ost->st->codec->codec_type);
3820 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
3821 } else if (!strcmp(codec_name, "copy"))
3822 ost->stream_copy = 1;
3824 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
3825 ost->st->codec->codec_id = ost->enc->id;
3829 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3832 AVStream *st = avformat_new_stream(oc, NULL);
3833 int idx = oc->nb_streams - 1, ret = 0;
3834 char *bsf = NULL, *next, *codec_tag = NULL;
3835 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3837 char *buf = NULL, *arg = NULL, *preset = NULL;
3838 AVIOContext *s = NULL;
3841 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3845 if (oc->nb_streams - 1 < o->nb_streamid_map)
3846 st->id = o->streamid_map[oc->nb_streams - 1];
3848 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3849 nb_output_streams + 1);
3850 ost = &output_streams[nb_output_streams - 1];
3851 ost->file_index = nb_output_files;
3854 st->codec->codec_type = type;
3855 choose_encoder(o, oc, ost);
3857 ost->opts = filter_codec_opts(codec_opts, ost->enc, oc, st);
3860 avcodec_get_context_defaults3(st->codec, ost->enc);
3861 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3863 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
3864 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
3867 if (!buf[0] || buf[0] == '#') {
3871 if (!(arg = strchr(buf, '='))) {
3872 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
3876 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
3878 } while (!s->eof_reached);
3882 av_log(NULL, AV_LOG_FATAL,
3883 "Preset %s specified for stream %d:%d, but could not be opened.\n",
3884 preset, ost->file_index, ost->index);
3888 ost->max_frames = INT64_MAX;
3889 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
3891 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3893 if (next = strchr(bsf, ','))
3895 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3896 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3900 bsfc_prev->next = bsfc;
3902 ost->bitstream_filters = bsfc;
3908 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3910 uint32_t tag = strtol(codec_tag, &next, 0);
3912 tag = AV_RL32(codec_tag);
3913 st->codec->codec_tag = tag;
3916 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3917 if (qscale >= 0 || same_quant) {
3918 st->codec->flags |= CODEC_FLAG_QSCALE;
3919 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3922 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
3923 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3925 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3929 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3932 const char *p = str;
3939 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3946 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3950 AVCodecContext *video_enc;
3952 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3954 video_enc = st->codec;
3956 if (!ost->stream_copy) {
3957 const char *p = NULL;
3958 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3959 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3960 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3963 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3964 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3965 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3969 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3970 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3971 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3975 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3976 if (frame_aspect_ratio)
3977 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3979 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3980 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3981 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3982 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3985 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3988 video_enc->gop_size = 0;
3989 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3991 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3992 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
3995 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3997 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3999 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
4000 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
4003 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
4006 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
4007 for (i = 0; p; i++) {
4009 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
4011 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
4014 /* FIXME realloc failure */
4015 video_enc->rc_override =
4016 av_realloc(video_enc->rc_override,
4017 sizeof(RcOverride) * (i + 1));
4018 video_enc->rc_override[i].start_frame = start;
4019 video_enc->rc_override[i].end_frame = end;
4021 video_enc->rc_override[i].qscale = q;
4022 video_enc->rc_override[i].quality_factor = 1.0;
4025 video_enc->rc_override[i].qscale = 0;
4026 video_enc->rc_override[i].quality_factor = -q/100.0;
4031 video_enc->rc_override_count = i;
4032 if (!video_enc->rc_initial_buffer_occupancy)
4033 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
4034 video_enc->intra_dc_precision = intra_dc_precision - 8;
4037 video_enc->flags|= CODEC_FLAG_PSNR;
4042 video_enc->flags |= CODEC_FLAG_PASS1;
4045 video_enc->flags |= CODEC_FLAG_PASS2;
4049 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
4050 if (forced_key_frames)
4051 parse_forced_key_frames(forced_key_frames, ost);
4053 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
4055 ost->top_field_first = -1;
4056 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
4059 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4061 ost->avfilter = av_strdup(filters);
4064 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
4070 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
4075 AVCodecContext *audio_enc;
4077 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
4080 audio_enc = st->codec;
4081 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
4083 if (!ost->stream_copy) {
4084 char *sample_fmt = NULL;
4086 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
4088 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
4090 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
4091 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
4095 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
4097 ost->rematrix_volume=1.0;
4098 MATCH_PER_STREAM_OPT(rematrix_volume, f, ost->rematrix_volume, oc, st);
4101 /* check for channel mapping for this audio stream */
4102 for (n = 0; n < o->nb_audio_channel_maps; n++) {
4103 AudioChannelMap *map = &o->audio_channel_maps[n];
4104 InputStream *ist = &input_streams[ost->source_index];
4105 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
4106 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
4107 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
4108 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
4109 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
4111 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
4112 ost->file_index, ost->st->index);
4119 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
4123 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
4124 if (!ost->stream_copy) {
4125 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
4132 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
4134 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
4135 ost->stream_copy = 1;
4139 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
4143 AVCodecContext *subtitle_enc;
4145 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
4147 subtitle_enc = st->codec;
4149 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
4154 /* arg format is "output-stream-index:streamid-value". */
4155 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
4161 av_strlcpy(idx_str, arg, sizeof(idx_str));
4162 p = strchr(idx_str, ':');
4164 av_log(NULL, AV_LOG_FATAL,
4165 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
4170 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
4171 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
4172 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
4176 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
4178 AVFormatContext *is = ifile->ctx;
4179 AVFormatContext *os = ofile->ctx;
4182 for (i = 0; i < is->nb_chapters; i++) {
4183 AVChapter *in_ch = is->chapters[i], *out_ch;
4184 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
4185 AV_TIME_BASE_Q, in_ch->time_base);
4186 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
4187 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
4190 if (in_ch->end < ts_off)
4192 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
4195 out_ch = av_mallocz(sizeof(AVChapter));
4197 return AVERROR(ENOMEM);
4199 out_ch->id = in_ch->id;
4200 out_ch->time_base = in_ch->time_base;
4201 out_ch->start = FFMAX(0, in_ch->start - ts_off);
4202 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
4205 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
4208 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
4210 return AVERROR(ENOMEM);
4211 os->chapters[os->nb_chapters - 1] = out_ch;
4216 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
4219 AVFormatContext *ic = avformat_alloc_context();
4221 ic->interrupt_callback = int_cb;
4222 err = avformat_open_input(&ic, filename, NULL, NULL);
4225 /* copy stream format */
4226 for(i=0;i<ic->nb_streams;i++) {
4230 AVCodecContext *avctx;
4232 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
4233 ost = new_output_stream(o, s, codec->type);
4238 // FIXME: a more elegant solution is needed
4239 memcpy(st, ic->streams[i], sizeof(AVStream));
4240 st->info = av_malloc(sizeof(*st->info));
4241 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
4243 avcodec_copy_context(st->codec, ic->streams[i]->codec);
4245 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
4246 choose_sample_fmt(st, codec);
4247 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
4248 choose_pixel_fmt(st, codec);
4251 avformat_close_input(&ic);
4255 static void opt_output_file(void *optctx, const char *filename)
4257 OptionsContext *o = optctx;
4258 AVFormatContext *oc;
4260 AVOutputFormat *file_oformat;
4264 if (!strcmp(filename, "-"))
4267 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
4269 print_error(filename, err);
4272 file_oformat= oc->oformat;
4273 oc->interrupt_callback = int_cb;
4275 if (!strcmp(file_oformat->name, "ffm") &&
4276 av_strstart(filename, "http:", NULL)) {
4278 /* special case for files sent to ffserver: we get the stream
4279 parameters from ffserver */
4280 int err = read_ffserver_streams(o, oc, filename);
4282 print_error(filename, err);
4285 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
4286 ost = &output_streams[j];
4287 for (i = 0; i < nb_input_streams; i++) {
4288 ist = &input_streams[i];
4289 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
4291 ost->source_index= i;
4297 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));
4301 } else if (!o->nb_stream_maps) {
4302 /* pick the "best" stream of each type */
4303 #define NEW_STREAM(type, index)\
4305 ost = new_ ## type ## _stream(o, oc);\
4306 ost->source_index = index;\
4307 ost->sync_ist = &input_streams[index];\
4308 input_streams[index].discard = 0;\
4311 /* video: highest resolution */
4312 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
4313 int area = 0, idx = -1;
4314 for (i = 0; i < nb_input_streams; i++) {
4315 ist = &input_streams[i];
4316 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
4317 ist->st->codec->width * ist->st->codec->height > area) {
4318 area = ist->st->codec->width * ist->st->codec->height;
4322 NEW_STREAM(video, idx);
4325 /* audio: most channels */
4326 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
4327 int channels = 0, idx = -1;
4328 for (i = 0; i < nb_input_streams; i++) {
4329 ist = &input_streams[i];
4330 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
4331 ist->st->codec->channels > channels) {
4332 channels = ist->st->codec->channels;
4336 NEW_STREAM(audio, idx);
4339 /* subtitles: pick first */
4340 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
4341 for (i = 0; i < nb_input_streams; i++)
4342 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
4343 NEW_STREAM(subtitle, i);
4347 /* do something with data? */
4349 for (i = 0; i < o->nb_stream_maps; i++) {
4350 StreamMap *map = &o->stream_maps[i];
4355 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
4356 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
4358 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
4360 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
4362 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
4365 switch (ist->st->codec->codec_type) {
4366 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
4367 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
4368 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
4369 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
4370 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
4372 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
4373 map->file_index, map->stream_index);
4377 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
4378 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
4379 map->sync_stream_index];
4384 /* handle attached files */
4385 for (i = 0; i < o->nb_attachments; i++) {
4387 uint8_t *attachment;
4391 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
4392 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
4396 if ((len = avio_size(pb)) <= 0) {
4397 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
4401 if (!(attachment = av_malloc(len))) {
4402 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
4406 avio_read(pb, attachment, len);
4408 ost = new_attachment_stream(o, oc);
4409 ost->stream_copy = 0;
4410 ost->source_index = -1;
4411 ost->attachment_filename = o->attachments[i];
4412 ost->st->codec->extradata = attachment;
4413 ost->st->codec->extradata_size = len;
4415 p = strrchr(o->attachments[i], '/');
4416 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
4420 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
4421 output_files[nb_output_files - 1].ctx = oc;
4422 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
4423 output_files[nb_output_files - 1].recording_time = o->recording_time;
4424 output_files[nb_output_files - 1].start_time = o->start_time;
4425 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
4426 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
4428 /* check filename in case of an image number is expected */
4429 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
4430 if (!av_filename_number_test(oc->filename)) {
4431 print_error(oc->filename, AVERROR(EINVAL));
4436 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
4437 /* test if it already exists to avoid losing precious files */
4438 assert_file_overwrite(filename);
4441 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
4442 &oc->interrupt_callback,
4443 &output_files[nb_output_files - 1].opts)) < 0) {
4444 print_error(filename, err);
4449 if (o->mux_preload) {
4451 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
4452 av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
4454 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
4456 if (loop_output >= 0) {
4457 av_log(NULL, AV_LOG_WARNING, "-loop_output is deprecated, use -loop\n");
4458 oc->loop_output = loop_output;
4462 for (i = 0; i < o->nb_metadata_map; i++) {
4464 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
4466 if (in_file_index < 0)
4468 if (in_file_index >= nb_input_files) {
4469 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
4472 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, input_files[in_file_index].ctx, o);
4476 if (o->chapters_input_file >= nb_input_files) {
4477 if (o->chapters_input_file == INT_MAX) {
4478 /* copy chapters from the first input file that has them*/
4479 o->chapters_input_file = -1;
4480 for (i = 0; i < nb_input_files; i++)
4481 if (input_files[i].ctx->nb_chapters) {
4482 o->chapters_input_file = i;
4486 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
4487 o->chapters_input_file);
4491 if (o->chapters_input_file >= 0)
4492 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
4493 !o->metadata_chapters_manual);
4495 /* copy global metadata by default */
4496 if (!o->metadata_global_manual && nb_input_files){
4497 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
4498 AV_DICT_DONT_OVERWRITE);
4499 if(o->recording_time != INT64_MAX)
4500 av_dict_set(&oc->metadata, "duration", NULL, 0);
4502 if (!o->metadata_streams_manual)
4503 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
4505 if (output_streams[i].source_index < 0) /* this is true e.g. for attached files */
4507 ist = &input_streams[output_streams[i].source_index];
4508 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
4511 /* process manually set metadata */
4512 for (i = 0; i < o->nb_metadata; i++) {
4515 const char *stream_spec;
4516 int index = 0, j, ret = 0;
4518 val = strchr(o->metadata[i].u.str, '=');
4520 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
4521 o->metadata[i].u.str);
4526 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
4528 for (j = 0; j < oc->nb_streams; j++) {
4529 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
4530 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
4534 printf("ret %d, stream_spec %s\n", ret, stream_spec);
4542 if (index < 0 || index >= oc->nb_chapters) {
4543 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
4546 m = &oc->chapters[index]->metadata;
4549 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
4552 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
4556 reset_options(o, 0);
4559 /* same option as mencoder */
4560 static int opt_pass(const char *opt, const char *arg)
4562 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
4566 static int64_t getutime(void)
4569 struct rusage rusage;
4571 getrusage(RUSAGE_SELF, &rusage);
4572 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4573 #elif HAVE_GETPROCESSTIMES
4575 FILETIME c, e, k, u;
4576 proc = GetCurrentProcess();
4577 GetProcessTimes(proc, &c, &e, &k, &u);
4578 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4580 return av_gettime();
4584 static int64_t getmaxrss(void)
4586 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4587 struct rusage rusage;
4588 getrusage(RUSAGE_SELF, &rusage);
4589 return (int64_t)rusage.ru_maxrss * 1024;
4590 #elif HAVE_GETPROCESSMEMORYINFO
4592 PROCESS_MEMORY_COUNTERS memcounters;
4593 proc = GetCurrentProcess();
4594 memcounters.cb = sizeof(memcounters);
4595 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4596 return memcounters.PeakPagefileUsage;
4602 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
4604 return parse_option(o, "q:a", arg, options);
4607 static void show_usage(void)
4609 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
4610 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
4611 av_log(NULL, AV_LOG_INFO, "\n");
4614 static int opt_help(const char *opt, const char *arg)
4616 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
4617 av_log_set_callback(log_callback_help);
4619 show_help_options(options, "Main options:\n",
4620 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4621 show_help_options(options, "\nAdvanced options:\n",
4622 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4624 show_help_options(options, "\nVideo options:\n",
4625 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4627 show_help_options(options, "\nAdvanced Video options:\n",
4628 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4629 OPT_VIDEO | OPT_EXPERT);
4630 show_help_options(options, "\nAudio options:\n",
4631 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4633 show_help_options(options, "\nAdvanced Audio options:\n",
4634 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4635 OPT_AUDIO | OPT_EXPERT);
4636 show_help_options(options, "\nSubtitle options:\n",
4637 OPT_SUBTITLE | OPT_GRAB,
4639 show_help_options(options, "\nAudio/Video grab options:\n",
4643 show_help_children(avcodec_get_class(), flags);
4644 show_help_children(avformat_get_class(), flags);
4645 show_help_children(sws_get_class(), flags);
4650 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
4652 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4653 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
4655 if (!strncmp(arg, "pal-", 4)) {
4658 } else if (!strncmp(arg, "ntsc-", 5)) {
4661 } else if (!strncmp(arg, "film-", 5)) {
4665 /* Try to determine PAL/NTSC by peeking in the input files */
4666 if (nb_input_files) {
4668 for (j = 0; j < nb_input_files; j++) {
4669 for (i = 0; i < input_files[j].nb_streams; i++) {
4670 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4671 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
4673 fr = c->time_base.den * 1000 / c->time_base.num;
4677 } else if ((fr == 29970) || (fr == 23976)) {
4682 if (norm != UNKNOWN)
4686 if (norm != UNKNOWN)
4687 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4690 if (norm == UNKNOWN) {
4691 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4692 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4693 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
4697 if (!strcmp(arg, "vcd")) {
4698 opt_video_codec(o, "c:v", "mpeg1video");
4699 opt_audio_codec(o, "c:a", "mp2");
4700 parse_option(o, "f", "vcd", options);
4702 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
4703 parse_option(o, "r", frame_rates[norm], options);
4704 opt_default("g", norm == PAL ? "15" : "18");
4706 opt_default("b:v", "1150000");
4707 opt_default("maxrate", "1150000");
4708 opt_default("minrate", "1150000");
4709 opt_default("bufsize", "327680"); // 40*1024*8;
4711 opt_default("b:a", "224000");
4712 parse_option(o, "ar", "44100", options);
4713 parse_option(o, "ac", "2", options);
4715 opt_default("packetsize", "2324");
4716 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4718 /* We have to offset the PTS, so that it is consistent with the SCR.
4719 SCR starts at 36000, but the first two packs contain only padding
4720 and the first pack from the other stream, respectively, may also have
4721 been written before.
4722 So the real data starts at SCR 36000+3*1200. */
4723 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
4724 } else if (!strcmp(arg, "svcd")) {
4726 opt_video_codec(o, "c:v", "mpeg2video");
4727 opt_audio_codec(o, "c:a", "mp2");
4728 parse_option(o, "f", "svcd", options);
4730 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
4731 parse_option(o, "r", frame_rates[norm], options);
4732 parse_option(o, "pix_fmt", "yuv420p", options);
4733 opt_default("g", norm == PAL ? "15" : "18");
4735 opt_default("b:v", "2040000");
4736 opt_default("maxrate", "2516000");
4737 opt_default("minrate", "0"); // 1145000;
4738 opt_default("bufsize", "1835008"); // 224*1024*8;
4739 opt_default("flags", "+scan_offset");
4742 opt_default("b:a", "224000");
4743 parse_option(o, "ar", "44100", options);
4745 opt_default("packetsize", "2324");
4747 } else if (!strcmp(arg, "dvd")) {
4749 opt_video_codec(o, "c:v", "mpeg2video");
4750 opt_audio_codec(o, "c:a", "ac3");
4751 parse_option(o, "f", "dvd", options);
4753 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4754 parse_option(o, "r", frame_rates[norm], options);
4755 parse_option(o, "pix_fmt", "yuv420p", options);
4756 opt_default("g", norm == PAL ? "15" : "18");
4758 opt_default("b:v", "6000000");
4759 opt_default("maxrate", "9000000");
4760 opt_default("minrate", "0"); // 1500000;
4761 opt_default("bufsize", "1835008"); // 224*1024*8;
4763 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4764 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4766 opt_default("b:a", "448000");
4767 parse_option(o, "ar", "48000", options);
4769 } else if (!strncmp(arg, "dv", 2)) {
4771 parse_option(o, "f", "dv", options);
4773 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4774 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4775 norm == PAL ? "yuv420p" : "yuv411p", options);
4776 parse_option(o, "r", frame_rates[norm], options);
4778 parse_option(o, "ar", "48000", options);
4779 parse_option(o, "ac", "2", options);
4782 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
4783 return AVERROR(EINVAL);
4788 static int opt_vstats_file(const char *opt, const char *arg)
4790 av_free (vstats_filename);
4791 vstats_filename = av_strdup (arg);
4795 static int opt_vstats(const char *opt, const char *arg)
4798 time_t today2 = time(NULL);
4799 struct tm *today = localtime(&today2);
4801 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4803 return opt_vstats_file(opt, filename);
4806 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4808 return parse_option(o, "frames:v", arg, options);
4811 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4813 return parse_option(o, "frames:a", arg, options);
4816 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4818 return parse_option(o, "frames:d", arg, options);
4821 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
4824 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4825 const char *codec_name = *opt == 'v' ? video_codec_name :
4826 *opt == 'a' ? audio_codec_name :
4827 subtitle_codec_name;
4829 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4830 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
4831 av_log(0, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
4833 av_log(0, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
4838 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4839 if(line[0] == '#' && !e)
4841 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4843 av_log(0, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
4846 if(!strcmp(tmp, "acodec")){
4847 opt_audio_codec(o, tmp, tmp2);
4848 }else if(!strcmp(tmp, "vcodec")){
4849 opt_video_codec(o, tmp, tmp2);
4850 }else if(!strcmp(tmp, "scodec")){
4851 opt_subtitle_codec(o, tmp, tmp2);
4852 }else if(!strcmp(tmp, "dcodec")){
4853 opt_data_codec(o, tmp, tmp2);
4854 }else if(opt_default(tmp, tmp2) < 0){
4855 av_log(0, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4865 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
4869 static int opt_passlogfile(const char *opt, const char *arg)
4871 pass_logfilename_prefix = arg;
4872 #if CONFIG_LIBX264_ENCODER
4873 return opt_default("passlogfile", arg);
4879 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
4881 char *s = av_asprintf("%s:%c", opt + 1, *opt);
4882 int ret = parse_option(o, s, arg, options);
4887 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
4889 if(!strcmp(opt, "b")){
4890 av_log(0,AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
4891 return parse_option(o, "b:v", arg, options);
4893 return opt_default(opt, arg);
4896 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4898 return parse_option(o, "filter:v", arg, options);
4901 static int opt_vsync(const char *opt, const char *arg)
4903 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
4904 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
4905 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
4907 if (video_sync_method == VSYNC_AUTO)
4908 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
4912 #define OFFSET(x) offsetof(OptionsContext, x)
4913 static const OptionDef options[] = {
4915 #include "cmdutils_common_opts.h"
4916 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4917 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4918 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4919 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
4920 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4921 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4922 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
4923 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
4924 { "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]" },
4925 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
4926 "outfile[,metadata]:infile[,metadata]" },
4927 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4928 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4929 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4930 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4931 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4932 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4933 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4934 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4935 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4936 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4937 "add timings for benchmarking" },
4938 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4939 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4940 "dump each input packet" },
4941 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4942 "when dumping packets, also dump the payload" },
4943 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4944 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "deprecated, use -loop" },
4945 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "deprecated, use -loop", "" },
4946 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4947 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
4948 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4949 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4950 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4951 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying", "source" },
4952 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4953 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4954 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4955 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
4956 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4957 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4958 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4959 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4961 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4963 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
4964 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
4965 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
4968 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4969 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4970 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4971 { "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" },
4972 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4973 { "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" },
4974 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4975 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4976 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4977 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4978 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4979 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4980 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4981 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4982 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4983 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4984 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4985 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4986 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4987 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4988 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4989 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4990 "use same quantizer as source (implies VBR)" },
4991 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4992 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4993 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4994 "deinterlace pictures" },
4995 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4996 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4997 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4999 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
5001 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
5002 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
5003 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
5004 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
5005 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
5006 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
5007 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
5008 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
5009 { "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" },
5010 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
5013 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
5014 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
5015 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
5016 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
5017 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
5018 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
5019 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
5020 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
5021 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
5022 { "rmvol", HAS_ARG | OPT_AUDIO | OPT_FLOAT | OPT_SPEC, {.off = OFFSET(rematrix_volume)}, "rematrix volume (as factor)", "volume" },
5024 /* subtitle options */
5025 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
5026 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
5027 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
5030 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
5031 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
5032 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
5035 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
5036 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
5038 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
5039 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
5040 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
5042 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
5043 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
5044 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
5045 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
5046 /* data codec support */
5047 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
5048 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
5050 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
5054 int main(int argc, char **argv)
5056 OptionsContext o = { 0 };
5059 reset_options(&o, 0);
5061 av_log_set_flags(AV_LOG_SKIP_REPEATED);
5062 parse_loglevel(argc, argv, options);
5064 if(argc>1 && !strcmp(argv[1], "-d")){
5066 av_log_set_callback(log_callback_null);
5071 avcodec_register_all();
5073 avdevice_register_all();
5076 avfilter_register_all();
5079 avformat_network_init();
5081 show_banner(argc, argv, options);
5086 parse_options(&o, argc, argv, options, opt_output_file);
5088 if (nb_output_files <= 0 && nb_input_files == 0) {
5090 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
5094 /* file converter / grab */
5095 if (nb_output_files <= 0) {
5096 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
5100 if (nb_input_files == 0) {
5101 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
5106 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
5108 ti = getutime() - ti;
5110 int maxrss = getmaxrss() / 1024;
5111 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);