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 static AVDictionary *ts_scale;
102 /* indexed by output file stream index */
103 static int *streamid_map = NULL;
104 static int nb_streamid_map = 0;
106 static int frame_width = 0;
107 static int frame_height = 0;
108 static float frame_aspect_ratio = 0;
109 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
110 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
111 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
112 static AVRational frame_rate;
113 static float video_qscale = 0;
114 static uint16_t *intra_matrix = NULL;
115 static uint16_t *inter_matrix = NULL;
116 static const char *video_rc_override_string=NULL;
117 static int video_disable = 0;
118 static int video_discard = 0;
119 static unsigned int video_codec_tag = 0;
120 static char *video_language = NULL;
121 static int same_quant = 0;
122 static int do_deinterlace = 0;
123 static int top_field_first = -1;
124 static int me_threshold = 0;
125 static int intra_dc_precision = 8;
126 static int qp_hist = 0;
128 static char *vfilters = NULL;
131 static int audio_sample_rate = 0;
132 #define QSCALE_NONE -99999
133 static float audio_qscale = QSCALE_NONE;
134 static int audio_disable = 0;
135 static int audio_channels = 0;
136 static unsigned int audio_codec_tag = 0;
137 static char *audio_language = NULL;
139 static int subtitle_disable = 0;
140 static char *subtitle_language = NULL;
141 static unsigned int subtitle_codec_tag = 0;
143 static int data_disable = 0;
144 static unsigned int data_codec_tag = 0;
146 static float mux_preload= 0.5;
147 static float mux_max_delay= 0.7;
149 static int file_overwrite = 0;
150 static AVDictionary *metadata;
151 static int do_benchmark = 0;
152 static int do_hex_dump = 0;
153 static int do_pkt_dump = 0;
154 static int do_psnr = 0;
155 static int do_pass = 0;
156 static char *pass_logfilename_prefix = NULL;
157 static int video_sync_method= -1;
158 static int audio_sync_method= 0;
159 static float audio_drift_threshold= 0.1;
160 static int copy_ts= 0;
162 static int opt_shortest = 0;
163 static char *vstats_filename;
164 static FILE *vstats_file;
165 static int opt_programid = 0;
166 static int copy_initial_nonkeyframes = 0;
168 static int rate_emu = 0;
170 static int audio_volume = 256;
172 static int exit_on_error = 0;
173 static int using_stdin = 0;
174 static int verbose = 1;
175 static int64_t video_size = 0;
176 static int64_t audio_size = 0;
177 static int64_t extra_size = 0;
178 static int nb_frames_dup = 0;
179 static int nb_frames_drop = 0;
180 static int input_sync;
181 static int force_fps = 0;
182 static char *forced_key_frames = NULL;
184 static float dts_delta_threshold = 10;
186 static uint8_t *audio_buf;
187 static uint8_t *audio_out;
188 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
190 static short *samples;
192 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
193 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
194 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
196 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
198 typedef struct InputStream {
201 int discard; /* true if stream data should be discarded */
202 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
205 int64_t start; /* time when read started */
206 int64_t next_pts; /* synthetic pts for cases where pkt.pts
208 int64_t pts; /* current pts */
209 PtsCorrectionContext pts_ctx;
211 int is_start; /* is 1 at the start and after a discontinuity */
212 int showed_multi_packet_warning;
216 typedef struct InputFile {
217 AVFormatContext *ctx;
218 int eof_reached; /* true if eof reached */
219 int ist_index; /* index of first stream in ist_table */
220 int buffer_size; /* current total buffer size */
222 int nb_streams; /* number of stream that avconv is aware of; may be different
223 from ctx.nb_streams if new streams appear during av_read_frame() */
226 typedef struct OutputStream {
227 int file_index; /* file index */
228 int index; /* stream index in the output file */
229 int source_index; /* InputStream index */
230 AVStream *st; /* stream in the output file */
231 int encoding_needed; /* true if encoding needed for this stream */
233 /* input pts and corresponding output pts
235 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
236 struct InputStream *sync_ist; /* input stream to sync against */
237 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
238 AVBitStreamFilterContext *bitstream_filters;
243 AVFrame pict_tmp; /* temporary image for resampling */
244 struct SwsContext *img_resample_ctx; /* for image resampling */
247 int resample_pix_fmt;
248 AVRational frame_rate;
250 float frame_aspect_ratio;
252 /* forced key frames */
253 int64_t *forced_kf_pts;
259 ReSampleContext *resample; /* for audio resampling */
260 int resample_sample_fmt;
261 int resample_channels;
262 int resample_sample_rate;
264 AVAudioConvert *reformat_ctx;
265 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
269 AVFilterContext *output_video_filter;
270 AVFilterContext *input_video_filter;
271 AVFilterBufferRef *picref;
273 AVFilterGraph *graph;
278 int is_past_recording_time;
282 typedef struct OutputFile {
283 AVFormatContext *ctx;
285 int ost_index; /* index of the first stream in output_streams */
286 int64_t recording_time; /* desired length of the resulting file in microseconds */
287 int64_t start_time; /* start time in microseconds */
288 uint64_t limit_filesize;
291 static InputStream *input_streams = NULL;
292 static int nb_input_streams = 0;
293 static InputFile *input_files = NULL;
294 static int nb_input_files = 0;
296 static OutputStream *output_streams = NULL;
297 static int nb_output_streams = 0;
298 static OutputFile *output_files = NULL;
299 static int nb_output_files = 0;
301 typedef struct OptionsContext {
302 /* input/output options */
306 SpecifierOpt *codec_names;
310 int64_t input_ts_offset;
313 StreamMap *stream_maps;
315 /* first item specifies output metadata, second is input */
316 MetadataMap (*meta_data_maps)[2];
317 int nb_meta_data_maps;
318 int metadata_global_manual;
319 int metadata_streams_manual;
320 int metadata_chapters_manual;
322 int chapters_input_file;
324 int64_t recording_time;
325 uint64_t limit_filesize;
328 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
331 for (i = 0; i < o->nb_ ## name; i++) {\
332 char *spec = o->name[i].specifier;\
333 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
334 outvar = o->name[i].u.type;\
340 static void reset_options(OptionsContext *o)
342 const OptionDef *po = options;
344 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
346 void *dst = (uint8_t*)o + po->u.off;
348 if (po->flags & OPT_SPEC) {
349 SpecifierOpt **so = dst;
350 int i, *count = (int*)(so + 1);
351 for (i = 0; i < *count; i++) {
352 av_freep(&(*so)[i].specifier);
353 if (po->flags & OPT_STRING)
354 av_freep(&(*so)[i].u.str);
358 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
363 av_freep(&o->stream_maps);
364 av_freep(&o->meta_data_maps);
366 memset(o, 0, sizeof(*o));
368 o->recording_time = INT64_MAX;
369 o->limit_filesize = UINT64_MAX;
370 o->chapters_input_file = INT_MAX;
378 static int configure_video_filters(InputStream *ist, OutputStream *ost)
380 AVFilterContext *last_filter, *filter;
381 /** filter graph containing all filters including input & output */
382 AVCodecContext *codec = ost->st->codec;
383 AVCodecContext *icodec = ist->st->codec;
384 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
385 AVRational sample_aspect_ratio;
389 ost->graph = avfilter_graph_alloc();
391 if (ist->st->sample_aspect_ratio.num){
392 sample_aspect_ratio = ist->st->sample_aspect_ratio;
394 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
396 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
397 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
398 sample_aspect_ratio.num, sample_aspect_ratio.den);
400 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
401 "src", args, NULL, ost->graph);
404 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
405 "out", NULL, &ffsink_ctx, ost->graph);
408 last_filter = ost->input_video_filter;
410 if (codec->width != icodec->width || codec->height != icodec->height) {
411 snprintf(args, 255, "%d:%d:flags=0x%X",
415 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
416 NULL, args, NULL, ost->graph)) < 0)
418 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
420 last_filter = filter;
423 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
424 ost->graph->scale_sws_opts = av_strdup(args);
427 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
428 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
430 outputs->name = av_strdup("in");
431 outputs->filter_ctx = last_filter;
432 outputs->pad_idx = 0;
433 outputs->next = NULL;
435 inputs->name = av_strdup("out");
436 inputs->filter_ctx = ost->output_video_filter;
440 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
442 av_freep(&ost->avfilter);
444 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
448 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
451 codec->width = ost->output_video_filter->inputs[0]->w;
452 codec->height = ost->output_video_filter->inputs[0]->h;
453 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
454 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
455 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
456 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
460 #endif /* CONFIG_AVFILTER */
462 static void term_exit(void)
464 av_log(NULL, AV_LOG_QUIET, "");
467 static volatile int received_sigterm = 0;
468 static volatile int received_nb_signals = 0;
471 sigterm_handler(int sig)
473 received_sigterm = sig;
474 received_nb_signals++;
478 static void term_init(void)
480 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
481 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
483 signal(SIGXCPU, sigterm_handler);
487 static int decode_interrupt_cb(void)
489 return received_nb_signals > 1;
492 void exit_program(int ret)
497 for(i=0;i<nb_output_files;i++) {
498 AVFormatContext *s = output_files[i].ctx;
499 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
501 avformat_free_context(s);
502 av_dict_free(&output_files[i].opts);
504 for(i=0;i<nb_input_files;i++) {
505 av_close_input_file(input_files[i].ctx);
507 for (i = 0; i < nb_input_streams; i++)
508 av_dict_free(&input_streams[i].opts);
510 av_free(intra_matrix);
511 av_free(inter_matrix);
515 av_free(vstats_filename);
517 av_freep(&input_streams);
518 av_freep(&input_files);
519 av_freep(&output_streams);
520 av_freep(&output_files);
525 allocated_audio_buf_size= allocated_audio_out_size= 0;
532 if (received_sigterm) {
534 "Received signal %d: terminating.\n",
535 (int) received_sigterm);
539 exit(ret); /* not all OS-es handle main() return value */
542 static void assert_avoptions(AVDictionary *m)
544 AVDictionaryEntry *t;
545 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
546 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
551 static void assert_codec_experimental(AVCodecContext *c, int encoder)
553 const char *codec_string = encoder ? "encoder" : "decoder";
555 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
556 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
557 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
558 "results.\nAdd '-strict experimental' if you want to use it.\n",
559 codec_string, c->codec->name);
560 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
561 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
562 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
563 codec_string, codec->name);
568 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
570 if(codec && codec->sample_fmts){
571 const enum AVSampleFormat *p= codec->sample_fmts;
573 if(*p == st->codec->sample_fmt)
577 av_log(NULL, AV_LOG_WARNING,
578 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
579 av_get_sample_fmt_name(st->codec->sample_fmt),
581 av_get_sample_fmt_name(codec->sample_fmts[0]));
582 st->codec->sample_fmt = codec->sample_fmts[0];
588 * Update the requested input sample format based on the output sample format.
589 * This is currently only used to request float output from decoders which
590 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
591 * Ideally this will be removed in the future when decoders do not do format
592 * conversion and only output in their native format.
594 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
597 /* if sample formats match or a decoder sample format has already been
598 requested, just return */
599 if (enc->sample_fmt == dec->sample_fmt ||
600 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
603 /* if decoder supports more than one output format */
604 if (dec_codec && dec_codec->sample_fmts &&
605 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
606 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
607 const enum AVSampleFormat *p;
608 int min_dec = -1, min_inc = -1;
610 /* find a matching sample format in the encoder */
611 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
612 if (*p == enc->sample_fmt) {
613 dec->request_sample_fmt = *p;
615 } else if (*p > enc->sample_fmt) {
616 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
618 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
621 /* if none match, provide the one that matches quality closest */
622 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
623 enc->sample_fmt - min_dec;
627 static void choose_sample_rate(AVStream *st, AVCodec *codec)
629 if(codec && codec->supported_samplerates){
630 const int *p= codec->supported_samplerates;
632 int best_dist=INT_MAX;
634 int dist= abs(st->codec->sample_rate - *p);
635 if(dist < best_dist){
641 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
643 st->codec->sample_rate= best;
647 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
649 if(codec && codec->pix_fmts){
650 const enum PixelFormat *p= codec->pix_fmts;
651 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
652 if(st->codec->codec_id==CODEC_ID_MJPEG){
653 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
654 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
655 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};
659 if(*p == st->codec->pix_fmt)
663 if(st->codec->pix_fmt != PIX_FMT_NONE)
664 av_log(NULL, AV_LOG_WARNING,
665 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
666 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
668 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
669 st->codec->pix_fmt = codec->pix_fmts[0];
675 get_sync_ipts(const OutputStream *ost)
677 const InputStream *ist = ost->sync_ist;
678 OutputFile *of = &output_files[ost->file_index];
679 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
682 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
686 AVPacket new_pkt= *pkt;
687 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
688 &new_pkt.data, &new_pkt.size,
689 pkt->data, pkt->size,
690 pkt->flags & AV_PKT_FLAG_KEY);
693 new_pkt.destruct= av_destruct_packet;
695 fprintf(stderr, "%s failed for stream %d, codec %s",
696 bsfc->filter->name, pkt->stream_index,
697 avctx->codec ? avctx->codec->name : "copy");
707 ret= av_interleaved_write_frame(s, pkt);
709 print_error("av_interleaved_write_frame()", ret);
714 static void do_audio_out(AVFormatContext *s,
717 unsigned char *buf, int size)
720 int64_t audio_out_size, audio_buf_size;
721 int64_t allocated_for_size= size;
723 int size_out, frame_bytes, ret, resample_changed;
724 AVCodecContext *enc= ost->st->codec;
725 AVCodecContext *dec= ist->st->codec;
726 int osize = av_get_bytes_per_sample(enc->sample_fmt);
727 int isize = av_get_bytes_per_sample(dec->sample_fmt);
728 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
731 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
732 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
733 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
734 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
735 audio_buf_size*= osize*enc->channels;
737 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
738 if(coded_bps > 8*osize)
739 audio_out_size= audio_out_size * coded_bps / (8*osize);
740 audio_out_size += FF_MIN_BUFFER_SIZE;
742 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
743 fprintf(stderr, "Buffer sizes too large\n");
747 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
748 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
749 if (!audio_buf || !audio_out){
750 fprintf(stderr, "Out of memory in do_audio_out\n");
754 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
755 ost->audio_resample = 1;
757 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
758 ost->resample_channels != dec->channels ||
759 ost->resample_sample_rate != dec->sample_rate;
761 if ((ost->audio_resample && !ost->resample) || resample_changed) {
762 if (resample_changed) {
763 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",
764 ist->file_index, ist->st->index,
765 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
766 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
767 ost->resample_sample_fmt = dec->sample_fmt;
768 ost->resample_channels = dec->channels;
769 ost->resample_sample_rate = dec->sample_rate;
771 audio_resample_close(ost->resample);
773 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
774 if (audio_sync_method <= 1 &&
775 ost->resample_sample_fmt == enc->sample_fmt &&
776 ost->resample_channels == enc->channels &&
777 ost->resample_sample_rate == enc->sample_rate) {
778 ost->resample = NULL;
779 ost->audio_resample = 0;
780 } else if (ost->audio_resample) {
781 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
782 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
783 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
784 enc->sample_rate, dec->sample_rate,
785 enc->sample_fmt, dec->sample_fmt,
787 if (!ost->resample) {
788 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
789 dec->channels, dec->sample_rate,
790 enc->channels, enc->sample_rate);
796 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
797 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
798 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
799 if (ost->reformat_ctx)
800 av_audio_convert_free(ost->reformat_ctx);
801 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
802 dec->sample_fmt, 1, NULL, 0);
803 if (!ost->reformat_ctx) {
804 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
805 av_get_sample_fmt_name(dec->sample_fmt),
806 av_get_sample_fmt_name(enc->sample_fmt));
809 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
812 if(audio_sync_method){
813 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
814 - av_fifo_size(ost->fifo)/(enc->channels * 2);
815 double idelta= delta*dec->sample_rate / enc->sample_rate;
816 int byte_delta= ((int)idelta)*2*dec->channels;
818 //FIXME resample delay
819 if(fabs(delta) > 50){
820 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
822 byte_delta= FFMAX(byte_delta, -size);
826 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
831 static uint8_t *input_tmp= NULL;
832 input_tmp= av_realloc(input_tmp, byte_delta + size);
834 if(byte_delta > allocated_for_size - size){
835 allocated_for_size= byte_delta + (int64_t)size;
840 memset(input_tmp, 0, byte_delta);
841 memcpy(input_tmp + byte_delta, buf, size);
845 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
847 }else if(audio_sync_method>1){
848 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
849 av_assert0(ost->audio_resample);
851 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
852 // 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));
853 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
857 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
858 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
860 if (ost->audio_resample) {
862 size_out = audio_resample(ost->resample,
863 (short *)buftmp, (short *)buf,
864 size / (dec->channels * isize));
865 size_out = size_out * enc->channels * osize;
871 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
872 const void *ibuf[6]= {buftmp};
873 void *obuf[6]= {audio_buf};
874 int istride[6]= {isize};
875 int ostride[6]= {osize};
876 int len= size_out/istride[0];
877 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
878 printf("av_audio_convert() failed\n");
884 size_out = len*osize;
887 /* now encode as many frames as possible */
888 if (enc->frame_size > 1) {
889 /* output resampled raw samples */
890 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
891 fprintf(stderr, "av_fifo_realloc2() failed\n");
894 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
896 frame_bytes = enc->frame_size * osize * enc->channels;
898 while (av_fifo_size(ost->fifo) >= frame_bytes) {
900 av_init_packet(&pkt);
902 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
904 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
906 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
909 fprintf(stderr, "Audio encoding failed\n");
913 pkt.stream_index= ost->index;
916 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
917 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
918 pkt.flags |= AV_PKT_FLAG_KEY;
919 write_frame(s, &pkt, enc, ost->bitstream_filters);
921 ost->sync_opts += enc->frame_size;
925 av_init_packet(&pkt);
927 ost->sync_opts += size_out / (osize * enc->channels);
929 /* output a pcm frame */
930 /* determine the size of the coded buffer */
933 size_out = size_out*coded_bps/8;
935 if(size_out > audio_out_size){
936 fprintf(stderr, "Internal error, buffer size too small\n");
940 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
941 ret = avcodec_encode_audio(enc, audio_out, size_out,
944 fprintf(stderr, "Audio encoding failed\n");
948 pkt.stream_index= ost->index;
951 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
952 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
953 pkt.flags |= AV_PKT_FLAG_KEY;
954 write_frame(s, &pkt, enc, ost->bitstream_filters);
958 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
962 AVPicture picture_tmp;
965 dec = ist->st->codec;
967 /* deinterlace : must be done before any resize */
968 if (do_deinterlace) {
971 /* create temporary picture */
972 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
973 buf = av_malloc(size);
977 picture2 = &picture_tmp;
978 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
980 if(avpicture_deinterlace(picture2, picture,
981 dec->pix_fmt, dec->width, dec->height) < 0) {
982 /* if error, do not deinterlace */
983 fprintf(stderr, "Deinterlacing failed\n");
992 if (picture != picture2)
993 *picture = *picture2;
997 static void do_subtitle_out(AVFormatContext *s,
1003 static uint8_t *subtitle_out = NULL;
1004 int subtitle_out_max_size = 1024 * 1024;
1005 int subtitle_out_size, nb, i;
1006 AVCodecContext *enc;
1009 if (pts == AV_NOPTS_VALUE) {
1010 fprintf(stderr, "Subtitle packets must have a pts\n");
1016 enc = ost->st->codec;
1018 if (!subtitle_out) {
1019 subtitle_out = av_malloc(subtitle_out_max_size);
1022 /* Note: DVB subtitle need one packet to draw them and one other
1023 packet to clear them */
1024 /* XXX: signal it in the codec context ? */
1025 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1030 for(i = 0; i < nb; i++) {
1031 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1032 // start_display_time is required to be 0
1033 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1034 sub->end_display_time -= sub->start_display_time;
1035 sub->start_display_time = 0;
1036 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1037 subtitle_out_max_size, sub);
1038 if (subtitle_out_size < 0) {
1039 fprintf(stderr, "Subtitle encoding failed\n");
1043 av_init_packet(&pkt);
1044 pkt.stream_index = ost->index;
1045 pkt.data = subtitle_out;
1046 pkt.size = subtitle_out_size;
1047 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1048 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1049 /* XXX: the pts correction is handled here. Maybe handling
1050 it in the codec would be better */
1052 pkt.pts += 90 * sub->start_display_time;
1054 pkt.pts += 90 * sub->end_display_time;
1056 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1060 static int bit_buffer_size= 1024*256;
1061 static uint8_t *bit_buffer= NULL;
1063 static void do_video_resample(OutputStream *ost,
1065 AVFrame *in_picture,
1066 AVFrame **out_picture)
1068 int resample_changed = 0;
1069 AVCodecContext *dec = ist->st->codec;
1070 *out_picture = in_picture;
1072 resample_changed = ost->resample_width != dec->width ||
1073 ost->resample_height != dec->height ||
1074 ost->resample_pix_fmt != dec->pix_fmt;
1076 if (resample_changed) {
1077 av_log(NULL, AV_LOG_INFO,
1078 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1079 ist->file_index, ist->st->index,
1080 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1081 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1082 if(!ost->video_resample)
1083 ost->video_resample = 1;
1086 #if !CONFIG_AVFILTER
1087 if (ost->video_resample) {
1088 *out_picture = &ost->pict_tmp;
1089 if (resample_changed) {
1090 /* initialize a new scaler context */
1091 sws_freeContext(ost->img_resample_ctx);
1092 ost->img_resample_ctx = sws_getContext(
1093 ist->st->codec->width,
1094 ist->st->codec->height,
1095 ist->st->codec->pix_fmt,
1096 ost->st->codec->width,
1097 ost->st->codec->height,
1098 ost->st->codec->pix_fmt,
1099 ost->sws_flags, NULL, NULL, NULL);
1100 if (ost->img_resample_ctx == NULL) {
1101 fprintf(stderr, "Cannot get resampling context\n");
1105 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1106 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1109 if (resample_changed) {
1110 avfilter_graph_free(&ost->graph);
1111 if (configure_video_filters(ist, ost)) {
1112 fprintf(stderr, "Error reinitializing filters!\n");
1117 if (resample_changed) {
1118 ost->resample_width = dec->width;
1119 ost->resample_height = dec->height;
1120 ost->resample_pix_fmt = dec->pix_fmt;
1125 static void do_video_out(AVFormatContext *s,
1128 AVFrame *in_picture,
1129 int *frame_size, float quality)
1131 int nb_frames, i, ret, format_video_sync;
1132 AVFrame *final_picture;
1133 AVCodecContext *enc;
1136 enc = ost->st->codec;
1138 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1140 /* by default, we output a single frame */
1145 format_video_sync = video_sync_method;
1146 if (format_video_sync < 0)
1147 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1149 if (format_video_sync) {
1150 double vdelta = sync_ipts - ost->sync_opts;
1151 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1154 else if (format_video_sync == 2) {
1157 }else if(vdelta>0.6)
1158 ost->sync_opts= lrintf(sync_ipts);
1159 }else if (vdelta > 1.1)
1160 nb_frames = lrintf(vdelta);
1161 //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);
1162 if (nb_frames == 0){
1165 fprintf(stderr, "*** drop!\n");
1166 }else if (nb_frames > 1) {
1167 nb_frames_dup += nb_frames - 1;
1169 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1172 ost->sync_opts= lrintf(sync_ipts);
1174 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1178 do_video_resample(ost, ist, in_picture, &final_picture);
1180 /* duplicates frame if needed */
1181 for(i=0;i<nb_frames;i++) {
1183 av_init_packet(&pkt);
1184 pkt.stream_index= ost->index;
1186 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1187 /* raw pictures are written as AVPicture structure to
1188 avoid any copies. We support temporarily the older
1190 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1191 enc->coded_frame->top_field_first = in_picture->top_field_first;
1192 pkt.data= (uint8_t *)final_picture;
1193 pkt.size= sizeof(AVPicture);
1194 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1195 pkt.flags |= AV_PKT_FLAG_KEY;
1197 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1199 AVFrame big_picture;
1201 big_picture= *final_picture;
1202 /* better than nothing: use input picture interlaced
1204 big_picture.interlaced_frame = in_picture->interlaced_frame;
1205 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1206 if(top_field_first == -1)
1207 big_picture.top_field_first = in_picture->top_field_first;
1209 big_picture.top_field_first = top_field_first;
1212 /* handles same_quant here. This is not correct because it may
1213 not be a global option */
1214 big_picture.quality = quality;
1216 big_picture.pict_type = 0;
1217 // big_picture.pts = AV_NOPTS_VALUE;
1218 big_picture.pts= ost->sync_opts;
1219 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1220 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1221 if (ost->forced_kf_index < ost->forced_kf_count &&
1222 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1223 big_picture.pict_type = AV_PICTURE_TYPE_I;
1224 ost->forced_kf_index++;
1226 ret = avcodec_encode_video(enc,
1227 bit_buffer, bit_buffer_size,
1230 fprintf(stderr, "Video encoding failed\n");
1235 pkt.data= bit_buffer;
1237 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1238 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1239 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1240 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1241 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1243 if(enc->coded_frame->key_frame)
1244 pkt.flags |= AV_PKT_FLAG_KEY;
1245 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1248 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1249 // enc->frame_number-1, ret, enc->pict_type);
1250 /* if two pass, output log */
1251 if (ost->logfile && enc->stats_out) {
1252 fprintf(ost->logfile, "%s", enc->stats_out);
1257 ost->frame_number++;
1261 static double psnr(double d){
1262 return -10.0*log(d)/log(10.0);
1265 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1268 AVCodecContext *enc;
1270 double ti1, bitrate, avg_bitrate;
1272 /* this is executed just the first time do_video_stats is called */
1274 vstats_file = fopen(vstats_filename, "w");
1281 enc = ost->st->codec;
1282 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1283 frame_number = ost->frame_number;
1284 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1285 if (enc->flags&CODEC_FLAG_PSNR)
1286 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1288 fprintf(vstats_file,"f_size= %6d ", frame_size);
1289 /* compute pts value */
1290 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1294 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1295 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1296 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1297 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1298 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1302 static void print_report(OutputFile *output_files,
1303 OutputStream *ost_table, int nb_ostreams,
1304 int is_last_report, int64_t timer_start)
1308 AVFormatContext *oc;
1310 AVCodecContext *enc;
1311 int frame_number, vid, i;
1312 double bitrate, ti1, pts;
1313 static int64_t last_time = -1;
1314 static int qp_histogram[52];
1316 if (!is_last_report) {
1318 /* display the report every 0.5 seconds */
1319 cur_time = av_gettime();
1320 if (last_time == -1) {
1321 last_time = cur_time;
1324 if ((cur_time - last_time) < 500000)
1326 last_time = cur_time;
1330 oc = output_files[0].ctx;
1332 total_size = avio_size(oc->pb);
1333 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1334 total_size= avio_tell(oc->pb);
1339 for(i=0;i<nb_ostreams;i++) {
1341 ost = &ost_table[i];
1342 enc = ost->st->codec;
1343 if (!ost->st->stream_copy && enc->coded_frame)
1344 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1345 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1346 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1348 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1349 float t = (av_gettime()-timer_start) / 1000000.0;
1351 frame_number = ost->frame_number;
1352 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1353 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1355 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1359 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1362 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1364 if (enc->flags&CODEC_FLAG_PSNR){
1366 double error, error_sum=0;
1367 double scale, scale_sum=0;
1368 char type[3]= {'Y','U','V'};
1369 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1372 error= enc->error[j];
1373 scale= enc->width*enc->height*255.0*255.0*frame_number;
1375 error= enc->coded_frame->error[j];
1376 scale= enc->width*enc->height*255.0*255.0;
1381 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1383 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1387 /* compute min output value */
1388 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1389 if ((pts < ti1) && (pts > 0))
1395 if (verbose > 0 || is_last_report) {
1396 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1398 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1399 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1400 (double)total_size / 1024, ti1, bitrate);
1402 if (nb_frames_dup || nb_frames_drop)
1403 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1404 nb_frames_dup, nb_frames_drop);
1407 fprintf(stderr, "%s \r", buf);
1412 if (is_last_report && verbose >= 0){
1413 int64_t raw= audio_size + video_size + extra_size;
1414 fprintf(stderr, "\n");
1415 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1419 100.0*(total_size - raw)/raw
1424 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1426 int fill_char = 0x00;
1427 if (sample_fmt == AV_SAMPLE_FMT_U8)
1429 memset(buf, fill_char, size);
1432 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1436 for (i = 0; i < nb_ostreams; i++) {
1437 OutputStream *ost = &ost_table[i];
1438 AVCodecContext *enc = ost->st->codec;
1439 AVFormatContext *os = output_files[ost->file_index].ctx;
1441 if (!ost->encoding_needed)
1444 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1446 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1452 av_init_packet(&pkt);
1453 pkt.stream_index= ost->index;
1455 switch (ost->st->codec->codec_type) {
1456 case AVMEDIA_TYPE_AUDIO:
1457 fifo_bytes = av_fifo_size(ost->fifo);
1459 /* encode any samples remaining in fifo */
1460 if (fifo_bytes > 0) {
1461 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1462 int fs_tmp = enc->frame_size;
1464 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1465 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1466 enc->frame_size = fifo_bytes / (osize * enc->channels);
1468 int frame_bytes = enc->frame_size*osize*enc->channels;
1469 if (allocated_audio_buf_size < frame_bytes)
1471 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1474 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1475 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1476 ost->st->time_base.num, enc->sample_rate);
1477 enc->frame_size = fs_tmp;
1480 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1483 fprintf(stderr, "Audio encoding failed\n");
1487 pkt.flags |= AV_PKT_FLAG_KEY;
1489 case AVMEDIA_TYPE_VIDEO:
1490 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1492 fprintf(stderr, "Video encoding failed\n");
1496 if(enc->coded_frame && enc->coded_frame->key_frame)
1497 pkt.flags |= AV_PKT_FLAG_KEY;
1498 if (ost->logfile && enc->stats_out) {
1499 fprintf(ost->logfile, "%s", enc->stats_out);
1508 pkt.data = bit_buffer;
1510 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1511 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1512 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1517 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1518 static int output_packet(InputStream *ist, int ist_index,
1519 OutputStream *ost_table, int nb_ostreams,
1520 const AVPacket *pkt)
1522 AVFormatContext *os;
1527 void *buffer_to_free = NULL;
1528 static unsigned int samples_size= 0;
1529 AVSubtitle subtitle, *subtitle_to_free;
1530 int64_t pkt_pts = AV_NOPTS_VALUE;
1532 int frame_available;
1537 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1539 if(ist->next_pts == AV_NOPTS_VALUE)
1540 ist->next_pts= ist->pts;
1544 av_init_packet(&avpkt);
1552 if(pkt->dts != AV_NOPTS_VALUE)
1553 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1554 if(pkt->pts != AV_NOPTS_VALUE)
1555 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1557 //while we have more to decode or while the decoder did output something on EOF
1558 while (avpkt.size > 0 || (!pkt && got_output)) {
1559 uint8_t *data_buf, *decoded_data_buf;
1560 int data_size, decoded_data_size;
1562 ist->pts= ist->next_pts;
1564 if(avpkt.size && avpkt.size != pkt->size &&
1565 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1566 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1567 ist->showed_multi_packet_warning=1;
1570 /* decode the packet if needed */
1571 decoded_data_buf = NULL; /* fail safe */
1572 decoded_data_size= 0;
1573 data_buf = avpkt.data;
1574 data_size = avpkt.size;
1575 subtitle_to_free = NULL;
1576 if (ist->decoding_needed) {
1577 switch(ist->st->codec->codec_type) {
1578 case AVMEDIA_TYPE_AUDIO:{
1579 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1580 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1582 samples= av_malloc(samples_size);
1584 decoded_data_size= samples_size;
1585 /* XXX: could avoid copy if PCM 16 bits with same
1586 endianness as CPU */
1587 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1594 got_output = decoded_data_size > 0;
1595 /* Some bug in mpeg audio decoder gives */
1596 /* decoded_data_size < 0, it seems they are overflows */
1598 /* no audio frame */
1601 decoded_data_buf = (uint8_t *)samples;
1602 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1603 (ist->st->codec->sample_rate * ist->st->codec->channels);
1605 case AVMEDIA_TYPE_VIDEO:
1606 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1607 /* XXX: allocate picture correctly */
1608 avcodec_get_frame_defaults(&picture);
1609 avpkt.pts = pkt_pts;
1610 avpkt.dts = ist->pts;
1611 pkt_pts = AV_NOPTS_VALUE;
1613 ret = avcodec_decode_video2(ist->st->codec,
1614 &picture, &got_output, &avpkt);
1615 quality = same_quant ? picture.quality : 0;
1619 /* no picture yet */
1620 goto discard_packet;
1622 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1623 if (ist->st->codec->time_base.num != 0) {
1624 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1625 ist->next_pts += ((int64_t)AV_TIME_BASE *
1626 ist->st->codec->time_base.num * ticks) /
1627 ist->st->codec->time_base.den;
1630 buffer_to_free = NULL;
1631 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1633 case AVMEDIA_TYPE_SUBTITLE:
1634 ret = avcodec_decode_subtitle2(ist->st->codec,
1635 &subtitle, &got_output, &avpkt);
1639 goto discard_packet;
1641 subtitle_to_free = &subtitle;
1648 switch(ist->st->codec->codec_type) {
1649 case AVMEDIA_TYPE_AUDIO:
1650 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1651 ist->st->codec->sample_rate;
1653 case AVMEDIA_TYPE_VIDEO:
1654 if (ist->st->codec->time_base.num != 0) {
1655 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1656 ist->next_pts += ((int64_t)AV_TIME_BASE *
1657 ist->st->codec->time_base.num * ticks) /
1658 ist->st->codec->time_base.den;
1665 // preprocess audio (volume)
1666 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1667 if (audio_volume != 256) {
1670 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1671 int v = ((*volp) * audio_volume + 128) >> 8;
1672 *volp++ = av_clip_int16(v);
1677 /* frame rate emulation */
1679 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1680 int64_t now = av_gettime() - ist->start;
1684 /* if output time reached then transcode raw format,
1685 encode packets and output them */
1686 for (i = 0; i < nb_ostreams; i++) {
1687 OutputFile *of = &output_files[ost_table[i].file_index];
1690 ost = &ost_table[i];
1691 if (ost->source_index != ist_index)
1694 if (of->start_time && ist->pts < of->start_time)
1697 if (of->recording_time != INT64_MAX &&
1698 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1699 (AVRational){1, 1000000}) >= 0) {
1700 ost->is_past_recording_time = 1;
1705 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1706 ost->input_video_filter) {
1708 if (ist->st->sample_aspect_ratio.num)
1709 sar = ist->st->sample_aspect_ratio;
1711 sar = ist->st->codec->sample_aspect_ratio;
1712 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, ist->pts, sar);
1714 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1715 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1716 while (frame_available) {
1717 AVRational ist_pts_tb;
1718 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1719 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1721 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1723 os = output_files[ost->file_index].ctx;
1725 /* set the input output pts pairs */
1726 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1728 if (ost->encoding_needed) {
1729 av_assert0(ist->decoding_needed);
1730 switch(ost->st->codec->codec_type) {
1731 case AVMEDIA_TYPE_AUDIO:
1732 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1734 case AVMEDIA_TYPE_VIDEO:
1736 if (ost->picref->video && !ost->frame_aspect_ratio)
1737 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1739 do_video_out(os, ost, ist, &picture, &frame_size,
1740 same_quant ? quality : ost->st->codec->global_quality);
1741 if (vstats_filename && frame_size)
1742 do_video_stats(os, ost, frame_size);
1744 case AVMEDIA_TYPE_SUBTITLE:
1745 do_subtitle_out(os, ost, ist, &subtitle,
1752 AVFrame avframe; //FIXME/XXX remove this
1754 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1756 av_init_packet(&opkt);
1758 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1759 #if !CONFIG_AVFILTER
1765 /* no reencoding needed : output the packet directly */
1766 /* force the input stream PTS */
1768 avcodec_get_frame_defaults(&avframe);
1769 ost->st->codec->coded_frame= &avframe;
1770 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1772 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1773 audio_size += data_size;
1774 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1775 video_size += data_size;
1779 opkt.stream_index= ost->index;
1780 if(pkt->pts != AV_NOPTS_VALUE)
1781 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1783 opkt.pts= AV_NOPTS_VALUE;
1785 if (pkt->dts == AV_NOPTS_VALUE)
1786 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1788 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1789 opkt.dts -= ost_tb_start_time;
1791 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1792 opkt.flags= pkt->flags;
1794 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1795 if( ost->st->codec->codec_id != CODEC_ID_H264
1796 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1797 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1799 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1800 opkt.destruct= av_destruct_packet;
1802 opkt.data = data_buf;
1803 opkt.size = data_size;
1806 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1807 ost->st->codec->frame_number++;
1808 ost->frame_number++;
1809 av_free_packet(&opkt);
1813 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1814 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1816 avfilter_unref_buffer(ost->picref);
1821 av_free(buffer_to_free);
1822 /* XXX: allocate the subtitles in the codec ? */
1823 if (subtitle_to_free) {
1824 avsubtitle_free(subtitle_to_free);
1825 subtitle_to_free = NULL;
1833 static void print_sdp(OutputFile *output_files, int n)
1837 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1841 for (i = 0; i < n; i++)
1842 avc[i] = output_files[i].ctx;
1844 av_sdp_create(avc, n, sdp, sizeof(sdp));
1845 printf("SDP:\n%s\n", sdp);
1850 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1851 char *error, int error_len)
1854 InputStream *ist = &input_streams[ist_index];
1855 if (ist->decoding_needed) {
1856 AVCodec *codec = ist->dec;
1858 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d.%d",
1859 ist->st->codec->codec_id, ist->file_index, ist->st->index);
1860 return AVERROR(EINVAL);
1863 /* update requested sample format for the decoder based on the
1864 corresponding encoder sample format */
1865 for (i = 0; i < nb_output_streams; i++) {
1866 OutputStream *ost = &output_streams[i];
1867 if (ost->source_index == ist_index) {
1868 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
1873 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1874 snprintf(error, error_len, "Error while opening decoder for input stream #%d.%d",
1875 ist->file_index, ist->st->index);
1876 return AVERROR(EINVAL);
1878 assert_codec_experimental(ist->st->codec, 0);
1879 assert_avoptions(ist->opts);
1882 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;
1883 ist->next_pts = AV_NOPTS_VALUE;
1884 init_pts_correction(&ist->pts_ctx);
1890 static int transcode_init(OutputFile *output_files,
1891 int nb_output_files,
1892 InputFile *input_files,
1896 AVFormatContext *os;
1897 AVCodecContext *codec, *icodec;
1904 for (i = 0; i < nb_input_streams; i++)
1905 input_streams[i].start = av_gettime();
1907 /* output stream init */
1908 for(i=0;i<nb_output_files;i++) {
1909 os = output_files[i].ctx;
1910 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1911 av_dump_format(os, i, os->filename, 1);
1912 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1913 return AVERROR(EINVAL);
1917 /* for each output stream, we compute the right encoding parameters */
1918 for (i = 0; i < nb_output_streams; i++) {
1919 ost = &output_streams[i];
1920 os = output_files[ost->file_index].ctx;
1921 ist = &input_streams[ost->source_index];
1923 codec = ost->st->codec;
1924 icodec = ist->st->codec;
1926 ost->st->disposition = ist->st->disposition;
1927 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1928 codec->chroma_sample_location = icodec->chroma_sample_location;
1930 if (ost->st->stream_copy) {
1931 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1933 if (extra_size > INT_MAX) {
1934 return AVERROR(EINVAL);
1937 /* if stream_copy is selected, no need to decode or encode */
1938 codec->codec_id = icodec->codec_id;
1939 codec->codec_type = icodec->codec_type;
1941 if(!codec->codec_tag){
1942 if( !os->oformat->codec_tag
1943 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1944 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1945 codec->codec_tag = icodec->codec_tag;
1948 codec->bit_rate = icodec->bit_rate;
1949 codec->rc_max_rate = icodec->rc_max_rate;
1950 codec->rc_buffer_size = icodec->rc_buffer_size;
1951 codec->extradata= av_mallocz(extra_size);
1952 if (!codec->extradata) {
1953 return AVERROR(ENOMEM);
1955 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
1956 codec->extradata_size= icodec->extradata_size;
1957 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){
1958 codec->time_base = icodec->time_base;
1959 codec->time_base.num *= icodec->ticks_per_frame;
1960 av_reduce(&codec->time_base.num, &codec->time_base.den,
1961 codec->time_base.num, codec->time_base.den, INT_MAX);
1963 codec->time_base = ist->st->time_base;
1964 switch(codec->codec_type) {
1965 case AVMEDIA_TYPE_AUDIO:
1966 if(audio_volume != 256) {
1967 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1970 codec->channel_layout = icodec->channel_layout;
1971 codec->sample_rate = icodec->sample_rate;
1972 codec->channels = icodec->channels;
1973 codec->frame_size = icodec->frame_size;
1974 codec->audio_service_type = icodec->audio_service_type;
1975 codec->block_align= icodec->block_align;
1976 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1977 codec->block_align= 0;
1978 if(codec->codec_id == CODEC_ID_AC3)
1979 codec->block_align= 0;
1981 case AVMEDIA_TYPE_VIDEO:
1982 codec->pix_fmt = icodec->pix_fmt;
1983 codec->width = icodec->width;
1984 codec->height = icodec->height;
1985 codec->has_b_frames = icodec->has_b_frames;
1986 if (!codec->sample_aspect_ratio.num) {
1987 codec->sample_aspect_ratio =
1988 ost->st->sample_aspect_ratio =
1989 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
1990 ist->st->codec->sample_aspect_ratio.num ?
1991 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
1994 case AVMEDIA_TYPE_SUBTITLE:
1995 codec->width = icodec->width;
1996 codec->height = icodec->height;
1998 case AVMEDIA_TYPE_DATA:
2005 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2006 switch(codec->codec_type) {
2007 case AVMEDIA_TYPE_AUDIO:
2008 ost->fifo= av_fifo_alloc(1024);
2010 return AVERROR(ENOMEM);
2012 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2013 if (!codec->sample_rate) {
2014 codec->sample_rate = icodec->sample_rate;
2016 codec->sample_rate >>= icodec->lowres;
2018 choose_sample_rate(ost->st, ost->enc);
2019 codec->time_base = (AVRational){1, codec->sample_rate};
2020 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2021 codec->sample_fmt = icodec->sample_fmt;
2022 choose_sample_fmt(ost->st, ost->enc);
2023 if (!codec->channels)
2024 codec->channels = icodec->channels;
2025 codec->channel_layout = icodec->channel_layout;
2026 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2027 codec->channel_layout = 0;
2028 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2029 icodec->request_channels = codec->channels;
2030 ist->decoding_needed = 1;
2031 ost->encoding_needed = 1;
2032 ost->resample_sample_fmt = icodec->sample_fmt;
2033 ost->resample_sample_rate = icodec->sample_rate;
2034 ost->resample_channels = icodec->channels;
2036 case AVMEDIA_TYPE_VIDEO:
2037 if (codec->pix_fmt == PIX_FMT_NONE)
2038 codec->pix_fmt = icodec->pix_fmt;
2039 choose_pixel_fmt(ost->st, ost->enc);
2041 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2042 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2046 if (!codec->width || !codec->height) {
2047 codec->width = icodec->width;
2048 codec->height = icodec->height;
2051 ost->video_resample = codec->width != icodec->width ||
2052 codec->height != icodec->height ||
2053 codec->pix_fmt != icodec->pix_fmt;
2054 if (ost->video_resample) {
2055 #if !CONFIG_AVFILTER
2056 avcodec_get_frame_defaults(&ost->pict_tmp);
2057 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2058 codec->width, codec->height)) {
2059 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2062 ost->img_resample_ctx = sws_getContext(
2069 ost->sws_flags, NULL, NULL, NULL);
2070 if (ost->img_resample_ctx == NULL) {
2071 fprintf(stderr, "Cannot get resampling context\n");
2075 codec->bits_per_raw_sample= 0;
2078 ost->resample_height = icodec->height;
2079 ost->resample_width = icodec->width;
2080 ost->resample_pix_fmt= icodec->pix_fmt;
2081 ost->encoding_needed = 1;
2082 ist->decoding_needed = 1;
2084 if (!ost->frame_rate.num)
2085 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2086 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2087 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2088 ost->frame_rate = ost->enc->supported_framerates[idx];
2090 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2093 if (configure_video_filters(ist, ost)) {
2094 fprintf(stderr, "Error opening filters!\n");
2099 case AVMEDIA_TYPE_SUBTITLE:
2100 ost->encoding_needed = 1;
2101 ist->decoding_needed = 1;
2108 if (ost->encoding_needed &&
2109 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2110 char logfilename[1024];
2113 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2114 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2116 if (codec->flags & CODEC_FLAG_PASS1) {
2117 f = fopen(logfilename, "wb");
2119 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2125 size_t logbuffer_size;
2126 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2127 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2130 codec->stats_in = logbuffer;
2134 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2135 int size= codec->width * codec->height;
2136 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2141 bit_buffer = av_malloc(bit_buffer_size);
2143 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2145 return AVERROR(ENOMEM);
2148 /* open each encoder */
2149 for (i = 0; i < nb_output_streams; i++) {
2150 ost = &output_streams[i];
2151 if (ost->encoding_needed) {
2152 AVCodec *codec = ost->enc;
2153 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2155 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2156 ost->st->codec->codec_id, ost->file_index, ost->index);
2157 ret = AVERROR(EINVAL);
2160 if (dec->subtitle_header) {
2161 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2162 if (!ost->st->codec->subtitle_header) {
2163 ret = AVERROR(ENOMEM);
2166 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2167 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2169 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2170 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2171 ost->file_index, ost->index);
2172 ret = AVERROR(EINVAL);
2175 assert_codec_experimental(ost->st->codec, 1);
2176 assert_avoptions(ost->opts);
2177 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2178 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2179 "It takes bits/s as argument, not kbits/s\n");
2180 extra_size += ost->st->codec->extradata_size;
2184 /* init input streams */
2185 for (i = 0; i < nb_input_streams; i++)
2186 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2189 /* open files and write file headers */
2190 for (i = 0; i < nb_output_files; i++) {
2191 os = output_files[i].ctx;
2192 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2193 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2194 ret = AVERROR(EINVAL);
2197 assert_avoptions(output_files[i].opts);
2198 if (strcmp(os->oformat->name, "rtp")) {
2204 /* dump the file output parameters - cannot be done before in case
2206 for(i=0;i<nb_output_files;i++) {
2207 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2210 /* dump the stream mapping */
2212 fprintf(stderr, "Stream mapping:\n");
2213 for (i = 0; i < nb_output_streams;i ++) {
2214 ost = &output_streams[i];
2215 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2216 input_streams[ost->source_index].file_index,
2217 input_streams[ost->source_index].st->index,
2220 if (ost->sync_ist != &input_streams[ost->source_index])
2221 fprintf(stderr, " [sync #%d.%d]",
2222 ost->sync_ist->file_index,
2223 ost->sync_ist->st->index);
2224 if (ost->st->stream_copy)
2225 fprintf(stderr, " (copy)");
2227 fprintf(stderr, " (%s -> %s)", input_streams[ost->source_index].dec ?
2228 input_streams[ost->source_index].dec->name : "?",
2229 ost->enc ? ost->enc->name : "?");
2230 fprintf(stderr, "\n");
2235 fprintf(stderr, "%s\n", error);
2240 print_sdp(output_files, nb_output_files);
2247 * The following code is the main loop of the file converter
2249 static int transcode(OutputFile *output_files,
2250 int nb_output_files,
2251 InputFile *input_files,
2255 AVFormatContext *is, *os;
2259 int no_packet_count=0;
2260 int64_t timer_start;
2262 if (!(no_packet = av_mallocz(nb_input_files)))
2265 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2270 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2273 timer_start = av_gettime();
2275 for(; received_sigterm == 0;) {
2276 int file_index, ist_index;
2281 ipts_min = INT64_MAX;
2284 /* select the stream that we must read now by looking at the
2285 smallest output pts */
2287 for (i = 0; i < nb_output_streams; i++) {
2291 ost = &output_streams[i];
2292 of = &output_files[ost->file_index];
2293 os = output_files[ost->file_index].ctx;
2294 ist = &input_streams[ost->source_index];
2295 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2296 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2298 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2300 if (!input_files[ist->file_index].eof_reached){
2301 if(ipts < ipts_min) {
2303 if(input_sync ) file_index = ist->file_index;
2305 if(opts < opts_min) {
2307 if(!input_sync) file_index = ist->file_index;
2310 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2315 /* if none, if is finished */
2316 if (file_index < 0) {
2317 if(no_packet_count){
2319 memset(no_packet, 0, nb_input_files);
2326 /* read a frame from it and output it in the fifo */
2327 is = input_files[file_index].ctx;
2328 ret= av_read_frame(is, &pkt);
2329 if(ret == AVERROR(EAGAIN)){
2330 no_packet[file_index]=1;
2335 input_files[file_index].eof_reached = 1;
2343 memset(no_packet, 0, nb_input_files);
2346 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2347 is->streams[pkt.stream_index]);
2349 /* the following test is needed in case new streams appear
2350 dynamically in stream : we ignore them */
2351 if (pkt.stream_index >= input_files[file_index].nb_streams)
2352 goto discard_packet;
2353 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2354 ist = &input_streams[ist_index];
2356 goto discard_packet;
2358 if (pkt.dts != AV_NOPTS_VALUE)
2359 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2360 if (pkt.pts != AV_NOPTS_VALUE)
2361 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2363 if (ist->ts_scale) {
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;
2370 // 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);
2371 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2372 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2373 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2374 int64_t delta= pkt_dts - ist->next_pts;
2375 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2376 input_files[ist->file_index].ts_offset -= delta;
2378 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2379 delta, input_files[ist->file_index].ts_offset);
2380 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2381 if(pkt.pts != AV_NOPTS_VALUE)
2382 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2386 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2387 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2390 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2391 ist->file_index, ist->st->index);
2394 av_free_packet(&pkt);
2399 av_free_packet(&pkt);
2401 /* dump report by using the output first video and audio streams */
2402 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2405 /* at the end of stream, we must flush the decoder buffers */
2406 for (i = 0; i < nb_input_streams; i++) {
2407 ist = &input_streams[i];
2408 if (ist->decoding_needed) {
2409 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2412 flush_encoders(output_streams, nb_output_streams);
2416 /* write the trailer if needed and close file */
2417 for(i=0;i<nb_output_files;i++) {
2418 os = output_files[i].ctx;
2419 av_write_trailer(os);
2422 /* dump report by using the first video and audio streams */
2423 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2425 /* close each encoder */
2426 for (i = 0; i < nb_output_streams; i++) {
2427 ost = &output_streams[i];
2428 if (ost->encoding_needed) {
2429 av_freep(&ost->st->codec->stats_in);
2430 avcodec_close(ost->st->codec);
2433 avfilter_graph_free(&ost->graph);
2437 /* close each decoder */
2438 for (i = 0; i < nb_input_streams; i++) {
2439 ist = &input_streams[i];
2440 if (ist->decoding_needed) {
2441 avcodec_close(ist->st->codec);
2449 av_freep(&bit_buffer);
2450 av_freep(&no_packet);
2452 if (output_streams) {
2453 for (i = 0; i < nb_output_streams; i++) {
2454 ost = &output_streams[i];
2456 if (ost->st->stream_copy)
2457 av_freep(&ost->st->codec->extradata);
2459 fclose(ost->logfile);
2460 ost->logfile = NULL;
2462 av_fifo_free(ost->fifo); /* works even if fifo is not
2463 initialized but set to zero */
2464 av_freep(&ost->st->codec->subtitle_header);
2465 av_free(ost->pict_tmp.data[0]);
2466 av_free(ost->forced_kf_pts);
2467 if (ost->video_resample)
2468 sws_freeContext(ost->img_resample_ctx);
2470 audio_resample_close(ost->resample);
2471 if (ost->reformat_ctx)
2472 av_audio_convert_free(ost->reformat_ctx);
2473 av_dict_free(&ost->opts);
2480 static int opt_video_rc_override_string(const char *opt, const char *arg)
2482 video_rc_override_string = arg;
2486 static int opt_me_threshold(const char *opt, const char *arg)
2488 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2492 static int opt_verbose(const char *opt, const char *arg)
2494 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2498 static int opt_frame_rate(const char *opt, const char *arg)
2500 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2501 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2507 static int opt_frame_size(const char *opt, const char *arg)
2509 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2510 fprintf(stderr, "Incorrect frame size\n");
2511 return AVERROR(EINVAL);
2516 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2518 if (strcmp(arg, "list")) {
2519 frame_pix_fmt = av_get_pix_fmt(arg);
2520 if (frame_pix_fmt == PIX_FMT_NONE) {
2521 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2522 return AVERROR(EINVAL);
2531 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2538 p = strchr(arg, ':');
2540 x = strtol(arg, &end, 10);
2542 y = strtol(end+1, &end, 10);
2544 ar = (double)x / (double)y;
2546 ar = strtod(arg, NULL);
2549 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2550 return AVERROR(EINVAL);
2552 frame_aspect_ratio = ar;
2556 static int opt_metadata(const char *opt, const char *arg)
2558 char *mid= strchr(arg, '=');
2561 fprintf(stderr, "Missing =\n");
2566 av_dict_set(&metadata, arg, mid, 0);
2571 static int opt_qscale(const char *opt, const char *arg)
2573 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2574 if (video_qscale == 0) {
2575 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2576 return AVERROR(EINVAL);
2581 static int opt_top_field_first(const char *opt, const char *arg)
2583 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2587 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2589 if (strcmp(arg, "list")) {
2590 audio_sample_fmt = av_get_sample_fmt(arg);
2591 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2592 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2593 return AVERROR(EINVAL);
2598 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2599 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2605 static int opt_audio_rate(const char *opt, const char *arg)
2607 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2611 static int opt_audio_channels(const char *opt, const char *arg)
2613 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2617 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2619 return parse_option(o, "codec:a", arg, options);
2622 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2624 return parse_option(o, "codec:v", arg, options);
2627 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2629 return parse_option(o, "codec:s", arg, options);
2632 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2634 return parse_option(o, "codec:d", arg, options);
2637 static int opt_codec_tag(const char *opt, const char *arg)
2640 uint32_t *codec_tag;
2642 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2643 !strcmp(opt, "vtag") ? &video_codec_tag :
2644 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2648 *codec_tag = strtol(arg, &tail, 0);
2650 *codec_tag = AV_RL32(arg);
2655 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2657 StreamMap *m = NULL;
2658 int i, negative = 0, file_idx;
2659 int sync_file_idx = -1, sync_stream_idx;
2667 map = av_strdup(arg);
2669 /* parse sync stream first, just pick first matching stream */
2670 if (sync = strchr(map, ',')) {
2672 sync_file_idx = strtol(sync + 1, &sync, 0);
2673 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2674 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2679 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2680 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2681 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2682 sync_stream_idx = i;
2685 if (i == input_files[sync_file_idx].nb_streams) {
2686 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2687 "match any streams.\n", arg);
2693 file_idx = strtol(map, &p, 0);
2694 if (file_idx >= nb_input_files || file_idx < 0) {
2695 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2699 /* disable some already defined maps */
2700 for (i = 0; i < o->nb_stream_maps; i++) {
2701 m = &o->stream_maps[i];
2702 if (check_stream_specifier(input_files[m->file_index].ctx,
2703 input_files[m->file_index].ctx->streams[m->stream_index],
2704 *p == ':' ? p + 1 : p) > 0)
2708 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2709 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2710 *p == ':' ? p + 1 : p) <= 0)
2712 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2713 &o->nb_stream_maps, o->nb_stream_maps + 1);
2714 m = &o->stream_maps[o->nb_stream_maps - 1];
2716 m->file_index = file_idx;
2717 m->stream_index = i;
2719 if (sync_file_idx >= 0) {
2720 m->sync_file_index = sync_file_idx;
2721 m->sync_stream_index = sync_stream_idx;
2723 m->sync_file_index = file_idx;
2724 m->sync_stream_index = i;
2729 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2737 static void parse_meta_type(char *arg, char *type, int *index)
2747 if (*(++arg) == ':')
2748 *index = strtol(++arg, NULL, 0);
2751 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2758 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
2760 MetadataMap *m, *m1;
2763 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
2764 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
2766 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
2767 m->file = strtol(arg, &p, 0);
2768 parse_meta_type(p, &m->type, &m->index);
2770 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
2771 if (p = strchr(opt, ':'))
2772 parse_meta_type(p, &m1->type, &m1->index);
2776 if (m->type == 'g' || m1->type == 'g')
2777 o->metadata_global_manual = 1;
2778 if (m->type == 's' || m1->type == 's')
2779 o->metadata_streams_manual = 1;
2780 if (m->type == 'c' || m1->type == 'c')
2781 o->metadata_chapters_manual = 1;
2786 static int opt_input_ts_scale(const char *opt, const char *arg)
2788 return av_dict_set(&ts_scale, opt, arg, 0);
2791 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2793 const char *codec_string = encoder ? "encoder" : "decoder";
2797 return CODEC_ID_NONE;
2799 avcodec_find_encoder_by_name(name) :
2800 avcodec_find_decoder_by_name(name);
2802 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2805 if(codec->type != type) {
2806 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2812 static AVCodec *choose_codec(OptionsContext *o, AVFormatContext *s, AVStream *st, enum AVMediaType type)
2814 char *codec_name = NULL;
2816 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
2820 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2821 return avcodec_find_encoder(st->codec->codec_id);
2823 } else if (!strcmp(codec_name, "copy"))
2824 st->stream_copy = 1;
2826 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
2827 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
2828 avcodec_find_decoder_by_name(codec_name);
2835 * Add all the streams from the given input file to the global
2836 * list of input streams.
2838 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
2840 int i, rfps, rfps_base, ret;
2842 for (i = 0; i < ic->nb_streams; i++) {
2843 AVStream *st = ic->streams[i];
2844 AVCodecContext *dec = st->codec;
2845 AVDictionaryEntry *e = NULL;
2849 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2850 ist = &input_streams[nb_input_streams - 1];
2852 ist->file_index = nb_input_files;
2854 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2856 while (e = av_dict_get(ts_scale, "", e, AV_DICT_IGNORE_SUFFIX)) {
2857 char *p = strchr(e->key, ':');
2859 if ((ret = check_stream_specifier(ic, st, p ? p + 1 : "")) > 0)
2865 ist->ts_scale = strtod(scale, NULL);
2867 ist->dec = choose_codec(o, ic, st, dec->codec_type);
2869 ist->dec = avcodec_find_decoder(dec->codec_id);
2871 switch (dec->codec_type) {
2872 case AVMEDIA_TYPE_AUDIO:
2874 st->discard= AVDISCARD_ALL;
2876 case AVMEDIA_TYPE_VIDEO:
2877 rfps = ic->streams[i]->r_frame_rate.num;
2878 rfps_base = ic->streams[i]->r_frame_rate.den;
2880 dec->flags |= CODEC_FLAG_EMU_EDGE;
2881 dec->height >>= dec->lowres;
2882 dec->width >>= dec->lowres;
2885 dec->debug |= FF_DEBUG_MV;
2887 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2890 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2891 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2893 (float)rfps / rfps_base, rfps, rfps_base);
2897 st->discard= AVDISCARD_ALL;
2898 else if(video_discard)
2899 st->discard= video_discard;
2901 case AVMEDIA_TYPE_DATA:
2903 case AVMEDIA_TYPE_SUBTITLE:
2904 if(subtitle_disable)
2905 st->discard = AVDISCARD_ALL;
2907 case AVMEDIA_TYPE_ATTACHMENT:
2908 case AVMEDIA_TYPE_UNKNOWN:
2916 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
2918 AVFormatContext *ic;
2919 AVInputFormat *file_iformat = NULL;
2923 AVDictionary **opts;
2924 int orig_nb_streams; // number of streams before avformat_find_stream_info
2927 if (!(file_iformat = av_find_input_format(o->format))) {
2928 fprintf(stderr, "Unknown input format: '%s'\n", o->format);
2933 if (!strcmp(filename, "-"))
2936 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2937 !strcmp(filename, "/dev/stdin");
2939 /* get default parameters from command line */
2940 ic = avformat_alloc_context();
2942 print_error(filename, AVERROR(ENOMEM));
2945 if (audio_sample_rate) {
2946 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
2947 av_dict_set(&format_opts, "sample_rate", buf, 0);
2949 if (audio_channels) {
2950 snprintf(buf, sizeof(buf), "%d", audio_channels);
2951 av_dict_set(&format_opts, "channels", buf, 0);
2953 if (frame_rate.num) {
2954 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
2955 av_dict_set(&format_opts, "framerate", buf, 0);
2957 if (frame_width && frame_height) {
2958 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
2959 av_dict_set(&format_opts, "video_size", buf, 0);
2961 if (frame_pix_fmt != PIX_FMT_NONE)
2962 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
2964 ic->flags |= AVFMT_FLAG_NONBLOCK;
2966 /* open the input file with generic libav function */
2967 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2969 print_error(filename, err);
2972 assert_avoptions(format_opts);
2977 for(i=0; i<ic->nb_streams; i++){
2978 ic->streams[i]->discard= AVDISCARD_ALL;
2980 for(i=0; i<ic->nb_programs; i++){
2981 AVProgram *p= ic->programs[i];
2982 if(p->id != opt_programid){
2983 p->discard = AVDISCARD_ALL;
2986 for(j=0; j<p->nb_stream_indexes; j++){
2987 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
2992 fprintf(stderr, "Specified program id not found\n");
2998 /* apply forced codec ids */
2999 for (i = 0; i < ic->nb_streams; i++)
3000 choose_codec(o, ic, ic->streams[i], ic->streams[i]->codec->codec_type);
3002 /* Set AVCodecContext options for avformat_find_stream_info */
3003 opts = setup_find_stream_info_opts(ic, codec_opts);
3004 orig_nb_streams = ic->nb_streams;
3006 /* If not enough info to get the stream parameters, we decode the
3007 first frames to get it. (used in mpeg case for example) */
3008 ret = avformat_find_stream_info(ic, opts);
3009 if (ret < 0 && verbose >= 0) {
3010 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3011 av_close_input_file(ic);
3015 timestamp = o->start_time;
3016 /* add the stream start time */
3017 if (ic->start_time != AV_NOPTS_VALUE)
3018 timestamp += ic->start_time;
3020 /* if seeking requested, we execute it */
3021 if (o->start_time != 0) {
3022 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3024 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3025 filename, (double)timestamp / AV_TIME_BASE);
3029 /* update the current parameters so that they match the one of the input stream */
3030 add_input_streams(o, ic);
3032 /* dump the file content */
3034 av_dump_format(ic, nb_input_files, filename, 0);
3036 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3037 input_files[nb_input_files - 1].ctx = ic;
3038 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3039 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3040 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3042 frame_rate = (AVRational){0, 0};
3043 frame_pix_fmt = PIX_FMT_NONE;
3046 audio_sample_rate = 0;
3048 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3049 av_dict_free(&ts_scale);
3051 for (i = 0; i < orig_nb_streams; i++)
3052 av_dict_free(&opts[i]);
3059 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3060 AVCodecContext *avctx)
3066 for (p = kf; *p; p++)
3069 ost->forced_kf_count = n;
3070 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3071 if (!ost->forced_kf_pts) {
3072 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3075 for (i = 0; i < n; i++) {
3076 p = i ? strchr(p, ',') + 1 : kf;
3077 t = parse_time_or_die("force_key_frames", p, 1);
3078 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3082 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3085 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3086 int idx = oc->nb_streams - 1;
3089 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3093 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3094 nb_output_streams + 1);
3095 ost = &output_streams[nb_output_streams - 1];
3096 ost->file_index = nb_output_files;
3099 st->codec->codec_type = type;
3100 ost->enc = choose_codec(o, oc, st, type);
3102 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3105 avcodec_get_context_defaults3(st->codec, ost->enc);
3106 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3108 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3112 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3116 AVCodecContext *video_enc;
3118 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3120 if (!st->stream_copy) {
3121 ost->frame_aspect_ratio = frame_aspect_ratio;
3122 frame_aspect_ratio = 0;
3124 ost->avfilter= vfilters;
3129 ost->bitstream_filters = video_bitstream_filters;
3130 video_bitstream_filters= NULL;
3132 video_enc = st->codec;
3135 video_enc->codec_tag= video_codec_tag;
3137 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3138 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3141 if (st->stream_copy) {
3142 video_enc->sample_aspect_ratio =
3143 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3149 ost->frame_rate = frame_rate;
3151 video_enc->width = frame_width;
3152 video_enc->height = frame_height;
3153 video_enc->pix_fmt = frame_pix_fmt;
3154 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3156 if (video_qscale || same_quant) {
3157 video_enc->flags |= CODEC_FLAG_QSCALE;
3158 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3162 video_enc->intra_matrix = intra_matrix;
3164 video_enc->inter_matrix = inter_matrix;
3166 p= video_rc_override_string;
3169 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3171 fprintf(stderr, "error parsing rc_override\n");
3174 video_enc->rc_override=
3175 av_realloc(video_enc->rc_override,
3176 sizeof(RcOverride)*(i+1));
3177 video_enc->rc_override[i].start_frame= start;
3178 video_enc->rc_override[i].end_frame = end;
3180 video_enc->rc_override[i].qscale= q;
3181 video_enc->rc_override[i].quality_factor= 1.0;
3184 video_enc->rc_override[i].qscale= 0;
3185 video_enc->rc_override[i].quality_factor= -q/100.0;
3190 video_enc->rc_override_count=i;
3191 if (!video_enc->rc_initial_buffer_occupancy)
3192 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3193 video_enc->me_threshold= me_threshold;
3194 video_enc->intra_dc_precision= intra_dc_precision - 8;
3197 video_enc->flags|= CODEC_FLAG_PSNR;
3202 video_enc->flags |= CODEC_FLAG_PASS1;
3204 video_enc->flags |= CODEC_FLAG_PASS2;
3208 if (forced_key_frames)
3209 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3211 if (video_language) {
3212 av_dict_set(&st->metadata, "language", video_language, 0);
3213 av_freep(&video_language);
3216 /* reset some key parameters */
3218 av_freep(&forced_key_frames);
3219 frame_pix_fmt = PIX_FMT_NONE;
3223 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3227 AVCodecContext *audio_enc;
3229 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3232 ost->bitstream_filters = audio_bitstream_filters;
3233 audio_bitstream_filters= NULL;
3235 audio_enc = st->codec;
3236 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3239 audio_enc->codec_tag= audio_codec_tag;
3241 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3242 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3244 if (!st->stream_copy) {
3245 if (audio_qscale > QSCALE_NONE) {
3246 audio_enc->flags |= CODEC_FLAG_QSCALE;
3247 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3250 audio_enc->channels = audio_channels;
3251 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3252 audio_enc->sample_fmt = audio_sample_fmt;
3253 if (audio_sample_rate)
3254 audio_enc->sample_rate = audio_sample_rate;
3256 if (audio_language) {
3257 av_dict_set(&st->metadata, "language", audio_language, 0);
3258 av_freep(&audio_language);
3261 /* reset some key parameters */
3267 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3271 AVCodecContext *data_enc;
3273 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3275 data_enc = st->codec;
3276 if (!st->stream_copy) {
3277 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3282 data_enc->codec_tag= data_codec_tag;
3284 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3285 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3292 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3296 AVCodecContext *subtitle_enc;
3298 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3300 subtitle_enc = st->codec;
3302 ost->bitstream_filters = subtitle_bitstream_filters;
3303 subtitle_bitstream_filters= NULL;
3305 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3307 if(subtitle_codec_tag)
3308 subtitle_enc->codec_tag= subtitle_codec_tag;
3310 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3311 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3314 if (subtitle_language) {
3315 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3316 av_freep(&subtitle_language);
3319 subtitle_disable = 0;
3323 /* arg format is "output-stream-index:streamid-value". */
3324 static int opt_streamid(const char *opt, const char *arg)
3330 av_strlcpy(idx_str, arg, sizeof(idx_str));
3331 p = strchr(idx_str, ':');
3334 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3339 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3340 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3341 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3345 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3347 AVFormatContext *is = ifile->ctx;
3348 AVFormatContext *os = ofile->ctx;
3351 for (i = 0; i < is->nb_chapters; i++) {
3352 AVChapter *in_ch = is->chapters[i], *out_ch;
3353 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3354 AV_TIME_BASE_Q, in_ch->time_base);
3355 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3356 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3359 if (in_ch->end < ts_off)
3361 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3364 out_ch = av_mallocz(sizeof(AVChapter));
3366 return AVERROR(ENOMEM);
3368 out_ch->id = in_ch->id;
3369 out_ch->time_base = in_ch->time_base;
3370 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3371 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3374 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3377 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3379 return AVERROR(ENOMEM);
3380 os->chapters[os->nb_chapters - 1] = out_ch;
3385 static int read_avserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3388 AVFormatContext *ic = NULL;
3390 err = avformat_open_input(&ic, filename, NULL, NULL);
3393 /* copy stream format */
3394 for(i=0;i<ic->nb_streams;i++) {
3399 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3400 ost = new_output_stream(o, s, codec->type);
3403 // FIXME: a more elegant solution is needed
3404 memcpy(st, ic->streams[i], sizeof(AVStream));
3406 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3408 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3409 choose_sample_fmt(st, codec);
3410 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3411 choose_pixel_fmt(st, codec);
3414 av_close_input_file(ic);
3418 static void opt_output_file(void *optctx, const char *filename)
3420 OptionsContext *o = optctx;
3421 AVFormatContext *oc;
3423 AVOutputFormat *file_oformat;
3427 if (!strcmp(filename, "-"))
3430 oc = avformat_alloc_context();
3432 print_error(filename, AVERROR(ENOMEM));
3437 file_oformat = av_guess_format(o->format, NULL, NULL);
3438 if (!file_oformat) {
3439 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", o->format);
3443 file_oformat = av_guess_format(NULL, filename, NULL);
3444 if (!file_oformat) {
3445 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3451 oc->oformat = file_oformat;
3452 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3454 if (!strcmp(file_oformat->name, "ffm") &&
3455 av_strstart(filename, "http:", NULL)) {
3456 /* special case for files sent to avserver: we get the stream
3457 parameters from avserver */
3458 int err = read_avserver_streams(o, oc, filename);
3460 print_error(filename, err);
3463 } else if (!o->nb_stream_maps) {
3464 /* pick the "best" stream of each type */
3465 #define NEW_STREAM(type, index)\
3467 ost = new_ ## type ## _stream(o, oc);\
3468 ost->source_index = index;\
3469 ost->sync_ist = &input_streams[index];\
3470 input_streams[index].discard = 0;\
3473 /* video: highest resolution */
3474 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3475 int area = 0, idx = -1;
3476 for (i = 0; i < nb_input_streams; i++) {
3477 ist = &input_streams[i];
3478 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3479 ist->st->codec->width * ist->st->codec->height > area) {
3480 area = ist->st->codec->width * ist->st->codec->height;
3484 NEW_STREAM(video, idx);
3487 /* audio: most channels */
3488 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3489 int channels = 0, idx = -1;
3490 for (i = 0; i < nb_input_streams; i++) {
3491 ist = &input_streams[i];
3492 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3493 ist->st->codec->channels > channels) {
3494 channels = ist->st->codec->channels;
3498 NEW_STREAM(audio, idx);
3501 /* subtitles: pick first */
3502 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3503 for (i = 0; i < nb_input_streams; i++)
3504 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3505 NEW_STREAM(subtitle, i);
3509 /* do something with data? */
3511 for (i = 0; i < o->nb_stream_maps; i++) {
3512 StreamMap *map = &o->stream_maps[i];
3517 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3518 switch (ist->st->codec->codec_type) {
3519 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3520 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3521 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3522 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3524 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3525 map->file_index, map->stream_index);
3529 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3530 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3531 map->sync_stream_index];
3536 av_dict_copy(&oc->metadata, metadata, 0);
3537 av_dict_free(&metadata);
3540 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3541 output_files[nb_output_files - 1].ctx = oc;
3542 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3543 output_files[nb_output_files - 1].recording_time = o->recording_time;
3544 output_files[nb_output_files - 1].start_time = o->start_time;
3545 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3546 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3548 /* check filename in case of an image number is expected */
3549 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3550 if (!av_filename_number_test(oc->filename)) {
3551 print_error(oc->filename, AVERROR(EINVAL));
3556 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3557 /* test if it already exists to avoid loosing precious files */
3558 if (!file_overwrite &&
3559 (strchr(filename, ':') == NULL ||
3560 filename[1] == ':' ||
3561 av_strstart(filename, "file:", NULL))) {
3562 if (avio_check(filename, 0) == 0) {
3564 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3566 if (!read_yesno()) {
3567 fprintf(stderr, "Not overwriting - exiting\n");
3572 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3579 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3580 print_error(filename, err);
3585 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3586 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3587 oc->flags |= AVFMT_FLAG_NONBLOCK;
3590 if (o->chapters_input_file >= nb_input_files) {
3591 if (o->chapters_input_file == INT_MAX) {
3592 /* copy chapters from the first input file that has them*/
3593 o->chapters_input_file = -1;
3594 for (i = 0; i < nb_input_files; i++)
3595 if (input_files[i].ctx->nb_chapters) {
3596 o->chapters_input_file = i;
3600 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3601 o->chapters_input_file);
3605 if (o->chapters_input_file >= 0)
3606 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
3607 o->metadata_chapters_manual);
3610 for (i = 0; i < o->nb_meta_data_maps; i++) {
3611 AVFormatContext *files[2];
3612 AVDictionary **meta[2];
3615 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3616 if ((index) < 0 || (index) >= (nb_elems)) {\
3617 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3622 int in_file_index = o->meta_data_maps[i][1].file;
3623 if (in_file_index < 0)
3625 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3628 files[1] = input_files[in_file_index].ctx;
3630 for (j = 0; j < 2; j++) {
3631 MetadataMap *map = &o->meta_data_maps[i][j];
3633 switch (map->type) {
3635 meta[j] = &files[j]->metadata;
3638 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3639 meta[j] = &files[j]->streams[map->index]->metadata;
3642 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3643 meta[j] = &files[j]->chapters[map->index]->metadata;
3646 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3647 meta[j] = &files[j]->programs[map->index]->metadata;
3652 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3655 /* copy global metadata by default */
3656 if (!o->metadata_global_manual && nb_input_files)
3657 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3658 AV_DICT_DONT_OVERWRITE);
3659 if (!o->metadata_streams_manual)
3660 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3661 InputStream *ist = &input_streams[output_streams[i].source_index];
3662 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3665 frame_rate = (AVRational){0, 0};
3668 audio_sample_rate = 0;
3670 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3672 av_freep(&streamid_map);
3673 nb_streamid_map = 0;
3675 av_freep(&forced_key_frames);
3679 /* same option as mencoder */
3680 static int opt_pass(const char *opt, const char *arg)
3682 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3686 static int64_t getutime(void)
3689 struct rusage rusage;
3691 getrusage(RUSAGE_SELF, &rusage);
3692 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3693 #elif HAVE_GETPROCESSTIMES
3695 FILETIME c, e, k, u;
3696 proc = GetCurrentProcess();
3697 GetProcessTimes(proc, &c, &e, &k, &u);
3698 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3700 return av_gettime();
3704 static int64_t getmaxrss(void)
3706 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3707 struct rusage rusage;
3708 getrusage(RUSAGE_SELF, &rusage);
3709 return (int64_t)rusage.ru_maxrss * 1024;
3710 #elif HAVE_GETPROCESSMEMORYINFO
3712 PROCESS_MEMORY_COUNTERS memcounters;
3713 proc = GetCurrentProcess();
3714 memcounters.cb = sizeof(memcounters);
3715 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3716 return memcounters.PeakPagefileUsage;
3722 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3725 const char *p = str;
3732 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3739 static void opt_inter_matrix(const char *arg)
3741 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3742 parse_matrix_coeffs(inter_matrix, arg);
3745 static void opt_intra_matrix(const char *arg)
3747 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3748 parse_matrix_coeffs(intra_matrix, arg);
3751 static void show_usage(void)
3753 printf("Hyper fast Audio and Video encoder\n");
3754 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3758 static void show_help(void)
3761 AVOutputFormat *oformat = NULL;
3762 AVInputFormat *iformat = NULL;
3763 const AVClass *class;
3765 av_log_set_callback(log_callback_help);
3767 show_help_options(options, "Main options:\n",
3768 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3769 show_help_options(options, "\nAdvanced options:\n",
3770 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3772 show_help_options(options, "\nVideo options:\n",
3773 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3775 show_help_options(options, "\nAdvanced Video options:\n",
3776 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3777 OPT_VIDEO | OPT_EXPERT);
3778 show_help_options(options, "\nAudio options:\n",
3779 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3781 show_help_options(options, "\nAdvanced Audio options:\n",
3782 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3783 OPT_AUDIO | OPT_EXPERT);
3784 show_help_options(options, "\nSubtitle options:\n",
3785 OPT_SUBTITLE | OPT_GRAB,
3787 show_help_options(options, "\nAudio/Video grab options:\n",
3791 class = avcodec_get_class();
3792 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3795 /* individual codec options */
3797 while ((c = av_codec_next(c))) {
3798 if (c->priv_class) {
3799 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3804 class = avformat_get_class();
3805 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3808 /* individual muxer options */
3809 while ((oformat = av_oformat_next(oformat))) {
3810 if (oformat->priv_class) {
3811 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3816 /* individual demuxer options */
3817 while ((iformat = av_iformat_next(iformat))) {
3818 if (iformat->priv_class) {
3819 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3824 class = sws_get_class();
3825 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3828 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
3830 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3831 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3833 if(!strncmp(arg, "pal-", 4)) {
3836 } else if(!strncmp(arg, "ntsc-", 5)) {
3839 } else if(!strncmp(arg, "film-", 5)) {
3844 /* Calculate FR via float to avoid int overflow */
3845 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3848 } else if((fr == 29970) || (fr == 23976)) {
3851 /* Try to determine PAL/NTSC by peeking in the input files */
3852 if(nb_input_files) {
3854 for (j = 0; j < nb_input_files; j++) {
3855 for (i = 0; i < input_files[j].nb_streams; i++) {
3856 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3857 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3859 fr = c->time_base.den * 1000 / c->time_base.num;
3863 } else if((fr == 29970) || (fr == 23976)) {
3873 if(verbose > 0 && norm != UNKNOWN)
3874 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3877 if(norm == UNKNOWN) {
3878 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3879 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3880 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3884 if(!strcmp(arg, "vcd")) {
3885 opt_video_codec(o, "c:v", "mpeg1video");
3886 opt_audio_codec(o, "c:a", "mp2");
3887 parse_option(o, "f", "vcd", options);
3889 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
3890 opt_frame_rate("r", frame_rates[norm]);
3891 opt_default("g", norm == PAL ? "15" : "18");
3893 opt_default("b", "1150000");
3894 opt_default("maxrate", "1150000");
3895 opt_default("minrate", "1150000");
3896 opt_default("bufsize", "327680"); // 40*1024*8;
3898 opt_default("b:a", "224000");
3899 audio_sample_rate = 44100;
3902 opt_default("packetsize", "2324");
3903 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3905 /* We have to offset the PTS, so that it is consistent with the SCR.
3906 SCR starts at 36000, but the first two packs contain only padding
3907 and the first pack from the other stream, respectively, may also have
3908 been written before.
3909 So the real data starts at SCR 36000+3*1200. */
3910 mux_preload= (36000+3*1200) / 90000.0; //0.44
3911 } else if(!strcmp(arg, "svcd")) {
3913 opt_video_codec(o, "c:v", "mpeg2video");
3914 opt_audio_codec(o, "c:a", "mp2");
3915 parse_option(o, "f", "svcd", options);
3917 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
3918 opt_frame_rate("r", frame_rates[norm]);
3919 opt_default("g", norm == PAL ? "15" : "18");
3921 opt_default("b", "2040000");
3922 opt_default("maxrate", "2516000");
3923 opt_default("minrate", "0"); //1145000;
3924 opt_default("bufsize", "1835008"); //224*1024*8;
3925 opt_default("flags", "+scan_offset");
3928 opt_default("b:a", "224000");
3929 audio_sample_rate = 44100;
3931 opt_default("packetsize", "2324");
3933 } else if(!strcmp(arg, "dvd")) {
3935 opt_video_codec(o, "c:v", "mpeg2video");
3936 opt_audio_codec(o, "c:a", "ac3");
3937 parse_option(o, "f", "dvd", options);
3939 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
3940 opt_frame_rate("r", frame_rates[norm]);
3941 opt_default("g", norm == PAL ? "15" : "18");
3943 opt_default("b", "6000000");
3944 opt_default("maxrate", "9000000");
3945 opt_default("minrate", "0"); //1500000;
3946 opt_default("bufsize", "1835008"); //224*1024*8;
3948 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3949 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3951 opt_default("b:a", "448000");
3952 audio_sample_rate = 48000;
3954 } else if(!strncmp(arg, "dv", 2)) {
3956 parse_option(o, "f", "dv", options);
3958 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
3959 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
3960 norm == PAL ? "yuv420p" : "yuv411p");
3961 opt_frame_rate("r", frame_rates[norm]);
3963 audio_sample_rate = 48000;
3967 fprintf(stderr, "Unknown target: %s\n", arg);
3968 return AVERROR(EINVAL);
3973 static int opt_vstats_file(const char *opt, const char *arg)
3975 av_free (vstats_filename);
3976 vstats_filename=av_strdup (arg);
3980 static int opt_vstats(const char *opt, const char *arg)
3983 time_t today2 = time(NULL);
3984 struct tm *today = localtime(&today2);
3986 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3988 return opt_vstats_file(opt, filename);
3991 static int opt_bsf(const char *opt, const char *arg)
3993 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3994 AVBitStreamFilterContext **bsfp;
3997 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4001 bsfp= *opt == 'v' ? &video_bitstream_filters :
4002 *opt == 'a' ? &audio_bitstream_filters :
4003 &subtitle_bitstream_filters;
4005 bsfp= &(*bsfp)->next;
4012 #define OFFSET(x) offsetof(OptionsContext, x)
4013 static const OptionDef options[] = {
4015 #include "cmdutils_common_opts.h"
4016 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4017 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4018 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4019 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4020 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4021 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4022 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4023 "outfile[,metadata]:infile[,metadata]" },
4024 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4025 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4026 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4027 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4028 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4029 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "scale" },
4030 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4031 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4032 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4033 "add timings for benchmarking" },
4034 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4035 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4036 "dump each input packet" },
4037 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4038 "when dumping packets, also dump the payload" },
4039 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4040 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4041 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4042 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4043 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4044 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4045 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4046 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4047 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4048 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4049 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4050 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4051 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4054 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4055 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4056 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4057 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4058 { "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" },
4059 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4060 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4061 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4062 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4063 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4064 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimation threshold", "threshold" },
4065 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4066 "use same quantizer as source (implies VBR)" },
4067 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4068 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4069 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4070 "deinterlace pictures" },
4071 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4072 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4073 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4075 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4077 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4078 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4079 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4080 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4081 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4082 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4083 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4084 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4085 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4086 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4089 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4090 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4091 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4092 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4093 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4094 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4095 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4096 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4097 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4098 { "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" },
4100 /* subtitle options */
4101 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4102 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4103 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4104 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4107 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4110 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4111 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4113 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4114 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4115 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4117 /* data codec support */
4118 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4120 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4124 int main(int argc, char **argv)
4126 OptionsContext o = { 0 };
4131 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4133 avcodec_register_all();
4135 avdevice_register_all();
4138 avfilter_register_all();
4142 avio_set_interrupt_cb(decode_interrupt_cb);
4147 parse_options(&o, argc, argv, options, opt_output_file);
4149 if(nb_output_files <= 0 && nb_input_files == 0) {
4151 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4155 /* file converter / grab */
4156 if (nb_output_files <= 0) {
4157 fprintf(stderr, "At least one output file must be specified\n");
4161 if (nb_input_files == 0) {
4162 fprintf(stderr, "At least one input file must be specified\n");
4167 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4169 ti = getutime() - ti;
4171 int maxrss = getmaxrss() / 1024;
4172 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);