3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg 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 * FFmpeg 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 FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 /* needed for usleep() */
23 #define _XOPEN_SOURCE 600
34 #include "libavformat/avformat.h"
35 #include "libavdevice/avdevice.h"
36 #include "libswscale/swscale.h"
37 #include "libavcodec/opt.h"
38 #include "libavcodec/audioconvert.h"
39 #include "libavcore/parseutils.h"
40 #include "libavcore/samplefmt.h"
41 #include "libavutil/colorspace.h"
42 #include "libavutil/fifo.h"
43 #include "libavutil/intreadwrite.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>
73 #include <sys/ioctl.h>
83 #include "libavutil/avassert.h"
85 const char program_name[] = "FFmpeg";
86 const int program_birth_year = 2000;
88 /* select an input stream for an output stream */
89 typedef struct AVStreamMap {
93 int sync_stream_index;
97 * select an input file for an output file
99 typedef struct AVMetaDataMap {
100 int file; //< file index
101 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
102 int index; //< stream/chapter/program number
105 typedef struct AVChapterMap {
110 static const OptionDef options[];
112 #define MAX_FILES 100
113 #if !FF_API_MAX_STREAMS
114 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
117 static const char *last_asked_format = NULL;
118 static AVFormatContext *input_files[MAX_FILES];
119 static int64_t input_files_ts_offset[MAX_FILES];
120 static double *input_files_ts_scale[MAX_FILES] = {NULL};
121 static AVCodec **input_codecs = NULL;
122 static int nb_input_files = 0;
123 static int nb_input_codecs = 0;
124 static int nb_input_files_ts_scale[MAX_FILES] = {0};
126 static AVFormatContext *output_files[MAX_FILES];
127 static AVCodec **output_codecs = NULL;
128 static int nb_output_files = 0;
129 static int nb_output_codecs = 0;
131 static AVStreamMap *stream_maps = NULL;
132 static int nb_stream_maps;
134 /* first item specifies output metadata, second is input */
135 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
136 static int nb_meta_data_maps;
137 static int metadata_streams_autocopy = 1;
138 static int metadata_chapters_autocopy = 1;
140 static AVChapterMap *chapter_maps = NULL;
141 static int nb_chapter_maps;
143 /* indexed by output file stream index */
144 static int *streamid_map = NULL;
145 static int nb_streamid_map = 0;
147 static int frame_width = 0;
148 static int frame_height = 0;
149 static float frame_aspect_ratio = 0;
150 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
151 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
152 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
153 static AVRational frame_rate;
154 static float video_qscale = 0;
155 static uint16_t *intra_matrix = NULL;
156 static uint16_t *inter_matrix = NULL;
157 static const char *video_rc_override_string=NULL;
158 static int video_disable = 0;
159 static int video_discard = 0;
160 static char *video_codec_name = NULL;
161 static unsigned int video_codec_tag = 0;
162 static char *video_language = NULL;
163 static int same_quality = 0;
164 static int do_deinterlace = 0;
165 static int top_field_first = -1;
166 static int me_threshold = 0;
167 static int intra_dc_precision = 8;
168 static int loop_input = 0;
169 static int loop_output = AVFMT_NOOUTPUTLOOP;
170 static int qp_hist = 0;
172 static char *vfilters = NULL;
173 AVFilterGraph *graph = NULL;
176 static int intra_only = 0;
177 static int audio_sample_rate = 44100;
178 static int64_t channel_layout = 0;
179 #define QSCALE_NONE -99999
180 static float audio_qscale = QSCALE_NONE;
181 static int audio_disable = 0;
182 static int audio_channels = 1;
183 static char *audio_codec_name = NULL;
184 static unsigned int audio_codec_tag = 0;
185 static char *audio_language = NULL;
187 static int subtitle_disable = 0;
188 static char *subtitle_codec_name = NULL;
189 static char *subtitle_language = NULL;
190 static unsigned int subtitle_codec_tag = 0;
192 static float mux_preload= 0.5;
193 static float mux_max_delay= 0.7;
195 static int64_t recording_time = INT64_MAX;
196 static int64_t start_time = 0;
197 static int64_t recording_timestamp = 0;
198 static int64_t input_ts_offset = 0;
199 static int file_overwrite = 0;
200 static AVMetadata *metadata;
201 static int do_benchmark = 0;
202 static int do_hex_dump = 0;
203 static int do_pkt_dump = 0;
204 static int do_psnr = 0;
205 static int do_pass = 0;
206 static char *pass_logfilename_prefix = NULL;
207 static int audio_stream_copy = 0;
208 static int video_stream_copy = 0;
209 static int subtitle_stream_copy = 0;
210 static int video_sync_method= -1;
211 static int audio_sync_method= 0;
212 static float audio_drift_threshold= 0.1;
213 static int copy_ts= 0;
214 static int opt_shortest = 0;
215 static int video_global_header = 0;
216 static char *vstats_filename;
217 static FILE *vstats_file;
218 static int opt_programid = 0;
219 static int copy_initial_nonkeyframes = 0;
221 static int rate_emu = 0;
223 static int video_channel = 0;
224 static char *video_standard;
226 static int audio_volume = 256;
228 static int exit_on_error = 0;
229 static int using_stdin = 0;
230 static int verbose = 1;
231 static int thread_count= 1;
232 static int q_pressed = 0;
233 static int64_t video_size = 0;
234 static int64_t audio_size = 0;
235 static int64_t extra_size = 0;
236 static int nb_frames_dup = 0;
237 static int nb_frames_drop = 0;
238 static int input_sync;
239 static uint64_t limit_filesize = 0;
240 static int force_fps = 0;
241 static char *forced_key_frames = NULL;
243 static float dts_delta_threshold = 10;
245 static unsigned int sws_flags = SWS_BICUBIC;
247 static int64_t timer_start;
249 static uint8_t *audio_buf;
250 static uint8_t *audio_out;
251 unsigned int allocated_audio_out_size, allocated_audio_buf_size;
253 static short *samples;
255 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
256 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
257 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
259 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
261 struct AVInputStream;
263 typedef struct AVOutputStream {
264 int file_index; /* file index */
265 int index; /* stream index in the output file */
266 int source_index; /* AVInputStream index */
267 AVStream *st; /* stream in the output file */
268 int encoding_needed; /* true if encoding needed for this stream */
270 /* input pts and corresponding output pts
272 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
273 struct AVInputStream *sync_ist; /* input stream to sync against */
274 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
275 AVBitStreamFilterContext *bitstream_filters;
278 AVFrame pict_tmp; /* temporary image for resampling */
279 struct SwsContext *img_resample_ctx; /* for image resampling */
282 int resample_pix_fmt;
284 /* full frame size of first frame */
288 /* forced key frames */
289 int64_t *forced_kf_pts;
295 ReSampleContext *resample; /* for audio resampling */
297 AVAudioConvert *reformat_ctx;
298 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
302 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
303 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
305 typedef struct AVInputStream {
309 int discard; /* true if stream data should be discarded */
310 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
311 int64_t sample_index; /* current sample */
313 int64_t start; /* time when read started */
314 int64_t next_pts; /* synthetic pts for cases where pkt.pts
316 int64_t pts; /* current pts */
317 PtsCorrectionContext pts_ctx;
318 int is_start; /* is 1 at the start and after a discontinuity */
319 int showed_multi_packet_warning;
320 int is_past_recording_time;
322 AVFilterContext *output_video_filter;
323 AVFilterContext *input_video_filter;
324 AVFrame *filter_frame;
325 int has_filter_frame;
326 AVFilterBufferRef *picref;
330 typedef struct AVInputFile {
331 int eof_reached; /* true if eof reached */
332 int ist_index; /* index of first stream in ist_table */
333 int buffer_size; /* current total buffer size */
334 int nb_streams; /* nb streams we are aware of */
339 /* init terminal so that we can grab keys */
340 static struct termios oldtty;
345 static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
347 AVFilterContext *last_filter, *filter;
348 /** filter graph containing all filters including input & output */
349 AVCodecContext *codec = ost->st->codec;
350 AVCodecContext *icodec = ist->st->codec;
351 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
355 graph = avfilter_graph_alloc();
357 if ((ret = avfilter_open(&ist->input_video_filter, avfilter_get_by_name("buffer"), "src")) < 0)
359 if ((ret = avfilter_open(&ist->output_video_filter, &ffsink, "out")) < 0)
362 snprintf(args, 255, "%d:%d:%d:%d:%d", ist->st->codec->width,
363 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE);
364 if ((ret = avfilter_init_filter(ist->input_video_filter, args, NULL)) < 0)
366 if ((ret = avfilter_init_filter(ist->output_video_filter, NULL, &ffsink_ctx)) < 0)
369 /* add input and output filters to the overall graph */
370 avfilter_graph_add_filter(graph, ist->input_video_filter);
371 avfilter_graph_add_filter(graph, ist->output_video_filter);
373 last_filter = ist->input_video_filter;
375 if (codec->width != icodec->width || codec->height != icodec->height) {
376 snprintf(args, 255, "%d:%d:flags=0x%X",
379 (int)av_get_int(sws_opts, "sws_flags", NULL));
380 if ((ret = avfilter_open(&filter, avfilter_get_by_name("scale"), NULL)) < 0)
382 if ((ret = avfilter_init_filter(filter, args, NULL)) < 0)
384 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
386 last_filter = filter;
387 avfilter_graph_add_filter(graph, last_filter);
390 snprintf(args, sizeof(args), "flags=0x%X", (int)av_get_int(sws_opts, "sws_flags", NULL));
391 graph->scale_sws_opts = av_strdup(args);
394 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
395 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
397 outputs->name = av_strdup("in");
398 outputs->filter_ctx = last_filter;
399 outputs->pad_idx = 0;
400 outputs->next = NULL;
402 inputs->name = av_strdup("out");
403 inputs->filter_ctx = ist->output_video_filter;
407 if ((ret = avfilter_graph_parse(graph, vfilters, inputs, outputs, NULL)) < 0)
411 if ((ret = avfilter_link(last_filter, 0, ist->output_video_filter, 0)) < 0)
415 if ((ret = avfilter_graph_config(graph, NULL)) < 0)
418 codec->width = ist->output_video_filter->inputs[0]->w;
419 codec->height = ist->output_video_filter->inputs[0]->h;
423 #endif /* CONFIG_AVFILTER */
425 static void term_exit(void)
427 av_log(NULL, AV_LOG_QUIET, "");
429 tcsetattr (0, TCSANOW, &oldtty);
433 static volatile int received_sigterm = 0;
436 sigterm_handler(int sig)
438 received_sigterm = sig;
442 static void term_init(void)
451 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
452 |INLCR|IGNCR|ICRNL|IXON);
453 tty.c_oflag |= OPOST;
454 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
455 tty.c_cflag &= ~(CSIZE|PARENB);
460 tcsetattr (0, TCSANOW, &tty);
461 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
464 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
465 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
467 signal(SIGXCPU, sigterm_handler);
471 /* read a key without blocking */
472 static int read_key(void)
484 n = select(1, &rfds, NULL, NULL, &tv);
499 static int decode_interrupt_cb(void)
501 return q_pressed || (q_pressed = read_key() == 'q');
504 static int ffmpeg_exit(int ret)
509 for(i=0;i<nb_output_files;i++) {
510 /* maybe av_close_output_file ??? */
511 AVFormatContext *s = output_files[i];
513 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
515 for(j=0;j<s->nb_streams;j++) {
516 av_metadata_free(&s->streams[j]->metadata);
517 av_free(s->streams[j]->codec);
518 av_free(s->streams[j]->info);
519 av_free(s->streams[j]);
521 for(j=0;j<s->nb_programs;j++) {
522 av_metadata_free(&s->programs[j]->metadata);
524 for(j=0;j<s->nb_chapters;j++) {
525 av_metadata_free(&s->chapters[j]->metadata);
527 av_metadata_free(&s->metadata);
529 av_free(output_streams_for_file[i]);
531 for(i=0;i<nb_input_files;i++) {
532 av_close_input_file(input_files[i]);
533 av_free(input_files_ts_scale[i]);
536 av_free(intra_matrix);
537 av_free(inter_matrix);
541 av_free(vstats_filename);
544 av_free(streamid_map);
545 av_free(input_codecs);
546 av_free(output_codecs);
547 av_free(stream_maps);
548 av_free(meta_data_maps);
550 av_free(video_codec_name);
551 av_free(audio_codec_name);
552 av_free(subtitle_codec_name);
554 av_free(video_standard);
559 allocated_audio_buf_size= allocated_audio_out_size= 0;
566 if (received_sigterm) {
568 "Received signal %d: terminating.\n",
569 (int) received_sigterm);
573 exit(ret); /* not all OS-es handle main() return value */
577 /* similar to ff_dynarray_add() and av_fast_realloc() */
578 static void *grow_array(void *array, int elem_size, int *size, int new_size)
580 if (new_size >= INT_MAX / elem_size) {
581 fprintf(stderr, "Array too big.\n");
584 if (*size < new_size) {
585 uint8_t *tmp = av_realloc(array, new_size*elem_size);
587 fprintf(stderr, "Could not alloc buffer.\n");
590 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
597 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
599 if(codec && codec->sample_fmts){
600 const enum AVSampleFormat *p= codec->sample_fmts;
602 if(*p == st->codec->sample_fmt)
606 st->codec->sample_fmt = codec->sample_fmts[0];
610 static void choose_sample_rate(AVStream *st, AVCodec *codec)
612 if(codec && codec->supported_samplerates){
613 const int *p= codec->supported_samplerates;
615 int best_dist=INT_MAX;
617 int dist= abs(st->codec->sample_rate - *p);
618 if(dist < best_dist){
624 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
626 st->codec->sample_rate= best;
630 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
632 if(codec && codec->pix_fmts){
633 const enum PixelFormat *p= codec->pix_fmts;
635 if(*p == st->codec->pix_fmt)
639 && !( st->codec->codec_id==CODEC_ID_MJPEG
640 && st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL
641 && ( st->codec->pix_fmt == PIX_FMT_YUV420P
642 || st->codec->pix_fmt == PIX_FMT_YUV422P)))
643 st->codec->pix_fmt = codec->pix_fmts[0];
647 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
649 int idx = oc->nb_streams - 1;
652 output_streams_for_file[file_idx] =
653 grow_array(output_streams_for_file[file_idx],
654 sizeof(*output_streams_for_file[file_idx]),
655 &nb_output_streams_for_file[file_idx],
657 ost = output_streams_for_file[file_idx][idx] =
658 av_mallocz(sizeof(AVOutputStream));
660 fprintf(stderr, "Could not alloc output stream\n");
663 ost->file_index = file_idx;
668 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
674 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
677 /* copy stream format */
679 for(i=0;i<ic->nb_streams;i++) {
685 // FIXME: a more elegant solution is needed
686 st = av_mallocz(sizeof(AVStream));
687 memcpy(st, ic->streams[i], sizeof(AVStream));
688 st->codec = avcodec_alloc_context();
690 print_error(filename, AVERROR(ENOMEM));
693 avcodec_copy_context(st->codec, ic->streams[i]->codec);
696 codec = avcodec_find_encoder(st->codec->codec_id);
697 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
698 if (audio_stream_copy) {
701 choose_sample_fmt(st, codec);
702 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
703 if (video_stream_copy) {
706 choose_pixel_fmt(st, codec);
709 if(!st->codec->thread_count)
710 st->codec->thread_count = 1;
711 if(st->codec->thread_count>1)
712 avcodec_thread_init(st->codec, st->codec->thread_count);
714 if(st->codec->flags & CODEC_FLAG_BITEXACT)
717 new_output_stream(s, nb_output_files);
721 s->timestamp = av_gettime();
723 av_close_input_file(ic);
728 get_sync_ipts(const AVOutputStream *ost)
730 const AVInputStream *ist = ost->sync_ist;
731 return (double)(ist->pts - start_time)/AV_TIME_BASE;
734 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
738 AVPacket new_pkt= *pkt;
739 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
740 &new_pkt.data, &new_pkt.size,
741 pkt->data, pkt->size,
742 pkt->flags & AV_PKT_FLAG_KEY);
745 new_pkt.destruct= av_destruct_packet;
747 fprintf(stderr, "%s failed for stream %d, codec %s",
748 bsfc->filter->name, pkt->stream_index,
749 avctx->codec ? avctx->codec->name : "copy");
759 ret= av_interleaved_write_frame(s, pkt);
761 print_error("av_interleaved_write_frame()", ret);
766 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
768 static void do_audio_out(AVFormatContext *s,
771 unsigned char *buf, int size)
774 int64_t audio_out_size, audio_buf_size;
775 int64_t allocated_for_size= size;
777 int size_out, frame_bytes, ret;
778 AVCodecContext *enc= ost->st->codec;
779 AVCodecContext *dec= ist->st->codec;
780 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
781 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
782 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
785 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
786 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
787 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
788 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
789 audio_buf_size*= osize*enc->channels;
791 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
792 if(coded_bps > 8*osize)
793 audio_out_size= audio_out_size * coded_bps / (8*osize);
794 audio_out_size += FF_MIN_BUFFER_SIZE;
796 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
797 fprintf(stderr, "Buffer sizes too large\n");
801 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
802 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
803 if (!audio_buf || !audio_out){
804 fprintf(stderr, "Out of memory in do_audio_out\n");
808 if (enc->channels != dec->channels)
809 ost->audio_resample = 1;
811 if (ost->audio_resample && !ost->resample) {
812 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
813 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
814 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
815 enc->sample_rate, dec->sample_rate,
816 enc->sample_fmt, dec->sample_fmt,
818 if (!ost->resample) {
819 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
820 dec->channels, dec->sample_rate,
821 enc->channels, enc->sample_rate);
826 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
827 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
828 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
829 if (ost->reformat_ctx)
830 av_audio_convert_free(ost->reformat_ctx);
831 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
832 dec->sample_fmt, 1, NULL, 0);
833 if (!ost->reformat_ctx) {
834 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
835 av_get_sample_fmt_name(dec->sample_fmt),
836 av_get_sample_fmt_name(enc->sample_fmt));
839 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
842 if(audio_sync_method){
843 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
844 - av_fifo_size(ost->fifo)/(enc->channels * 2);
845 double idelta= delta*dec->sample_rate / enc->sample_rate;
846 int byte_delta= ((int)idelta)*2*dec->channels;
848 //FIXME resample delay
849 if(fabs(delta) > 50){
850 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
852 byte_delta= FFMAX(byte_delta, -size);
856 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
861 static uint8_t *input_tmp= NULL;
862 input_tmp= av_realloc(input_tmp, byte_delta + size);
864 if(byte_delta > allocated_for_size - size){
865 allocated_for_size= byte_delta + (int64_t)size;
870 memset(input_tmp, 0, byte_delta);
871 memcpy(input_tmp + byte_delta, buf, size);
875 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
877 }else if(audio_sync_method>1){
878 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
879 av_assert0(ost->audio_resample);
881 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
882 // 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));
883 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
887 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
888 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
890 if (ost->audio_resample) {
892 size_out = audio_resample(ost->resample,
893 (short *)buftmp, (short *)buf,
894 size / (dec->channels * isize));
895 size_out = size_out * enc->channels * osize;
901 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
902 const void *ibuf[6]= {buftmp};
903 void *obuf[6]= {audio_buf};
904 int istride[6]= {isize};
905 int ostride[6]= {osize};
906 int len= size_out/istride[0];
907 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
908 printf("av_audio_convert() failed\n");
914 size_out = len*osize;
917 /* now encode as many frames as possible */
918 if (enc->frame_size > 1) {
919 /* output resampled raw samples */
920 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
921 fprintf(stderr, "av_fifo_realloc2() failed\n");
924 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
926 frame_bytes = enc->frame_size * osize * enc->channels;
928 while (av_fifo_size(ost->fifo) >= frame_bytes) {
930 av_init_packet(&pkt);
932 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
934 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
936 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
939 fprintf(stderr, "Audio encoding failed\n");
943 pkt.stream_index= ost->index;
946 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
947 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
948 pkt.flags |= AV_PKT_FLAG_KEY;
949 write_frame(s, &pkt, enc, ost->bitstream_filters);
951 ost->sync_opts += enc->frame_size;
955 av_init_packet(&pkt);
957 ost->sync_opts += size_out / (osize * enc->channels);
959 /* output a pcm frame */
960 /* determine the size of the coded buffer */
963 size_out = size_out*coded_bps/8;
965 if(size_out > audio_out_size){
966 fprintf(stderr, "Internal error, buffer size too small\n");
970 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
971 ret = avcodec_encode_audio(enc, audio_out, size_out,
974 fprintf(stderr, "Audio encoding failed\n");
978 pkt.stream_index= ost->index;
981 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
982 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
983 pkt.flags |= AV_PKT_FLAG_KEY;
984 write_frame(s, &pkt, enc, ost->bitstream_filters);
988 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
992 AVPicture picture_tmp;
995 dec = ist->st->codec;
997 /* deinterlace : must be done before any resize */
998 if (do_deinterlace) {
1001 /* create temporary picture */
1002 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1003 buf = av_malloc(size);
1007 picture2 = &picture_tmp;
1008 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1010 if(avpicture_deinterlace(picture2, picture,
1011 dec->pix_fmt, dec->width, dec->height) < 0) {
1012 /* if error, do not deinterlace */
1013 fprintf(stderr, "Deinterlacing failed\n");
1022 if (picture != picture2)
1023 *picture = *picture2;
1027 /* we begin to correct av delay at this threshold */
1028 #define AV_DELAY_MAX 0.100
1030 static void do_subtitle_out(AVFormatContext *s,
1031 AVOutputStream *ost,
1036 static uint8_t *subtitle_out = NULL;
1037 int subtitle_out_max_size = 1024 * 1024;
1038 int subtitle_out_size, nb, i;
1039 AVCodecContext *enc;
1042 if (pts == AV_NOPTS_VALUE) {
1043 fprintf(stderr, "Subtitle packets must have a pts\n");
1049 enc = ost->st->codec;
1051 if (!subtitle_out) {
1052 subtitle_out = av_malloc(subtitle_out_max_size);
1055 /* Note: DVB subtitle need one packet to draw them and one other
1056 packet to clear them */
1057 /* XXX: signal it in the codec context ? */
1058 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1063 for(i = 0; i < nb; i++) {
1064 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1065 // start_display_time is required to be 0
1066 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1067 sub->end_display_time -= sub->start_display_time;
1068 sub->start_display_time = 0;
1069 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1070 subtitle_out_max_size, sub);
1071 if (subtitle_out_size < 0) {
1072 fprintf(stderr, "Subtitle encoding failed\n");
1076 av_init_packet(&pkt);
1077 pkt.stream_index = ost->index;
1078 pkt.data = subtitle_out;
1079 pkt.size = subtitle_out_size;
1080 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1081 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1082 /* XXX: the pts correction is handled here. Maybe handling
1083 it in the codec would be better */
1085 pkt.pts += 90 * sub->start_display_time;
1087 pkt.pts += 90 * sub->end_display_time;
1089 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1093 static int bit_buffer_size= 1024*256;
1094 static uint8_t *bit_buffer= NULL;
1096 static void do_video_out(AVFormatContext *s,
1097 AVOutputStream *ost,
1099 AVFrame *in_picture,
1102 int nb_frames, i, ret;
1103 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
1104 AVCodecContext *enc, *dec;
1107 enc = ost->st->codec;
1108 dec = ist->st->codec;
1110 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1112 /* by default, we output a single frame */
1117 if(video_sync_method){
1118 double vdelta = sync_ipts - ost->sync_opts;
1119 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1122 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1125 }else if(vdelta>0.6)
1126 ost->sync_opts= lrintf(sync_ipts);
1127 }else if (vdelta > 1.1)
1128 nb_frames = lrintf(vdelta);
1129 //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);
1130 if (nb_frames == 0){
1133 fprintf(stderr, "*** drop!\n");
1134 }else if (nb_frames > 1) {
1135 nb_frames_dup += nb_frames - 1;
1137 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1140 ost->sync_opts= lrintf(sync_ipts);
1142 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1146 formatted_picture = in_picture;
1147 final_picture = formatted_picture;
1148 padding_src = formatted_picture;
1149 resampling_dst = &ost->pict_tmp;
1151 if ( ost->resample_height != ist->st->codec->height
1152 || ost->resample_width != ist->st->codec->width
1153 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1155 fprintf(stderr,"Input Stream #%d.%d frame size changed to %dx%d, %s\n", ist->file_index, ist->index, ist->st->codec->width, ist->st->codec->height,avcodec_get_pix_fmt_name(ist->st->codec->pix_fmt));
1156 if(!ost->video_resample)
1160 #if !CONFIG_AVFILTER
1161 if (ost->video_resample) {
1163 final_picture = &ost->pict_tmp;
1164 if( ost->resample_height != ist->st->codec->height
1165 || ost->resample_width != ist->st->codec->width
1166 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1168 /* initialize a new scaler context */
1169 sws_freeContext(ost->img_resample_ctx);
1170 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1171 ost->img_resample_ctx = sws_getContext(
1172 ist->st->codec->width,
1173 ist->st->codec->height,
1174 ist->st->codec->pix_fmt,
1175 ost->st->codec->width,
1176 ost->st->codec->height,
1177 ost->st->codec->pix_fmt,
1178 sws_flags, NULL, NULL, NULL);
1179 if (ost->img_resample_ctx == NULL) {
1180 fprintf(stderr, "Cannot get resampling context\n");
1184 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1185 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1189 /* duplicates frame if needed */
1190 for(i=0;i<nb_frames;i++) {
1192 av_init_packet(&pkt);
1193 pkt.stream_index= ost->index;
1195 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1196 /* raw pictures are written as AVPicture structure to
1197 avoid any copies. We support temorarily the older
1199 AVFrame* old_frame = enc->coded_frame;
1200 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1201 pkt.data= (uint8_t *)final_picture;
1202 pkt.size= sizeof(AVPicture);
1203 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1204 pkt.flags |= AV_PKT_FLAG_KEY;
1206 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1207 enc->coded_frame = old_frame;
1209 AVFrame big_picture;
1211 big_picture= *final_picture;
1212 /* better than nothing: use input picture interlaced
1214 big_picture.interlaced_frame = in_picture->interlaced_frame;
1215 if(avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
1216 if(top_field_first == -1)
1217 big_picture.top_field_first = in_picture->top_field_first;
1219 big_picture.top_field_first = top_field_first;
1222 /* handles sameq here. This is not correct because it may
1223 not be a global option */
1224 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1226 big_picture.pict_type = 0;
1227 // big_picture.pts = AV_NOPTS_VALUE;
1228 big_picture.pts= ost->sync_opts;
1229 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1230 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1231 if (ost->forced_kf_index < ost->forced_kf_count &&
1232 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1233 big_picture.pict_type = FF_I_TYPE;
1234 ost->forced_kf_index++;
1236 ret = avcodec_encode_video(enc,
1237 bit_buffer, bit_buffer_size,
1240 fprintf(stderr, "Video encoding failed\n");
1245 pkt.data= bit_buffer;
1247 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1248 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1249 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1250 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1251 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1253 if(enc->coded_frame->key_frame)
1254 pkt.flags |= AV_PKT_FLAG_KEY;
1255 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1258 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1259 // enc->frame_number-1, ret, enc->pict_type);
1260 /* if two pass, output log */
1261 if (ost->logfile && enc->stats_out) {
1262 fprintf(ost->logfile, "%s", enc->stats_out);
1267 ost->frame_number++;
1271 static double psnr(double d){
1272 return -10.0*log(d)/log(10.0);
1275 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1278 AVCodecContext *enc;
1280 double ti1, bitrate, avg_bitrate;
1282 /* this is executed just the first time do_video_stats is called */
1284 vstats_file = fopen(vstats_filename, "w");
1291 enc = ost->st->codec;
1292 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1293 frame_number = ost->frame_number;
1294 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1295 if (enc->flags&CODEC_FLAG_PSNR)
1296 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1298 fprintf(vstats_file,"f_size= %6d ", frame_size);
1299 /* compute pts value */
1300 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1304 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1305 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1306 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1307 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1308 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1312 static void print_report(AVFormatContext **output_files,
1313 AVOutputStream **ost_table, int nb_ostreams,
1317 AVOutputStream *ost;
1318 AVFormatContext *oc;
1320 AVCodecContext *enc;
1321 int frame_number, vid, i;
1322 double bitrate, ti1, pts;
1323 static int64_t last_time = -1;
1324 static int qp_histogram[52];
1326 if (!is_last_report) {
1328 /* display the report every 0.5 seconds */
1329 cur_time = av_gettime();
1330 if (last_time == -1) {
1331 last_time = cur_time;
1334 if ((cur_time - last_time) < 500000)
1336 last_time = cur_time;
1340 oc = output_files[0];
1342 total_size = url_fsize(oc->pb);
1343 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1344 total_size= url_ftell(oc->pb);
1349 for(i=0;i<nb_ostreams;i++) {
1351 enc = ost->st->codec;
1352 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1353 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1354 !ost->st->stream_copy ?
1355 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1357 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1358 float t = (av_gettime()-timer_start) / 1000000.0;
1360 frame_number = ost->frame_number;
1361 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1362 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1363 !ost->st->stream_copy ?
1364 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1366 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1369 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1370 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1373 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1375 if (enc->flags&CODEC_FLAG_PSNR){
1377 double error, error_sum=0;
1378 double scale, scale_sum=0;
1379 char type[3]= {'Y','U','V'};
1380 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1383 error= enc->error[j];
1384 scale= enc->width*enc->height*255.0*255.0*frame_number;
1386 error= enc->coded_frame->error[j];
1387 scale= enc->width*enc->height*255.0*255.0;
1392 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1394 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1398 /* compute min output value */
1399 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1400 if ((pts < ti1) && (pts > 0))
1406 if (verbose || is_last_report) {
1407 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1409 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1410 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1411 (double)total_size / 1024, ti1, bitrate);
1413 if (nb_frames_dup || nb_frames_drop)
1414 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1415 nb_frames_dup, nb_frames_drop);
1418 fprintf(stderr, "%s \r", buf);
1423 if (is_last_report && verbose >= 0){
1424 int64_t raw= audio_size + video_size + extra_size;
1425 fprintf(stderr, "\n");
1426 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1430 100.0*(total_size - raw)/raw
1435 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1436 static int output_packet(AVInputStream *ist, int ist_index,
1437 AVOutputStream **ost_table, int nb_ostreams,
1438 const AVPacket *pkt)
1440 AVFormatContext *os;
1441 AVOutputStream *ost;
1445 void *buffer_to_free;
1446 static unsigned int samples_size= 0;
1447 AVSubtitle subtitle, *subtitle_to_free;
1448 int64_t pkt_pts = AV_NOPTS_VALUE;
1450 int frame_available;
1454 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1456 if(ist->next_pts == AV_NOPTS_VALUE)
1457 ist->next_pts= ist->pts;
1461 av_init_packet(&avpkt);
1469 if(pkt->dts != AV_NOPTS_VALUE)
1470 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1471 if(pkt->pts != AV_NOPTS_VALUE)
1472 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1474 //while we have more to decode or while the decoder did output something on EOF
1475 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1476 uint8_t *data_buf, *decoded_data_buf;
1477 int data_size, decoded_data_size;
1479 ist->pts= ist->next_pts;
1481 if(avpkt.size && avpkt.size != pkt->size &&
1482 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1483 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1484 ist->showed_multi_packet_warning=1;
1487 /* decode the packet if needed */
1488 decoded_data_buf = NULL; /* fail safe */
1489 decoded_data_size= 0;
1490 data_buf = avpkt.data;
1491 data_size = avpkt.size;
1492 subtitle_to_free = NULL;
1493 if (ist->decoding_needed) {
1494 switch(ist->st->codec->codec_type) {
1495 case AVMEDIA_TYPE_AUDIO:{
1496 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1497 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1499 samples= av_malloc(samples_size);
1501 decoded_data_size= samples_size;
1502 /* XXX: could avoid copy if PCM 16 bits with same
1503 endianness as CPU */
1504 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1511 /* Some bug in mpeg audio decoder gives */
1512 /* decoded_data_size < 0, it seems they are overflows */
1513 if (decoded_data_size <= 0) {
1514 /* no audio frame */
1517 decoded_data_buf = (uint8_t *)samples;
1518 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1519 (ist->st->codec->sample_rate * ist->st->codec->channels);
1521 case AVMEDIA_TYPE_VIDEO:
1522 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1523 /* XXX: allocate picture correctly */
1524 avcodec_get_frame_defaults(&picture);
1525 ist->st->codec->reordered_opaque = pkt_pts;
1526 pkt_pts = AV_NOPTS_VALUE;
1528 ret = avcodec_decode_video2(ist->st->codec,
1529 &picture, &got_picture, &avpkt);
1530 ist->st->quality= picture.quality;
1534 /* no picture yet */
1535 goto discard_packet;
1537 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.reordered_opaque, ist->pts);
1538 if (ist->st->codec->time_base.num != 0) {
1539 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1540 ist->next_pts += ((int64_t)AV_TIME_BASE *
1541 ist->st->codec->time_base.num * ticks) /
1542 ist->st->codec->time_base.den;
1546 case AVMEDIA_TYPE_SUBTITLE:
1547 ret = avcodec_decode_subtitle2(ist->st->codec,
1548 &subtitle, &got_picture, &avpkt);
1552 goto discard_packet;
1554 subtitle_to_free = &subtitle;
1561 switch(ist->st->codec->codec_type) {
1562 case AVMEDIA_TYPE_AUDIO:
1563 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1564 ist->st->codec->sample_rate;
1566 case AVMEDIA_TYPE_VIDEO:
1567 if (ist->st->codec->time_base.num != 0) {
1568 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1569 ist->next_pts += ((int64_t)AV_TIME_BASE *
1570 ist->st->codec->time_base.num * ticks) /
1571 ist->st->codec->time_base.den;
1579 buffer_to_free = NULL;
1580 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1581 pre_process_video_frame(ist, (AVPicture *)&picture,
1586 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->input_video_filter) {
1587 // add it to be filtered
1588 av_vsrc_buffer_add_frame(ist->input_video_filter, &picture,
1590 ist->st->codec->sample_aspect_ratio);
1594 // preprocess audio (volume)
1595 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1596 if (audio_volume != 256) {
1599 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1600 int v = ((*volp) * audio_volume + 128) >> 8;
1601 if (v < -32768) v = -32768;
1602 if (v > 32767) v = 32767;
1608 /* frame rate emulation */
1610 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1611 int64_t now = av_gettime() - ist->start;
1616 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1617 !ist->output_video_filter || avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1619 /* if output time reached then transcode raw format,
1620 encode packets and output them */
1621 if (start_time == 0 || ist->pts >= start_time)
1623 while (frame_available) {
1624 AVRational ist_pts_tb;
1625 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->output_video_filter)
1626 get_filtered_video_frame(ist->output_video_filter, &picture, &ist->picref, &ist_pts_tb);
1628 ist->pts = av_rescale_q(ist->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1630 for(i=0;i<nb_ostreams;i++) {
1634 if (ost->source_index == ist_index) {
1635 os = output_files[ost->file_index];
1637 /* set the input output pts pairs */
1638 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1640 if (ost->encoding_needed) {
1641 av_assert0(ist->decoding_needed);
1642 switch(ost->st->codec->codec_type) {
1643 case AVMEDIA_TYPE_AUDIO:
1644 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1646 case AVMEDIA_TYPE_VIDEO:
1648 if (ist->picref->video)
1649 ost->st->codec->sample_aspect_ratio = ist->picref->video->pixel_aspect;
1651 do_video_out(os, ost, ist, &picture, &frame_size);
1652 if (vstats_filename && frame_size)
1653 do_video_stats(os, ost, frame_size);
1655 case AVMEDIA_TYPE_SUBTITLE:
1656 do_subtitle_out(os, ost, ist, &subtitle,
1663 AVFrame avframe; //FIXME/XXX remove this
1665 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1667 av_init_packet(&opkt);
1669 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1672 /* no reencoding needed : output the packet directly */
1673 /* force the input stream PTS */
1675 avcodec_get_frame_defaults(&avframe);
1676 ost->st->codec->coded_frame= &avframe;
1677 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1679 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1680 audio_size += data_size;
1681 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1682 video_size += data_size;
1686 opkt.stream_index= ost->index;
1687 if(pkt->pts != AV_NOPTS_VALUE)
1688 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1690 opkt.pts= AV_NOPTS_VALUE;
1692 if (pkt->dts == AV_NOPTS_VALUE)
1693 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1695 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1696 opkt.dts -= ost_tb_start_time;
1698 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1699 opkt.flags= pkt->flags;
1701 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1702 if( ost->st->codec->codec_id != CODEC_ID_H264
1703 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1704 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1706 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1707 opkt.destruct= av_destruct_packet;
1709 opkt.data = data_buf;
1710 opkt.size = data_size;
1713 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1714 ost->st->codec->frame_number++;
1715 ost->frame_number++;
1716 av_free_packet(&opkt);
1722 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1723 ist->output_video_filter && avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1725 avfilter_unref_buffer(ist->picref);
1728 av_free(buffer_to_free);
1729 /* XXX: allocate the subtitles in the codec ? */
1730 if (subtitle_to_free) {
1731 if (subtitle_to_free->rects != NULL) {
1732 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1733 av_freep(&subtitle_to_free->rects[i]->pict.data[0]);
1734 av_freep(&subtitle_to_free->rects[i]->pict.data[1]);
1735 av_freep(&subtitle_to_free->rects[i]);
1737 av_freep(&subtitle_to_free->rects);
1739 subtitle_to_free->num_rects = 0;
1740 subtitle_to_free = NULL;
1747 for(i=0;i<nb_ostreams;i++) {
1749 if (ost->source_index == ist_index) {
1750 AVCodecContext *enc= ost->st->codec;
1751 os = output_files[ost->file_index];
1753 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1755 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1758 if (ost->encoding_needed) {
1762 av_init_packet(&pkt);
1763 pkt.stream_index= ost->index;
1765 switch(ost->st->codec->codec_type) {
1766 case AVMEDIA_TYPE_AUDIO:
1767 fifo_bytes = av_fifo_size(ost->fifo);
1769 /* encode any samples remaining in fifo */
1770 if (fifo_bytes > 0) {
1771 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1772 int fs_tmp = enc->frame_size;
1774 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1775 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1776 enc->frame_size = fifo_bytes / (osize * enc->channels);
1778 int frame_bytes = enc->frame_size*osize*enc->channels;
1779 if (allocated_audio_buf_size < frame_bytes)
1781 memset(audio_buf+fifo_bytes, 0, frame_bytes - fifo_bytes);
1784 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1785 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1786 ost->st->time_base.num, enc->sample_rate);
1787 enc->frame_size = fs_tmp;
1790 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1793 fprintf(stderr, "Audio encoding failed\n");
1797 pkt.flags |= AV_PKT_FLAG_KEY;
1799 case AVMEDIA_TYPE_VIDEO:
1800 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1802 fprintf(stderr, "Video encoding failed\n");
1806 if(enc->coded_frame && enc->coded_frame->key_frame)
1807 pkt.flags |= AV_PKT_FLAG_KEY;
1808 if (ost->logfile && enc->stats_out) {
1809 fprintf(ost->logfile, "%s", enc->stats_out);
1818 pkt.data= bit_buffer;
1820 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1821 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1822 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1834 static void print_sdp(AVFormatContext **avc, int n)
1838 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1839 printf("SDP:\n%s\n", sdp);
1843 static int copy_chapters(int infile, int outfile)
1845 AVFormatContext *is = input_files[infile];
1846 AVFormatContext *os = output_files[outfile];
1849 for (i = 0; i < is->nb_chapters; i++) {
1850 AVChapter *in_ch = is->chapters[i], *out_ch;
1851 AVMetadataTag *t = NULL;
1852 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1853 AV_TIME_BASE_Q, in_ch->time_base);
1854 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1855 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1858 if (in_ch->end < ts_off)
1860 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1863 out_ch = av_mallocz(sizeof(AVChapter));
1865 return AVERROR(ENOMEM);
1867 out_ch->id = in_ch->id;
1868 out_ch->time_base = in_ch->time_base;
1869 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1870 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1872 if (metadata_chapters_autocopy)
1873 while ((t = av_metadata_get(in_ch->metadata, "", t, AV_METADATA_IGNORE_SUFFIX)))
1874 av_metadata_set2(&out_ch->metadata, t->key, t->value, 0);
1877 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1879 return AVERROR(ENOMEM);
1880 os->chapters[os->nb_chapters - 1] = out_ch;
1885 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1886 AVCodecContext *avctx)
1892 for (p = kf; *p; p++)
1895 ost->forced_kf_count = n;
1896 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1897 if (!ost->forced_kf_pts) {
1898 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1901 for (i = 0; i < n; i++) {
1902 p = i ? strchr(p, ',') + 1 : kf;
1903 t = parse_time_or_die("force_key_frames", p, 1);
1904 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1909 * The following code is the main loop of the file converter
1911 static int transcode(AVFormatContext **output_files,
1912 int nb_output_files,
1913 AVFormatContext **input_files,
1915 AVStreamMap *stream_maps, int nb_stream_maps)
1917 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1918 AVFormatContext *is, *os;
1919 AVCodecContext *codec, *icodec;
1920 AVOutputStream *ost, **ost_table = NULL;
1921 AVInputStream *ist, **ist_table = NULL;
1922 AVInputFile *file_table;
1926 uint8_t no_packet[MAX_FILES]={0};
1927 int no_packet_count=0;
1929 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1933 /* input stream init */
1935 for(i=0;i<nb_input_files;i++) {
1936 is = input_files[i];
1937 file_table[i].ist_index = j;
1938 file_table[i].nb_streams = is->nb_streams;
1939 j += is->nb_streams;
1943 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1947 for(i=0;i<nb_istreams;i++) {
1948 ist = av_mallocz(sizeof(AVInputStream));
1954 for(i=0;i<nb_input_files;i++) {
1955 is = input_files[i];
1956 for(k=0;k<is->nb_streams;k++) {
1957 ist = ist_table[j++];
1958 ist->st = is->streams[k];
1959 ist->file_index = i;
1961 ist->discard = 1; /* the stream is discarded by default
1965 ist->start = av_gettime();
1970 /* output stream init */
1972 for(i=0;i<nb_output_files;i++) {
1973 os = output_files[i];
1974 if (!os->nb_streams) {
1975 dump_format(output_files[i], i, output_files[i]->filename, 1);
1976 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1977 ret = AVERROR(EINVAL);
1980 nb_ostreams += os->nb_streams;
1982 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1983 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1984 ret = AVERROR(EINVAL);
1988 /* Sanity check the mapping args -- do the input files & streams exist? */
1989 for(i=0;i<nb_stream_maps;i++) {
1990 int fi = stream_maps[i].file_index;
1991 int si = stream_maps[i].stream_index;
1993 if (fi < 0 || fi > nb_input_files - 1 ||
1994 si < 0 || si > file_table[fi].nb_streams - 1) {
1995 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1996 ret = AVERROR(EINVAL);
1999 fi = stream_maps[i].sync_file_index;
2000 si = stream_maps[i].sync_stream_index;
2001 if (fi < 0 || fi > nb_input_files - 1 ||
2002 si < 0 || si > file_table[fi].nb_streams - 1) {
2003 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2004 ret = AVERROR(EINVAL);
2009 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2013 for(k=0;k<nb_output_files;k++) {
2014 os = output_files[k];
2015 for(i=0;i<os->nb_streams;i++,n++) {
2017 ost = ost_table[n] = output_streams_for_file[k][i];
2018 ost->st = os->streams[i];
2019 if (nb_stream_maps > 0) {
2020 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
2021 stream_maps[n].stream_index;
2023 /* Sanity check that the stream types match */
2024 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
2025 int i= ost->file_index;
2026 dump_format(output_files[i], i, output_files[i]->filename, 1);
2027 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2028 stream_maps[n].file_index, stream_maps[n].stream_index,
2029 ost->file_index, ost->index);
2034 int best_nb_frames=-1;
2035 /* get corresponding input stream index : we select the first one with the right type */
2037 for(j=0;j<nb_istreams;j++) {
2042 AVFormatContext *f= input_files[ ist->file_index ];
2044 for(pi=0; pi<f->nb_programs; pi++){
2045 AVProgram *p= f->programs[pi];
2046 if(p->id == opt_programid)
2047 for(si=0; si<p->nb_stream_indexes; si++){
2048 if(f->streams[ p->stream_index[si] ] == ist->st)
2053 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2054 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2055 if(best_nb_frames < ist->st->codec_info_nb_frames){
2056 best_nb_frames= ist->st->codec_info_nb_frames;
2057 ost->source_index = j;
2064 if(! opt_programid) {
2065 /* try again and reuse existing stream */
2066 for(j=0;j<nb_istreams;j++) {
2068 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2069 && ist->st->discard != AVDISCARD_ALL) {
2070 ost->source_index = j;
2076 int i= ost->file_index;
2077 dump_format(output_files[i], i, output_files[i]->filename, 1);
2078 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2079 ost->file_index, ost->index);
2084 ist = ist_table[ost->source_index];
2086 ost->sync_ist = (nb_stream_maps > 0) ?
2087 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2088 stream_maps[n].sync_stream_index] : ist;
2092 /* for each output stream, we compute the right encoding parameters */
2093 for(i=0;i<nb_ostreams;i++) {
2094 AVMetadataTag *t = NULL;
2096 os = output_files[ost->file_index];
2097 ist = ist_table[ost->source_index];
2099 codec = ost->st->codec;
2100 icodec = ist->st->codec;
2102 if (metadata_streams_autocopy)
2103 while ((t = av_metadata_get(ist->st->metadata, "", t, AV_METADATA_IGNORE_SUFFIX))) {
2104 av_metadata_set2(&ost->st->metadata, t->key, t->value, AV_METADATA_DONT_OVERWRITE);
2107 ost->st->disposition = ist->st->disposition;
2108 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2109 codec->chroma_sample_location = icodec->chroma_sample_location;
2111 if (ost->st->stream_copy) {
2112 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2114 if (extra_size > INT_MAX)
2117 /* if stream_copy is selected, no need to decode or encode */
2118 codec->codec_id = icodec->codec_id;
2119 codec->codec_type = icodec->codec_type;
2121 if(!codec->codec_tag){
2122 if( !os->oformat->codec_tag
2123 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2124 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2125 codec->codec_tag = icodec->codec_tag;
2128 codec->bit_rate = icodec->bit_rate;
2129 codec->rc_max_rate = icodec->rc_max_rate;
2130 codec->rc_buffer_size = icodec->rc_buffer_size;
2131 codec->extradata= av_mallocz(extra_size);
2132 if (!codec->extradata)
2134 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2135 codec->extradata_size= icodec->extradata_size;
2136 if(av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000){
2137 codec->time_base = icodec->time_base;
2138 codec->time_base.num *= icodec->ticks_per_frame;
2139 av_reduce(&codec->time_base.num, &codec->time_base.den,
2140 codec->time_base.num, codec->time_base.den, INT_MAX);
2142 codec->time_base = ist->st->time_base;
2143 switch(codec->codec_type) {
2144 case AVMEDIA_TYPE_AUDIO:
2145 if(audio_volume != 256) {
2146 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2149 codec->channel_layout = icodec->channel_layout;
2150 codec->sample_rate = icodec->sample_rate;
2151 codec->channels = icodec->channels;
2152 codec->frame_size = icodec->frame_size;
2153 codec->block_align= icodec->block_align;
2154 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2155 codec->block_align= 0;
2156 if(codec->codec_id == CODEC_ID_AC3)
2157 codec->block_align= 0;
2159 case AVMEDIA_TYPE_VIDEO:
2160 codec->pix_fmt = icodec->pix_fmt;
2161 codec->width = icodec->width;
2162 codec->height = icodec->height;
2163 codec->has_b_frames = icodec->has_b_frames;
2165 case AVMEDIA_TYPE_SUBTITLE:
2166 codec->width = icodec->width;
2167 codec->height = icodec->height;
2173 switch(codec->codec_type) {
2174 case AVMEDIA_TYPE_AUDIO:
2175 ost->fifo= av_fifo_alloc(1024);
2178 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2179 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2180 icodec->request_channels = codec->channels;
2181 ist->decoding_needed = 1;
2182 ost->encoding_needed = 1;
2184 case AVMEDIA_TYPE_VIDEO:
2185 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2186 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2189 ost->video_resample = (codec->width != icodec->width ||
2190 codec->height != icodec->height ||
2191 (codec->pix_fmt != icodec->pix_fmt));
2192 if (ost->video_resample) {
2193 avcodec_get_frame_defaults(&ost->pict_tmp);
2194 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2195 codec->width, codec->height)) {
2196 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2199 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
2200 ost->img_resample_ctx = sws_getContext(
2207 sws_flags, NULL, NULL, NULL);
2208 if (ost->img_resample_ctx == NULL) {
2209 fprintf(stderr, "Cannot get resampling context\n");
2213 #if !CONFIG_AVFILTER
2214 ost->original_height = icodec->height;
2215 ost->original_width = icodec->width;
2217 codec->bits_per_raw_sample= 0;
2219 ost->resample_height = icodec->height;
2220 ost->resample_width = icodec->width;
2221 ost->resample_pix_fmt= icodec->pix_fmt;
2222 ost->encoding_needed = 1;
2223 ist->decoding_needed = 1;
2226 if (configure_filters(ist, ost)) {
2227 fprintf(stderr, "Error opening filters!\n");
2232 case AVMEDIA_TYPE_SUBTITLE:
2233 ost->encoding_needed = 1;
2234 ist->decoding_needed = 1;
2241 if (ost->encoding_needed &&
2242 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2243 char logfilename[1024];
2246 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2247 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2249 if (codec->flags & CODEC_FLAG_PASS1) {
2250 f = fopen(logfilename, "wb");
2252 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2258 size_t logbuffer_size;
2259 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2260 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2263 codec->stats_in = logbuffer;
2267 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2268 int size= codec->width * codec->height;
2269 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2274 bit_buffer = av_malloc(bit_buffer_size);
2276 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2278 ret = AVERROR(ENOMEM);
2282 /* open each encoder */
2283 for(i=0;i<nb_ostreams;i++) {
2285 if (ost->encoding_needed) {
2286 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2287 AVCodecContext *dec = ist_table[ost->source_index]->st->codec;
2289 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2291 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2292 ost->st->codec->codec_id, ost->file_index, ost->index);
2293 ret = AVERROR(EINVAL);
2296 if (dec->subtitle_header) {
2297 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2298 if (!ost->st->codec->subtitle_header) {
2299 ret = AVERROR(ENOMEM);
2302 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2303 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2305 if (avcodec_open(ost->st->codec, codec) < 0) {
2306 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2307 ost->file_index, ost->index);
2308 ret = AVERROR(EINVAL);
2311 extra_size += ost->st->codec->extradata_size;
2315 /* open each decoder */
2316 for(i=0;i<nb_istreams;i++) {
2318 if (ist->decoding_needed) {
2319 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2321 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2323 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2324 ist->st->codec->codec_id, ist->file_index, ist->index);
2325 ret = AVERROR(EINVAL);
2328 if (avcodec_open(ist->st->codec, codec) < 0) {
2329 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2330 ist->file_index, ist->index);
2331 ret = AVERROR(EINVAL);
2334 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2335 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2340 for(i=0;i<nb_istreams;i++) {
2344 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2345 ist->next_pts = AV_NOPTS_VALUE;
2346 init_pts_correction(&ist->pts_ctx);
2350 /* set meta data information from input file if required */
2351 for (i=0;i<nb_meta_data_maps;i++) {
2352 AVFormatContext *files[2];
2353 AVMetadata **meta[2];
2354 AVMetadataTag *mtag;
2357 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2358 if ((index) < 0 || (index) >= (nb_elems)) {\
2359 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2361 ret = AVERROR(EINVAL);\
2365 int out_file_index = meta_data_maps[i][0].file;
2366 int in_file_index = meta_data_maps[i][1].file;
2367 if (in_file_index < 0 || out_file_index < 0)
2369 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2370 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2372 files[0] = output_files[out_file_index];
2373 files[1] = input_files[in_file_index];
2375 for (j = 0; j < 2; j++) {
2376 AVMetaDataMap *map = &meta_data_maps[i][j];
2378 switch (map->type) {
2380 meta[j] = &files[j]->metadata;
2383 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2384 meta[j] = &files[j]->streams[map->index]->metadata;
2387 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2388 meta[j] = &files[j]->chapters[map->index]->metadata;
2391 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2392 meta[j] = &files[j]->programs[map->index]->metadata;
2398 while((mtag=av_metadata_get(*meta[1], "", mtag, AV_METADATA_IGNORE_SUFFIX)))
2399 av_metadata_set2(meta[0], mtag->key, mtag->value, AV_METADATA_DONT_OVERWRITE);
2402 /* copy chapters according to chapter maps */
2403 for (i = 0; i < nb_chapter_maps; i++) {
2404 int infile = chapter_maps[i].in_file;
2405 int outfile = chapter_maps[i].out_file;
2407 if (infile < 0 || outfile < 0)
2409 if (infile >= nb_input_files) {
2410 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2411 ret = AVERROR(EINVAL);
2414 if (outfile >= nb_output_files) {
2415 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2416 ret = AVERROR(EINVAL);
2419 copy_chapters(infile, outfile);
2422 /* copy chapters from the first input file that has them*/
2423 if (!nb_chapter_maps)
2424 for (i = 0; i < nb_input_files; i++) {
2425 if (!input_files[i]->nb_chapters)
2428 for (j = 0; j < nb_output_files; j++)
2429 if ((ret = copy_chapters(i, j)) < 0)
2434 /* open files and write file headers */
2435 for(i=0;i<nb_output_files;i++) {
2436 os = output_files[i];
2437 if (av_write_header(os) < 0) {
2438 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2439 ret = AVERROR(EINVAL);
2442 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2448 /* dump the file output parameters - cannot be done before in case
2450 for(i=0;i<nb_output_files;i++) {
2451 dump_format(output_files[i], i, output_files[i]->filename, 1);
2454 /* dump the stream mapping */
2456 fprintf(stderr, "Stream mapping:\n");
2457 for(i=0;i<nb_ostreams;i++) {
2459 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2460 ist_table[ost->source_index]->file_index,
2461 ist_table[ost->source_index]->index,
2464 if (ost->sync_ist != ist_table[ost->source_index])
2465 fprintf(stderr, " [sync #%d.%d]",
2466 ost->sync_ist->file_index,
2467 ost->sync_ist->index);
2468 fprintf(stderr, "\n");
2473 fprintf(stderr, "%s\n", error);
2478 print_sdp(output_files, nb_output_files);
2481 if (!using_stdin && verbose >= 0) {
2482 fprintf(stderr, "Press [q] to stop encoding\n");
2483 url_set_interrupt_cb(decode_interrupt_cb);
2487 timer_start = av_gettime();
2489 for(; received_sigterm == 0;) {
2490 int file_index, ist_index;
2498 /* if 'q' pressed, exits */
2502 /* read_key() returns 0 on EOF */
2508 /* select the stream that we must read now by looking at the
2509 smallest output pts */
2511 for(i=0;i<nb_ostreams;i++) {
2514 os = output_files[ost->file_index];
2515 ist = ist_table[ost->source_index];
2516 if(ist->is_past_recording_time || no_packet[ist->file_index])
2518 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2519 ipts = (double)ist->pts;
2520 if (!file_table[ist->file_index].eof_reached){
2521 if(ipts < ipts_min) {
2523 if(input_sync ) file_index = ist->file_index;
2525 if(opts < opts_min) {
2527 if(!input_sync) file_index = ist->file_index;
2530 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2535 /* if none, if is finished */
2536 if (file_index < 0) {
2537 if(no_packet_count){
2539 memset(no_packet, 0, sizeof(no_packet));
2546 /* finish if limit size exhausted */
2547 if (limit_filesize != 0 && limit_filesize <= url_ftell(output_files[0]->pb))
2550 /* read a frame from it and output it in the fifo */
2551 is = input_files[file_index];
2552 ret= av_read_frame(is, &pkt);
2553 if(ret == AVERROR(EAGAIN)){
2554 no_packet[file_index]=1;
2559 file_table[file_index].eof_reached = 1;
2567 memset(no_packet, 0, sizeof(no_packet));
2570 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2572 /* the following test is needed in case new streams appear
2573 dynamically in stream : we ignore them */
2574 if (pkt.stream_index >= file_table[file_index].nb_streams)
2575 goto discard_packet;
2576 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2577 ist = ist_table[ist_index];
2579 goto discard_packet;
2581 if (pkt.dts != AV_NOPTS_VALUE)
2582 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2583 if (pkt.pts != AV_NOPTS_VALUE)
2584 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2586 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2587 && input_files_ts_scale[file_index][pkt.stream_index]){
2588 if(pkt.pts != AV_NOPTS_VALUE)
2589 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2590 if(pkt.dts != AV_NOPTS_VALUE)
2591 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2594 // fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files_ts_offset[ist->file_index], ist->st->codec->codec_type);
2595 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2596 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2597 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2598 int64_t delta= pkt_dts - ist->next_pts;
2599 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2600 input_files_ts_offset[ist->file_index]-= delta;
2602 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2603 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2604 if(pkt.pts != AV_NOPTS_VALUE)
2605 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2609 /* finish if recording time exhausted */
2610 if (recording_time != INT64_MAX &&
2611 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2612 ist->is_past_recording_time = 1;
2613 goto discard_packet;
2616 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2617 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2620 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2621 ist->file_index, ist->index);
2624 av_free_packet(&pkt);
2629 av_free_packet(&pkt);
2631 /* dump report by using the output first video and audio streams */
2632 print_report(output_files, ost_table, nb_ostreams, 0);
2635 /* at the end of stream, we must flush the decoder buffers */
2636 for(i=0;i<nb_istreams;i++) {
2638 if (ist->decoding_needed) {
2639 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2645 /* write the trailer if needed and close file */
2646 for(i=0;i<nb_output_files;i++) {
2647 os = output_files[i];
2648 av_write_trailer(os);
2651 /* dump report by using the first video and audio streams */
2652 print_report(output_files, ost_table, nb_ostreams, 1);
2654 /* close each encoder */
2655 for(i=0;i<nb_ostreams;i++) {
2657 if (ost->encoding_needed) {
2658 av_freep(&ost->st->codec->stats_in);
2659 avcodec_close(ost->st->codec);
2663 /* close each decoder */
2664 for(i=0;i<nb_istreams;i++) {
2666 if (ist->decoding_needed) {
2667 avcodec_close(ist->st->codec);
2672 avfilter_graph_free(graph);
2681 av_freep(&bit_buffer);
2682 av_free(file_table);
2685 for(i=0;i<nb_istreams;i++) {
2692 for(i=0;i<nb_ostreams;i++) {
2695 if (ost->st->stream_copy)
2696 av_freep(&ost->st->codec->extradata);
2698 fclose(ost->logfile);
2699 ost->logfile = NULL;
2701 av_fifo_free(ost->fifo); /* works even if fifo is not
2702 initialized but set to zero */
2703 av_freep(&ost->st->codec->subtitle_header);
2704 av_free(ost->pict_tmp.data[0]);
2705 av_free(ost->forced_kf_pts);
2706 if (ost->video_resample)
2707 sws_freeContext(ost->img_resample_ctx);
2709 audio_resample_close(ost->resample);
2710 if (ost->reformat_ctx)
2711 av_audio_convert_free(ost->reformat_ctx);
2720 static void opt_format(const char *arg)
2722 last_asked_format = arg;
2725 static void opt_video_rc_override_string(const char *arg)
2727 video_rc_override_string = arg;
2730 static int opt_me_threshold(const char *opt, const char *arg)
2732 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2736 static int opt_verbose(const char *opt, const char *arg)
2738 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2742 static int opt_frame_rate(const char *opt, const char *arg)
2744 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2745 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2751 static int opt_bitrate(const char *opt, const char *arg)
2753 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2755 opt_default(opt, arg);
2757 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2758 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2763 static int opt_frame_crop(const char *opt, const char *arg)
2765 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2766 return AVERROR(EINVAL);
2769 static void opt_frame_size(const char *arg)
2771 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2772 fprintf(stderr, "Incorrect frame size\n");
2777 static int opt_pad(const char *opt, const char *arg) {
2778 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2782 static void opt_frame_pix_fmt(const char *arg)
2784 if (strcmp(arg, "list")) {
2785 frame_pix_fmt = av_get_pix_fmt(arg);
2786 if (frame_pix_fmt == PIX_FMT_NONE) {
2787 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2796 static void opt_frame_aspect_ratio(const char *arg)
2803 p = strchr(arg, ':');
2805 x = strtol(arg, &end, 10);
2807 y = strtol(end+1, &end, 10);
2809 ar = (double)x / (double)y;
2811 ar = strtod(arg, NULL);
2814 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2817 frame_aspect_ratio = ar;
2820 static int opt_metadata(const char *opt, const char *arg)
2822 char *mid= strchr(arg, '=');
2825 fprintf(stderr, "Missing =\n");
2830 av_metadata_set2(&metadata, arg, mid, 0);
2835 static void opt_qscale(const char *arg)
2837 video_qscale = atof(arg);
2838 if (video_qscale <= 0 ||
2839 video_qscale > 255) {
2840 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2845 static void opt_top_field_first(const char *arg)
2847 top_field_first= atoi(arg);
2850 static int opt_thread_count(const char *opt, const char *arg)
2852 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2855 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2860 static void opt_audio_sample_fmt(const char *arg)
2862 if (strcmp(arg, "list"))
2863 audio_sample_fmt = av_get_sample_fmt(arg);
2865 list_fmts(av_get_sample_fmt_string, AV_SAMPLE_FMT_NB);
2870 static int opt_audio_rate(const char *opt, const char *arg)
2872 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2876 static int opt_audio_channels(const char *opt, const char *arg)
2878 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2882 static void opt_video_channel(const char *arg)
2884 video_channel = strtol(arg, NULL, 0);
2887 static void opt_video_standard(const char *arg)
2889 video_standard = av_strdup(arg);
2892 static void opt_codec(int *pstream_copy, char **pcodec_name,
2893 int codec_type, const char *arg)
2895 av_freep(pcodec_name);
2896 if (!strcmp(arg, "copy")) {
2899 *pcodec_name = av_strdup(arg);
2903 static void opt_audio_codec(const char *arg)
2905 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2908 static void opt_video_codec(const char *arg)
2910 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2913 static void opt_subtitle_codec(const char *arg)
2915 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2918 static int opt_codec_tag(const char *opt, const char *arg)
2921 uint32_t *codec_tag;
2923 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2924 !strcmp(opt, "vtag") ? &video_codec_tag :
2925 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2929 *codec_tag = strtol(arg, &tail, 0);
2931 *codec_tag = AV_RL32(arg);
2936 static void opt_map(const char *arg)
2941 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2942 m = &stream_maps[nb_stream_maps-1];
2944 m->file_index = strtol(arg, &p, 0);
2948 m->stream_index = strtol(p, &p, 0);
2951 m->sync_file_index = strtol(p, &p, 0);
2954 m->sync_stream_index = strtol(p, &p, 0);
2956 m->sync_file_index = m->file_index;
2957 m->sync_stream_index = m->stream_index;
2961 static void parse_meta_type(const char *arg, char *type, int *index, char **endptr)
2972 *index = strtol(++arg, endptr, 0);
2975 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2982 static void opt_map_meta_data(const char *arg)
2984 AVMetaDataMap *m, *m1;
2987 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2988 &nb_meta_data_maps, nb_meta_data_maps + 1);
2990 m = &meta_data_maps[nb_meta_data_maps - 1][0];
2991 m->file = strtol(arg, &p, 0);
2992 parse_meta_type(p, &m->type, &m->index, &p);
2996 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
2997 m1->file = strtol(p, &p, 0);
2998 parse_meta_type(p, &m1->type, &m1->index, &p);
3000 if (m->type == 's' || m1->type == 's')
3001 metadata_streams_autocopy = 0;
3002 if (m->type == 'c' || m1->type == 'c')
3003 metadata_chapters_autocopy = 0;
3006 static void opt_map_chapters(const char *arg)
3011 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3012 nb_chapter_maps + 1);
3013 c = &chapter_maps[nb_chapter_maps - 1];
3014 c->out_file = strtol(arg, &p, 0);
3018 c->in_file = strtol(p, &p, 0);
3021 static void opt_input_ts_scale(const char *arg)
3023 unsigned int stream;
3027 stream = strtol(arg, &p, 0);
3030 scale= strtod(p, &p);
3032 if(stream >= MAX_STREAMS)
3035 input_files_ts_scale[nb_input_files] = grow_array(input_files_ts_scale[nb_input_files], sizeof(*input_files_ts_scale[nb_input_files]), &nb_input_files_ts_scale[nb_input_files], stream + 1);
3036 input_files_ts_scale[nb_input_files][stream]= scale;
3039 static int opt_recording_time(const char *opt, const char *arg)
3041 recording_time = parse_time_or_die(opt, arg, 1);
3045 static int opt_start_time(const char *opt, const char *arg)
3047 start_time = parse_time_or_die(opt, arg, 1);
3051 static int opt_recording_timestamp(const char *opt, const char *arg)
3053 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3057 static int opt_input_ts_offset(const char *opt, const char *arg)
3059 input_ts_offset = parse_time_or_die(opt, arg, 1);
3063 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3065 const char *codec_string = encoder ? "encoder" : "decoder";
3069 return CODEC_ID_NONE;
3071 avcodec_find_encoder_by_name(name) :
3072 avcodec_find_decoder_by_name(name);
3074 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3077 if(codec->type != type) {
3078 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3081 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3082 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3083 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3084 "results.\nAdd '-strict experimental' if you want to use it.\n",
3085 codec_string, codec->name);
3087 avcodec_find_encoder(codec->id) :
3088 avcodec_find_decoder(codec->id);
3089 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3090 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3091 codec_string, codec->name);
3097 static void opt_input_file(const char *filename)
3099 AVFormatContext *ic;
3100 AVFormatParameters params, *ap = ¶ms;
3101 AVInputFormat *file_iformat = NULL;
3102 int err, i, ret, rfps, rfps_base;
3105 if (last_asked_format) {
3106 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3107 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3110 last_asked_format = NULL;
3113 if (!strcmp(filename, "-"))
3116 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3117 !strcmp(filename, "/dev/stdin");
3119 /* get default parameters from command line */
3120 ic = avformat_alloc_context();
3122 print_error(filename, AVERROR(ENOMEM));
3126 memset(ap, 0, sizeof(*ap));
3127 ap->prealloced_context = 1;
3128 ap->sample_rate = audio_sample_rate;
3129 ap->channels = audio_channels;
3130 ap->time_base.den = frame_rate.num;
3131 ap->time_base.num = frame_rate.den;
3132 ap->width = frame_width;
3133 ap->height = frame_height;
3134 ap->pix_fmt = frame_pix_fmt;
3135 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3136 ap->channel = video_channel;
3137 ap->standard = video_standard;
3139 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3141 ic->video_codec_id =
3142 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3143 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3144 ic->audio_codec_id =
3145 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3146 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3147 ic->subtitle_codec_id=
3148 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3149 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3150 ic->flags |= AVFMT_FLAG_NONBLOCK;
3152 /* open the input file with generic libav function */
3153 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3155 print_error(filename, err);
3161 for(i=0; i<ic->nb_streams; i++){
3162 ic->streams[i]->discard= AVDISCARD_ALL;
3164 for(i=0; i<ic->nb_programs; i++){
3165 AVProgram *p= ic->programs[i];
3166 if(p->id != opt_programid){
3167 p->discard = AVDISCARD_ALL;
3170 for(j=0; j<p->nb_stream_indexes; j++){
3171 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3176 fprintf(stderr, "Specified program id not found\n");
3182 ic->loop_input = loop_input;
3184 /* If not enough info to get the stream parameters, we decode the
3185 first frames to get it. (used in mpeg case for example) */
3186 ret = av_find_stream_info(ic);
3187 if (ret < 0 && verbose >= 0) {
3188 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3189 av_close_input_file(ic);
3193 timestamp = start_time;
3194 /* add the stream start time */
3195 if (ic->start_time != AV_NOPTS_VALUE)
3196 timestamp += ic->start_time;
3198 /* if seeking requested, we execute it */
3199 if (start_time != 0) {
3200 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3202 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3203 filename, (double)timestamp / AV_TIME_BASE);
3205 /* reset seek info */
3209 /* update the current parameters so that they match the one of the input stream */
3210 for(i=0;i<ic->nb_streams;i++) {
3211 AVStream *st = ic->streams[i];
3212 AVCodecContext *dec = st->codec;
3213 avcodec_thread_init(dec, thread_count);
3214 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3215 switch (dec->codec_type) {
3216 case AVMEDIA_TYPE_AUDIO:
3217 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3218 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM, input_codecs[nb_input_codecs-1]);
3219 //fprintf(stderr, "\nInput Audio channels: %d", dec->channels);
3220 channel_layout = dec->channel_layout;
3221 audio_channels = dec->channels;
3222 audio_sample_rate = dec->sample_rate;
3223 audio_sample_fmt = dec->sample_fmt;
3225 st->discard= AVDISCARD_ALL;
3226 /* Note that av_find_stream_info can add more streams, and we
3227 * currently have no chance of setting up lowres decoding
3228 * early enough for them. */
3230 audio_sample_rate >>= dec->lowres;
3232 case AVMEDIA_TYPE_VIDEO:
3233 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3234 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM, input_codecs[nb_input_codecs-1]);
3235 frame_height = dec->height;
3236 frame_width = dec->width;
3237 if(ic->streams[i]->sample_aspect_ratio.num)
3238 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3240 frame_aspect_ratio=av_q2d(dec->sample_aspect_ratio);
3241 frame_aspect_ratio *= (float) dec->width / dec->height;
3242 frame_pix_fmt = dec->pix_fmt;
3243 rfps = ic->streams[i]->r_frame_rate.num;
3244 rfps_base = ic->streams[i]->r_frame_rate.den;
3246 dec->flags |= CODEC_FLAG_EMU_EDGE;
3247 frame_height >>= dec->lowres;
3248 frame_width >>= dec->lowres;
3251 dec->debug |= FF_DEBUG_MV;
3253 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3256 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3257 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3259 (float)rfps / rfps_base, rfps, rfps_base);
3261 /* update the current frame rate to match the stream frame rate */
3262 frame_rate.num = rfps;
3263 frame_rate.den = rfps_base;
3266 st->discard= AVDISCARD_ALL;
3267 else if(video_discard)
3268 st->discard= video_discard;
3270 case AVMEDIA_TYPE_DATA:
3272 case AVMEDIA_TYPE_SUBTITLE:
3273 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3274 if(subtitle_disable)
3275 st->discard = AVDISCARD_ALL;
3277 case AVMEDIA_TYPE_ATTACHMENT:
3278 case AVMEDIA_TYPE_UNKNOWN:
3285 input_files[nb_input_files] = ic;
3286 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3287 /* dump the file content */
3289 dump_format(ic, nb_input_files, filename, 0);
3295 av_freep(&video_codec_name);
3296 av_freep(&audio_codec_name);
3297 av_freep(&subtitle_codec_name);
3300 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3301 int *has_subtitle_ptr)
3303 int has_video, has_audio, has_subtitle, i, j;
3304 AVFormatContext *ic;
3309 for(j=0;j<nb_input_files;j++) {
3310 ic = input_files[j];
3311 for(i=0;i<ic->nb_streams;i++) {
3312 AVCodecContext *enc = ic->streams[i]->codec;
3313 switch(enc->codec_type) {
3314 case AVMEDIA_TYPE_AUDIO:
3317 case AVMEDIA_TYPE_VIDEO:
3320 case AVMEDIA_TYPE_SUBTITLE:
3323 case AVMEDIA_TYPE_DATA:
3324 case AVMEDIA_TYPE_ATTACHMENT:
3325 case AVMEDIA_TYPE_UNKNOWN:
3332 *has_video_ptr = has_video;
3333 *has_audio_ptr = has_audio;
3334 *has_subtitle_ptr = has_subtitle;
3337 static void new_video_stream(AVFormatContext *oc, int file_idx)
3340 AVOutputStream *ost;
3341 AVCodecContext *video_enc;
3342 enum CodecID codec_id;
3343 AVCodec *codec= NULL;
3345 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3347 fprintf(stderr, "Could not alloc stream\n");
3350 ost = new_output_stream(oc, file_idx);
3352 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3353 if(!video_stream_copy){
3354 if (video_codec_name) {
3355 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3356 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3357 codec = avcodec_find_encoder_by_name(video_codec_name);
3358 output_codecs[nb_output_codecs-1] = codec;
3360 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3361 codec = avcodec_find_encoder(codec_id);
3365 avcodec_get_context_defaults3(st->codec, codec);
3366 ost->bitstream_filters = video_bitstream_filters;
3367 video_bitstream_filters= NULL;
3369 avcodec_thread_init(st->codec, thread_count);
3371 video_enc = st->codec;
3374 video_enc->codec_tag= video_codec_tag;
3376 if( (video_global_header&1)
3377 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3378 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3379 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3381 if(video_global_header&2){
3382 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3383 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3386 if (video_stream_copy) {
3387 st->stream_copy = 1;
3388 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3389 video_enc->sample_aspect_ratio =
3390 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3394 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3396 video_enc->codec_id = codec_id;
3397 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3399 if (codec && codec->supported_framerates && !force_fps)
3400 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3401 video_enc->time_base.den = fps.num;
3402 video_enc->time_base.num = fps.den;
3404 video_enc->width = frame_width;
3405 video_enc->height = frame_height;
3406 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3407 video_enc->pix_fmt = frame_pix_fmt;
3408 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3410 choose_pixel_fmt(st, codec);
3413 video_enc->gop_size = 0;
3414 if (video_qscale || same_quality) {
3415 video_enc->flags |= CODEC_FLAG_QSCALE;
3416 video_enc->global_quality=
3417 st->quality = FF_QP2LAMBDA * video_qscale;
3421 video_enc->intra_matrix = intra_matrix;
3423 video_enc->inter_matrix = inter_matrix;
3425 p= video_rc_override_string;
3428 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3430 fprintf(stderr, "error parsing rc_override\n");
3433 video_enc->rc_override=
3434 av_realloc(video_enc->rc_override,
3435 sizeof(RcOverride)*(i+1));
3436 video_enc->rc_override[i].start_frame= start;
3437 video_enc->rc_override[i].end_frame = end;
3439 video_enc->rc_override[i].qscale= q;
3440 video_enc->rc_override[i].quality_factor= 1.0;
3443 video_enc->rc_override[i].qscale= 0;
3444 video_enc->rc_override[i].quality_factor= -q/100.0;
3449 video_enc->rc_override_count=i;
3450 if (!video_enc->rc_initial_buffer_occupancy)
3451 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3452 video_enc->me_threshold= me_threshold;
3453 video_enc->intra_dc_precision= intra_dc_precision - 8;
3456 video_enc->flags|= CODEC_FLAG_PSNR;
3461 video_enc->flags |= CODEC_FLAG_PASS1;
3463 video_enc->flags |= CODEC_FLAG_PASS2;
3467 if (forced_key_frames)
3468 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3470 if (video_language) {
3471 av_metadata_set2(&st->metadata, "language", video_language, 0);
3472 av_freep(&video_language);
3475 /* reset some key parameters */
3477 av_freep(&video_codec_name);
3478 av_freep(&forced_key_frames);
3479 video_stream_copy = 0;
3480 frame_pix_fmt = PIX_FMT_NONE;
3483 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3486 AVOutputStream *ost;
3487 AVCodec *codec= NULL;
3488 AVCodecContext *audio_enc;
3489 enum CodecID codec_id;
3491 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3493 fprintf(stderr, "Could not alloc stream\n");
3496 ost = new_output_stream(oc, file_idx);
3498 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3499 if(!audio_stream_copy){
3500 if (audio_codec_name) {
3501 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3502 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3503 codec = avcodec_find_encoder_by_name(audio_codec_name);
3504 output_codecs[nb_output_codecs-1] = codec;
3506 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3507 codec = avcodec_find_encoder(codec_id);
3511 avcodec_get_context_defaults3(st->codec, codec);
3513 ost->bitstream_filters = audio_bitstream_filters;
3514 audio_bitstream_filters= NULL;
3516 avcodec_thread_init(st->codec, thread_count);
3518 audio_enc = st->codec;
3519 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3522 audio_enc->codec_tag= audio_codec_tag;
3524 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3525 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3526 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3528 if (audio_stream_copy) {
3529 st->stream_copy = 1;
3530 audio_enc->channels = audio_channels;
3531 audio_enc->sample_rate = audio_sample_rate;
3533 audio_enc->codec_id = codec_id;
3534 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3536 if (audio_qscale > QSCALE_NONE) {
3537 audio_enc->flags |= CODEC_FLAG_QSCALE;
3538 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3540 audio_enc->channels = audio_channels;
3541 audio_enc->sample_fmt = audio_sample_fmt;
3542 audio_enc->sample_rate = audio_sample_rate;
3543 audio_enc->channel_layout = channel_layout;
3544 if (avcodec_channel_layout_num_channels(channel_layout) != audio_channels)
3545 audio_enc->channel_layout = 0;
3546 choose_sample_fmt(st, codec);
3547 choose_sample_rate(st, codec);
3549 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3550 if (audio_language) {
3551 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3552 av_freep(&audio_language);
3555 /* reset some key parameters */
3557 av_freep(&audio_codec_name);
3558 audio_stream_copy = 0;
3561 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3564 AVOutputStream *ost;
3565 AVCodec *codec=NULL;
3566 AVCodecContext *subtitle_enc;
3568 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3570 fprintf(stderr, "Could not alloc stream\n");
3573 ost = new_output_stream(oc, file_idx);
3574 subtitle_enc = st->codec;
3575 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3576 if(!subtitle_stream_copy){
3577 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3578 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3579 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3581 avcodec_get_context_defaults3(st->codec, codec);
3583 ost->bitstream_filters = subtitle_bitstream_filters;
3584 subtitle_bitstream_filters= NULL;
3586 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3588 if(subtitle_codec_tag)
3589 subtitle_enc->codec_tag= subtitle_codec_tag;
3591 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3592 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3593 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3595 if (subtitle_stream_copy) {
3596 st->stream_copy = 1;
3598 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3601 if (subtitle_language) {
3602 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3603 av_freep(&subtitle_language);
3606 subtitle_disable = 0;
3607 av_freep(&subtitle_codec_name);
3608 subtitle_stream_copy = 0;
3611 static int opt_new_stream(const char *opt, const char *arg)
3613 AVFormatContext *oc;
3614 int file_idx = nb_output_files - 1;
3615 if (nb_output_files <= 0) {
3616 fprintf(stderr, "At least one output file must be specified\n");
3619 oc = output_files[file_idx];
3621 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3622 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3623 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3628 /* arg format is "output-stream-index:streamid-value". */
3629 static int opt_streamid(const char *opt, const char *arg)
3635 strncpy(idx_str, arg, sizeof(idx_str));
3636 idx_str[sizeof(idx_str)-1] = '\0';
3637 p = strchr(idx_str, ':');
3640 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3645 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3646 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3647 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3651 static void opt_output_file(const char *filename)
3653 AVFormatContext *oc;
3654 int err, use_video, use_audio, use_subtitle;
3655 int input_has_video, input_has_audio, input_has_subtitle;
3656 AVFormatParameters params, *ap = ¶ms;
3657 AVOutputFormat *file_oformat;
3658 AVMetadataTag *tag = NULL;
3660 if (!strcmp(filename, "-"))
3663 oc = avformat_alloc_context();
3665 print_error(filename, AVERROR(ENOMEM));
3669 if (last_asked_format) {
3670 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3671 if (!file_oformat) {
3672 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3675 last_asked_format = NULL;
3677 file_oformat = av_guess_format(NULL, filename, NULL);
3678 if (!file_oformat) {
3679 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3685 oc->oformat = file_oformat;
3686 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3688 if (!strcmp(file_oformat->name, "ffm") &&
3689 av_strstart(filename, "http:", NULL)) {
3690 /* special case for files sent to ffserver: we get the stream
3691 parameters from ffserver */
3692 int err = read_ffserver_streams(oc, filename);
3694 print_error(filename, err);
3698 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3699 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3700 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3702 /* disable if no corresponding type found and at least one
3704 if (nb_input_files > 0) {
3705 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3706 &input_has_subtitle);
3707 if (!input_has_video)
3709 if (!input_has_audio)
3711 if (!input_has_subtitle)
3715 /* manual disable */
3716 if (audio_disable) use_audio = 0;
3717 if (video_disable) use_video = 0;
3718 if (subtitle_disable) use_subtitle = 0;
3720 if (use_video) new_video_stream(oc, nb_output_files);
3721 if (use_audio) new_audio_stream(oc, nb_output_files);
3722 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3724 oc->timestamp = recording_timestamp;
3726 while ((tag = av_metadata_get(metadata, "", tag, AV_METADATA_IGNORE_SUFFIX)))
3727 av_metadata_set2(&oc->metadata, tag->key, tag->value, 0);
3728 av_metadata_free(&metadata);
3731 output_files[nb_output_files++] = oc;
3733 /* check filename in case of an image number is expected */
3734 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3735 if (!av_filename_number_test(oc->filename)) {
3736 print_error(oc->filename, AVERROR_NUMEXPECTED);
3741 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3742 /* test if it already exists to avoid loosing precious files */
3743 if (!file_overwrite &&
3744 (strchr(filename, ':') == NULL ||
3745 filename[1] == ':' ||
3746 av_strstart(filename, "file:", NULL))) {
3747 if (url_exist(filename)) {
3749 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3751 if (!read_yesno()) {
3752 fprintf(stderr, "Not overwriting - exiting\n");
3757 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3764 if ((err = url_fopen(&oc->pb, filename, URL_WRONLY)) < 0) {
3765 print_error(filename, err);
3770 memset(ap, 0, sizeof(*ap));
3771 if (av_set_parameters(oc, ap) < 0) {
3772 fprintf(stderr, "%s: Invalid encoding parameters\n",
3777 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3778 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3779 oc->loop_output = loop_output;
3780 oc->flags |= AVFMT_FLAG_NONBLOCK;
3782 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3784 nb_streamid_map = 0;
3785 av_freep(&forced_key_frames);
3788 /* same option as mencoder */
3789 static void opt_pass(const char *pass_str)
3792 pass = atoi(pass_str);
3793 if (pass != 1 && pass != 2) {
3794 fprintf(stderr, "pass number can be only 1 or 2\n");
3800 static int64_t getutime(void)
3803 struct rusage rusage;
3805 getrusage(RUSAGE_SELF, &rusage);
3806 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3807 #elif HAVE_GETPROCESSTIMES
3809 FILETIME c, e, k, u;
3810 proc = GetCurrentProcess();
3811 GetProcessTimes(proc, &c, &e, &k, &u);
3812 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3814 return av_gettime();
3818 static int64_t getmaxrss(void)
3820 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3821 struct rusage rusage;
3822 getrusage(RUSAGE_SELF, &rusage);
3823 return (int64_t)rusage.ru_maxrss * 1024;
3824 #elif HAVE_GETPROCESSMEMORYINFO
3826 PROCESS_MEMORY_COUNTERS memcounters;
3827 proc = GetCurrentProcess();
3828 memcounters.cb = sizeof(memcounters);
3829 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3830 return memcounters.PeakPagefileUsage;
3836 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3839 const char *p = str;
3846 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3853 static void opt_inter_matrix(const char *arg)
3855 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3856 parse_matrix_coeffs(inter_matrix, arg);
3859 static void opt_intra_matrix(const char *arg)
3861 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3862 parse_matrix_coeffs(intra_matrix, arg);
3865 static void show_usage(void)
3867 printf("Hyper fast Audio and Video encoder\n");
3868 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3872 static void show_help(void)
3874 av_log_set_callback(log_callback_help);
3876 show_help_options(options, "Main options:\n",
3877 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3878 show_help_options(options, "\nAdvanced options:\n",
3879 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3881 show_help_options(options, "\nVideo options:\n",
3882 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3884 show_help_options(options, "\nAdvanced Video options:\n",
3885 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3886 OPT_VIDEO | OPT_EXPERT);
3887 show_help_options(options, "\nAudio options:\n",
3888 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3890 show_help_options(options, "\nAdvanced Audio options:\n",
3891 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3892 OPT_AUDIO | OPT_EXPERT);
3893 show_help_options(options, "\nSubtitle options:\n",
3894 OPT_SUBTITLE | OPT_GRAB,
3896 show_help_options(options, "\nAudio/Video grab options:\n",
3900 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3902 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3904 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3907 static void opt_target(const char *arg)
3909 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3910 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3912 if(!strncmp(arg, "pal-", 4)) {
3915 } else if(!strncmp(arg, "ntsc-", 5)) {
3918 } else if(!strncmp(arg, "film-", 5)) {
3923 /* Calculate FR via float to avoid int overflow */
3924 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3927 } else if((fr == 29970) || (fr == 23976)) {
3930 /* Try to determine PAL/NTSC by peeking in the input files */
3931 if(nb_input_files) {
3933 for(j = 0; j < nb_input_files; j++) {
3934 for(i = 0; i < input_files[j]->nb_streams; i++) {
3935 AVCodecContext *c = input_files[j]->streams[i]->codec;
3936 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3938 fr = c->time_base.den * 1000 / c->time_base.num;
3942 } else if((fr == 29970) || (fr == 23976)) {
3952 if(verbose && norm != UNKNOWN)
3953 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3956 if(norm == UNKNOWN) {
3957 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3958 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3959 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3963 if(!strcmp(arg, "vcd")) {
3965 opt_video_codec("mpeg1video");
3966 opt_audio_codec("mp2");
3969 opt_frame_size(norm == PAL ? "352x288" : "352x240");
3970 opt_frame_rate(NULL, frame_rates[norm]);
3971 opt_default("g", norm == PAL ? "15" : "18");
3973 opt_default("b", "1150000");
3974 opt_default("maxrate", "1150000");
3975 opt_default("minrate", "1150000");
3976 opt_default("bufsize", "327680"); // 40*1024*8;
3978 opt_default("ab", "224000");
3979 audio_sample_rate = 44100;
3982 opt_default("packetsize", "2324");
3983 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3985 /* We have to offset the PTS, so that it is consistent with the SCR.
3986 SCR starts at 36000, but the first two packs contain only padding
3987 and the first pack from the other stream, respectively, may also have
3988 been written before.
3989 So the real data starts at SCR 36000+3*1200. */
3990 mux_preload= (36000+3*1200) / 90000.0; //0.44
3991 } else if(!strcmp(arg, "svcd")) {
3993 opt_video_codec("mpeg2video");
3994 opt_audio_codec("mp2");
3997 opt_frame_size(norm == PAL ? "480x576" : "480x480");
3998 opt_frame_rate(NULL, frame_rates[norm]);
3999 opt_default("g", norm == PAL ? "15" : "18");
4001 opt_default("b", "2040000");
4002 opt_default("maxrate", "2516000");
4003 opt_default("minrate", "0"); //1145000;
4004 opt_default("bufsize", "1835008"); //224*1024*8;
4005 opt_default("flags", "+scan_offset");
4008 opt_default("ab", "224000");
4009 audio_sample_rate = 44100;
4011 opt_default("packetsize", "2324");
4013 } else if(!strcmp(arg, "dvd")) {
4015 opt_video_codec("mpeg2video");
4016 opt_audio_codec("ac3");
4019 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4020 opt_frame_rate(NULL, frame_rates[norm]);
4021 opt_default("g", norm == PAL ? "15" : "18");
4023 opt_default("b", "6000000");
4024 opt_default("maxrate", "9000000");
4025 opt_default("minrate", "0"); //1500000;
4026 opt_default("bufsize", "1835008"); //224*1024*8;
4028 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4029 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4031 opt_default("ab", "448000");
4032 audio_sample_rate = 48000;
4034 } else if(!strncmp(arg, "dv", 2)) {
4038 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4039 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4040 (norm == PAL ? "yuv420p" : "yuv411p"));
4041 opt_frame_rate(NULL, frame_rates[norm]);
4043 audio_sample_rate = 48000;
4047 fprintf(stderr, "Unknown target: %s\n", arg);
4052 static void opt_vstats_file (const char *arg)
4054 av_free (vstats_filename);
4055 vstats_filename=av_strdup (arg);
4058 static void opt_vstats (void)
4061 time_t today2 = time(NULL);
4062 struct tm *today = localtime(&today2);
4064 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4066 opt_vstats_file(filename);
4069 static int opt_bsf(const char *opt, const char *arg)
4071 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4072 AVBitStreamFilterContext **bsfp;
4075 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4079 bsfp= *opt == 'v' ? &video_bitstream_filters :
4080 *opt == 'a' ? &audio_bitstream_filters :
4081 &subtitle_bitstream_filters;
4083 bsfp= &(*bsfp)->next;
4090 static int opt_preset(const char *opt, const char *arg)
4093 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4094 char *codec_name = *opt == 'v' ? video_codec_name :
4095 *opt == 'a' ? audio_codec_name :
4096 subtitle_codec_name;
4098 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4099 fprintf(stderr, "File for preset '%s' not found\n", arg);
4104 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4105 if(line[0] == '#' && !e)
4107 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4109 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4112 if(!strcmp(tmp, "acodec")){
4113 opt_audio_codec(tmp2);
4114 }else if(!strcmp(tmp, "vcodec")){
4115 opt_video_codec(tmp2);
4116 }else if(!strcmp(tmp, "scodec")){
4117 opt_subtitle_codec(tmp2);
4118 }else if(opt_default(tmp, tmp2) < 0){
4119 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4129 static const OptionDef options[] = {
4131 #include "cmdutils_common_opts.h"
4132 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4133 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4134 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4135 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
4136 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile[,metadata]:infile[,metadata]" },
4137 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4138 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4139 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4140 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4141 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4142 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4143 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4144 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4145 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4146 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4147 "add timings for benchmarking" },
4148 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4149 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4150 "dump each input packet" },
4151 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4152 "when dumping packets, also dump the payload" },
4153 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4154 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4155 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "number of times to loop output in formats that support looping (0 loops forever)", "" },
4156 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4157 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4158 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4159 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4160 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4161 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4162 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4163 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4164 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4165 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4166 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4167 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4168 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4171 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4172 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4173 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4174 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4175 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4176 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4177 { "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" },
4178 { "croptop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4179 { "cropbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4180 { "cropleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4181 { "cropright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4182 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4183 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4184 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4185 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4186 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4187 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4188 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4189 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4190 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4191 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4192 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4193 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4194 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4195 "use same video quality as source (implies VBR)" },
4196 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4197 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4198 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4199 "deinterlace pictures" },
4200 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4201 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4202 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4204 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4206 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4207 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4208 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4209 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4210 { "vtag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4211 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4212 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4213 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4214 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4215 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4216 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4219 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4220 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4221 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4222 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4223 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4224 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4225 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4226 { "atag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4227 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4228 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4229 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4230 { "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" },
4232 /* subtitle options */
4233 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4234 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4235 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4236 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4237 { "stag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4240 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4241 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4242 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4245 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4246 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4248 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4249 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4250 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4252 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4253 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4254 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4255 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4257 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4261 int main(int argc, char **argv)
4265 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4267 avcodec_register_all();
4269 avdevice_register_all();
4272 avfilter_register_all();
4277 if(isatty(STDIN_FILENO))
4278 url_set_interrupt_cb(decode_interrupt_cb);
4286 parse_options(argc, argv, options, opt_output_file);
4288 if(nb_output_files <= 0 && nb_input_files == 0) {
4290 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4294 /* file converter / grab */
4295 if (nb_output_files <= 0) {
4296 fprintf(stderr, "At least one output file must be specified\n");
4300 if (nb_input_files == 0) {
4301 fprintf(stderr, "At least one input file must be specified\n");
4306 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4307 stream_maps, nb_stream_maps) < 0)
4309 ti = getutime() - ti;
4311 int maxrss = getmaxrss() / 1024;
4312 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4315 return ffmpeg_exit(0);