3 * Copyright (c) 2000-2011 The libav developers.
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/dict.h"
43 #include "libavutil/mathematics.h"
44 #include "libavutil/pixdesc.h"
45 #include "libavutil/avstring.h"
46 #include "libavutil/libm.h"
47 #include "libavformat/os_support.h"
50 # include "libavfilter/avfilter.h"
51 # include "libavfilter/avfiltergraph.h"
52 # include "libavfilter/vsrc_buffer.h"
55 #if HAVE_SYS_RESOURCE_H
56 #include <sys/types.h>
58 #include <sys/resource.h>
59 #elif HAVE_GETPROCESSTIMES
62 #if HAVE_GETPROCESSMEMORYINFO
68 #include <sys/select.h>
75 #include "libavutil/avassert.h"
77 const char program_name[] = "avconv";
78 const int program_birth_year = 2000;
80 /* select an input stream for an output stream */
81 typedef struct StreamMap {
82 int disabled; /** 1 is this mapping is disabled by a negative map */
86 int sync_stream_index;
90 * select an input file for an output file
92 typedef struct MetadataMap {
93 int file; ///< file index
94 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
95 int index; ///< stream/chapter/program number
98 static const OptionDef options[];
100 /* indexed by output file stream index */
101 static int *streamid_map = NULL;
102 static int nb_streamid_map = 0;
104 static int frame_width = 0;
105 static int frame_height = 0;
106 static float frame_aspect_ratio = 0;
107 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
108 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
109 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
110 static AVRational frame_rate;
111 static float video_qscale = 0;
112 static uint16_t *intra_matrix = NULL;
113 static uint16_t *inter_matrix = NULL;
114 static const char *video_rc_override_string=NULL;
115 static int video_disable = 0;
116 static int video_discard = 0;
117 static unsigned int video_codec_tag = 0;
118 static char *video_language = NULL;
119 static int same_quant = 0;
120 static int do_deinterlace = 0;
121 static int top_field_first = -1;
122 static int me_threshold = 0;
123 static int intra_dc_precision = 8;
124 static int qp_hist = 0;
126 static char *vfilters = NULL;
129 static int audio_sample_rate = 0;
130 #define QSCALE_NONE -99999
131 static float audio_qscale = QSCALE_NONE;
132 static int audio_disable = 0;
133 static int audio_channels = 0;
134 static unsigned int audio_codec_tag = 0;
135 static char *audio_language = NULL;
137 static int subtitle_disable = 0;
138 static char *subtitle_language = NULL;
139 static unsigned int subtitle_codec_tag = 0;
141 static int data_disable = 0;
142 static unsigned int data_codec_tag = 0;
144 static float mux_preload= 0.5;
145 static float mux_max_delay= 0.7;
147 static int file_overwrite = 0;
148 static AVDictionary *metadata;
149 static int do_benchmark = 0;
150 static int do_hex_dump = 0;
151 static int do_pkt_dump = 0;
152 static int do_psnr = 0;
153 static int do_pass = 0;
154 static char *pass_logfilename_prefix = NULL;
155 static int video_sync_method= -1;
156 static int audio_sync_method= 0;
157 static float audio_drift_threshold= 0.1;
158 static int copy_ts= 0;
160 static int opt_shortest = 0;
161 static char *vstats_filename;
162 static FILE *vstats_file;
163 static int opt_programid = 0;
164 static int copy_initial_nonkeyframes = 0;
166 static int rate_emu = 0;
168 static int audio_volume = 256;
170 static int exit_on_error = 0;
171 static int using_stdin = 0;
172 static int verbose = 1;
173 static int64_t video_size = 0;
174 static int64_t audio_size = 0;
175 static int64_t extra_size = 0;
176 static int nb_frames_dup = 0;
177 static int nb_frames_drop = 0;
178 static int input_sync;
179 static int force_fps = 0;
180 static char *forced_key_frames = NULL;
182 static float dts_delta_threshold = 10;
184 static uint8_t *audio_buf;
185 static uint8_t *audio_out;
186 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
188 static short *samples;
190 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
191 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
192 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
194 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
196 typedef struct InputStream {
199 int discard; /* true if stream data should be discarded */
200 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
203 int64_t start; /* time when read started */
204 int64_t next_pts; /* synthetic pts for cases where pkt.pts
206 int64_t pts; /* current pts */
207 PtsCorrectionContext pts_ctx;
209 int is_start; /* is 1 at the start and after a discontinuity */
210 int showed_multi_packet_warning;
214 typedef struct InputFile {
215 AVFormatContext *ctx;
216 int eof_reached; /* true if eof reached */
217 int ist_index; /* index of first stream in ist_table */
218 int buffer_size; /* current total buffer size */
220 int nb_streams; /* number of stream that avconv is aware of; may be different
221 from ctx.nb_streams if new streams appear during av_read_frame() */
224 typedef struct OutputStream {
225 int file_index; /* file index */
226 int index; /* stream index in the output file */
227 int source_index; /* InputStream index */
228 AVStream *st; /* stream in the output file */
229 int encoding_needed; /* true if encoding needed for this stream */
231 /* input pts and corresponding output pts
233 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
234 struct InputStream *sync_ist; /* input stream to sync against */
235 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
236 AVBitStreamFilterContext *bitstream_filters;
241 AVFrame pict_tmp; /* temporary image for resampling */
242 struct SwsContext *img_resample_ctx; /* for image resampling */
245 int resample_pix_fmt;
246 AVRational frame_rate;
248 float frame_aspect_ratio;
250 /* forced key frames */
251 int64_t *forced_kf_pts;
257 ReSampleContext *resample; /* for audio resampling */
258 int resample_sample_fmt;
259 int resample_channels;
260 int resample_sample_rate;
262 AVAudioConvert *reformat_ctx;
263 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
267 AVFilterContext *output_video_filter;
268 AVFilterContext *input_video_filter;
269 AVFilterBufferRef *picref;
271 AVFilterGraph *graph;
276 int is_past_recording_time;
280 typedef struct OutputFile {
281 AVFormatContext *ctx;
283 int ost_index; /* index of the first stream in output_streams */
284 int64_t recording_time; /* desired length of the resulting file in microseconds */
285 int64_t start_time; /* start time in microseconds */
286 uint64_t limit_filesize;
289 static InputStream *input_streams = NULL;
290 static int nb_input_streams = 0;
291 static InputFile *input_files = NULL;
292 static int nb_input_files = 0;
294 static OutputStream *output_streams = NULL;
295 static int nb_output_streams = 0;
296 static OutputFile *output_files = NULL;
297 static int nb_output_files = 0;
299 typedef struct OptionsContext {
300 /* input/output options */
304 SpecifierOpt *codec_names;
308 int64_t input_ts_offset;
310 SpecifierOpt *ts_scale;
314 StreamMap *stream_maps;
316 /* first item specifies output metadata, second is input */
317 MetadataMap (*meta_data_maps)[2];
318 int nb_meta_data_maps;
319 int metadata_global_manual;
320 int metadata_streams_manual;
321 int metadata_chapters_manual;
323 int chapters_input_file;
325 int64_t recording_time;
326 uint64_t limit_filesize;
329 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
332 for (i = 0; i < o->nb_ ## name; i++) {\
333 char *spec = o->name[i].specifier;\
334 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
335 outvar = o->name[i].u.type;\
341 static void reset_options(OptionsContext *o)
343 const OptionDef *po = options;
345 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
347 void *dst = (uint8_t*)o + po->u.off;
349 if (po->flags & OPT_SPEC) {
350 SpecifierOpt **so = dst;
351 int i, *count = (int*)(so + 1);
352 for (i = 0; i < *count; i++) {
353 av_freep(&(*so)[i].specifier);
354 if (po->flags & OPT_STRING)
355 av_freep(&(*so)[i].u.str);
359 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
364 av_freep(&o->stream_maps);
365 av_freep(&o->meta_data_maps);
367 memset(o, 0, sizeof(*o));
369 o->recording_time = INT64_MAX;
370 o->limit_filesize = UINT64_MAX;
371 o->chapters_input_file = INT_MAX;
379 static int configure_video_filters(InputStream *ist, OutputStream *ost)
381 AVFilterContext *last_filter, *filter;
382 /** filter graph containing all filters including input & output */
383 AVCodecContext *codec = ost->st->codec;
384 AVCodecContext *icodec = ist->st->codec;
385 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
386 AVRational sample_aspect_ratio;
390 ost->graph = avfilter_graph_alloc();
392 if (ist->st->sample_aspect_ratio.num){
393 sample_aspect_ratio = ist->st->sample_aspect_ratio;
395 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
397 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
398 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
399 sample_aspect_ratio.num, sample_aspect_ratio.den);
401 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
402 "src", args, NULL, ost->graph);
405 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
406 "out", NULL, &ffsink_ctx, ost->graph);
409 last_filter = ost->input_video_filter;
411 if (codec->width != icodec->width || codec->height != icodec->height) {
412 snprintf(args, 255, "%d:%d:flags=0x%X",
416 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
417 NULL, args, NULL, ost->graph)) < 0)
419 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
421 last_filter = filter;
424 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
425 ost->graph->scale_sws_opts = av_strdup(args);
428 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
429 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
431 outputs->name = av_strdup("in");
432 outputs->filter_ctx = last_filter;
433 outputs->pad_idx = 0;
434 outputs->next = NULL;
436 inputs->name = av_strdup("out");
437 inputs->filter_ctx = ost->output_video_filter;
441 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
443 av_freep(&ost->avfilter);
445 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
449 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
452 codec->width = ost->output_video_filter->inputs[0]->w;
453 codec->height = ost->output_video_filter->inputs[0]->h;
454 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
455 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
456 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
457 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
461 #endif /* CONFIG_AVFILTER */
463 static void term_exit(void)
465 av_log(NULL, AV_LOG_QUIET, "");
468 static volatile int received_sigterm = 0;
469 static volatile int received_nb_signals = 0;
472 sigterm_handler(int sig)
474 received_sigterm = sig;
475 received_nb_signals++;
479 static void term_init(void)
481 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
482 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
484 signal(SIGXCPU, sigterm_handler);
488 static int decode_interrupt_cb(void)
490 return received_nb_signals > 1;
493 void exit_program(int ret)
498 for(i=0;i<nb_output_files;i++) {
499 AVFormatContext *s = output_files[i].ctx;
500 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
502 avformat_free_context(s);
503 av_dict_free(&output_files[i].opts);
505 for(i=0;i<nb_input_files;i++) {
506 av_close_input_file(input_files[i].ctx);
508 for (i = 0; i < nb_input_streams; i++)
509 av_dict_free(&input_streams[i].opts);
511 av_free(intra_matrix);
512 av_free(inter_matrix);
516 av_free(vstats_filename);
518 av_freep(&input_streams);
519 av_freep(&input_files);
520 av_freep(&output_streams);
521 av_freep(&output_files);
526 allocated_audio_buf_size= allocated_audio_out_size= 0;
533 if (received_sigterm) {
535 "Received signal %d: terminating.\n",
536 (int) received_sigterm);
540 exit(ret); /* not all OS-es handle main() return value */
543 static void assert_avoptions(AVDictionary *m)
545 AVDictionaryEntry *t;
546 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
547 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
552 static void assert_codec_experimental(AVCodecContext *c, int encoder)
554 const char *codec_string = encoder ? "encoder" : "decoder";
556 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
557 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
558 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
559 "results.\nAdd '-strict experimental' if you want to use it.\n",
560 codec_string, c->codec->name);
561 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
562 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
563 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
564 codec_string, codec->name);
569 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
571 if(codec && codec->sample_fmts){
572 const enum AVSampleFormat *p= codec->sample_fmts;
574 if(*p == st->codec->sample_fmt)
578 av_log(NULL, AV_LOG_WARNING,
579 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
580 av_get_sample_fmt_name(st->codec->sample_fmt),
582 av_get_sample_fmt_name(codec->sample_fmts[0]));
583 st->codec->sample_fmt = codec->sample_fmts[0];
589 * Update the requested input sample format based on the output sample format.
590 * This is currently only used to request float output from decoders which
591 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
592 * Ideally this will be removed in the future when decoders do not do format
593 * conversion and only output in their native format.
595 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
598 /* if sample formats match or a decoder sample format has already been
599 requested, just return */
600 if (enc->sample_fmt == dec->sample_fmt ||
601 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
604 /* if decoder supports more than one output format */
605 if (dec_codec && dec_codec->sample_fmts &&
606 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
607 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
608 const enum AVSampleFormat *p;
609 int min_dec = -1, min_inc = -1;
611 /* find a matching sample format in the encoder */
612 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
613 if (*p == enc->sample_fmt) {
614 dec->request_sample_fmt = *p;
616 } else if (*p > enc->sample_fmt) {
617 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
619 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
622 /* if none match, provide the one that matches quality closest */
623 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
624 enc->sample_fmt - min_dec;
628 static void choose_sample_rate(AVStream *st, AVCodec *codec)
630 if(codec && codec->supported_samplerates){
631 const int *p= codec->supported_samplerates;
633 int best_dist=INT_MAX;
635 int dist= abs(st->codec->sample_rate - *p);
636 if(dist < best_dist){
642 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
644 st->codec->sample_rate= best;
648 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
650 if(codec && codec->pix_fmts){
651 const enum PixelFormat *p= codec->pix_fmts;
652 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
653 if(st->codec->codec_id==CODEC_ID_MJPEG){
654 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
655 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
656 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE};
660 if(*p == st->codec->pix_fmt)
664 if(st->codec->pix_fmt != PIX_FMT_NONE)
665 av_log(NULL, AV_LOG_WARNING,
666 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
667 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
669 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
670 st->codec->pix_fmt = codec->pix_fmts[0];
676 get_sync_ipts(const OutputStream *ost)
678 const InputStream *ist = ost->sync_ist;
679 OutputFile *of = &output_files[ost->file_index];
680 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
683 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
687 AVPacket new_pkt= *pkt;
688 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
689 &new_pkt.data, &new_pkt.size,
690 pkt->data, pkt->size,
691 pkt->flags & AV_PKT_FLAG_KEY);
694 new_pkt.destruct= av_destruct_packet;
696 fprintf(stderr, "%s failed for stream %d, codec %s",
697 bsfc->filter->name, pkt->stream_index,
698 avctx->codec ? avctx->codec->name : "copy");
708 ret= av_interleaved_write_frame(s, pkt);
710 print_error("av_interleaved_write_frame()", ret);
715 static void do_audio_out(AVFormatContext *s,
718 unsigned char *buf, int size)
721 int64_t audio_out_size, audio_buf_size;
722 int64_t allocated_for_size= size;
724 int size_out, frame_bytes, ret, resample_changed;
725 AVCodecContext *enc= ost->st->codec;
726 AVCodecContext *dec= ist->st->codec;
727 int osize = av_get_bytes_per_sample(enc->sample_fmt);
728 int isize = av_get_bytes_per_sample(dec->sample_fmt);
729 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
732 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
733 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
734 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
735 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
736 audio_buf_size*= osize*enc->channels;
738 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
739 if(coded_bps > 8*osize)
740 audio_out_size= audio_out_size * coded_bps / (8*osize);
741 audio_out_size += FF_MIN_BUFFER_SIZE;
743 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
744 fprintf(stderr, "Buffer sizes too large\n");
748 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
749 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
750 if (!audio_buf || !audio_out){
751 fprintf(stderr, "Out of memory in do_audio_out\n");
755 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
756 ost->audio_resample = 1;
758 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
759 ost->resample_channels != dec->channels ||
760 ost->resample_sample_rate != dec->sample_rate;
762 if ((ost->audio_resample && !ost->resample) || resample_changed) {
763 if (resample_changed) {
764 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",
765 ist->file_index, ist->st->index,
766 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
767 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
768 ost->resample_sample_fmt = dec->sample_fmt;
769 ost->resample_channels = dec->channels;
770 ost->resample_sample_rate = dec->sample_rate;
772 audio_resample_close(ost->resample);
774 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
775 if (audio_sync_method <= 1 &&
776 ost->resample_sample_fmt == enc->sample_fmt &&
777 ost->resample_channels == enc->channels &&
778 ost->resample_sample_rate == enc->sample_rate) {
779 ost->resample = NULL;
780 ost->audio_resample = 0;
781 } else if (ost->audio_resample) {
782 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
783 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
784 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
785 enc->sample_rate, dec->sample_rate,
786 enc->sample_fmt, dec->sample_fmt,
788 if (!ost->resample) {
789 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
790 dec->channels, dec->sample_rate,
791 enc->channels, enc->sample_rate);
797 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
798 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
799 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
800 if (ost->reformat_ctx)
801 av_audio_convert_free(ost->reformat_ctx);
802 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
803 dec->sample_fmt, 1, NULL, 0);
804 if (!ost->reformat_ctx) {
805 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
806 av_get_sample_fmt_name(dec->sample_fmt),
807 av_get_sample_fmt_name(enc->sample_fmt));
810 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
813 if(audio_sync_method){
814 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
815 - av_fifo_size(ost->fifo)/(enc->channels * 2);
816 double idelta= delta*dec->sample_rate / enc->sample_rate;
817 int byte_delta= ((int)idelta)*2*dec->channels;
819 //FIXME resample delay
820 if(fabs(delta) > 50){
821 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
823 byte_delta= FFMAX(byte_delta, -size);
827 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
832 static uint8_t *input_tmp= NULL;
833 input_tmp= av_realloc(input_tmp, byte_delta + size);
835 if(byte_delta > allocated_for_size - size){
836 allocated_for_size= byte_delta + (int64_t)size;
841 memset(input_tmp, 0, byte_delta);
842 memcpy(input_tmp + byte_delta, buf, size);
846 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
848 }else if(audio_sync_method>1){
849 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
850 av_assert0(ost->audio_resample);
852 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
853 // 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));
854 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
858 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
859 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
861 if (ost->audio_resample) {
863 size_out = audio_resample(ost->resample,
864 (short *)buftmp, (short *)buf,
865 size / (dec->channels * isize));
866 size_out = size_out * enc->channels * osize;
872 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
873 const void *ibuf[6]= {buftmp};
874 void *obuf[6]= {audio_buf};
875 int istride[6]= {isize};
876 int ostride[6]= {osize};
877 int len= size_out/istride[0];
878 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
879 printf("av_audio_convert() failed\n");
885 size_out = len*osize;
888 /* now encode as many frames as possible */
889 if (enc->frame_size > 1) {
890 /* output resampled raw samples */
891 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
892 fprintf(stderr, "av_fifo_realloc2() failed\n");
895 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
897 frame_bytes = enc->frame_size * osize * enc->channels;
899 while (av_fifo_size(ost->fifo) >= frame_bytes) {
901 av_init_packet(&pkt);
903 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
905 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
907 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
910 fprintf(stderr, "Audio encoding failed\n");
914 pkt.stream_index= ost->index;
917 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
918 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
919 pkt.flags |= AV_PKT_FLAG_KEY;
920 write_frame(s, &pkt, enc, ost->bitstream_filters);
922 ost->sync_opts += enc->frame_size;
926 av_init_packet(&pkt);
928 ost->sync_opts += size_out / (osize * enc->channels);
930 /* output a pcm frame */
931 /* determine the size of the coded buffer */
934 size_out = size_out*coded_bps/8;
936 if(size_out > audio_out_size){
937 fprintf(stderr, "Internal error, buffer size too small\n");
941 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
942 ret = avcodec_encode_audio(enc, audio_out, size_out,
945 fprintf(stderr, "Audio encoding failed\n");
949 pkt.stream_index= ost->index;
952 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
953 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
954 pkt.flags |= AV_PKT_FLAG_KEY;
955 write_frame(s, &pkt, enc, ost->bitstream_filters);
959 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
963 AVPicture picture_tmp;
966 dec = ist->st->codec;
968 /* deinterlace : must be done before any resize */
969 if (do_deinterlace) {
972 /* create temporary picture */
973 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
974 buf = av_malloc(size);
978 picture2 = &picture_tmp;
979 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
981 if(avpicture_deinterlace(picture2, picture,
982 dec->pix_fmt, dec->width, dec->height) < 0) {
983 /* if error, do not deinterlace */
984 fprintf(stderr, "Deinterlacing failed\n");
993 if (picture != picture2)
994 *picture = *picture2;
998 static void do_subtitle_out(AVFormatContext *s,
1004 static uint8_t *subtitle_out = NULL;
1005 int subtitle_out_max_size = 1024 * 1024;
1006 int subtitle_out_size, nb, i;
1007 AVCodecContext *enc;
1010 if (pts == AV_NOPTS_VALUE) {
1011 fprintf(stderr, "Subtitle packets must have a pts\n");
1017 enc = ost->st->codec;
1019 if (!subtitle_out) {
1020 subtitle_out = av_malloc(subtitle_out_max_size);
1023 /* Note: DVB subtitle need one packet to draw them and one other
1024 packet to clear them */
1025 /* XXX: signal it in the codec context ? */
1026 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1031 for(i = 0; i < nb; i++) {
1032 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1033 // start_display_time is required to be 0
1034 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1035 sub->end_display_time -= sub->start_display_time;
1036 sub->start_display_time = 0;
1037 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1038 subtitle_out_max_size, sub);
1039 if (subtitle_out_size < 0) {
1040 fprintf(stderr, "Subtitle encoding failed\n");
1044 av_init_packet(&pkt);
1045 pkt.stream_index = ost->index;
1046 pkt.data = subtitle_out;
1047 pkt.size = subtitle_out_size;
1048 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1049 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1050 /* XXX: the pts correction is handled here. Maybe handling
1051 it in the codec would be better */
1053 pkt.pts += 90 * sub->start_display_time;
1055 pkt.pts += 90 * sub->end_display_time;
1057 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1061 static int bit_buffer_size= 1024*256;
1062 static uint8_t *bit_buffer= NULL;
1064 static void do_video_resample(OutputStream *ost,
1066 AVFrame *in_picture,
1067 AVFrame **out_picture)
1069 int resample_changed = 0;
1070 AVCodecContext *dec = ist->st->codec;
1071 *out_picture = in_picture;
1073 resample_changed = ost->resample_width != dec->width ||
1074 ost->resample_height != dec->height ||
1075 ost->resample_pix_fmt != dec->pix_fmt;
1077 if (resample_changed) {
1078 av_log(NULL, AV_LOG_INFO,
1079 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1080 ist->file_index, ist->st->index,
1081 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1082 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1083 if(!ost->video_resample)
1084 ost->video_resample = 1;
1087 #if !CONFIG_AVFILTER
1088 if (ost->video_resample) {
1089 *out_picture = &ost->pict_tmp;
1090 if (resample_changed) {
1091 /* initialize a new scaler context */
1092 sws_freeContext(ost->img_resample_ctx);
1093 ost->img_resample_ctx = sws_getContext(
1094 ist->st->codec->width,
1095 ist->st->codec->height,
1096 ist->st->codec->pix_fmt,
1097 ost->st->codec->width,
1098 ost->st->codec->height,
1099 ost->st->codec->pix_fmt,
1100 ost->sws_flags, NULL, NULL, NULL);
1101 if (ost->img_resample_ctx == NULL) {
1102 fprintf(stderr, "Cannot get resampling context\n");
1106 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1107 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1110 if (resample_changed) {
1111 avfilter_graph_free(&ost->graph);
1112 if (configure_video_filters(ist, ost)) {
1113 fprintf(stderr, "Error reinitializing filters!\n");
1118 if (resample_changed) {
1119 ost->resample_width = dec->width;
1120 ost->resample_height = dec->height;
1121 ost->resample_pix_fmt = dec->pix_fmt;
1126 static void do_video_out(AVFormatContext *s,
1129 AVFrame *in_picture,
1130 int *frame_size, float quality)
1132 int nb_frames, i, ret, format_video_sync;
1133 AVFrame *final_picture;
1134 AVCodecContext *enc;
1137 enc = ost->st->codec;
1139 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1141 /* by default, we output a single frame */
1146 format_video_sync = video_sync_method;
1147 if (format_video_sync < 0)
1148 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1150 if (format_video_sync) {
1151 double vdelta = sync_ipts - ost->sync_opts;
1152 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1155 else if (format_video_sync == 2) {
1158 }else if(vdelta>0.6)
1159 ost->sync_opts= lrintf(sync_ipts);
1160 }else if (vdelta > 1.1)
1161 nb_frames = lrintf(vdelta);
1162 //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);
1163 if (nb_frames == 0){
1166 fprintf(stderr, "*** drop!\n");
1167 }else if (nb_frames > 1) {
1168 nb_frames_dup += nb_frames - 1;
1170 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1173 ost->sync_opts= lrintf(sync_ipts);
1175 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1179 do_video_resample(ost, ist, in_picture, &final_picture);
1181 /* duplicates frame if needed */
1182 for(i=0;i<nb_frames;i++) {
1184 av_init_packet(&pkt);
1185 pkt.stream_index= ost->index;
1187 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1188 /* raw pictures are written as AVPicture structure to
1189 avoid any copies. We support temporarily the older
1191 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1192 enc->coded_frame->top_field_first = in_picture->top_field_first;
1193 pkt.data= (uint8_t *)final_picture;
1194 pkt.size= sizeof(AVPicture);
1195 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1196 pkt.flags |= AV_PKT_FLAG_KEY;
1198 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1200 AVFrame big_picture;
1202 big_picture= *final_picture;
1203 /* better than nothing: use input picture interlaced
1205 big_picture.interlaced_frame = in_picture->interlaced_frame;
1206 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1207 if(top_field_first == -1)
1208 big_picture.top_field_first = in_picture->top_field_first;
1210 big_picture.top_field_first = top_field_first;
1213 /* handles same_quant here. This is not correct because it may
1214 not be a global option */
1215 big_picture.quality = quality;
1217 big_picture.pict_type = 0;
1218 // big_picture.pts = AV_NOPTS_VALUE;
1219 big_picture.pts= ost->sync_opts;
1220 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1221 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1222 if (ost->forced_kf_index < ost->forced_kf_count &&
1223 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1224 big_picture.pict_type = AV_PICTURE_TYPE_I;
1225 ost->forced_kf_index++;
1227 ret = avcodec_encode_video(enc,
1228 bit_buffer, bit_buffer_size,
1231 fprintf(stderr, "Video encoding failed\n");
1236 pkt.data= bit_buffer;
1238 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1239 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1240 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1241 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1242 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1244 if(enc->coded_frame->key_frame)
1245 pkt.flags |= AV_PKT_FLAG_KEY;
1246 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1249 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1250 // enc->frame_number-1, ret, enc->pict_type);
1251 /* if two pass, output log */
1252 if (ost->logfile && enc->stats_out) {
1253 fprintf(ost->logfile, "%s", enc->stats_out);
1258 ost->frame_number++;
1262 static double psnr(double d){
1263 return -10.0*log(d)/log(10.0);
1266 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1269 AVCodecContext *enc;
1271 double ti1, bitrate, avg_bitrate;
1273 /* this is executed just the first time do_video_stats is called */
1275 vstats_file = fopen(vstats_filename, "w");
1282 enc = ost->st->codec;
1283 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1284 frame_number = ost->frame_number;
1285 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1286 if (enc->flags&CODEC_FLAG_PSNR)
1287 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1289 fprintf(vstats_file,"f_size= %6d ", frame_size);
1290 /* compute pts value */
1291 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1295 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1296 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1297 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1298 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1299 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1303 static void print_report(OutputFile *output_files,
1304 OutputStream *ost_table, int nb_ostreams,
1305 int is_last_report, int64_t timer_start)
1309 AVFormatContext *oc;
1311 AVCodecContext *enc;
1312 int frame_number, vid, i;
1313 double bitrate, ti1, pts;
1314 static int64_t last_time = -1;
1315 static int qp_histogram[52];
1317 if (!is_last_report) {
1319 /* display the report every 0.5 seconds */
1320 cur_time = av_gettime();
1321 if (last_time == -1) {
1322 last_time = cur_time;
1325 if ((cur_time - last_time) < 500000)
1327 last_time = cur_time;
1331 oc = output_files[0].ctx;
1333 total_size = avio_size(oc->pb);
1334 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1335 total_size= avio_tell(oc->pb);
1340 for(i=0;i<nb_ostreams;i++) {
1342 ost = &ost_table[i];
1343 enc = ost->st->codec;
1344 if (!ost->st->stream_copy && enc->coded_frame)
1345 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1346 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1347 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1349 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1350 float t = (av_gettime()-timer_start) / 1000000.0;
1352 frame_number = ost->frame_number;
1353 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1354 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1356 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1360 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1363 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1365 if (enc->flags&CODEC_FLAG_PSNR){
1367 double error, error_sum=0;
1368 double scale, scale_sum=0;
1369 char type[3]= {'Y','U','V'};
1370 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1373 error= enc->error[j];
1374 scale= enc->width*enc->height*255.0*255.0*frame_number;
1376 error= enc->coded_frame->error[j];
1377 scale= enc->width*enc->height*255.0*255.0;
1382 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1384 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1388 /* compute min output value */
1389 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1390 if ((pts < ti1) && (pts > 0))
1396 if (verbose > 0 || is_last_report) {
1397 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1399 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1400 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1401 (double)total_size / 1024, ti1, bitrate);
1403 if (nb_frames_dup || nb_frames_drop)
1404 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1405 nb_frames_dup, nb_frames_drop);
1408 fprintf(stderr, "%s \r", buf);
1413 if (is_last_report && verbose >= 0){
1414 int64_t raw= audio_size + video_size + extra_size;
1415 fprintf(stderr, "\n");
1416 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1420 100.0*(total_size - raw)/raw
1425 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1427 int fill_char = 0x00;
1428 if (sample_fmt == AV_SAMPLE_FMT_U8)
1430 memset(buf, fill_char, size);
1433 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1437 for (i = 0; i < nb_ostreams; i++) {
1438 OutputStream *ost = &ost_table[i];
1439 AVCodecContext *enc = ost->st->codec;
1440 AVFormatContext *os = output_files[ost->file_index].ctx;
1442 if (!ost->encoding_needed)
1445 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1447 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1453 av_init_packet(&pkt);
1454 pkt.stream_index= ost->index;
1456 switch (ost->st->codec->codec_type) {
1457 case AVMEDIA_TYPE_AUDIO:
1458 fifo_bytes = av_fifo_size(ost->fifo);
1460 /* encode any samples remaining in fifo */
1461 if (fifo_bytes > 0) {
1462 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1463 int fs_tmp = enc->frame_size;
1465 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1466 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1467 enc->frame_size = fifo_bytes / (osize * enc->channels);
1469 int frame_bytes = enc->frame_size*osize*enc->channels;
1470 if (allocated_audio_buf_size < frame_bytes)
1472 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1475 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1476 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1477 ost->st->time_base.num, enc->sample_rate);
1478 enc->frame_size = fs_tmp;
1481 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1484 fprintf(stderr, "Audio encoding failed\n");
1488 pkt.flags |= AV_PKT_FLAG_KEY;
1490 case AVMEDIA_TYPE_VIDEO:
1491 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1493 fprintf(stderr, "Video encoding failed\n");
1497 if(enc->coded_frame && enc->coded_frame->key_frame)
1498 pkt.flags |= AV_PKT_FLAG_KEY;
1499 if (ost->logfile && enc->stats_out) {
1500 fprintf(ost->logfile, "%s", enc->stats_out);
1509 pkt.data = bit_buffer;
1511 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1512 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1513 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1518 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1519 static int output_packet(InputStream *ist, int ist_index,
1520 OutputStream *ost_table, int nb_ostreams,
1521 const AVPacket *pkt)
1523 AVFormatContext *os;
1528 void *buffer_to_free = NULL;
1529 static unsigned int samples_size= 0;
1530 AVSubtitle subtitle, *subtitle_to_free;
1531 int64_t pkt_pts = AV_NOPTS_VALUE;
1533 int frame_available;
1538 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1540 if(ist->next_pts == AV_NOPTS_VALUE)
1541 ist->next_pts= ist->pts;
1545 av_init_packet(&avpkt);
1553 if(pkt->dts != AV_NOPTS_VALUE)
1554 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1555 if(pkt->pts != AV_NOPTS_VALUE)
1556 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1558 //while we have more to decode or while the decoder did output something on EOF
1559 while (avpkt.size > 0 || (!pkt && got_output)) {
1560 uint8_t *data_buf, *decoded_data_buf;
1561 int data_size, decoded_data_size;
1563 ist->pts= ist->next_pts;
1565 if(avpkt.size && avpkt.size != pkt->size &&
1566 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1567 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1568 ist->showed_multi_packet_warning=1;
1571 /* decode the packet if needed */
1572 decoded_data_buf = NULL; /* fail safe */
1573 decoded_data_size= 0;
1574 data_buf = avpkt.data;
1575 data_size = avpkt.size;
1576 subtitle_to_free = NULL;
1577 if (ist->decoding_needed) {
1578 switch(ist->st->codec->codec_type) {
1579 case AVMEDIA_TYPE_AUDIO:{
1580 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1581 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1583 samples= av_malloc(samples_size);
1585 decoded_data_size= samples_size;
1586 /* XXX: could avoid copy if PCM 16 bits with same
1587 endianness as CPU */
1588 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1595 got_output = decoded_data_size > 0;
1596 /* Some bug in mpeg audio decoder gives */
1597 /* decoded_data_size < 0, it seems they are overflows */
1599 /* no audio frame */
1602 decoded_data_buf = (uint8_t *)samples;
1603 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1604 (ist->st->codec->sample_rate * ist->st->codec->channels);
1606 case AVMEDIA_TYPE_VIDEO:
1607 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1608 /* XXX: allocate picture correctly */
1609 avcodec_get_frame_defaults(&picture);
1610 avpkt.pts = pkt_pts;
1611 avpkt.dts = ist->pts;
1612 pkt_pts = AV_NOPTS_VALUE;
1614 ret = avcodec_decode_video2(ist->st->codec,
1615 &picture, &got_output, &avpkt);
1616 quality = same_quant ? picture.quality : 0;
1620 /* no picture yet */
1621 goto discard_packet;
1623 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1624 if (ist->st->codec->time_base.num != 0) {
1625 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1626 ist->next_pts += ((int64_t)AV_TIME_BASE *
1627 ist->st->codec->time_base.num * ticks) /
1628 ist->st->codec->time_base.den;
1631 buffer_to_free = NULL;
1632 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1634 case AVMEDIA_TYPE_SUBTITLE:
1635 ret = avcodec_decode_subtitle2(ist->st->codec,
1636 &subtitle, &got_output, &avpkt);
1640 goto discard_packet;
1642 subtitle_to_free = &subtitle;
1649 switch(ist->st->codec->codec_type) {
1650 case AVMEDIA_TYPE_AUDIO:
1651 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1652 ist->st->codec->sample_rate;
1654 case AVMEDIA_TYPE_VIDEO:
1655 if (ist->st->codec->time_base.num != 0) {
1656 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1657 ist->next_pts += ((int64_t)AV_TIME_BASE *
1658 ist->st->codec->time_base.num * ticks) /
1659 ist->st->codec->time_base.den;
1666 // preprocess audio (volume)
1667 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1668 if (audio_volume != 256) {
1671 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1672 int v = ((*volp) * audio_volume + 128) >> 8;
1673 *volp++ = av_clip_int16(v);
1678 /* frame rate emulation */
1680 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1681 int64_t now = av_gettime() - ist->start;
1685 /* if output time reached then transcode raw format,
1686 encode packets and output them */
1687 for (i = 0; i < nb_ostreams; i++) {
1688 OutputFile *of = &output_files[ost_table[i].file_index];
1691 ost = &ost_table[i];
1692 if (ost->source_index != ist_index)
1695 if (of->start_time && ist->pts < of->start_time)
1698 if (of->recording_time != INT64_MAX &&
1699 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1700 (AVRational){1, 1000000}) >= 0) {
1701 ost->is_past_recording_time = 1;
1706 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1707 ost->input_video_filter) {
1709 if (ist->st->sample_aspect_ratio.num)
1710 sar = ist->st->sample_aspect_ratio;
1712 sar = ist->st->codec->sample_aspect_ratio;
1713 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, ist->pts, sar);
1715 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1716 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1717 while (frame_available) {
1718 AVRational ist_pts_tb;
1719 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1720 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1722 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1724 os = output_files[ost->file_index].ctx;
1726 /* set the input output pts pairs */
1727 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1729 if (ost->encoding_needed) {
1730 av_assert0(ist->decoding_needed);
1731 switch(ost->st->codec->codec_type) {
1732 case AVMEDIA_TYPE_AUDIO:
1733 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1735 case AVMEDIA_TYPE_VIDEO:
1737 if (ost->picref->video && !ost->frame_aspect_ratio)
1738 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1740 do_video_out(os, ost, ist, &picture, &frame_size,
1741 same_quant ? quality : ost->st->codec->global_quality);
1742 if (vstats_filename && frame_size)
1743 do_video_stats(os, ost, frame_size);
1745 case AVMEDIA_TYPE_SUBTITLE:
1746 do_subtitle_out(os, ost, ist, &subtitle,
1753 AVFrame avframe; //FIXME/XXX remove this
1755 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1757 av_init_packet(&opkt);
1759 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1760 #if !CONFIG_AVFILTER
1766 /* no reencoding needed : output the packet directly */
1767 /* force the input stream PTS */
1769 avcodec_get_frame_defaults(&avframe);
1770 ost->st->codec->coded_frame= &avframe;
1771 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1773 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1774 audio_size += data_size;
1775 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1776 video_size += data_size;
1780 opkt.stream_index= ost->index;
1781 if(pkt->pts != AV_NOPTS_VALUE)
1782 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1784 opkt.pts= AV_NOPTS_VALUE;
1786 if (pkt->dts == AV_NOPTS_VALUE)
1787 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1789 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1790 opkt.dts -= ost_tb_start_time;
1792 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1793 opkt.flags= pkt->flags;
1795 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1796 if( ost->st->codec->codec_id != CODEC_ID_H264
1797 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1798 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1800 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1801 opkt.destruct= av_destruct_packet;
1803 opkt.data = data_buf;
1804 opkt.size = data_size;
1807 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1808 ost->st->codec->frame_number++;
1809 ost->frame_number++;
1810 av_free_packet(&opkt);
1814 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1815 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1817 avfilter_unref_buffer(ost->picref);
1822 av_free(buffer_to_free);
1823 /* XXX: allocate the subtitles in the codec ? */
1824 if (subtitle_to_free) {
1825 avsubtitle_free(subtitle_to_free);
1826 subtitle_to_free = NULL;
1834 static void print_sdp(OutputFile *output_files, int n)
1838 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1842 for (i = 0; i < n; i++)
1843 avc[i] = output_files[i].ctx;
1845 av_sdp_create(avc, n, sdp, sizeof(sdp));
1846 printf("SDP:\n%s\n", sdp);
1851 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1852 char *error, int error_len)
1855 InputStream *ist = &input_streams[ist_index];
1856 if (ist->decoding_needed) {
1857 AVCodec *codec = ist->dec;
1859 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d.%d",
1860 ist->st->codec->codec_id, ist->file_index, ist->st->index);
1861 return AVERROR(EINVAL);
1864 /* update requested sample format for the decoder based on the
1865 corresponding encoder sample format */
1866 for (i = 0; i < nb_output_streams; i++) {
1867 OutputStream *ost = &output_streams[i];
1868 if (ost->source_index == ist_index) {
1869 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
1874 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1875 snprintf(error, error_len, "Error while opening decoder for input stream #%d.%d",
1876 ist->file_index, ist->st->index);
1877 return AVERROR(EINVAL);
1879 assert_codec_experimental(ist->st->codec, 0);
1880 assert_avoptions(ist->opts);
1883 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;
1884 ist->next_pts = AV_NOPTS_VALUE;
1885 init_pts_correction(&ist->pts_ctx);
1891 static int transcode_init(OutputFile *output_files,
1892 int nb_output_files,
1893 InputFile *input_files,
1897 AVFormatContext *os;
1898 AVCodecContext *codec, *icodec;
1905 for (i = 0; i < nb_input_streams; i++)
1906 input_streams[i].start = av_gettime();
1908 /* output stream init */
1909 for(i=0;i<nb_output_files;i++) {
1910 os = output_files[i].ctx;
1911 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1912 av_dump_format(os, i, os->filename, 1);
1913 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1914 return AVERROR(EINVAL);
1918 /* for each output stream, we compute the right encoding parameters */
1919 for (i = 0; i < nb_output_streams; i++) {
1920 ost = &output_streams[i];
1921 os = output_files[ost->file_index].ctx;
1922 ist = &input_streams[ost->source_index];
1924 codec = ost->st->codec;
1925 icodec = ist->st->codec;
1927 ost->st->disposition = ist->st->disposition;
1928 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1929 codec->chroma_sample_location = icodec->chroma_sample_location;
1931 if (ost->st->stream_copy) {
1932 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1934 if (extra_size > INT_MAX) {
1935 return AVERROR(EINVAL);
1938 /* if stream_copy is selected, no need to decode or encode */
1939 codec->codec_id = icodec->codec_id;
1940 codec->codec_type = icodec->codec_type;
1942 if(!codec->codec_tag){
1943 if( !os->oformat->codec_tag
1944 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1945 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1946 codec->codec_tag = icodec->codec_tag;
1949 codec->bit_rate = icodec->bit_rate;
1950 codec->rc_max_rate = icodec->rc_max_rate;
1951 codec->rc_buffer_size = icodec->rc_buffer_size;
1952 codec->extradata= av_mallocz(extra_size);
1953 if (!codec->extradata) {
1954 return AVERROR(ENOMEM);
1956 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
1957 codec->extradata_size= icodec->extradata_size;
1958 if(!copy_tb && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/500){
1959 codec->time_base = icodec->time_base;
1960 codec->time_base.num *= icodec->ticks_per_frame;
1961 av_reduce(&codec->time_base.num, &codec->time_base.den,
1962 codec->time_base.num, codec->time_base.den, INT_MAX);
1964 codec->time_base = ist->st->time_base;
1965 switch(codec->codec_type) {
1966 case AVMEDIA_TYPE_AUDIO:
1967 if(audio_volume != 256) {
1968 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1971 codec->channel_layout = icodec->channel_layout;
1972 codec->sample_rate = icodec->sample_rate;
1973 codec->channels = icodec->channels;
1974 codec->frame_size = icodec->frame_size;
1975 codec->audio_service_type = icodec->audio_service_type;
1976 codec->block_align= icodec->block_align;
1977 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1978 codec->block_align= 0;
1979 if(codec->codec_id == CODEC_ID_AC3)
1980 codec->block_align= 0;
1982 case AVMEDIA_TYPE_VIDEO:
1983 codec->pix_fmt = icodec->pix_fmt;
1984 codec->width = icodec->width;
1985 codec->height = icodec->height;
1986 codec->has_b_frames = icodec->has_b_frames;
1987 if (!codec->sample_aspect_ratio.num) {
1988 codec->sample_aspect_ratio =
1989 ost->st->sample_aspect_ratio =
1990 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
1991 ist->st->codec->sample_aspect_ratio.num ?
1992 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
1995 case AVMEDIA_TYPE_SUBTITLE:
1996 codec->width = icodec->width;
1997 codec->height = icodec->height;
1999 case AVMEDIA_TYPE_DATA:
2006 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2007 switch(codec->codec_type) {
2008 case AVMEDIA_TYPE_AUDIO:
2009 ost->fifo= av_fifo_alloc(1024);
2011 return AVERROR(ENOMEM);
2013 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2014 if (!codec->sample_rate) {
2015 codec->sample_rate = icodec->sample_rate;
2017 codec->sample_rate >>= icodec->lowres;
2019 choose_sample_rate(ost->st, ost->enc);
2020 codec->time_base = (AVRational){1, codec->sample_rate};
2021 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2022 codec->sample_fmt = icodec->sample_fmt;
2023 choose_sample_fmt(ost->st, ost->enc);
2024 if (!codec->channels)
2025 codec->channels = icodec->channels;
2026 codec->channel_layout = icodec->channel_layout;
2027 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2028 codec->channel_layout = 0;
2029 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2030 icodec->request_channels = codec->channels;
2031 ist->decoding_needed = 1;
2032 ost->encoding_needed = 1;
2033 ost->resample_sample_fmt = icodec->sample_fmt;
2034 ost->resample_sample_rate = icodec->sample_rate;
2035 ost->resample_channels = icodec->channels;
2037 case AVMEDIA_TYPE_VIDEO:
2038 if (codec->pix_fmt == PIX_FMT_NONE)
2039 codec->pix_fmt = icodec->pix_fmt;
2040 choose_pixel_fmt(ost->st, ost->enc);
2042 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2043 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2047 if (!codec->width || !codec->height) {
2048 codec->width = icodec->width;
2049 codec->height = icodec->height;
2052 ost->video_resample = codec->width != icodec->width ||
2053 codec->height != icodec->height ||
2054 codec->pix_fmt != icodec->pix_fmt;
2055 if (ost->video_resample) {
2056 #if !CONFIG_AVFILTER
2057 avcodec_get_frame_defaults(&ost->pict_tmp);
2058 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2059 codec->width, codec->height)) {
2060 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2063 ost->img_resample_ctx = sws_getContext(
2070 ost->sws_flags, NULL, NULL, NULL);
2071 if (ost->img_resample_ctx == NULL) {
2072 fprintf(stderr, "Cannot get resampling context\n");
2076 codec->bits_per_raw_sample= 0;
2079 ost->resample_height = icodec->height;
2080 ost->resample_width = icodec->width;
2081 ost->resample_pix_fmt= icodec->pix_fmt;
2082 ost->encoding_needed = 1;
2083 ist->decoding_needed = 1;
2085 if (!ost->frame_rate.num)
2086 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2087 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2088 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2089 ost->frame_rate = ost->enc->supported_framerates[idx];
2091 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2094 if (configure_video_filters(ist, ost)) {
2095 fprintf(stderr, "Error opening filters!\n");
2100 case AVMEDIA_TYPE_SUBTITLE:
2101 ost->encoding_needed = 1;
2102 ist->decoding_needed = 1;
2109 if (ost->encoding_needed &&
2110 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2111 char logfilename[1024];
2114 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2115 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2117 if (codec->flags & CODEC_FLAG_PASS1) {
2118 f = fopen(logfilename, "wb");
2120 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2126 size_t logbuffer_size;
2127 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2128 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2131 codec->stats_in = logbuffer;
2135 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2136 int size= codec->width * codec->height;
2137 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2142 bit_buffer = av_malloc(bit_buffer_size);
2144 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2146 return AVERROR(ENOMEM);
2149 /* open each encoder */
2150 for (i = 0; i < nb_output_streams; i++) {
2151 ost = &output_streams[i];
2152 if (ost->encoding_needed) {
2153 AVCodec *codec = ost->enc;
2154 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2156 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2157 ost->st->codec->codec_id, ost->file_index, ost->index);
2158 ret = AVERROR(EINVAL);
2161 if (dec->subtitle_header) {
2162 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2163 if (!ost->st->codec->subtitle_header) {
2164 ret = AVERROR(ENOMEM);
2167 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2168 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2170 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2171 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2172 ost->file_index, ost->index);
2173 ret = AVERROR(EINVAL);
2176 assert_codec_experimental(ost->st->codec, 1);
2177 assert_avoptions(ost->opts);
2178 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2179 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2180 "It takes bits/s as argument, not kbits/s\n");
2181 extra_size += ost->st->codec->extradata_size;
2185 /* init input streams */
2186 for (i = 0; i < nb_input_streams; i++)
2187 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2190 /* open files and write file headers */
2191 for (i = 0; i < nb_output_files; i++) {
2192 os = output_files[i].ctx;
2193 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2194 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2195 ret = AVERROR(EINVAL);
2198 assert_avoptions(output_files[i].opts);
2199 if (strcmp(os->oformat->name, "rtp")) {
2205 /* dump the file output parameters - cannot be done before in case
2207 for(i=0;i<nb_output_files;i++) {
2208 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2211 /* dump the stream mapping */
2213 fprintf(stderr, "Stream mapping:\n");
2214 for (i = 0; i < nb_output_streams;i ++) {
2215 ost = &output_streams[i];
2216 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2217 input_streams[ost->source_index].file_index,
2218 input_streams[ost->source_index].st->index,
2221 if (ost->sync_ist != &input_streams[ost->source_index])
2222 fprintf(stderr, " [sync #%d.%d]",
2223 ost->sync_ist->file_index,
2224 ost->sync_ist->st->index);
2225 if (ost->st->stream_copy)
2226 fprintf(stderr, " (copy)");
2228 fprintf(stderr, " (%s -> %s)", input_streams[ost->source_index].dec ?
2229 input_streams[ost->source_index].dec->name : "?",
2230 ost->enc ? ost->enc->name : "?");
2231 fprintf(stderr, "\n");
2236 fprintf(stderr, "%s\n", error);
2241 print_sdp(output_files, nb_output_files);
2248 * The following code is the main loop of the file converter
2250 static int transcode(OutputFile *output_files,
2251 int nb_output_files,
2252 InputFile *input_files,
2256 AVFormatContext *is, *os;
2260 int no_packet_count=0;
2261 int64_t timer_start;
2263 if (!(no_packet = av_mallocz(nb_input_files)))
2266 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2271 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2274 timer_start = av_gettime();
2276 for(; received_sigterm == 0;) {
2277 int file_index, ist_index;
2282 ipts_min = INT64_MAX;
2285 /* select the stream that we must read now by looking at the
2286 smallest output pts */
2288 for (i = 0; i < nb_output_streams; i++) {
2292 ost = &output_streams[i];
2293 of = &output_files[ost->file_index];
2294 os = output_files[ost->file_index].ctx;
2295 ist = &input_streams[ost->source_index];
2296 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2297 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2299 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2301 if (!input_files[ist->file_index].eof_reached){
2302 if(ipts < ipts_min) {
2304 if(input_sync ) file_index = ist->file_index;
2306 if(opts < opts_min) {
2308 if(!input_sync) file_index = ist->file_index;
2311 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2316 /* if none, if is finished */
2317 if (file_index < 0) {
2318 if(no_packet_count){
2320 memset(no_packet, 0, nb_input_files);
2327 /* read a frame from it and output it in the fifo */
2328 is = input_files[file_index].ctx;
2329 ret= av_read_frame(is, &pkt);
2330 if(ret == AVERROR(EAGAIN)){
2331 no_packet[file_index]=1;
2336 input_files[file_index].eof_reached = 1;
2344 memset(no_packet, 0, nb_input_files);
2347 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2348 is->streams[pkt.stream_index]);
2350 /* the following test is needed in case new streams appear
2351 dynamically in stream : we ignore them */
2352 if (pkt.stream_index >= input_files[file_index].nb_streams)
2353 goto discard_packet;
2354 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2355 ist = &input_streams[ist_index];
2357 goto discard_packet;
2359 if (pkt.dts != AV_NOPTS_VALUE)
2360 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2361 if (pkt.pts != AV_NOPTS_VALUE)
2362 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2364 if(pkt.pts != AV_NOPTS_VALUE)
2365 pkt.pts *= ist->ts_scale;
2366 if(pkt.dts != AV_NOPTS_VALUE)
2367 pkt.dts *= ist->ts_scale;
2369 // fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files[ist->file_index].ts_offset, ist->st->codec->codec_type);
2370 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2371 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2372 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2373 int64_t delta= pkt_dts - ist->next_pts;
2374 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2375 input_files[ist->file_index].ts_offset -= delta;
2377 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2378 delta, input_files[ist->file_index].ts_offset);
2379 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2380 if(pkt.pts != AV_NOPTS_VALUE)
2381 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2385 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2386 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2389 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2390 ist->file_index, ist->st->index);
2393 av_free_packet(&pkt);
2398 av_free_packet(&pkt);
2400 /* dump report by using the output first video and audio streams */
2401 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2404 /* at the end of stream, we must flush the decoder buffers */
2405 for (i = 0; i < nb_input_streams; i++) {
2406 ist = &input_streams[i];
2407 if (ist->decoding_needed) {
2408 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2411 flush_encoders(output_streams, nb_output_streams);
2415 /* write the trailer if needed and close file */
2416 for(i=0;i<nb_output_files;i++) {
2417 os = output_files[i].ctx;
2418 av_write_trailer(os);
2421 /* dump report by using the first video and audio streams */
2422 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2424 /* close each encoder */
2425 for (i = 0; i < nb_output_streams; i++) {
2426 ost = &output_streams[i];
2427 if (ost->encoding_needed) {
2428 av_freep(&ost->st->codec->stats_in);
2429 avcodec_close(ost->st->codec);
2432 avfilter_graph_free(&ost->graph);
2436 /* close each decoder */
2437 for (i = 0; i < nb_input_streams; i++) {
2438 ist = &input_streams[i];
2439 if (ist->decoding_needed) {
2440 avcodec_close(ist->st->codec);
2448 av_freep(&bit_buffer);
2449 av_freep(&no_packet);
2451 if (output_streams) {
2452 for (i = 0; i < nb_output_streams; i++) {
2453 ost = &output_streams[i];
2455 if (ost->st->stream_copy)
2456 av_freep(&ost->st->codec->extradata);
2458 fclose(ost->logfile);
2459 ost->logfile = NULL;
2461 av_fifo_free(ost->fifo); /* works even if fifo is not
2462 initialized but set to zero */
2463 av_freep(&ost->st->codec->subtitle_header);
2464 av_free(ost->pict_tmp.data[0]);
2465 av_free(ost->forced_kf_pts);
2466 if (ost->video_resample)
2467 sws_freeContext(ost->img_resample_ctx);
2469 audio_resample_close(ost->resample);
2470 if (ost->reformat_ctx)
2471 av_audio_convert_free(ost->reformat_ctx);
2472 av_dict_free(&ost->opts);
2479 static int opt_video_rc_override_string(const char *opt, const char *arg)
2481 video_rc_override_string = arg;
2485 static int opt_me_threshold(const char *opt, const char *arg)
2487 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2491 static int opt_verbose(const char *opt, const char *arg)
2493 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2497 static int opt_frame_rate(const char *opt, const char *arg)
2499 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2500 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2506 static int opt_frame_size(const char *opt, const char *arg)
2508 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2509 fprintf(stderr, "Incorrect frame size\n");
2510 return AVERROR(EINVAL);
2515 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2517 if (strcmp(arg, "list")) {
2518 frame_pix_fmt = av_get_pix_fmt(arg);
2519 if (frame_pix_fmt == PIX_FMT_NONE) {
2520 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2521 return AVERROR(EINVAL);
2530 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2537 p = strchr(arg, ':');
2539 x = strtol(arg, &end, 10);
2541 y = strtol(end+1, &end, 10);
2543 ar = (double)x / (double)y;
2545 ar = strtod(arg, NULL);
2548 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2549 return AVERROR(EINVAL);
2551 frame_aspect_ratio = ar;
2555 static int opt_metadata(const char *opt, const char *arg)
2557 char *mid= strchr(arg, '=');
2560 fprintf(stderr, "Missing =\n");
2565 av_dict_set(&metadata, arg, mid, 0);
2570 static int opt_qscale(const char *opt, const char *arg)
2572 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2573 if (video_qscale == 0) {
2574 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2575 return AVERROR(EINVAL);
2580 static int opt_top_field_first(const char *opt, const char *arg)
2582 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2586 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2588 if (strcmp(arg, "list")) {
2589 audio_sample_fmt = av_get_sample_fmt(arg);
2590 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2591 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2592 return AVERROR(EINVAL);
2597 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2598 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2604 static int opt_audio_rate(const char *opt, const char *arg)
2606 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2610 static int opt_audio_channels(const char *opt, const char *arg)
2612 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2616 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2618 return parse_option(o, "codec:a", arg, options);
2621 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2623 return parse_option(o, "codec:v", arg, options);
2626 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2628 return parse_option(o, "codec:s", arg, options);
2631 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2633 return parse_option(o, "codec:d", arg, options);
2636 static int opt_codec_tag(const char *opt, const char *arg)
2639 uint32_t *codec_tag;
2641 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2642 !strcmp(opt, "vtag") ? &video_codec_tag :
2643 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2647 *codec_tag = strtol(arg, &tail, 0);
2649 *codec_tag = AV_RL32(arg);
2654 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2656 StreamMap *m = NULL;
2657 int i, negative = 0, file_idx;
2658 int sync_file_idx = -1, sync_stream_idx;
2666 map = av_strdup(arg);
2668 /* parse sync stream first, just pick first matching stream */
2669 if (sync = strchr(map, ',')) {
2671 sync_file_idx = strtol(sync + 1, &sync, 0);
2672 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2673 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2678 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2679 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2680 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2681 sync_stream_idx = i;
2684 if (i == input_files[sync_file_idx].nb_streams) {
2685 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2686 "match any streams.\n", arg);
2692 file_idx = strtol(map, &p, 0);
2693 if (file_idx >= nb_input_files || file_idx < 0) {
2694 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2698 /* disable some already defined maps */
2699 for (i = 0; i < o->nb_stream_maps; i++) {
2700 m = &o->stream_maps[i];
2701 if (check_stream_specifier(input_files[m->file_index].ctx,
2702 input_files[m->file_index].ctx->streams[m->stream_index],
2703 *p == ':' ? p + 1 : p) > 0)
2707 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2708 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2709 *p == ':' ? p + 1 : p) <= 0)
2711 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2712 &o->nb_stream_maps, o->nb_stream_maps + 1);
2713 m = &o->stream_maps[o->nb_stream_maps - 1];
2715 m->file_index = file_idx;
2716 m->stream_index = i;
2718 if (sync_file_idx >= 0) {
2719 m->sync_file_index = sync_file_idx;
2720 m->sync_stream_index = sync_stream_idx;
2722 m->sync_file_index = file_idx;
2723 m->sync_stream_index = i;
2728 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2736 static void parse_meta_type(char *arg, char *type, int *index)
2746 if (*(++arg) == ':')
2747 *index = strtol(++arg, NULL, 0);
2750 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2757 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
2759 MetadataMap *m, *m1;
2762 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
2763 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
2765 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
2766 m->file = strtol(arg, &p, 0);
2767 parse_meta_type(p, &m->type, &m->index);
2769 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
2770 if (p = strchr(opt, ':'))
2771 parse_meta_type(p, &m1->type, &m1->index);
2775 if (m->type == 'g' || m1->type == 'g')
2776 o->metadata_global_manual = 1;
2777 if (m->type == 's' || m1->type == 's')
2778 o->metadata_streams_manual = 1;
2779 if (m->type == 'c' || m1->type == 'c')
2780 o->metadata_chapters_manual = 1;
2785 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2787 const char *codec_string = encoder ? "encoder" : "decoder";
2791 return CODEC_ID_NONE;
2793 avcodec_find_encoder_by_name(name) :
2794 avcodec_find_decoder_by_name(name);
2796 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2799 if(codec->type != type) {
2800 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2806 static AVCodec *choose_codec(OptionsContext *o, AVFormatContext *s, AVStream *st, enum AVMediaType type)
2808 char *codec_name = NULL;
2810 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
2814 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2815 return avcodec_find_encoder(st->codec->codec_id);
2817 } else if (!strcmp(codec_name, "copy"))
2818 st->stream_copy = 1;
2820 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
2821 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
2822 avcodec_find_decoder_by_name(codec_name);
2829 * Add all the streams from the given input file to the global
2830 * list of input streams.
2832 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
2834 int i, rfps, rfps_base;
2836 for (i = 0; i < ic->nb_streams; i++) {
2837 AVStream *st = ic->streams[i];
2838 AVCodecContext *dec = st->codec;
2842 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2843 ist = &input_streams[nb_input_streams - 1];
2845 ist->file_index = nb_input_files;
2847 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2849 MATCH_PER_STREAM_OPT(ts_scale, dbl, scale, ic, st);
2850 ist->ts_scale = scale;
2852 ist->dec = choose_codec(o, ic, st, dec->codec_type);
2854 ist->dec = avcodec_find_decoder(dec->codec_id);
2856 switch (dec->codec_type) {
2857 case AVMEDIA_TYPE_AUDIO:
2859 st->discard= AVDISCARD_ALL;
2861 case AVMEDIA_TYPE_VIDEO:
2862 rfps = ic->streams[i]->r_frame_rate.num;
2863 rfps_base = ic->streams[i]->r_frame_rate.den;
2865 dec->flags |= CODEC_FLAG_EMU_EDGE;
2866 dec->height >>= dec->lowres;
2867 dec->width >>= dec->lowres;
2870 dec->debug |= FF_DEBUG_MV;
2872 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2875 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2876 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2878 (float)rfps / rfps_base, rfps, rfps_base);
2882 st->discard= AVDISCARD_ALL;
2883 else if(video_discard)
2884 st->discard= video_discard;
2886 case AVMEDIA_TYPE_DATA:
2888 case AVMEDIA_TYPE_SUBTITLE:
2889 if(subtitle_disable)
2890 st->discard = AVDISCARD_ALL;
2892 case AVMEDIA_TYPE_ATTACHMENT:
2893 case AVMEDIA_TYPE_UNKNOWN:
2901 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
2903 AVFormatContext *ic;
2904 AVInputFormat *file_iformat = NULL;
2908 AVDictionary **opts;
2909 int orig_nb_streams; // number of streams before avformat_find_stream_info
2912 if (!(file_iformat = av_find_input_format(o->format))) {
2913 fprintf(stderr, "Unknown input format: '%s'\n", o->format);
2918 if (!strcmp(filename, "-"))
2921 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2922 !strcmp(filename, "/dev/stdin");
2924 /* get default parameters from command line */
2925 ic = avformat_alloc_context();
2927 print_error(filename, AVERROR(ENOMEM));
2930 if (audio_sample_rate) {
2931 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
2932 av_dict_set(&format_opts, "sample_rate", buf, 0);
2934 if (audio_channels) {
2935 snprintf(buf, sizeof(buf), "%d", audio_channels);
2936 av_dict_set(&format_opts, "channels", buf, 0);
2938 if (frame_rate.num) {
2939 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
2940 av_dict_set(&format_opts, "framerate", buf, 0);
2942 if (frame_width && frame_height) {
2943 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
2944 av_dict_set(&format_opts, "video_size", buf, 0);
2946 if (frame_pix_fmt != PIX_FMT_NONE)
2947 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
2949 ic->flags |= AVFMT_FLAG_NONBLOCK;
2951 /* open the input file with generic libav function */
2952 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2954 print_error(filename, err);
2957 assert_avoptions(format_opts);
2962 for(i=0; i<ic->nb_streams; i++){
2963 ic->streams[i]->discard= AVDISCARD_ALL;
2965 for(i=0; i<ic->nb_programs; i++){
2966 AVProgram *p= ic->programs[i];
2967 if(p->id != opt_programid){
2968 p->discard = AVDISCARD_ALL;
2971 for(j=0; j<p->nb_stream_indexes; j++){
2972 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
2977 fprintf(stderr, "Specified program id not found\n");
2983 /* apply forced codec ids */
2984 for (i = 0; i < ic->nb_streams; i++)
2985 choose_codec(o, ic, ic->streams[i], ic->streams[i]->codec->codec_type);
2987 /* Set AVCodecContext options for avformat_find_stream_info */
2988 opts = setup_find_stream_info_opts(ic, codec_opts);
2989 orig_nb_streams = ic->nb_streams;
2991 /* If not enough info to get the stream parameters, we decode the
2992 first frames to get it. (used in mpeg case for example) */
2993 ret = avformat_find_stream_info(ic, opts);
2994 if (ret < 0 && verbose >= 0) {
2995 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2996 av_close_input_file(ic);
3000 timestamp = o->start_time;
3001 /* add the stream start time */
3002 if (ic->start_time != AV_NOPTS_VALUE)
3003 timestamp += ic->start_time;
3005 /* if seeking requested, we execute it */
3006 if (o->start_time != 0) {
3007 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3009 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3010 filename, (double)timestamp / AV_TIME_BASE);
3014 /* update the current parameters so that they match the one of the input stream */
3015 add_input_streams(o, ic);
3017 /* dump the file content */
3019 av_dump_format(ic, nb_input_files, filename, 0);
3021 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3022 input_files[nb_input_files - 1].ctx = ic;
3023 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3024 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3025 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3027 frame_rate = (AVRational){0, 0};
3028 frame_pix_fmt = PIX_FMT_NONE;
3031 audio_sample_rate = 0;
3033 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3035 for (i = 0; i < orig_nb_streams; i++)
3036 av_dict_free(&opts[i]);
3043 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3044 AVCodecContext *avctx)
3050 for (p = kf; *p; p++)
3053 ost->forced_kf_count = n;
3054 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3055 if (!ost->forced_kf_pts) {
3056 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3059 for (i = 0; i < n; i++) {
3060 p = i ? strchr(p, ',') + 1 : kf;
3061 t = parse_time_or_die("force_key_frames", p, 1);
3062 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3066 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3069 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3070 int idx = oc->nb_streams - 1;
3073 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3077 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3078 nb_output_streams + 1);
3079 ost = &output_streams[nb_output_streams - 1];
3080 ost->file_index = nb_output_files;
3083 st->codec->codec_type = type;
3084 ost->enc = choose_codec(o, oc, st, type);
3086 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3089 avcodec_get_context_defaults3(st->codec, ost->enc);
3090 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3092 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3096 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3100 AVCodecContext *video_enc;
3102 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3104 if (!st->stream_copy) {
3105 ost->frame_aspect_ratio = frame_aspect_ratio;
3106 frame_aspect_ratio = 0;
3108 ost->avfilter= vfilters;
3113 ost->bitstream_filters = video_bitstream_filters;
3114 video_bitstream_filters= NULL;
3116 video_enc = st->codec;
3119 video_enc->codec_tag= video_codec_tag;
3121 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3122 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3125 if (st->stream_copy) {
3126 video_enc->sample_aspect_ratio =
3127 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3133 ost->frame_rate = frame_rate;
3135 video_enc->width = frame_width;
3136 video_enc->height = frame_height;
3137 video_enc->pix_fmt = frame_pix_fmt;
3138 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3140 if (video_qscale || same_quant) {
3141 video_enc->flags |= CODEC_FLAG_QSCALE;
3142 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3146 video_enc->intra_matrix = intra_matrix;
3148 video_enc->inter_matrix = inter_matrix;
3150 p= video_rc_override_string;
3153 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3155 fprintf(stderr, "error parsing rc_override\n");
3158 video_enc->rc_override=
3159 av_realloc(video_enc->rc_override,
3160 sizeof(RcOverride)*(i+1));
3161 video_enc->rc_override[i].start_frame= start;
3162 video_enc->rc_override[i].end_frame = end;
3164 video_enc->rc_override[i].qscale= q;
3165 video_enc->rc_override[i].quality_factor= 1.0;
3168 video_enc->rc_override[i].qscale= 0;
3169 video_enc->rc_override[i].quality_factor= -q/100.0;
3174 video_enc->rc_override_count=i;
3175 if (!video_enc->rc_initial_buffer_occupancy)
3176 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3177 video_enc->me_threshold= me_threshold;
3178 video_enc->intra_dc_precision= intra_dc_precision - 8;
3181 video_enc->flags|= CODEC_FLAG_PSNR;
3186 video_enc->flags |= CODEC_FLAG_PASS1;
3188 video_enc->flags |= CODEC_FLAG_PASS2;
3192 if (forced_key_frames)
3193 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3195 if (video_language) {
3196 av_dict_set(&st->metadata, "language", video_language, 0);
3197 av_freep(&video_language);
3200 /* reset some key parameters */
3202 av_freep(&forced_key_frames);
3203 frame_pix_fmt = PIX_FMT_NONE;
3207 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3211 AVCodecContext *audio_enc;
3213 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3216 ost->bitstream_filters = audio_bitstream_filters;
3217 audio_bitstream_filters= NULL;
3219 audio_enc = st->codec;
3220 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3223 audio_enc->codec_tag= audio_codec_tag;
3225 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3226 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3228 if (!st->stream_copy) {
3229 if (audio_qscale > QSCALE_NONE) {
3230 audio_enc->flags |= CODEC_FLAG_QSCALE;
3231 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3234 audio_enc->channels = audio_channels;
3235 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3236 audio_enc->sample_fmt = audio_sample_fmt;
3237 if (audio_sample_rate)
3238 audio_enc->sample_rate = audio_sample_rate;
3240 if (audio_language) {
3241 av_dict_set(&st->metadata, "language", audio_language, 0);
3242 av_freep(&audio_language);
3245 /* reset some key parameters */
3251 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3255 AVCodecContext *data_enc;
3257 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3259 data_enc = st->codec;
3260 if (!st->stream_copy) {
3261 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3266 data_enc->codec_tag= data_codec_tag;
3268 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3269 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3276 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3280 AVCodecContext *subtitle_enc;
3282 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3284 subtitle_enc = st->codec;
3286 ost->bitstream_filters = subtitle_bitstream_filters;
3287 subtitle_bitstream_filters= NULL;
3289 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3291 if(subtitle_codec_tag)
3292 subtitle_enc->codec_tag= subtitle_codec_tag;
3294 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3295 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3298 if (subtitle_language) {
3299 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3300 av_freep(&subtitle_language);
3303 subtitle_disable = 0;
3307 /* arg format is "output-stream-index:streamid-value". */
3308 static int opt_streamid(const char *opt, const char *arg)
3314 av_strlcpy(idx_str, arg, sizeof(idx_str));
3315 p = strchr(idx_str, ':');
3318 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3323 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3324 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3325 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3329 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3331 AVFormatContext *is = ifile->ctx;
3332 AVFormatContext *os = ofile->ctx;
3335 for (i = 0; i < is->nb_chapters; i++) {
3336 AVChapter *in_ch = is->chapters[i], *out_ch;
3337 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3338 AV_TIME_BASE_Q, in_ch->time_base);
3339 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3340 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3343 if (in_ch->end < ts_off)
3345 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3348 out_ch = av_mallocz(sizeof(AVChapter));
3350 return AVERROR(ENOMEM);
3352 out_ch->id = in_ch->id;
3353 out_ch->time_base = in_ch->time_base;
3354 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3355 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3358 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3361 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3363 return AVERROR(ENOMEM);
3364 os->chapters[os->nb_chapters - 1] = out_ch;
3369 static int read_avserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3372 AVFormatContext *ic = NULL;
3374 err = avformat_open_input(&ic, filename, NULL, NULL);
3377 /* copy stream format */
3378 for(i=0;i<ic->nb_streams;i++) {
3383 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3384 ost = new_output_stream(o, s, codec->type);
3387 // FIXME: a more elegant solution is needed
3388 memcpy(st, ic->streams[i], sizeof(AVStream));
3390 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3392 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3393 choose_sample_fmt(st, codec);
3394 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3395 choose_pixel_fmt(st, codec);
3398 av_close_input_file(ic);
3402 static void opt_output_file(void *optctx, const char *filename)
3404 OptionsContext *o = optctx;
3405 AVFormatContext *oc;
3407 AVOutputFormat *file_oformat;
3411 if (!strcmp(filename, "-"))
3414 oc = avformat_alloc_context();
3416 print_error(filename, AVERROR(ENOMEM));
3421 file_oformat = av_guess_format(o->format, NULL, NULL);
3422 if (!file_oformat) {
3423 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", o->format);
3427 file_oformat = av_guess_format(NULL, filename, NULL);
3428 if (!file_oformat) {
3429 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3435 oc->oformat = file_oformat;
3436 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3438 if (!strcmp(file_oformat->name, "ffm") &&
3439 av_strstart(filename, "http:", NULL)) {
3440 /* special case for files sent to avserver: we get the stream
3441 parameters from avserver */
3442 int err = read_avserver_streams(o, oc, filename);
3444 print_error(filename, err);
3447 } else if (!o->nb_stream_maps) {
3448 /* pick the "best" stream of each type */
3449 #define NEW_STREAM(type, index)\
3451 ost = new_ ## type ## _stream(o, oc);\
3452 ost->source_index = index;\
3453 ost->sync_ist = &input_streams[index];\
3454 input_streams[index].discard = 0;\
3457 /* video: highest resolution */
3458 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3459 int area = 0, idx = -1;
3460 for (i = 0; i < nb_input_streams; i++) {
3461 ist = &input_streams[i];
3462 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3463 ist->st->codec->width * ist->st->codec->height > area) {
3464 area = ist->st->codec->width * ist->st->codec->height;
3468 NEW_STREAM(video, idx);
3471 /* audio: most channels */
3472 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3473 int channels = 0, idx = -1;
3474 for (i = 0; i < nb_input_streams; i++) {
3475 ist = &input_streams[i];
3476 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3477 ist->st->codec->channels > channels) {
3478 channels = ist->st->codec->channels;
3482 NEW_STREAM(audio, idx);
3485 /* subtitles: pick first */
3486 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3487 for (i = 0; i < nb_input_streams; i++)
3488 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3489 NEW_STREAM(subtitle, i);
3493 /* do something with data? */
3495 for (i = 0; i < o->nb_stream_maps; i++) {
3496 StreamMap *map = &o->stream_maps[i];
3501 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3502 switch (ist->st->codec->codec_type) {
3503 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3504 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3505 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3506 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3508 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3509 map->file_index, map->stream_index);
3513 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3514 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3515 map->sync_stream_index];
3520 av_dict_copy(&oc->metadata, metadata, 0);
3521 av_dict_free(&metadata);
3524 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3525 output_files[nb_output_files - 1].ctx = oc;
3526 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3527 output_files[nb_output_files - 1].recording_time = o->recording_time;
3528 output_files[nb_output_files - 1].start_time = o->start_time;
3529 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3530 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3532 /* check filename in case of an image number is expected */
3533 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3534 if (!av_filename_number_test(oc->filename)) {
3535 print_error(oc->filename, AVERROR(EINVAL));
3540 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3541 /* test if it already exists to avoid loosing precious files */
3542 if (!file_overwrite &&
3543 (strchr(filename, ':') == NULL ||
3544 filename[1] == ':' ||
3545 av_strstart(filename, "file:", NULL))) {
3546 if (avio_check(filename, 0) == 0) {
3548 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3550 if (!read_yesno()) {
3551 fprintf(stderr, "Not overwriting - exiting\n");
3556 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3563 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3564 print_error(filename, err);
3569 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3570 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3571 oc->flags |= AVFMT_FLAG_NONBLOCK;
3574 if (o->chapters_input_file >= nb_input_files) {
3575 if (o->chapters_input_file == INT_MAX) {
3576 /* copy chapters from the first input file that has them*/
3577 o->chapters_input_file = -1;
3578 for (i = 0; i < nb_input_files; i++)
3579 if (input_files[i].ctx->nb_chapters) {
3580 o->chapters_input_file = i;
3584 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3585 o->chapters_input_file);
3589 if (o->chapters_input_file >= 0)
3590 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
3591 o->metadata_chapters_manual);
3594 for (i = 0; i < o->nb_meta_data_maps; i++) {
3595 AVFormatContext *files[2];
3596 AVDictionary **meta[2];
3599 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3600 if ((index) < 0 || (index) >= (nb_elems)) {\
3601 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3606 int in_file_index = o->meta_data_maps[i][1].file;
3607 if (in_file_index < 0)
3609 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3612 files[1] = input_files[in_file_index].ctx;
3614 for (j = 0; j < 2; j++) {
3615 MetadataMap *map = &o->meta_data_maps[i][j];
3617 switch (map->type) {
3619 meta[j] = &files[j]->metadata;
3622 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3623 meta[j] = &files[j]->streams[map->index]->metadata;
3626 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3627 meta[j] = &files[j]->chapters[map->index]->metadata;
3630 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3631 meta[j] = &files[j]->programs[map->index]->metadata;
3636 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3639 /* copy global metadata by default */
3640 if (!o->metadata_global_manual && nb_input_files)
3641 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3642 AV_DICT_DONT_OVERWRITE);
3643 if (!o->metadata_streams_manual)
3644 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3645 InputStream *ist = &input_streams[output_streams[i].source_index];
3646 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3649 frame_rate = (AVRational){0, 0};
3652 audio_sample_rate = 0;
3654 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3656 av_freep(&streamid_map);
3657 nb_streamid_map = 0;
3659 av_freep(&forced_key_frames);
3663 /* same option as mencoder */
3664 static int opt_pass(const char *opt, const char *arg)
3666 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3670 static int64_t getutime(void)
3673 struct rusage rusage;
3675 getrusage(RUSAGE_SELF, &rusage);
3676 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3677 #elif HAVE_GETPROCESSTIMES
3679 FILETIME c, e, k, u;
3680 proc = GetCurrentProcess();
3681 GetProcessTimes(proc, &c, &e, &k, &u);
3682 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3684 return av_gettime();
3688 static int64_t getmaxrss(void)
3690 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3691 struct rusage rusage;
3692 getrusage(RUSAGE_SELF, &rusage);
3693 return (int64_t)rusage.ru_maxrss * 1024;
3694 #elif HAVE_GETPROCESSMEMORYINFO
3696 PROCESS_MEMORY_COUNTERS memcounters;
3697 proc = GetCurrentProcess();
3698 memcounters.cb = sizeof(memcounters);
3699 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3700 return memcounters.PeakPagefileUsage;
3706 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3709 const char *p = str;
3716 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3723 static void opt_inter_matrix(const char *arg)
3725 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3726 parse_matrix_coeffs(inter_matrix, arg);
3729 static void opt_intra_matrix(const char *arg)
3731 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3732 parse_matrix_coeffs(intra_matrix, arg);
3735 static void show_usage(void)
3737 printf("Hyper fast Audio and Video encoder\n");
3738 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3742 static void show_help(void)
3745 AVOutputFormat *oformat = NULL;
3746 AVInputFormat *iformat = NULL;
3747 const AVClass *class;
3749 av_log_set_callback(log_callback_help);
3751 show_help_options(options, "Main options:\n",
3752 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3753 show_help_options(options, "\nAdvanced options:\n",
3754 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3756 show_help_options(options, "\nVideo options:\n",
3757 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3759 show_help_options(options, "\nAdvanced Video options:\n",
3760 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3761 OPT_VIDEO | OPT_EXPERT);
3762 show_help_options(options, "\nAudio options:\n",
3763 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3765 show_help_options(options, "\nAdvanced Audio options:\n",
3766 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3767 OPT_AUDIO | OPT_EXPERT);
3768 show_help_options(options, "\nSubtitle options:\n",
3769 OPT_SUBTITLE | OPT_GRAB,
3771 show_help_options(options, "\nAudio/Video grab options:\n",
3775 class = avcodec_get_class();
3776 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3779 /* individual codec options */
3781 while ((c = av_codec_next(c))) {
3782 if (c->priv_class) {
3783 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3788 class = avformat_get_class();
3789 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3792 /* individual muxer options */
3793 while ((oformat = av_oformat_next(oformat))) {
3794 if (oformat->priv_class) {
3795 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3800 /* individual demuxer options */
3801 while ((iformat = av_iformat_next(iformat))) {
3802 if (iformat->priv_class) {
3803 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3808 class = sws_get_class();
3809 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3812 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
3814 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3815 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3817 if(!strncmp(arg, "pal-", 4)) {
3820 } else if(!strncmp(arg, "ntsc-", 5)) {
3823 } else if(!strncmp(arg, "film-", 5)) {
3828 /* Calculate FR via float to avoid int overflow */
3829 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3832 } else if((fr == 29970) || (fr == 23976)) {
3835 /* Try to determine PAL/NTSC by peeking in the input files */
3836 if(nb_input_files) {
3838 for (j = 0; j < nb_input_files; j++) {
3839 for (i = 0; i < input_files[j].nb_streams; i++) {
3840 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3841 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3843 fr = c->time_base.den * 1000 / c->time_base.num;
3847 } else if((fr == 29970) || (fr == 23976)) {
3857 if(verbose > 0 && norm != UNKNOWN)
3858 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3861 if(norm == UNKNOWN) {
3862 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3863 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3864 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3868 if(!strcmp(arg, "vcd")) {
3869 opt_video_codec(o, "c:v", "mpeg1video");
3870 opt_audio_codec(o, "c:a", "mp2");
3871 parse_option(o, "f", "vcd", options);
3873 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
3874 opt_frame_rate("r", frame_rates[norm]);
3875 opt_default("g", norm == PAL ? "15" : "18");
3877 opt_default("b", "1150000");
3878 opt_default("maxrate", "1150000");
3879 opt_default("minrate", "1150000");
3880 opt_default("bufsize", "327680"); // 40*1024*8;
3882 opt_default("b:a", "224000");
3883 audio_sample_rate = 44100;
3886 opt_default("packetsize", "2324");
3887 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3889 /* We have to offset the PTS, so that it is consistent with the SCR.
3890 SCR starts at 36000, but the first two packs contain only padding
3891 and the first pack from the other stream, respectively, may also have
3892 been written before.
3893 So the real data starts at SCR 36000+3*1200. */
3894 mux_preload= (36000+3*1200) / 90000.0; //0.44
3895 } else if(!strcmp(arg, "svcd")) {
3897 opt_video_codec(o, "c:v", "mpeg2video");
3898 opt_audio_codec(o, "c:a", "mp2");
3899 parse_option(o, "f", "svcd", options);
3901 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
3902 opt_frame_rate("r", frame_rates[norm]);
3903 opt_default("g", norm == PAL ? "15" : "18");
3905 opt_default("b", "2040000");
3906 opt_default("maxrate", "2516000");
3907 opt_default("minrate", "0"); //1145000;
3908 opt_default("bufsize", "1835008"); //224*1024*8;
3909 opt_default("flags", "+scan_offset");
3912 opt_default("b:a", "224000");
3913 audio_sample_rate = 44100;
3915 opt_default("packetsize", "2324");
3917 } else if(!strcmp(arg, "dvd")) {
3919 opt_video_codec(o, "c:v", "mpeg2video");
3920 opt_audio_codec(o, "c:a", "ac3");
3921 parse_option(o, "f", "dvd", options);
3923 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
3924 opt_frame_rate("r", frame_rates[norm]);
3925 opt_default("g", norm == PAL ? "15" : "18");
3927 opt_default("b", "6000000");
3928 opt_default("maxrate", "9000000");
3929 opt_default("minrate", "0"); //1500000;
3930 opt_default("bufsize", "1835008"); //224*1024*8;
3932 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3933 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3935 opt_default("b:a", "448000");
3936 audio_sample_rate = 48000;
3938 } else if(!strncmp(arg, "dv", 2)) {
3940 parse_option(o, "f", "dv", options);
3942 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
3943 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
3944 norm == PAL ? "yuv420p" : "yuv411p");
3945 opt_frame_rate("r", frame_rates[norm]);
3947 audio_sample_rate = 48000;
3951 fprintf(stderr, "Unknown target: %s\n", arg);
3952 return AVERROR(EINVAL);
3957 static int opt_vstats_file(const char *opt, const char *arg)
3959 av_free (vstats_filename);
3960 vstats_filename=av_strdup (arg);
3964 static int opt_vstats(const char *opt, const char *arg)
3967 time_t today2 = time(NULL);
3968 struct tm *today = localtime(&today2);
3970 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3972 return opt_vstats_file(opt, filename);
3975 static int opt_bsf(const char *opt, const char *arg)
3977 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3978 AVBitStreamFilterContext **bsfp;
3981 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3985 bsfp= *opt == 'v' ? &video_bitstream_filters :
3986 *opt == 'a' ? &audio_bitstream_filters :
3987 &subtitle_bitstream_filters;
3989 bsfp= &(*bsfp)->next;
3996 #define OFFSET(x) offsetof(OptionsContext, x)
3997 static const OptionDef options[] = {
3999 #include "cmdutils_common_opts.h"
4000 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4001 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4002 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4003 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4004 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4005 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4006 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4007 "outfile[,metadata]:infile[,metadata]" },
4008 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4009 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4010 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4011 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4012 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4013 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4014 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4015 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4016 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4017 "add timings for benchmarking" },
4018 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4019 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4020 "dump each input packet" },
4021 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4022 "when dumping packets, also dump the payload" },
4023 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4024 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4025 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4026 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4027 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4028 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4029 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4030 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4031 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4032 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4033 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4034 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4035 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4038 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4039 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4040 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4041 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4042 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format, 'list' as argument shows all the pixel formats supported", "format" },
4043 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4044 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4045 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4046 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4047 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4048 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimation threshold", "threshold" },
4049 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4050 "use same quantizer as source (implies VBR)" },
4051 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4052 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4053 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4054 "deinterlace pictures" },
4055 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4056 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4057 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4059 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4061 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4062 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4063 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4064 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4065 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4066 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4067 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4068 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4069 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4070 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4073 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4074 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4075 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4076 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4077 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4078 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4079 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4080 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4081 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4082 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_sample_fmt}, "set sample format, 'list' as argument shows all the sample formats supported", "format" },
4084 /* subtitle options */
4085 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4086 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4087 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4088 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4091 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4094 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4095 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4097 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4098 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4099 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4101 /* data codec support */
4102 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4104 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4108 int main(int argc, char **argv)
4110 OptionsContext o = { 0 };
4115 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4117 avcodec_register_all();
4119 avdevice_register_all();
4122 avfilter_register_all();
4126 avio_set_interrupt_cb(decode_interrupt_cb);
4131 parse_options(&o, argc, argv, options, opt_output_file);
4133 if(nb_output_files <= 0 && nb_input_files == 0) {
4135 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4139 /* file converter / grab */
4140 if (nb_output_files <= 0) {
4141 fprintf(stderr, "At least one output file must be specified\n");
4145 if (nb_input_files == 0) {
4146 fprintf(stderr, "At least one input file must be specified\n");
4151 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4153 ti = getutime() - ti;
4155 int maxrss = getmaxrss() / 1024;
4156 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);