Merge branch 'mirror'
[FFMpeg-mirror/ffmpeg-ajc30.git] / ffmpeg.c
blob5e2e38a8707e35f3fb456bf1e620b7c7b759c63b
1 /*
2 * FFmpeg main
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
25 #include "config.h"
26 #include <ctype.h>
27 #include <string.h>
28 #include <math.h>
29 #include <stdlib.h>
30 #include <errno.h>
31 #include <signal.h>
32 #include <limits.h>
33 #include <unistd.h>
34 #include "libavformat/avformat.h"
35 #include "libavdevice/avdevice.h"
36 #include "libswscale/swscale.h"
37 #include "libavformat/framehook.h"
38 #include "libavcodec/opt.h"
39 #include "libavcodec/audioconvert.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/avstring.h"
42 #include "libavformat/os_support.h"
44 #ifdef HAVE_SYS_RESOURCE_H
45 #include <sys/types.h>
46 #include <sys/resource.h>
47 #elif defined(HAVE_GETPROCESSTIMES)
48 #include <windows.h>
49 #endif
51 #ifdef HAVE_SYS_SELECT_H
52 #include <sys/select.h>
53 #endif
55 #ifdef HAVE_TERMIOS_H
56 #include <fcntl.h>
57 #include <sys/ioctl.h>
58 #include <sys/time.h>
59 #include <termios.h>
60 #elif defined(HAVE_CONIO_H)
61 #include <conio.h>
62 #endif
63 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
64 #include <time.h>
66 #include "cmdutils.h"
68 #undef NDEBUG
69 #include <assert.h>
71 #undef exit
73 const char program_name[] = "FFmpeg";
74 const int program_birth_year = 2000;
76 /* select an input stream for an output stream */
77 typedef struct AVStreamMap {
78 int file_index;
79 int stream_index;
80 int sync_file_index;
81 int sync_stream_index;
82 } AVStreamMap;
84 /** select an input file for an output file */
85 typedef struct AVMetaDataMap {
86 int out_file;
87 int in_file;
88 } AVMetaDataMap;
90 static const OptionDef options[];
92 #define MAX_FILES 20
94 static AVFormatContext *input_files[MAX_FILES];
95 static int64_t input_files_ts_offset[MAX_FILES];
96 static double input_files_ts_scale[MAX_FILES][MAX_STREAMS];
97 static AVCodec *input_codecs[MAX_FILES*MAX_STREAMS];
98 static int nb_input_files = 0;
99 static int nb_icodecs;
101 static AVFormatContext *output_files[MAX_FILES];
102 static AVCodec *output_codecs[MAX_FILES*MAX_STREAMS];
103 static int nb_output_files = 0;
104 static int nb_ocodecs;
106 static AVStreamMap stream_maps[MAX_FILES*MAX_STREAMS];
107 static int nb_stream_maps;
109 static AVMetaDataMap meta_data_maps[MAX_FILES];
110 static int nb_meta_data_maps;
112 static AVInputFormat *file_iformat;
113 static AVOutputFormat *file_oformat;
114 static int frame_width = 0;
115 static int frame_height = 0;
116 static float frame_aspect_ratio = 0;
117 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
118 static enum SampleFormat audio_sample_fmt = SAMPLE_FMT_NONE;
119 static int frame_padtop = 0;
120 static int frame_padbottom = 0;
121 static int frame_padleft = 0;
122 static int frame_padright = 0;
123 static int padcolor[3] = {16,128,128}; /* default to black */
124 static int frame_topBand = 0;
125 static int frame_bottomBand = 0;
126 static int frame_leftBand = 0;
127 static int frame_rightBand = 0;
128 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
129 static AVRational frame_rate;
130 static float video_qscale = 0;
131 static uint16_t *intra_matrix = NULL;
132 static uint16_t *inter_matrix = NULL;
133 #if 0 //experimental, (can be removed)
134 static float video_rc_qsquish=1.0;
135 static float video_rc_qmod_amp=0;
136 static int video_rc_qmod_freq=0;
137 #endif
138 static const char *video_rc_override_string=NULL;
139 static int video_disable = 0;
140 static int video_discard = 0;
141 static char *video_codec_name = NULL;
142 static int video_codec_tag = 0;
143 static int same_quality = 0;
144 static int do_deinterlace = 0;
145 static int top_field_first = -1;
146 static int me_threshold = 0;
147 static int intra_dc_precision = 8;
148 static int loop_input = 0;
149 static int loop_output = AVFMT_NOOUTPUTLOOP;
150 static int qp_hist = 0;
152 static int intra_only = 0;
153 static int audio_sample_rate = 44100;
154 static int64_t channel_layout = 0;
155 #define QSCALE_NONE -99999
156 static float audio_qscale = QSCALE_NONE;
157 static int audio_disable = 0;
158 static int audio_channels = 1;
159 static char *audio_codec_name = NULL;
160 static int audio_codec_tag = 0;
161 static char *audio_language = NULL;
163 static int subtitle_disable = 0;
164 static char *subtitle_codec_name = NULL;
165 static char *subtitle_language = NULL;
167 static float mux_preload= 0.5;
168 static float mux_max_delay= 0.7;
170 static int64_t recording_time = INT64_MAX;
171 static int64_t start_time = 0;
172 static int64_t rec_timestamp = 0;
173 static int64_t input_ts_offset = 0;
174 static int file_overwrite = 0;
175 static char *str_title = NULL;
176 static char *str_author = NULL;
177 static char *str_copyright = NULL;
178 static char *str_comment = NULL;
179 static char *str_genre = NULL;
180 static char *str_album = NULL;
181 static int do_benchmark = 0;
182 static int do_hex_dump = 0;
183 static int do_pkt_dump = 0;
184 static int do_psnr = 0;
185 static int do_pass = 0;
186 static char *pass_logfilename_prefix = NULL;
187 static int audio_stream_copy = 0;
188 static int video_stream_copy = 0;
189 static int subtitle_stream_copy = 0;
190 static int video_sync_method= -1;
191 static int audio_sync_method= 0;
192 static float audio_drift_threshold= 0.1;
193 static int copy_ts= 0;
194 static int opt_shortest = 0;
195 static int video_global_header = 0;
196 static char *vstats_filename;
197 static FILE *vstats_file;
198 static int opt_programid = 0;
199 static int copy_initial_nonkeyframes = 0;
201 static int rate_emu = 0;
203 static int video_channel = 0;
204 static char *video_standard;
206 static int audio_volume = 256;
208 static int exit_on_error = 0;
209 static int using_stdin = 0;
210 static int using_vhook = 0;
211 static int verbose = 1;
212 static int thread_count= 1;
213 static int q_pressed = 0;
214 static int64_t video_size = 0;
215 static int64_t audio_size = 0;
216 static int64_t extra_size = 0;
217 static int nb_frames_dup = 0;
218 static int nb_frames_drop = 0;
219 static int input_sync;
220 static uint64_t limit_filesize = 0;
221 static int force_fps = 0;
223 static int pgmyuv_compatibility_hack=0;
224 static float dts_delta_threshold = 10;
226 static unsigned int sws_flags = SWS_BICUBIC;
228 static int64_t timer_start;
230 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
231 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
232 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
233 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
235 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
237 struct AVInputStream;
239 typedef struct AVOutputStream {
240 int file_index; /* file index */
241 int index; /* stream index in the output file */
242 int source_index; /* AVInputStream index */
243 AVStream *st; /* stream in the output file */
244 int encoding_needed; /* true if encoding needed for this stream */
245 int frame_number;
246 /* input pts and corresponding output pts
247 for A/V sync */
248 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
249 struct AVInputStream *sync_ist; /* input stream to sync against */
250 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
251 /* video only */
252 int video_resample;
253 AVFrame pict_tmp; /* temporary image for resampling */
254 struct SwsContext *img_resample_ctx; /* for image resampling */
255 int resample_height;
257 int video_crop;
258 int topBand; /* cropping area sizes */
259 int leftBand;
261 int video_pad;
262 int padtop; /* padding area sizes */
263 int padbottom;
264 int padleft;
265 int padright;
267 /* audio only */
268 int audio_resample;
269 ReSampleContext *resample; /* for audio resampling */
270 int reformat_pair;
271 AVAudioConvert *reformat_ctx;
272 AVFifoBuffer fifo; /* for compression: one audio fifo per codec */
273 FILE *logfile;
274 } AVOutputStream;
276 typedef struct AVInputStream {
277 int file_index;
278 int index;
279 AVStream *st;
280 int discard; /* true if stream data should be discarded */
281 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
282 int64_t sample_index; /* current sample */
284 int64_t start; /* time when read started */
285 int64_t next_pts; /* synthetic pts for cases where pkt.pts
286 is not defined */
287 int64_t pts; /* current pts */
288 int is_start; /* is 1 at the start and after a discontinuity */
289 } AVInputStream;
291 typedef struct AVInputFile {
292 int eof_reached; /* true if eof reached */
293 int ist_index; /* index of first stream in ist_table */
294 int buffer_size; /* current total buffer size */
295 int nb_streams; /* nb streams we are aware of */
296 } AVInputFile;
298 #ifdef HAVE_TERMIOS_H
300 /* init terminal so that we can grab keys */
301 static struct termios oldtty;
302 #endif
304 static void term_exit(void)
306 #ifdef HAVE_TERMIOS_H
307 tcsetattr (0, TCSANOW, &oldtty);
308 #endif
311 static volatile sig_atomic_t received_sigterm = 0;
313 static void
314 sigterm_handler(int sig)
316 received_sigterm = sig;
317 term_exit();
320 static void term_init(void)
322 #ifdef HAVE_TERMIOS_H
323 struct termios tty;
325 tcgetattr (0, &tty);
326 oldtty = tty;
328 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
329 |INLCR|IGNCR|ICRNL|IXON);
330 tty.c_oflag |= OPOST;
331 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
332 tty.c_cflag &= ~(CSIZE|PARENB);
333 tty.c_cflag |= CS8;
334 tty.c_cc[VMIN] = 1;
335 tty.c_cc[VTIME] = 0;
337 tcsetattr (0, TCSANOW, &tty);
338 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
339 #endif
341 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
342 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
344 register a function to be called at normal program termination
346 atexit(term_exit);
347 #ifdef CONFIG_BEOS_NETSERVER
348 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
349 #endif
352 /* read a key without blocking */
353 static int read_key(void)
355 #if defined(HAVE_TERMIOS_H)
356 int n = 1;
357 unsigned char ch;
358 #ifndef CONFIG_BEOS_NETSERVER
359 struct timeval tv;
360 fd_set rfds;
362 FD_ZERO(&rfds);
363 FD_SET(0, &rfds);
364 tv.tv_sec = 0;
365 tv.tv_usec = 0;
366 n = select(1, &rfds, NULL, NULL, &tv);
367 #endif
368 if (n > 0) {
369 n = read(0, &ch, 1);
370 if (n == 1)
371 return ch;
373 return n;
375 #elif defined(HAVE_CONIO_H)
376 if(kbhit())
377 return(getch());
378 #endif
379 return -1;
382 static int decode_interrupt_cb(void)
384 return q_pressed || (q_pressed = read_key() == 'q');
387 static int av_exit(int ret)
389 int i;
391 /* close files */
392 for(i=0;i<nb_output_files;i++) {
393 /* maybe av_close_output_file ??? */
394 AVFormatContext *s = output_files[i];
395 int j;
396 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
397 url_fclose(s->pb);
398 for(j=0;j<s->nb_streams;j++) {
399 av_free(s->streams[j]->codec);
400 av_free(s->streams[j]);
402 av_free(s);
404 for(i=0;i<nb_input_files;i++)
405 av_close_input_file(input_files[i]);
407 av_free(intra_matrix);
408 av_free(inter_matrix);
410 if (vstats_file)
411 fclose(vstats_file);
412 av_free(vstats_filename);
414 av_free(opt_names);
416 av_free(video_codec_name);
417 av_free(audio_codec_name);
418 av_free(subtitle_codec_name);
420 av_free(video_standard);
422 #ifdef CONFIG_POWERPC_PERF
423 void powerpc_display_perf_report(void);
424 powerpc_display_perf_report();
425 #endif /* CONFIG_POWERPC_PERF */
427 if (received_sigterm) {
428 fprintf(stderr,
429 "Received signal %d: terminating.\n",
430 (int) received_sigterm);
431 exit (255);
434 exit(ret); /* not all OS-es handle main() return value */
435 return ret;
438 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
440 int i, err;
441 AVFormatContext *ic;
442 int nopts = 0;
444 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
445 if (err < 0)
446 return err;
447 /* copy stream format */
448 s->nb_streams = ic->nb_streams;
449 for(i=0;i<ic->nb_streams;i++) {
450 AVStream *st;
452 // FIXME: a more elegant solution is needed
453 st = av_mallocz(sizeof(AVStream));
454 memcpy(st, ic->streams[i], sizeof(AVStream));
455 st->codec = avcodec_alloc_context();
456 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
457 s->streams[i] = st;
459 if (st->codec->codec_type == CODEC_TYPE_AUDIO && audio_stream_copy)
460 st->stream_copy = 1;
461 else if (st->codec->codec_type == CODEC_TYPE_VIDEO && video_stream_copy)
462 st->stream_copy = 1;
464 if(!st->codec->thread_count)
465 st->codec->thread_count = 1;
466 if(st->codec->thread_count>1)
467 avcodec_thread_init(st->codec, st->codec->thread_count);
469 if(st->codec->flags & CODEC_FLAG_BITEXACT)
470 nopts = 1;
473 if (!nopts)
474 s->timestamp = av_gettime();
476 av_close_input_file(ic);
477 return 0;
480 static double
481 get_sync_ipts(const AVOutputStream *ost)
483 const AVInputStream *ist = ost->sync_ist;
484 return (double)(ist->pts - start_time)/AV_TIME_BASE;
487 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
488 int ret;
490 while(bsfc){
491 AVPacket new_pkt= *pkt;
492 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
493 &new_pkt.data, &new_pkt.size,
494 pkt->data, pkt->size,
495 pkt->flags & PKT_FLAG_KEY);
496 if(a>0){
497 av_free_packet(pkt);
498 new_pkt.destruct= av_destruct_packet;
499 } else if(a<0){
500 fprintf(stderr, "%s failed for stream %d, codec %s",
501 bsfc->filter->name, pkt->stream_index,
502 avctx->codec ? avctx->codec->name : "copy");
503 print_error("", a);
504 if (exit_on_error)
505 av_exit(1);
507 *pkt= new_pkt;
509 bsfc= bsfc->next;
512 ret= av_interleaved_write_frame(s, pkt);
513 if(ret < 0){
514 print_error("av_interleaved_write_frame()", ret);
515 av_exit(1);
519 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
521 static void do_audio_out(AVFormatContext *s,
522 AVOutputStream *ost,
523 AVInputStream *ist,
524 unsigned char *buf, int size)
526 uint8_t *buftmp;
527 static uint8_t *audio_buf = NULL;
528 static uint8_t *audio_out = NULL;
529 static uint8_t *audio_out2 = NULL;
530 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
532 int size_out, frame_bytes, ret;
533 AVCodecContext *enc= ost->st->codec;
534 AVCodecContext *dec= ist->st->codec;
535 int osize= av_get_bits_per_sample_format(enc->sample_fmt)/8;
536 int isize= av_get_bits_per_sample_format(dec->sample_fmt)/8;
538 /* SC: dynamic allocation of buffers */
539 if (!audio_buf)
540 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
541 if (!audio_out)
542 audio_out = av_malloc(audio_out_size);
543 if (!audio_buf || !audio_out)
544 return; /* Should signal an error ! */
546 if (enc->channels != dec->channels)
547 ost->audio_resample = 1;
549 if (ost->audio_resample && !ost->resample) {
550 if (dec->sample_fmt != SAMPLE_FMT_S16) {
551 fprintf(stderr, "Audio resampler only works with 16 bits per sample, patch welcome.\n");
552 av_exit(1);
554 ost->resample = audio_resample_init(enc->channels, dec->channels,
555 enc->sample_rate, dec->sample_rate);
556 if (!ost->resample) {
557 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
558 dec->channels, dec->sample_rate,
559 enc->channels, enc->sample_rate);
560 av_exit(1);
564 #define MAKE_SFMT_PAIR(a,b) ((a)+SAMPLE_FMT_NB*(b))
565 if (dec->sample_fmt!=enc->sample_fmt &&
566 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
567 if (!audio_out2)
568 audio_out2 = av_malloc(audio_out_size);
569 if (!audio_out2)
570 av_exit(1);
571 if (ost->reformat_ctx)
572 av_audio_convert_free(ost->reformat_ctx);
573 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
574 dec->sample_fmt, 1, NULL, 0);
575 if (!ost->reformat_ctx) {
576 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
577 avcodec_get_sample_fmt_name(dec->sample_fmt),
578 avcodec_get_sample_fmt_name(enc->sample_fmt));
579 av_exit(1);
581 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
584 if(audio_sync_method){
585 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
586 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2);
587 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
588 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
590 //FIXME resample delay
591 if(fabs(delta) > 50){
592 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
593 if(byte_delta < 0){
594 byte_delta= FFMAX(byte_delta, -size);
595 size += byte_delta;
596 buf -= byte_delta;
597 if(verbose > 2)
598 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
599 if(!size)
600 return;
601 ist->is_start=0;
602 }else{
603 static uint8_t *input_tmp= NULL;
604 input_tmp= av_realloc(input_tmp, byte_delta + size);
606 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
607 ist->is_start=0;
608 else
609 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
611 memset(input_tmp, 0, byte_delta);
612 memcpy(input_tmp + byte_delta, buf, size);
613 buf= input_tmp;
614 size += byte_delta;
615 if(verbose > 2)
616 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
618 }else if(audio_sync_method>1){
619 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
620 assert(ost->audio_resample);
621 if(verbose > 2)
622 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
623 // 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));
624 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
627 }else
628 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
629 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
631 if (ost->audio_resample) {
632 buftmp = audio_buf;
633 size_out = audio_resample(ost->resample,
634 (short *)buftmp, (short *)buf,
635 size / (ist->st->codec->channels * isize));
636 size_out = size_out * enc->channels * osize;
637 } else {
638 buftmp = buf;
639 size_out = size;
642 if (dec->sample_fmt!=enc->sample_fmt) {
643 const void *ibuf[6]= {buftmp};
644 void *obuf[6]= {audio_out2};
645 int istride[6]= {isize};
646 int ostride[6]= {osize};
647 int len= size_out/istride[0];
648 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
649 printf("av_audio_convert() failed\n");
650 if (exit_on_error)
651 av_exit(1);
652 return;
654 buftmp = audio_out2;
655 size_out = len*osize;
658 /* now encode as many frames as possible */
659 if (enc->frame_size > 1) {
660 /* output resampled raw samples */
661 if (av_fifo_realloc2(&ost->fifo, av_fifo_size(&ost->fifo) + size_out) < 0) {
662 fprintf(stderr, "av_fifo_realloc2() failed\n");
663 av_exit(1);
665 av_fifo_generic_write(&ost->fifo, buftmp, size_out, NULL);
667 frame_bytes = enc->frame_size * osize * enc->channels;
669 while (av_fifo_size(&ost->fifo) >= frame_bytes) {
670 AVPacket pkt;
671 av_init_packet(&pkt);
673 av_fifo_read(&ost->fifo, audio_buf, frame_bytes);
675 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
677 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
678 (short *)audio_buf);
679 audio_size += ret;
680 pkt.stream_index= ost->index;
681 pkt.data= audio_out;
682 pkt.size= ret;
683 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
684 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
685 pkt.flags |= PKT_FLAG_KEY;
686 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
688 ost->sync_opts += enc->frame_size;
690 } else {
691 AVPacket pkt;
692 int coded_bps = av_get_bits_per_sample(enc->codec->id)/8;
693 av_init_packet(&pkt);
695 ost->sync_opts += size_out / (osize * enc->channels);
697 /* output a pcm frame */
698 /* determine the size of the coded buffer */
699 size_out /= osize;
700 if (coded_bps)
701 size_out *= coded_bps;
703 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
704 ret = avcodec_encode_audio(enc, audio_out, size_out,
705 (short *)buftmp);
706 audio_size += ret;
707 pkt.stream_index= ost->index;
708 pkt.data= audio_out;
709 pkt.size= ret;
710 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
711 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
712 pkt.flags |= PKT_FLAG_KEY;
713 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
717 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
719 AVCodecContext *dec;
720 AVPicture *picture2;
721 AVPicture picture_tmp;
722 uint8_t *buf = 0;
724 dec = ist->st->codec;
726 /* deinterlace : must be done before any resize */
727 if (do_deinterlace || using_vhook) {
728 int size;
730 /* create temporary picture */
731 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
732 buf = av_malloc(size);
733 if (!buf)
734 return;
736 picture2 = &picture_tmp;
737 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
739 if (do_deinterlace){
740 if(avpicture_deinterlace(picture2, picture,
741 dec->pix_fmt, dec->width, dec->height) < 0) {
742 /* if error, do not deinterlace */
743 fprintf(stderr, "Deinterlacing failed\n");
744 av_free(buf);
745 buf = NULL;
746 picture2 = picture;
748 } else {
749 av_picture_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
751 } else {
752 picture2 = picture;
755 if (ENABLE_VHOOK)
756 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height,
757 1000000 * ist->pts / AV_TIME_BASE);
759 if (picture != picture2)
760 *picture = *picture2;
761 *bufp = buf;
764 /* we begin to correct av delay at this threshold */
765 #define AV_DELAY_MAX 0.100
767 static void do_subtitle_out(AVFormatContext *s,
768 AVOutputStream *ost,
769 AVInputStream *ist,
770 AVSubtitle *sub,
771 int64_t pts)
773 static uint8_t *subtitle_out = NULL;
774 int subtitle_out_max_size = 65536;
775 int subtitle_out_size, nb, i;
776 AVCodecContext *enc;
777 AVPacket pkt;
779 if (pts == AV_NOPTS_VALUE) {
780 fprintf(stderr, "Subtitle packets must have a pts\n");
781 if (exit_on_error)
782 av_exit(1);
783 return;
786 enc = ost->st->codec;
788 if (!subtitle_out) {
789 subtitle_out = av_malloc(subtitle_out_max_size);
792 /* Note: DVB subtitle need one packet to draw them and one other
793 packet to clear them */
794 /* XXX: signal it in the codec context ? */
795 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
796 nb = 2;
797 else
798 nb = 1;
800 for(i = 0; i < nb; i++) {
801 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
802 subtitle_out_max_size, sub);
804 av_init_packet(&pkt);
805 pkt.stream_index = ost->index;
806 pkt.data = subtitle_out;
807 pkt.size = subtitle_out_size;
808 pkt.pts = av_rescale_q(pts, ist->st->time_base, ost->st->time_base);
809 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
810 /* XXX: the pts correction is handled here. Maybe handling
811 it in the codec would be better */
812 if (i == 0)
813 pkt.pts += 90 * sub->start_display_time;
814 else
815 pkt.pts += 90 * sub->end_display_time;
817 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
821 static int bit_buffer_size= 1024*256;
822 static uint8_t *bit_buffer= NULL;
824 static void do_video_out(AVFormatContext *s,
825 AVOutputStream *ost,
826 AVInputStream *ist,
827 AVFrame *in_picture,
828 int *frame_size)
830 int nb_frames, i, ret;
831 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
832 AVFrame picture_crop_temp, picture_pad_temp;
833 AVCodecContext *enc, *dec;
835 avcodec_get_frame_defaults(&picture_crop_temp);
836 avcodec_get_frame_defaults(&picture_pad_temp);
838 enc = ost->st->codec;
839 dec = ist->st->codec;
841 /* by default, we output a single frame */
842 nb_frames = 1;
844 *frame_size = 0;
846 if(video_sync_method>0 || (video_sync_method && av_q2d(enc->time_base) > 0.001)){
847 double vdelta;
848 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
849 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
850 if (vdelta < -1.1)
851 nb_frames = 0;
852 else if (video_sync_method == 2)
853 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
854 else if (vdelta > 1.1)
855 nb_frames = lrintf(vdelta);
856 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, ost->sync_ipts, nb_frames);
857 if (nb_frames == 0){
858 ++nb_frames_drop;
859 if (verbose>2)
860 fprintf(stderr, "*** drop!\n");
861 }else if (nb_frames > 1) {
862 nb_frames_dup += nb_frames;
863 if (verbose>2)
864 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
866 }else
867 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
869 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
870 if (nb_frames <= 0)
871 return;
873 if (ost->video_crop) {
874 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
875 av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
876 if (exit_on_error)
877 av_exit(1);
878 return;
880 formatted_picture = &picture_crop_temp;
881 } else {
882 formatted_picture = in_picture;
885 final_picture = formatted_picture;
886 padding_src = formatted_picture;
887 resampling_dst = &ost->pict_tmp;
888 if (ost->video_pad) {
889 final_picture = &ost->pict_tmp;
890 if (ost->video_resample) {
891 if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
892 av_log(NULL, AV_LOG_ERROR, "error padding picture\n");
893 if (exit_on_error)
894 av_exit(1);
895 return;
897 resampling_dst = &picture_pad_temp;
901 if (ost->video_resample) {
902 padding_src = NULL;
903 final_picture = &ost->pict_tmp;
904 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
905 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
908 if (ost->video_pad) {
909 av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
910 enc->height, enc->width, enc->pix_fmt,
911 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
914 /* duplicates frame if needed */
915 for(i=0;i<nb_frames;i++) {
916 AVPacket pkt;
917 av_init_packet(&pkt);
918 pkt.stream_index= ost->index;
920 if (s->oformat->flags & AVFMT_RAWPICTURE) {
921 /* raw pictures are written as AVPicture structure to
922 avoid any copies. We support temorarily the older
923 method. */
924 AVFrame* old_frame = enc->coded_frame;
925 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
926 pkt.data= (uint8_t *)final_picture;
927 pkt.size= sizeof(AVPicture);
928 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
929 pkt.flags |= PKT_FLAG_KEY;
931 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
932 enc->coded_frame = old_frame;
933 } else {
934 AVFrame big_picture;
936 big_picture= *final_picture;
937 /* better than nothing: use input picture interlaced
938 settings */
939 big_picture.interlaced_frame = in_picture->interlaced_frame;
940 if(avctx_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
941 if(top_field_first == -1)
942 big_picture.top_field_first = in_picture->top_field_first;
943 else
944 big_picture.top_field_first = top_field_first;
947 /* handles sameq here. This is not correct because it may
948 not be a global option */
949 if (same_quality) {
950 big_picture.quality = ist->st->quality;
951 }else
952 big_picture.quality = ost->st->quality;
953 if(!me_threshold)
954 big_picture.pict_type = 0;
955 // big_picture.pts = AV_NOPTS_VALUE;
956 big_picture.pts= ost->sync_opts;
957 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
958 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
959 ret = avcodec_encode_video(enc,
960 bit_buffer, bit_buffer_size,
961 &big_picture);
962 if (ret == -1) {
963 fprintf(stderr, "Video encoding failed\n");
964 av_exit(1);
966 //enc->frame_number = enc->real_pict_num;
967 if(ret>0){
968 pkt.data= bit_buffer;
969 pkt.size= ret;
970 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
971 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
972 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
973 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
974 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
976 if(enc->coded_frame->key_frame)
977 pkt.flags |= PKT_FLAG_KEY;
978 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
979 *frame_size = ret;
980 video_size += ret;
981 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
982 // enc->frame_number-1, enc->real_pict_num, ret,
983 // enc->pict_type);
984 /* if two pass, output log */
985 if (ost->logfile && enc->stats_out) {
986 fprintf(ost->logfile, "%s", enc->stats_out);
990 ost->sync_opts++;
991 ost->frame_number++;
995 static double psnr(double d){
996 return -10.0*log(d)/log(10.0);
999 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1000 int frame_size)
1002 AVCodecContext *enc;
1003 int frame_number;
1004 double ti1, bitrate, avg_bitrate;
1006 /* this is executed just the first time do_video_stats is called */
1007 if (!vstats_file) {
1008 vstats_file = fopen(vstats_filename, "w");
1009 if (!vstats_file) {
1010 perror("fopen");
1011 av_exit(1);
1015 enc = ost->st->codec;
1016 if (enc->codec_type == CODEC_TYPE_VIDEO) {
1017 frame_number = ost->frame_number;
1018 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1019 if (enc->flags&CODEC_FLAG_PSNR)
1020 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1022 fprintf(vstats_file,"f_size= %6d ", frame_size);
1023 /* compute pts value */
1024 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1025 if (ti1 < 0.01)
1026 ti1 = 0.01;
1028 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1029 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1030 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1031 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1032 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1036 static void print_report(AVFormatContext **output_files,
1037 AVOutputStream **ost_table, int nb_ostreams,
1038 int is_last_report)
1040 char buf[1024];
1041 AVOutputStream *ost;
1042 AVFormatContext *oc, *os;
1043 int64_t total_size;
1044 AVCodecContext *enc;
1045 int frame_number, vid, i;
1046 double bitrate, ti1, pts;
1047 static int64_t last_time = -1;
1048 static int qp_histogram[52];
1050 if (!is_last_report) {
1051 int64_t cur_time;
1052 /* display the report every 0.5 seconds */
1053 cur_time = av_gettime();
1054 if (last_time == -1) {
1055 last_time = cur_time;
1056 return;
1058 if ((cur_time - last_time) < 500000)
1059 return;
1060 last_time = cur_time;
1064 oc = output_files[0];
1066 total_size = url_fsize(oc->pb);
1067 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1068 total_size= url_ftell(oc->pb);
1070 buf[0] = '\0';
1071 ti1 = 1e10;
1072 vid = 0;
1073 for(i=0;i<nb_ostreams;i++) {
1074 ost = ost_table[i];
1075 os = output_files[ost->file_index];
1076 enc = ost->st->codec;
1077 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1078 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1079 !ost->st->stream_copy ?
1080 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1082 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1083 float t = (av_gettime()-timer_start) / 1000000.0;
1085 frame_number = ost->frame_number;
1086 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1087 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1088 !ost->st->stream_copy ?
1089 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1090 if(is_last_report)
1091 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1092 if(qp_hist){
1093 int j;
1094 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1095 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1096 qp_histogram[qp]++;
1097 for(j=0; j<32; j++)
1098 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1100 if (enc->flags&CODEC_FLAG_PSNR){
1101 int j;
1102 double error, error_sum=0;
1103 double scale, scale_sum=0;
1104 char type[3]= {'Y','U','V'};
1105 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1106 for(j=0; j<3; j++){
1107 if(is_last_report){
1108 error= enc->error[j];
1109 scale= enc->width*enc->height*255.0*255.0*frame_number;
1110 }else{
1111 error= enc->coded_frame->error[j];
1112 scale= enc->width*enc->height*255.0*255.0;
1114 if(j) scale/=4;
1115 error_sum += error;
1116 scale_sum += scale;
1117 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1119 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1121 vid = 1;
1123 /* compute min output value */
1124 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1125 if ((pts < ti1) && (pts > 0))
1126 ti1 = pts;
1128 if (ti1 < 0.01)
1129 ti1 = 0.01;
1131 if (verbose || is_last_report) {
1132 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1134 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1135 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1136 (double)total_size / 1024, ti1, bitrate);
1138 if (verbose > 1)
1139 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1140 nb_frames_dup, nb_frames_drop);
1142 if (verbose >= 0)
1143 fprintf(stderr, "%s \r", buf);
1145 fflush(stderr);
1148 if (is_last_report && verbose >= 0){
1149 int64_t raw= audio_size + video_size + extra_size;
1150 fprintf(stderr, "\n");
1151 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1152 video_size/1024.0,
1153 audio_size/1024.0,
1154 extra_size/1024.0,
1155 100.0*(total_size - raw)/raw
1160 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1161 static int output_packet(AVInputStream *ist, int ist_index,
1162 AVOutputStream **ost_table, int nb_ostreams,
1163 const AVPacket *pkt)
1165 AVFormatContext *os;
1166 AVOutputStream *ost;
1167 uint8_t *ptr;
1168 int len, ret, i;
1169 uint8_t *data_buf;
1170 int data_size, got_picture;
1171 AVFrame picture;
1172 void *buffer_to_free;
1173 static unsigned int samples_size= 0;
1174 static short *samples= NULL;
1175 AVSubtitle subtitle, *subtitle_to_free;
1176 int got_subtitle;
1178 if(ist->next_pts == AV_NOPTS_VALUE)
1179 ist->next_pts= ist->pts;
1181 if (pkt == NULL) {
1182 /* EOF handling */
1183 ptr = NULL;
1184 len = 0;
1185 goto handle_eof;
1188 if(pkt->dts != AV_NOPTS_VALUE)
1189 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1191 len = pkt->size;
1192 ptr = pkt->data;
1194 //while we have more to decode or while the decoder did output something on EOF
1195 while (len > 0 || (!pkt && ist->next_pts != ist->pts)) {
1196 handle_eof:
1197 ist->pts= ist->next_pts;
1199 if(len && len != pkt->size && verbose>0)
1200 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1202 /* decode the packet if needed */
1203 data_buf = NULL; /* fail safe */
1204 data_size = 0;
1205 subtitle_to_free = NULL;
1206 if (ist->decoding_needed) {
1207 switch(ist->st->codec->codec_type) {
1208 case CODEC_TYPE_AUDIO:{
1209 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1210 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1211 av_free(samples);
1212 samples= av_malloc(samples_size);
1214 data_size= samples_size;
1215 /* XXX: could avoid copy if PCM 16 bits with same
1216 endianness as CPU */
1217 ret = avcodec_decode_audio2(ist->st->codec, samples, &data_size,
1218 ptr, len);
1219 if (ret < 0)
1220 goto fail_decode;
1221 ptr += ret;
1222 len -= ret;
1223 /* Some bug in mpeg audio decoder gives */
1224 /* data_size < 0, it seems they are overflows */
1225 if (data_size <= 0) {
1226 /* no audio frame */
1227 continue;
1229 data_buf = (uint8_t *)samples;
1230 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1231 (ist->st->codec->sample_rate * ist->st->codec->channels);
1232 break;}
1233 case CODEC_TYPE_VIDEO:
1234 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1235 /* XXX: allocate picture correctly */
1236 avcodec_get_frame_defaults(&picture);
1238 ret = avcodec_decode_video(ist->st->codec,
1239 &picture, &got_picture, ptr, len);
1240 ist->st->quality= picture.quality;
1241 if (ret < 0)
1242 goto fail_decode;
1243 if (!got_picture) {
1244 /* no picture yet */
1245 goto discard_packet;
1247 if (ist->st->codec->time_base.num != 0) {
1248 ist->next_pts += ((int64_t)AV_TIME_BASE *
1249 ist->st->codec->time_base.num) /
1250 ist->st->codec->time_base.den;
1252 len = 0;
1253 break;
1254 case CODEC_TYPE_SUBTITLE:
1255 ret = avcodec_decode_subtitle(ist->st->codec,
1256 &subtitle, &got_subtitle, ptr, len);
1257 if (ret < 0)
1258 goto fail_decode;
1259 if (!got_subtitle) {
1260 goto discard_packet;
1262 subtitle_to_free = &subtitle;
1263 len = 0;
1264 break;
1265 default:
1266 goto fail_decode;
1268 } else {
1269 switch(ist->st->codec->codec_type) {
1270 case CODEC_TYPE_AUDIO:
1271 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1272 ist->st->codec->sample_rate;
1273 break;
1274 case CODEC_TYPE_VIDEO:
1275 if (ist->st->codec->time_base.num != 0) {
1276 ist->next_pts += ((int64_t)AV_TIME_BASE *
1277 ist->st->codec->time_base.num) /
1278 ist->st->codec->time_base.den;
1280 break;
1282 data_buf = ptr;
1283 data_size = len;
1284 ret = len;
1285 len = 0;
1288 buffer_to_free = NULL;
1289 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1290 pre_process_video_frame(ist, (AVPicture *)&picture,
1291 &buffer_to_free);
1294 // preprocess audio (volume)
1295 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1296 if (audio_volume != 256) {
1297 short *volp;
1298 volp = samples;
1299 for(i=0;i<(data_size / sizeof(short));i++) {
1300 int v = ((*volp) * audio_volume + 128) >> 8;
1301 if (v < -32768) v = -32768;
1302 if (v > 32767) v = 32767;
1303 *volp++ = v;
1308 /* frame rate emulation */
1309 if (rate_emu) {
1310 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1311 int64_t now = av_gettime() - ist->start;
1312 if (pts > now)
1313 usleep(pts - now);
1316 /* if output time reached then transcode raw format,
1317 encode packets and output them */
1318 if (start_time == 0 || ist->pts >= start_time)
1319 for(i=0;i<nb_ostreams;i++) {
1320 int frame_size;
1322 ost = ost_table[i];
1323 if (ost->source_index == ist_index) {
1324 os = output_files[ost->file_index];
1326 #if 0
1327 printf("%d: got pts=%0.3f %0.3f\n", i,
1328 (double)pkt->pts / AV_TIME_BASE,
1329 ((double)ist->pts / AV_TIME_BASE) -
1330 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1331 #endif
1332 /* set the input output pts pairs */
1333 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1335 if (ost->encoding_needed) {
1336 switch(ost->st->codec->codec_type) {
1337 case CODEC_TYPE_AUDIO:
1338 do_audio_out(os, ost, ist, data_buf, data_size);
1339 break;
1340 case CODEC_TYPE_VIDEO:
1341 do_video_out(os, ost, ist, &picture, &frame_size);
1342 if (vstats_filename && frame_size)
1343 do_video_stats(os, ost, frame_size);
1344 break;
1345 case CODEC_TYPE_SUBTITLE:
1346 do_subtitle_out(os, ost, ist, &subtitle,
1347 pkt->pts);
1348 break;
1349 default:
1350 abort();
1352 } else {
1353 AVFrame avframe; //FIXME/XXX remove this
1354 AVPacket opkt;
1355 av_init_packet(&opkt);
1357 if ((!ost->frame_number && !(pkt->flags & PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1358 continue;
1360 /* no reencoding needed : output the packet directly */
1361 /* force the input stream PTS */
1363 avcodec_get_frame_defaults(&avframe);
1364 ost->st->codec->coded_frame= &avframe;
1365 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1367 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1368 audio_size += data_size;
1369 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1370 video_size += data_size;
1371 ost->sync_opts++;
1374 opkt.stream_index= ost->index;
1375 if(pkt->pts != AV_NOPTS_VALUE)
1376 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base);
1377 else
1378 opkt.pts= AV_NOPTS_VALUE;
1380 if (pkt->dts == AV_NOPTS_VALUE)
1381 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1382 else
1383 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1385 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1386 opkt.flags= pkt->flags;
1388 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1389 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1390 opkt.destruct= av_destruct_packet;
1392 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][opkt.stream_index]);
1393 ost->st->codec->frame_number++;
1394 ost->frame_number++;
1395 av_free_packet(&opkt);
1399 av_free(buffer_to_free);
1400 /* XXX: allocate the subtitles in the codec ? */
1401 if (subtitle_to_free) {
1402 if (subtitle_to_free->rects != NULL) {
1403 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1404 av_freep(&subtitle_to_free->rects[i]->pict.data[0]);
1405 av_freep(&subtitle_to_free->rects[i]->pict.data[1]);
1406 av_freep(&subtitle_to_free->rects[i]);
1408 av_freep(&subtitle_to_free->rects);
1410 subtitle_to_free->num_rects = 0;
1411 subtitle_to_free = NULL;
1414 discard_packet:
1415 if (pkt == NULL) {
1416 /* EOF handling */
1418 for(i=0;i<nb_ostreams;i++) {
1419 ost = ost_table[i];
1420 if (ost->source_index == ist_index) {
1421 AVCodecContext *enc= ost->st->codec;
1422 os = output_files[ost->file_index];
1424 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1425 continue;
1426 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1427 continue;
1429 if (ost->encoding_needed) {
1430 for(;;) {
1431 AVPacket pkt;
1432 int fifo_bytes;
1433 av_init_packet(&pkt);
1434 pkt.stream_index= ost->index;
1436 switch(ost->st->codec->codec_type) {
1437 case CODEC_TYPE_AUDIO:
1438 fifo_bytes = av_fifo_size(&ost->fifo);
1439 ret = 0;
1440 /* encode any samples remaining in fifo */
1441 if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1442 int fs_tmp = enc->frame_size;
1443 enc->frame_size = fifo_bytes / (2 * enc->channels);
1444 av_fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes);
1445 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1446 enc->frame_size = fs_tmp;
1448 if(ret <= 0) {
1449 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1451 audio_size += ret;
1452 pkt.flags |= PKT_FLAG_KEY;
1453 break;
1454 case CODEC_TYPE_VIDEO:
1455 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1456 video_size += ret;
1457 if(enc->coded_frame && enc->coded_frame->key_frame)
1458 pkt.flags |= PKT_FLAG_KEY;
1459 if (ost->logfile && enc->stats_out) {
1460 fprintf(ost->logfile, "%s", enc->stats_out);
1462 break;
1463 default:
1464 ret=-1;
1467 if(ret<=0)
1468 break;
1469 pkt.data= bit_buffer;
1470 pkt.size= ret;
1471 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1472 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1473 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1480 return 0;
1481 fail_decode:
1482 return -1;
1485 static void print_sdp(AVFormatContext **avc, int n)
1487 char sdp[2048];
1489 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1490 printf("SDP:\n%s\n", sdp);
1491 fflush(stdout);
1494 static int stream_index_from_inputs(AVFormatContext **input_files,
1495 int nb_input_files,
1496 AVInputFile *file_table,
1497 AVInputStream **ist_table,
1498 enum CodecType type,
1499 int programid)
1501 int p, q, z;
1502 for(z=0; z<nb_input_files; z++) {
1503 AVFormatContext *ic = input_files[z];
1504 for(p=0; p<ic->nb_programs; p++) {
1505 AVProgram *program = ic->programs[p];
1506 if(program->id != programid)
1507 continue;
1508 for(q=0; q<program->nb_stream_indexes; q++) {
1509 int sidx = program->stream_index[q];
1510 int ris = file_table[z].ist_index + sidx;
1511 if(ist_table[ris]->discard && ic->streams[sidx]->codec->codec_type == type)
1512 return ris;
1517 return -1;
1521 * The following code is the main loop of the file converter
1523 static int av_encode(AVFormatContext **output_files,
1524 int nb_output_files,
1525 AVFormatContext **input_files,
1526 int nb_input_files,
1527 AVStreamMap *stream_maps, int nb_stream_maps)
1529 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1530 AVFormatContext *is, *os;
1531 AVCodecContext *codec, *icodec;
1532 AVOutputStream *ost, **ost_table = NULL;
1533 AVInputStream *ist, **ist_table = NULL;
1534 AVInputFile *file_table;
1535 int key;
1536 int want_sdp = 1;
1538 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1539 if (!file_table)
1540 goto fail;
1542 /* input stream init */
1543 j = 0;
1544 for(i=0;i<nb_input_files;i++) {
1545 is = input_files[i];
1546 file_table[i].ist_index = j;
1547 file_table[i].nb_streams = is->nb_streams;
1548 j += is->nb_streams;
1550 nb_istreams = j;
1552 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1553 if (!ist_table)
1554 goto fail;
1556 for(i=0;i<nb_istreams;i++) {
1557 ist = av_mallocz(sizeof(AVInputStream));
1558 if (!ist)
1559 goto fail;
1560 ist_table[i] = ist;
1562 j = 0;
1563 for(i=0;i<nb_input_files;i++) {
1564 is = input_files[i];
1565 for(k=0;k<is->nb_streams;k++) {
1566 ist = ist_table[j++];
1567 ist->st = is->streams[k];
1568 ist->file_index = i;
1569 ist->index = k;
1570 ist->discard = 1; /* the stream is discarded by default
1571 (changed later) */
1573 if (rate_emu) {
1574 ist->start = av_gettime();
1579 /* output stream init */
1580 nb_ostreams = 0;
1581 for(i=0;i<nb_output_files;i++) {
1582 os = output_files[i];
1583 if (!os->nb_streams) {
1584 dump_format(output_files[i], i, output_files[i]->filename, 1);
1585 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1586 av_exit(1);
1588 nb_ostreams += os->nb_streams;
1590 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1591 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1592 av_exit(1);
1595 /* Sanity check the mapping args -- do the input files & streams exist? */
1596 for(i=0;i<nb_stream_maps;i++) {
1597 int fi = stream_maps[i].file_index;
1598 int si = stream_maps[i].stream_index;
1600 if (fi < 0 || fi > nb_input_files - 1 ||
1601 si < 0 || si > file_table[fi].nb_streams - 1) {
1602 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1603 av_exit(1);
1605 fi = stream_maps[i].sync_file_index;
1606 si = stream_maps[i].sync_stream_index;
1607 if (fi < 0 || fi > nb_input_files - 1 ||
1608 si < 0 || si > file_table[fi].nb_streams - 1) {
1609 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1610 av_exit(1);
1614 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1615 if (!ost_table)
1616 goto fail;
1617 for(i=0;i<nb_ostreams;i++) {
1618 ost = av_mallocz(sizeof(AVOutputStream));
1619 if (!ost)
1620 goto fail;
1621 ost_table[i] = ost;
1624 n = 0;
1625 for(k=0;k<nb_output_files;k++) {
1626 os = output_files[k];
1627 for(i=0;i<os->nb_streams;i++,n++) {
1628 int found;
1629 ost = ost_table[n];
1630 ost->file_index = k;
1631 ost->index = i;
1632 ost->st = os->streams[i];
1633 if (nb_stream_maps > 0) {
1634 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
1635 stream_maps[n].stream_index;
1637 /* Sanity check that the stream types match */
1638 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1639 int i= ost->file_index;
1640 dump_format(output_files[i], i, output_files[i]->filename, 1);
1641 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1642 stream_maps[n].file_index, stream_maps[n].stream_index,
1643 ost->file_index, ost->index);
1644 av_exit(1);
1647 } else {
1648 if(opt_programid) {
1649 found = 0;
1650 j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid);
1651 if(j != -1) {
1652 ost->source_index = j;
1653 found = 1;
1655 } else {
1656 /* get corresponding input stream index : we select the first one with the right type */
1657 found = 0;
1658 for(j=0;j<nb_istreams;j++) {
1659 ist = ist_table[j];
1660 if (ist->discard &&
1661 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1662 ost->source_index = j;
1663 found = 1;
1664 break;
1669 if (!found) {
1670 if(! opt_programid) {
1671 /* try again and reuse existing stream */
1672 for(j=0;j<nb_istreams;j++) {
1673 ist = ist_table[j];
1674 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1675 ost->source_index = j;
1676 found = 1;
1680 if (!found) {
1681 int i= ost->file_index;
1682 dump_format(output_files[i], i, output_files[i]->filename, 1);
1683 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1684 ost->file_index, ost->index);
1685 av_exit(1);
1689 ist = ist_table[ost->source_index];
1690 ist->discard = 0;
1691 ost->sync_ist = (nb_stream_maps > 0) ?
1692 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
1693 stream_maps[n].sync_stream_index] : ist;
1697 /* for each output stream, we compute the right encoding parameters */
1698 for(i=0;i<nb_ostreams;i++) {
1699 ost = ost_table[i];
1700 os = output_files[ost->file_index];
1701 ist = ist_table[ost->source_index];
1703 codec = ost->st->codec;
1704 icodec = ist->st->codec;
1706 if (!ost->st->language[0])
1707 av_strlcpy(ost->st->language, ist->st->language,
1708 sizeof(ost->st->language));
1710 ost->st->disposition = ist->st->disposition;
1712 if (ost->st->stream_copy) {
1713 /* if stream_copy is selected, no need to decode or encode */
1714 codec->codec_id = icodec->codec_id;
1715 codec->codec_type = icodec->codec_type;
1717 if(!codec->codec_tag){
1718 if( !os->oformat->codec_tag
1719 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) > 0
1720 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1721 codec->codec_tag = icodec->codec_tag;
1724 codec->bit_rate = icodec->bit_rate;
1725 codec->extradata= icodec->extradata;
1726 codec->extradata_size= icodec->extradata_size;
1727 if(av_q2d(icodec->time_base) > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000)
1728 codec->time_base = icodec->time_base;
1729 else
1730 codec->time_base = ist->st->time_base;
1731 switch(codec->codec_type) {
1732 case CODEC_TYPE_AUDIO:
1733 if(audio_volume != 256) {
1734 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1735 av_exit(1);
1737 codec->channel_layout = icodec->channel_layout;
1738 codec->sample_rate = icodec->sample_rate;
1739 codec->channels = icodec->channels;
1740 codec->frame_size = icodec->frame_size;
1741 codec->block_align= icodec->block_align;
1742 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1743 codec->block_align= 0;
1744 if(codec->codec_id == CODEC_ID_AC3)
1745 codec->block_align= 0;
1746 break;
1747 case CODEC_TYPE_VIDEO:
1748 if(using_vhook) {
1749 fprintf(stderr,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");
1750 av_exit(1);
1752 codec->pix_fmt = icodec->pix_fmt;
1753 codec->width = icodec->width;
1754 codec->height = icodec->height;
1755 codec->has_b_frames = icodec->has_b_frames;
1756 break;
1757 case CODEC_TYPE_SUBTITLE:
1758 break;
1759 default:
1760 abort();
1762 } else {
1763 switch(codec->codec_type) {
1764 case CODEC_TYPE_AUDIO:
1765 if (av_fifo_init(&ost->fifo, 1024))
1766 goto fail;
1767 ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
1768 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1769 icodec->request_channels = codec->channels;
1770 ist->decoding_needed = 1;
1771 ost->encoding_needed = 1;
1772 break;
1773 case CODEC_TYPE_VIDEO:
1774 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1775 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1776 ost->video_resample = ((codec->width != icodec->width -
1777 (frame_leftBand + frame_rightBand) +
1778 (frame_padleft + frame_padright)) ||
1779 (codec->height != icodec->height -
1780 (frame_topBand + frame_bottomBand) +
1781 (frame_padtop + frame_padbottom)) ||
1782 (codec->pix_fmt != icodec->pix_fmt));
1783 if (ost->video_crop) {
1784 ost->topBand = frame_topBand;
1785 ost->leftBand = frame_leftBand;
1787 if (ost->video_pad) {
1788 ost->padtop = frame_padtop;
1789 ost->padleft = frame_padleft;
1790 ost->padbottom = frame_padbottom;
1791 ost->padright = frame_padright;
1792 if (!ost->video_resample) {
1793 avcodec_get_frame_defaults(&ost->pict_tmp);
1794 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1795 codec->width, codec->height))
1796 goto fail;
1799 if (ost->video_resample) {
1800 avcodec_get_frame_defaults(&ost->pict_tmp);
1801 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1802 codec->width, codec->height)) {
1803 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1804 av_exit(1);
1806 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1807 ost->img_resample_ctx = sws_getContext(
1808 icodec->width - (frame_leftBand + frame_rightBand),
1809 icodec->height - (frame_topBand + frame_bottomBand),
1810 icodec->pix_fmt,
1811 codec->width - (frame_padleft + frame_padright),
1812 codec->height - (frame_padtop + frame_padbottom),
1813 codec->pix_fmt,
1814 sws_flags, NULL, NULL, NULL);
1815 if (ost->img_resample_ctx == NULL) {
1816 fprintf(stderr, "Cannot get resampling context\n");
1817 av_exit(1);
1819 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1821 ost->encoding_needed = 1;
1822 ist->decoding_needed = 1;
1823 break;
1824 case CODEC_TYPE_SUBTITLE:
1825 ost->encoding_needed = 1;
1826 ist->decoding_needed = 1;
1827 break;
1828 default:
1829 abort();
1830 break;
1832 /* two pass mode */
1833 if (ost->encoding_needed &&
1834 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1835 char logfilename[1024];
1836 FILE *f;
1837 int size;
1838 char *logbuffer;
1840 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1841 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
1843 if (codec->flags & CODEC_FLAG_PASS1) {
1844 f = fopen(logfilename, "w");
1845 if (!f) {
1846 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
1847 av_exit(1);
1849 ost->logfile = f;
1850 } else {
1851 /* read the log file */
1852 f = fopen(logfilename, "r");
1853 if (!f) {
1854 fprintf(stderr, "Cannot read log file '%s' for pass-2 encoding: %s\n", logfilename, strerror(errno));
1855 av_exit(1);
1857 fseek(f, 0, SEEK_END);
1858 size = ftell(f);
1859 fseek(f, 0, SEEK_SET);
1860 logbuffer = av_malloc(size + 1);
1861 if (!logbuffer) {
1862 fprintf(stderr, "Could not allocate log buffer\n");
1863 av_exit(1);
1865 size = fread(logbuffer, 1, size, f);
1866 fclose(f);
1867 logbuffer[size] = '\0';
1868 codec->stats_in = logbuffer;
1872 if(codec->codec_type == CODEC_TYPE_VIDEO){
1873 int size= codec->width * codec->height;
1874 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1878 if (!bit_buffer)
1879 bit_buffer = av_malloc(bit_buffer_size);
1880 if (!bit_buffer)
1881 goto fail;
1883 /* dump the file output parameters - cannot be done before in case
1884 of stream copy */
1885 for(i=0;i<nb_output_files;i++) {
1886 dump_format(output_files[i], i, output_files[i]->filename, 1);
1889 /* dump the stream mapping */
1890 if (verbose >= 0) {
1891 fprintf(stderr, "Stream mapping:\n");
1892 for(i=0;i<nb_ostreams;i++) {
1893 ost = ost_table[i];
1894 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1895 ist_table[ost->source_index]->file_index,
1896 ist_table[ost->source_index]->index,
1897 ost->file_index,
1898 ost->index);
1899 if (ost->sync_ist != ist_table[ost->source_index])
1900 fprintf(stderr, " [sync #%d.%d]",
1901 ost->sync_ist->file_index,
1902 ost->sync_ist->index);
1903 fprintf(stderr, "\n");
1907 /* open each encoder */
1908 for(i=0;i<nb_ostreams;i++) {
1909 ost = ost_table[i];
1910 if (ost->encoding_needed) {
1911 AVCodec *codec = output_codecs[i];
1912 if (!codec)
1913 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1914 if (!codec) {
1915 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1916 ost->file_index, ost->index);
1917 av_exit(1);
1919 if (avcodec_open(ost->st->codec, codec) < 0) {
1920 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1921 ost->file_index, ost->index);
1922 av_exit(1);
1924 extra_size += ost->st->codec->extradata_size;
1928 /* open each decoder */
1929 for(i=0;i<nb_istreams;i++) {
1930 ist = ist_table[i];
1931 if (ist->decoding_needed) {
1932 AVCodec *codec = input_codecs[i];
1933 if (!codec)
1934 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1935 if (!codec) {
1936 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1937 ist->st->codec->codec_id, ist->file_index, ist->index);
1938 av_exit(1);
1940 if (avcodec_open(ist->st->codec, codec) < 0) {
1941 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1942 ist->file_index, ist->index);
1943 av_exit(1);
1945 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1946 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1950 /* init pts */
1951 for(i=0;i<nb_istreams;i++) {
1952 ist = ist_table[i];
1953 is = input_files[ist->file_index];
1954 ist->pts = 0;
1955 ist->next_pts = AV_NOPTS_VALUE;
1956 ist->is_start = 1;
1959 /* set meta data information from input file if required */
1960 for (i=0;i<nb_meta_data_maps;i++) {
1961 AVFormatContext *out_file;
1962 AVFormatContext *in_file;
1964 int out_file_index = meta_data_maps[i].out_file;
1965 int in_file_index = meta_data_maps[i].in_file;
1966 if (out_file_index < 0 || out_file_index >= nb_output_files) {
1967 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1968 ret = AVERROR(EINVAL);
1969 goto fail;
1971 if (in_file_index < 0 || in_file_index >= nb_input_files) {
1972 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1973 ret = AVERROR(EINVAL);
1974 goto fail;
1977 out_file = output_files[out_file_index];
1978 in_file = input_files[in_file_index];
1980 strcpy(out_file->title, in_file->title);
1981 strcpy(out_file->author, in_file->author);
1982 strcpy(out_file->copyright, in_file->copyright);
1983 strcpy(out_file->comment, in_file->comment);
1984 strcpy(out_file->album, in_file->album);
1985 out_file->year = in_file->year;
1986 out_file->track = in_file->track;
1987 strcpy(out_file->genre, in_file->genre);
1990 /* open files and write file headers */
1991 for(i=0;i<nb_output_files;i++) {
1992 os = output_files[i];
1993 if (av_write_header(os) < 0) {
1994 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1995 ret = AVERROR(EINVAL);
1996 goto fail;
1998 if (strcmp(output_files[i]->oformat->name, "rtp")) {
1999 want_sdp = 0;
2002 if (want_sdp) {
2003 print_sdp(output_files, nb_output_files);
2006 if (!using_stdin && verbose >= 0) {
2007 fprintf(stderr, "Press [q] to stop encoding\n");
2008 url_set_interrupt_cb(decode_interrupt_cb);
2010 term_init();
2012 key = -1;
2013 timer_start = av_gettime();
2015 for(; received_sigterm == 0;) {
2016 int file_index, ist_index;
2017 AVPacket pkt;
2018 double ipts_min;
2019 double opts_min;
2021 redo:
2022 ipts_min= 1e100;
2023 opts_min= 1e100;
2024 /* if 'q' pressed, exits */
2025 if (!using_stdin) {
2026 if (q_pressed)
2027 break;
2028 /* read_key() returns 0 on EOF */
2029 key = read_key();
2030 if (key == 'q')
2031 break;
2034 /* select the stream that we must read now by looking at the
2035 smallest output pts */
2036 file_index = -1;
2037 for(i=0;i<nb_ostreams;i++) {
2038 double ipts, opts;
2039 ost = ost_table[i];
2040 os = output_files[ost->file_index];
2041 ist = ist_table[ost->source_index];
2042 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
2043 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
2044 else
2045 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2046 ipts = (double)ist->pts;
2047 if (!file_table[ist->file_index].eof_reached){
2048 if(ipts < ipts_min) {
2049 ipts_min = ipts;
2050 if(input_sync ) file_index = ist->file_index;
2052 if(opts < opts_min) {
2053 opts_min = opts;
2054 if(!input_sync) file_index = ist->file_index;
2057 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2058 file_index= -1;
2059 break;
2062 /* if none, if is finished */
2063 if (file_index < 0) {
2064 break;
2067 /* finish if recording time exhausted */
2068 if (opts_min >= (recording_time / 1000000.0))
2069 break;
2071 /* finish if limit size exhausted */
2072 if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
2073 break;
2075 /* read a frame from it and output it in the fifo */
2076 is = input_files[file_index];
2077 if (av_read_frame(is, &pkt) < 0) {
2078 file_table[file_index].eof_reached = 1;
2079 if (opt_shortest)
2080 break;
2081 else
2082 continue;
2085 if (do_pkt_dump) {
2086 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2088 /* the following test is needed in case new streams appear
2089 dynamically in stream : we ignore them */
2090 if (pkt.stream_index >= file_table[file_index].nb_streams)
2091 goto discard_packet;
2092 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2093 ist = ist_table[ist_index];
2094 if (ist->discard)
2095 goto discard_packet;
2097 if (pkt.dts != AV_NOPTS_VALUE)
2098 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2099 if (pkt.pts != AV_NOPTS_VALUE)
2100 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2102 if(input_files_ts_scale[file_index][pkt.stream_index]){
2103 if(pkt.pts != AV_NOPTS_VALUE)
2104 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2105 if(pkt.dts != AV_NOPTS_VALUE)
2106 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2109 // 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);
2110 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2111 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2112 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2113 int64_t delta= pkt_dts - ist->next_pts;
2114 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2115 input_files_ts_offset[ist->file_index]-= delta;
2116 if (verbose > 2)
2117 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2118 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2119 if(pkt.pts != AV_NOPTS_VALUE)
2120 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2124 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2125 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2127 if (verbose >= 0)
2128 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2129 ist->file_index, ist->index);
2130 if (exit_on_error)
2131 av_exit(1);
2132 av_free_packet(&pkt);
2133 goto redo;
2136 discard_packet:
2137 av_free_packet(&pkt);
2139 /* dump report by using the output first video and audio streams */
2140 print_report(output_files, ost_table, nb_ostreams, 0);
2143 /* at the end of stream, we must flush the decoder buffers */
2144 for(i=0;i<nb_istreams;i++) {
2145 ist = ist_table[i];
2146 if (ist->decoding_needed) {
2147 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2151 term_exit();
2153 /* write the trailer if needed and close file */
2154 for(i=0;i<nb_output_files;i++) {
2155 os = output_files[i];
2156 av_write_trailer(os);
2159 /* dump report by using the first video and audio streams */
2160 print_report(output_files, ost_table, nb_ostreams, 1);
2162 /* close each encoder */
2163 for(i=0;i<nb_ostreams;i++) {
2164 ost = ost_table[i];
2165 if (ost->encoding_needed) {
2166 av_freep(&ost->st->codec->stats_in);
2167 avcodec_close(ost->st->codec);
2171 /* close each decoder */
2172 for(i=0;i<nb_istreams;i++) {
2173 ist = ist_table[i];
2174 if (ist->decoding_needed) {
2175 avcodec_close(ist->st->codec);
2179 /* finished ! */
2181 ret = 0;
2182 fail1:
2183 av_freep(&bit_buffer);
2184 av_free(file_table);
2186 if (ist_table) {
2187 for(i=0;i<nb_istreams;i++) {
2188 ist = ist_table[i];
2189 av_free(ist);
2191 av_free(ist_table);
2193 if (ost_table) {
2194 for(i=0;i<nb_ostreams;i++) {
2195 ost = ost_table[i];
2196 if (ost) {
2197 if (ost->logfile) {
2198 fclose(ost->logfile);
2199 ost->logfile = NULL;
2201 av_fifo_free(&ost->fifo); /* works even if fifo is not
2202 initialized but set to zero */
2203 av_free(ost->pict_tmp.data[0]);
2204 if (ost->video_resample)
2205 sws_freeContext(ost->img_resample_ctx);
2206 if (ost->resample)
2207 audio_resample_close(ost->resample);
2208 if (ost->reformat_ctx)
2209 av_audio_convert_free(ost->reformat_ctx);
2210 av_free(ost);
2213 av_free(ost_table);
2215 return ret;
2216 fail:
2217 ret = AVERROR(ENOMEM);
2218 goto fail1;
2221 #if 0
2222 int file_read(const char *filename)
2224 URLContext *h;
2225 unsigned char buffer[1024];
2226 int len, i;
2228 if (url_open(&h, filename, O_RDONLY) < 0) {
2229 printf("could not open '%s'\n", filename);
2230 return -1;
2232 for(;;) {
2233 len = url_read(h, buffer, sizeof(buffer));
2234 if (len <= 0)
2235 break;
2236 for(i=0;i<len;i++) putchar(buffer[i]);
2238 url_close(h);
2239 return 0;
2241 #endif
2243 static void opt_format(const char *arg)
2245 /* compatibility stuff for pgmyuv */
2246 if (!strcmp(arg, "pgmyuv")) {
2247 pgmyuv_compatibility_hack=1;
2248 // opt_image_format(arg);
2249 arg = "image2";
2250 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2253 file_iformat = av_find_input_format(arg);
2254 file_oformat = guess_format(arg, NULL, NULL);
2255 if (!file_iformat && !file_oformat) {
2256 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2257 av_exit(1);
2261 static void opt_video_rc_override_string(const char *arg)
2263 video_rc_override_string = arg;
2266 static int opt_me_threshold(const char *opt, const char *arg)
2268 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2269 return 0;
2272 static int opt_verbose(const char *opt, const char *arg)
2274 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2275 av_log_set_level(verbose);
2276 return 0;
2279 static int opt_frame_rate(const char *opt, const char *arg)
2281 if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2282 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2283 av_exit(1);
2285 return 0;
2288 static int opt_bitrate(const char *opt, const char *arg)
2290 int codec_type = opt[0]=='a' ? CODEC_TYPE_AUDIO : CODEC_TYPE_VIDEO;
2292 opt_default(opt, arg);
2294 if (av_get_int(avctx_opts[codec_type], "b", NULL) < 1000)
2295 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2297 return 0;
2300 static void opt_frame_crop_top(const char *arg)
2302 frame_topBand = atoi(arg);
2303 if (frame_topBand < 0) {
2304 fprintf(stderr, "Incorrect top crop size\n");
2305 av_exit(1);
2307 if ((frame_topBand % 2) != 0) {
2308 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2309 av_exit(1);
2311 if ((frame_topBand) >= frame_height){
2312 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2313 av_exit(1);
2315 frame_height -= frame_topBand;
2318 static void opt_frame_crop_bottom(const char *arg)
2320 frame_bottomBand = atoi(arg);
2321 if (frame_bottomBand < 0) {
2322 fprintf(stderr, "Incorrect bottom crop size\n");
2323 av_exit(1);
2325 if ((frame_bottomBand % 2) != 0) {
2326 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2327 av_exit(1);
2329 if ((frame_bottomBand) >= frame_height){
2330 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2331 av_exit(1);
2333 frame_height -= frame_bottomBand;
2336 static void opt_frame_crop_left(const char *arg)
2338 frame_leftBand = atoi(arg);
2339 if (frame_leftBand < 0) {
2340 fprintf(stderr, "Incorrect left crop size\n");
2341 av_exit(1);
2343 if ((frame_leftBand % 2) != 0) {
2344 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2345 av_exit(1);
2347 if ((frame_leftBand) >= frame_width){
2348 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2349 av_exit(1);
2351 frame_width -= frame_leftBand;
2354 static void opt_frame_crop_right(const char *arg)
2356 frame_rightBand = atoi(arg);
2357 if (frame_rightBand < 0) {
2358 fprintf(stderr, "Incorrect right crop size\n");
2359 av_exit(1);
2361 if ((frame_rightBand % 2) != 0) {
2362 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2363 av_exit(1);
2365 if ((frame_rightBand) >= frame_width){
2366 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2367 av_exit(1);
2369 frame_width -= frame_rightBand;
2372 static void opt_frame_size(const char *arg)
2374 if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
2375 fprintf(stderr, "Incorrect frame size\n");
2376 av_exit(1);
2378 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2379 fprintf(stderr, "Frame size must be a multiple of 2\n");
2380 av_exit(1);
2385 #define SCALEBITS 10
2386 #define ONE_HALF (1 << (SCALEBITS - 1))
2387 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2389 #define RGB_TO_Y(r, g, b) \
2390 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2391 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2393 #define RGB_TO_U(r1, g1, b1, shift)\
2394 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2395 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2397 #define RGB_TO_V(r1, g1, b1, shift)\
2398 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2399 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2401 static void opt_pad_color(const char *arg) {
2402 /* Input is expected to be six hex digits similar to
2403 how colors are expressed in html tags (but without the #) */
2404 int rgb = strtol(arg, NULL, 16);
2405 int r,g,b;
2407 r = (rgb >> 16);
2408 g = ((rgb >> 8) & 255);
2409 b = (rgb & 255);
2411 padcolor[0] = RGB_TO_Y(r,g,b);
2412 padcolor[1] = RGB_TO_U(r,g,b,0);
2413 padcolor[2] = RGB_TO_V(r,g,b,0);
2416 static void opt_frame_pad_top(const char *arg)
2418 frame_padtop = atoi(arg);
2419 if (frame_padtop < 0) {
2420 fprintf(stderr, "Incorrect top pad size\n");
2421 av_exit(1);
2423 if ((frame_padtop % 2) != 0) {
2424 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2425 av_exit(1);
2429 static void opt_frame_pad_bottom(const char *arg)
2431 frame_padbottom = atoi(arg);
2432 if (frame_padbottom < 0) {
2433 fprintf(stderr, "Incorrect bottom pad size\n");
2434 av_exit(1);
2436 if ((frame_padbottom % 2) != 0) {
2437 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2438 av_exit(1);
2443 static void opt_frame_pad_left(const char *arg)
2445 frame_padleft = atoi(arg);
2446 if (frame_padleft < 0) {
2447 fprintf(stderr, "Incorrect left pad size\n");
2448 av_exit(1);
2450 if ((frame_padleft % 2) != 0) {
2451 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2452 av_exit(1);
2457 static void opt_frame_pad_right(const char *arg)
2459 frame_padright = atoi(arg);
2460 if (frame_padright < 0) {
2461 fprintf(stderr, "Incorrect right pad size\n");
2462 av_exit(1);
2464 if ((frame_padright % 2) != 0) {
2465 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2466 av_exit(1);
2470 static void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts)
2472 int i;
2473 char fmt_str[128];
2474 for (i=-1; i < nb_fmts; i++) {
2475 get_fmt_string (fmt_str, sizeof(fmt_str), i);
2476 fprintf(stdout, "%s\n", fmt_str);
2480 static void opt_frame_pix_fmt(const char *arg)
2482 if (strcmp(arg, "list"))
2483 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2484 else {
2485 list_fmts(avcodec_pix_fmt_string, PIX_FMT_NB);
2486 av_exit(0);
2490 static void opt_frame_aspect_ratio(const char *arg)
2492 int x = 0, y = 0;
2493 double ar = 0;
2494 const char *p;
2495 char *end;
2497 p = strchr(arg, ':');
2498 if (p) {
2499 x = strtol(arg, &end, 10);
2500 if (end == p)
2501 y = strtol(end+1, &end, 10);
2502 if (x > 0 && y > 0)
2503 ar = (double)x / (double)y;
2504 } else
2505 ar = strtod(arg, NULL);
2507 if (!ar) {
2508 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2509 av_exit(1);
2511 frame_aspect_ratio = ar;
2514 static void opt_qscale(const char *arg)
2516 video_qscale = atof(arg);
2517 if (video_qscale <= 0 ||
2518 video_qscale > 255) {
2519 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2520 av_exit(1);
2524 static void opt_top_field_first(const char *arg)
2526 top_field_first= atoi(arg);
2529 static int opt_thread_count(const char *opt, const char *arg)
2531 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2532 #if !defined(HAVE_THREADS)
2533 if (verbose >= 0)
2534 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2535 #endif
2536 return 0;
2539 static void opt_audio_sample_fmt(const char *arg)
2541 if (strcmp(arg, "list"))
2542 audio_sample_fmt = avcodec_get_sample_fmt(arg);
2543 else {
2544 list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
2545 av_exit(0);
2549 static int opt_audio_rate(const char *opt, const char *arg)
2551 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2552 return 0;
2555 static int opt_audio_channels(const char *opt, const char *arg)
2557 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2558 return 0;
2561 static void opt_video_channel(const char *arg)
2563 video_channel = strtol(arg, NULL, 0);
2566 static void opt_video_standard(const char *arg)
2568 video_standard = av_strdup(arg);
2571 static void opt_codec(int *pstream_copy, char **pcodec_name,
2572 int codec_type, const char *arg)
2574 av_freep(pcodec_name);
2575 if (!strcmp(arg, "copy")) {
2576 *pstream_copy = 1;
2577 } else {
2578 *pcodec_name = av_strdup(arg);
2582 static void opt_audio_codec(const char *arg)
2584 opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg);
2587 static void opt_audio_tag(const char *arg)
2589 char *tail;
2590 audio_codec_tag= strtol(arg, &tail, 0);
2592 if(!tail || *tail)
2593 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2596 static void opt_video_tag(const char *arg)
2598 char *tail;
2599 video_codec_tag= strtol(arg, &tail, 0);
2601 if(!tail || *tail)
2602 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2605 #ifdef CONFIG_VHOOK
2606 static void add_frame_hooker(const char *arg)
2608 int argc = 0;
2609 char *argv[64];
2610 int i;
2611 char *args = av_strdup(arg);
2613 using_vhook = 1;
2615 argv[0] = strtok(args, " ");
2616 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2619 i = frame_hook_add(argc, argv);
2621 if (i != 0) {
2622 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2623 av_exit(1);
2626 #endif
2628 static void opt_video_codec(const char *arg)
2630 opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg);
2633 static void opt_subtitle_codec(const char *arg)
2635 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
2638 static void opt_map(const char *arg)
2640 AVStreamMap *m;
2641 char *p;
2643 m = &stream_maps[nb_stream_maps++];
2645 m->file_index = strtol(arg, &p, 0);
2646 if (*p)
2647 p++;
2649 m->stream_index = strtol(p, &p, 0);
2650 if (*p) {
2651 p++;
2652 m->sync_file_index = strtol(p, &p, 0);
2653 if (*p)
2654 p++;
2655 m->sync_stream_index = strtol(p, &p, 0);
2656 } else {
2657 m->sync_file_index = m->file_index;
2658 m->sync_stream_index = m->stream_index;
2662 static void opt_map_meta_data(const char *arg)
2664 AVMetaDataMap *m;
2665 char *p;
2667 m = &meta_data_maps[nb_meta_data_maps++];
2669 m->out_file = strtol(arg, &p, 0);
2670 if (*p)
2671 p++;
2673 m->in_file = strtol(p, &p, 0);
2676 static void opt_input_ts_scale(const char *arg)
2678 unsigned int stream;
2679 double scale;
2680 char *p;
2682 stream = strtol(arg, &p, 0);
2683 if (*p)
2684 p++;
2685 scale= strtod(p, &p);
2687 if(stream >= MAX_STREAMS)
2688 av_exit(1);
2690 input_files_ts_scale[nb_input_files][stream]= scale;
2693 static int opt_recording_time(const char *opt, const char *arg)
2695 recording_time = parse_time_or_die(opt, arg, 1);
2696 return 0;
2699 static int opt_start_time(const char *opt, const char *arg)
2701 start_time = parse_time_or_die(opt, arg, 1);
2702 return 0;
2705 static int opt_rec_timestamp(const char *opt, const char *arg)
2707 rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
2708 return 0;
2711 static int opt_input_ts_offset(const char *opt, const char *arg)
2713 input_ts_offset = parse_time_or_die(opt, arg, 1);
2714 return 0;
2717 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
2719 const char *codec_string = encoder ? "encoder" : "decoder";
2720 AVCodec *codec;
2722 if(!name)
2723 return CODEC_ID_NONE;
2724 codec = encoder ?
2725 avcodec_find_encoder_by_name(name) :
2726 avcodec_find_decoder_by_name(name);
2727 if(!codec) {
2728 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2729 av_exit(1);
2731 if(codec->type != type) {
2732 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2733 av_exit(1);
2735 return codec->id;
2738 static void opt_input_file(const char *filename)
2740 AVFormatContext *ic;
2741 AVFormatParameters params, *ap = &params;
2742 int err, i, ret, rfps, rfps_base;
2743 int64_t timestamp;
2745 if (!strcmp(filename, "-"))
2746 filename = "pipe:";
2748 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2749 !strcmp(filename, "/dev/stdin");
2751 /* get default parameters from command line */
2752 ic = av_alloc_format_context();
2754 memset(ap, 0, sizeof(*ap));
2755 ap->prealloced_context = 1;
2756 ap->sample_rate = audio_sample_rate;
2757 ap->channels = audio_channels;
2758 ap->time_base.den = frame_rate.num;
2759 ap->time_base.num = frame_rate.den;
2760 ap->width = frame_width + frame_padleft + frame_padright;
2761 ap->height = frame_height + frame_padtop + frame_padbottom;
2762 ap->pix_fmt = frame_pix_fmt;
2763 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
2764 ap->channel = video_channel;
2765 ap->standard = video_standard;
2766 ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0);
2767 ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0);
2768 if(pgmyuv_compatibility_hack)
2769 ap->video_codec_id= CODEC_ID_PGMYUV;
2771 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
2773 ic->video_codec_id = find_codec_or_die(video_codec_name , CODEC_TYPE_VIDEO , 0);
2774 ic->audio_codec_id = find_codec_or_die(audio_codec_name , CODEC_TYPE_AUDIO , 0);
2775 ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 0);
2777 /* open the input file with generic libav function */
2778 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2779 if (err < 0) {
2780 print_error(filename, err);
2781 av_exit(1);
2783 if(opt_programid) {
2784 int i;
2785 for(i=0; i<ic->nb_programs; i++)
2786 if(ic->programs[i]->id != opt_programid)
2787 ic->programs[i]->discard = AVDISCARD_ALL;
2790 ic->loop_input = loop_input;
2792 /* If not enough info to get the stream parameters, we decode the
2793 first frames to get it. (used in mpeg case for example) */
2794 ret = av_find_stream_info(ic);
2795 if (ret < 0 && verbose >= 0) {
2796 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2797 av_exit(1);
2800 timestamp = start_time;
2801 /* add the stream start time */
2802 if (ic->start_time != AV_NOPTS_VALUE)
2803 timestamp += ic->start_time;
2805 /* if seeking requested, we execute it */
2806 if (start_time != 0) {
2807 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2808 if (ret < 0) {
2809 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2810 filename, (double)timestamp / AV_TIME_BASE);
2812 /* reset seek info */
2813 start_time = 0;
2816 /* update the current parameters so that they match the one of the input stream */
2817 for(i=0;i<ic->nb_streams;i++) {
2818 AVCodecContext *enc = ic->streams[i]->codec;
2819 if(thread_count>1)
2820 avcodec_thread_init(enc, thread_count);
2821 enc->thread_count= thread_count;
2822 switch(enc->codec_type) {
2823 case CODEC_TYPE_AUDIO:
2824 set_context_opts(enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2825 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2826 channel_layout = enc->channel_layout;
2827 audio_channels = enc->channels;
2828 audio_sample_rate = enc->sample_rate;
2829 audio_sample_fmt = enc->sample_fmt;
2830 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(audio_codec_name);
2831 if(audio_disable)
2832 ic->streams[i]->discard= AVDISCARD_ALL;
2833 break;
2834 case CODEC_TYPE_VIDEO:
2835 set_context_opts(enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2836 frame_height = enc->height;
2837 frame_width = enc->width;
2838 if(ic->streams[i]->sample_aspect_ratio.num)
2839 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
2840 else
2841 frame_aspect_ratio=av_q2d(enc->sample_aspect_ratio);
2842 frame_aspect_ratio *= (float) enc->width / enc->height;
2843 frame_pix_fmt = enc->pix_fmt;
2844 rfps = ic->streams[i]->r_frame_rate.num;
2845 rfps_base = ic->streams[i]->r_frame_rate.den;
2846 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2847 if(me_threshold)
2848 enc->debug |= FF_DEBUG_MV;
2850 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2852 if (verbose >= 0)
2853 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2854 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2856 (float)rfps / rfps_base, rfps, rfps_base);
2858 /* update the current frame rate to match the stream frame rate */
2859 frame_rate.num = rfps;
2860 frame_rate.den = rfps_base;
2862 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(video_codec_name);
2863 if(video_disable)
2864 ic->streams[i]->discard= AVDISCARD_ALL;
2865 else if(video_discard)
2866 ic->streams[i]->discard= video_discard;
2867 break;
2868 case CODEC_TYPE_DATA:
2869 break;
2870 case CODEC_TYPE_SUBTITLE:
2871 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(subtitle_codec_name);
2872 if(subtitle_disable)
2873 ic->streams[i]->discard = AVDISCARD_ALL;
2874 break;
2875 case CODEC_TYPE_ATTACHMENT:
2876 case CODEC_TYPE_UNKNOWN:
2877 nb_icodecs++;
2878 break;
2879 default:
2880 abort();
2884 input_files[nb_input_files] = ic;
2885 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2886 /* dump the file content */
2887 if (verbose >= 0)
2888 dump_format(ic, nb_input_files, filename, 0);
2890 nb_input_files++;
2891 file_iformat = NULL;
2892 file_oformat = NULL;
2894 video_channel = 0;
2896 av_freep(&video_codec_name);
2897 av_freep(&audio_codec_name);
2898 av_freep(&subtitle_codec_name);
2901 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
2902 int *has_subtitle_ptr)
2904 int has_video, has_audio, has_subtitle, i, j;
2905 AVFormatContext *ic;
2907 has_video = 0;
2908 has_audio = 0;
2909 has_subtitle = 0;
2910 for(j=0;j<nb_input_files;j++) {
2911 ic = input_files[j];
2912 for(i=0;i<ic->nb_streams;i++) {
2913 AVCodecContext *enc = ic->streams[i]->codec;
2914 switch(enc->codec_type) {
2915 case CODEC_TYPE_AUDIO:
2916 has_audio = 1;
2917 break;
2918 case CODEC_TYPE_VIDEO:
2919 has_video = 1;
2920 break;
2921 case CODEC_TYPE_SUBTITLE:
2922 has_subtitle = 1;
2923 break;
2924 case CODEC_TYPE_DATA:
2925 case CODEC_TYPE_ATTACHMENT:
2926 case CODEC_TYPE_UNKNOWN:
2927 break;
2928 default:
2929 abort();
2933 *has_video_ptr = has_video;
2934 *has_audio_ptr = has_audio;
2935 *has_subtitle_ptr = has_subtitle;
2938 static void new_video_stream(AVFormatContext *oc)
2940 AVStream *st;
2941 AVCodecContext *video_enc;
2942 int codec_id;
2944 st = av_new_stream(oc, oc->nb_streams);
2945 if (!st) {
2946 fprintf(stderr, "Could not alloc stream\n");
2947 av_exit(1);
2949 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
2950 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
2951 video_bitstream_filters= NULL;
2953 if(thread_count>1)
2954 avcodec_thread_init(st->codec, thread_count);
2956 video_enc = st->codec;
2958 if(video_codec_tag)
2959 video_enc->codec_tag= video_codec_tag;
2961 if( (video_global_header&1)
2962 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
2963 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2964 avctx_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
2966 if(video_global_header&2){
2967 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
2968 avctx_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
2971 if (video_stream_copy) {
2972 st->stream_copy = 1;
2973 video_enc->codec_type = CODEC_TYPE_VIDEO;
2974 video_enc->sample_aspect_ratio =
2975 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
2976 } else {
2977 const char *p;
2978 int i;
2979 AVCodec *codec;
2980 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
2982 if (video_codec_name) {
2983 codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
2984 codec = avcodec_find_encoder_by_name(video_codec_name);
2985 output_codecs[nb_ocodecs] = codec;
2986 } else {
2987 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
2988 codec = avcodec_find_encoder(codec_id);
2991 video_enc->codec_id = codec_id;
2993 set_context_opts(video_enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
2995 if (codec && codec->supported_framerates && !force_fps)
2996 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
2997 video_enc->time_base.den = fps.num;
2998 video_enc->time_base.num = fps.den;
3000 video_enc->width = frame_width + frame_padright + frame_padleft;
3001 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3002 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3003 video_enc->pix_fmt = frame_pix_fmt;
3004 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3006 if(codec && codec->pix_fmts){
3007 const enum PixelFormat *p= codec->pix_fmts;
3008 for(; *p!=-1; p++){
3009 if(*p == video_enc->pix_fmt)
3010 break;
3012 if(*p == -1)
3013 video_enc->pix_fmt = codec->pix_fmts[0];
3016 if (intra_only)
3017 video_enc->gop_size = 0;
3018 if (video_qscale || same_quality) {
3019 video_enc->flags |= CODEC_FLAG_QSCALE;
3020 video_enc->global_quality=
3021 st->quality = FF_QP2LAMBDA * video_qscale;
3024 if(intra_matrix)
3025 video_enc->intra_matrix = intra_matrix;
3026 if(inter_matrix)
3027 video_enc->inter_matrix = inter_matrix;
3029 video_enc->thread_count = thread_count;
3030 p= video_rc_override_string;
3031 for(i=0; p; i++){
3032 int start, end, q;
3033 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3034 if(e!=3){
3035 fprintf(stderr, "error parsing rc_override\n");
3036 av_exit(1);
3038 video_enc->rc_override=
3039 av_realloc(video_enc->rc_override,
3040 sizeof(RcOverride)*(i+1));
3041 video_enc->rc_override[i].start_frame= start;
3042 video_enc->rc_override[i].end_frame = end;
3043 if(q>0){
3044 video_enc->rc_override[i].qscale= q;
3045 video_enc->rc_override[i].quality_factor= 1.0;
3047 else{
3048 video_enc->rc_override[i].qscale= 0;
3049 video_enc->rc_override[i].quality_factor= -q/100.0;
3051 p= strchr(p, '/');
3052 if(p) p++;
3054 video_enc->rc_override_count=i;
3055 if (!video_enc->rc_initial_buffer_occupancy)
3056 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3057 video_enc->me_threshold= me_threshold;
3058 video_enc->intra_dc_precision= intra_dc_precision - 8;
3060 if (do_psnr)
3061 video_enc->flags|= CODEC_FLAG_PSNR;
3063 /* two pass mode */
3064 if (do_pass) {
3065 if (do_pass == 1) {
3066 video_enc->flags |= CODEC_FLAG_PASS1;
3067 } else {
3068 video_enc->flags |= CODEC_FLAG_PASS2;
3072 nb_ocodecs++;
3074 /* reset some key parameters */
3075 video_disable = 0;
3076 av_freep(&video_codec_name);
3077 video_stream_copy = 0;
3080 static void new_audio_stream(AVFormatContext *oc)
3082 AVStream *st;
3083 AVCodecContext *audio_enc;
3084 int codec_id;
3086 st = av_new_stream(oc, oc->nb_streams);
3087 if (!st) {
3088 fprintf(stderr, "Could not alloc stream\n");
3089 av_exit(1);
3091 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
3093 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
3094 audio_bitstream_filters= NULL;
3096 if(thread_count>1)
3097 avcodec_thread_init(st->codec, thread_count);
3099 audio_enc = st->codec;
3100 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3102 if(audio_codec_tag)
3103 audio_enc->codec_tag= audio_codec_tag;
3105 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3106 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3107 avctx_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3109 if (audio_stream_copy) {
3110 st->stream_copy = 1;
3111 audio_enc->channels = audio_channels;
3112 } else {
3113 AVCodec *codec;
3115 set_context_opts(audio_enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3117 if (audio_codec_name) {
3118 codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
3119 codec = avcodec_find_encoder_by_name(audio_codec_name);
3120 output_codecs[nb_ocodecs] = codec;
3121 } else {
3122 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3123 codec = avcodec_find_encoder(codec_id);
3125 audio_enc->codec_id = codec_id;
3127 if (audio_qscale > QSCALE_NONE) {
3128 audio_enc->flags |= CODEC_FLAG_QSCALE;
3129 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3131 audio_enc->thread_count = thread_count;
3132 audio_enc->channels = audio_channels;
3133 audio_enc->sample_fmt = audio_sample_fmt;
3134 audio_enc->channel_layout = channel_layout;
3136 if(codec && codec->sample_fmts){
3137 const enum SampleFormat *p= codec->sample_fmts;
3138 for(; *p!=-1; p++){
3139 if(*p == audio_enc->sample_fmt)
3140 break;
3142 if(*p == -1)
3143 audio_enc->sample_fmt = codec->sample_fmts[0];
3146 nb_ocodecs++;
3147 audio_enc->sample_rate = audio_sample_rate;
3148 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3149 if (audio_language) {
3150 av_strlcpy(st->language, audio_language, sizeof(st->language));
3151 av_free(audio_language);
3152 audio_language = NULL;
3155 /* reset some key parameters */
3156 audio_disable = 0;
3157 av_freep(&audio_codec_name);
3158 audio_stream_copy = 0;
3161 static void new_subtitle_stream(AVFormatContext *oc)
3163 AVStream *st;
3164 AVCodecContext *subtitle_enc;
3166 st = av_new_stream(oc, oc->nb_streams);
3167 if (!st) {
3168 fprintf(stderr, "Could not alloc stream\n");
3169 av_exit(1);
3171 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
3173 bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
3174 subtitle_bitstream_filters= NULL;
3176 subtitle_enc = st->codec;
3177 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3178 if (subtitle_stream_copy) {
3179 st->stream_copy = 1;
3180 } else {
3181 set_context_opts(avctx_opts[CODEC_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3182 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1);
3183 output_codecs[nb_ocodecs] = avcodec_find_encoder_by_name(subtitle_codec_name);
3185 nb_ocodecs++;
3187 if (subtitle_language) {
3188 av_strlcpy(st->language, subtitle_language, sizeof(st->language));
3189 av_free(subtitle_language);
3190 subtitle_language = NULL;
3193 subtitle_disable = 0;
3194 av_freep(&subtitle_codec_name);
3195 subtitle_stream_copy = 0;
3198 static void opt_new_audio_stream(void)
3200 AVFormatContext *oc;
3201 if (nb_output_files <= 0) {
3202 fprintf(stderr, "At least one output file must be specified\n");
3203 av_exit(1);
3205 oc = output_files[nb_output_files - 1];
3206 new_audio_stream(oc);
3209 static void opt_new_video_stream(void)
3211 AVFormatContext *oc;
3212 if (nb_output_files <= 0) {
3213 fprintf(stderr, "At least one output file must be specified\n");
3214 av_exit(1);
3216 oc = output_files[nb_output_files - 1];
3217 new_video_stream(oc);
3220 static void opt_new_subtitle_stream(void)
3222 AVFormatContext *oc;
3223 if (nb_output_files <= 0) {
3224 fprintf(stderr, "At least one output file must be specified\n");
3225 av_exit(1);
3227 oc = output_files[nb_output_files - 1];
3228 new_subtitle_stream(oc);
3231 static void opt_output_file(const char *filename)
3233 AVFormatContext *oc;
3234 int use_video, use_audio, use_subtitle;
3235 int input_has_video, input_has_audio, input_has_subtitle;
3236 AVFormatParameters params, *ap = &params;
3238 if (!strcmp(filename, "-"))
3239 filename = "pipe:";
3241 oc = av_alloc_format_context();
3243 if (!file_oformat) {
3244 file_oformat = guess_format(NULL, filename, NULL);
3245 if (!file_oformat) {
3246 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3247 filename);
3248 av_exit(1);
3252 oc->oformat = file_oformat;
3253 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3255 if (!strcmp(file_oformat->name, "ffm") &&
3256 av_strstart(filename, "http:", NULL)) {
3257 /* special case for files sent to ffserver: we get the stream
3258 parameters from ffserver */
3259 int err = read_ffserver_streams(oc, filename);
3260 if (err < 0) {
3261 print_error(filename, err);
3262 av_exit(1);
3264 } else {
3265 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3266 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3267 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3269 /* disable if no corresponding type found and at least one
3270 input file */
3271 if (nb_input_files > 0) {
3272 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3273 &input_has_subtitle);
3274 if (!input_has_video)
3275 use_video = 0;
3276 if (!input_has_audio)
3277 use_audio = 0;
3278 if (!input_has_subtitle)
3279 use_subtitle = 0;
3282 /* manual disable */
3283 if (audio_disable) {
3284 use_audio = 0;
3286 if (video_disable) {
3287 use_video = 0;
3289 if (subtitle_disable) {
3290 use_subtitle = 0;
3293 if (use_video) {
3294 new_video_stream(oc);
3297 if (use_audio) {
3298 new_audio_stream(oc);
3301 if (use_subtitle) {
3302 new_subtitle_stream(oc);
3305 oc->timestamp = rec_timestamp;
3307 if (str_title)
3308 av_strlcpy(oc->title, str_title, sizeof(oc->title));
3309 if (str_author)
3310 av_strlcpy(oc->author, str_author, sizeof(oc->author));
3311 if (str_copyright)
3312 av_strlcpy(oc->copyright, str_copyright, sizeof(oc->copyright));
3313 if (str_comment)
3314 av_strlcpy(oc->comment, str_comment, sizeof(oc->comment));
3315 if (str_album)
3316 av_strlcpy(oc->album, str_album, sizeof(oc->album));
3317 if (str_genre)
3318 av_strlcpy(oc->genre, str_genre, sizeof(oc->genre));
3321 output_files[nb_output_files++] = oc;
3323 /* check filename in case of an image number is expected */
3324 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3325 if (!av_filename_number_test(oc->filename)) {
3326 print_error(oc->filename, AVERROR_NUMEXPECTED);
3327 av_exit(1);
3331 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3332 /* test if it already exists to avoid loosing precious files */
3333 if (!file_overwrite &&
3334 (strchr(filename, ':') == NULL ||
3335 filename[1] == ':' ||
3336 av_strstart(filename, "file:", NULL))) {
3337 if (url_exist(filename)) {
3338 int c;
3340 if (!using_stdin) {
3341 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3342 fflush(stderr);
3343 c = getchar();
3344 if (toupper(c) != 'Y') {
3345 fprintf(stderr, "Not overwriting - exiting\n");
3346 av_exit(1);
3349 else {
3350 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3351 av_exit(1);
3356 /* open the file */
3357 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3358 fprintf(stderr, "Could not open '%s'\n", filename);
3359 av_exit(1);
3363 memset(ap, 0, sizeof(*ap));
3364 if (av_set_parameters(oc, ap) < 0) {
3365 fprintf(stderr, "%s: Invalid encoding parameters\n",
3366 oc->filename);
3367 av_exit(1);
3370 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3371 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3372 oc->loop_output = loop_output;
3374 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
3376 /* reset some options */
3377 file_oformat = NULL;
3378 file_iformat = NULL;
3381 /* same option as mencoder */
3382 static void opt_pass(const char *pass_str)
3384 int pass;
3385 pass = atoi(pass_str);
3386 if (pass != 1 && pass != 2) {
3387 fprintf(stderr, "pass number can be only 1 or 2\n");
3388 av_exit(1);
3390 do_pass = pass;
3393 static int64_t getutime(void)
3395 #ifdef HAVE_GETRUSAGE
3396 struct rusage rusage;
3398 getrusage(RUSAGE_SELF, &rusage);
3399 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3400 #elif defined(HAVE_GETPROCESSTIMES)
3401 HANDLE proc;
3402 FILETIME c, e, k, u;
3403 proc = GetCurrentProcess();
3404 GetProcessTimes(proc, &c, &e, &k, &u);
3405 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3406 #else
3407 return av_gettime();
3408 #endif
3411 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3413 int i;
3414 const char *p = str;
3415 for(i = 0;; i++) {
3416 dest[i] = atoi(p);
3417 if(i == 63)
3418 break;
3419 p = strchr(p, ',');
3420 if(!p) {
3421 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3422 av_exit(1);
3424 p++;
3428 static void opt_inter_matrix(const char *arg)
3430 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3431 parse_matrix_coeffs(inter_matrix, arg);
3434 static void opt_intra_matrix(const char *arg)
3436 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3437 parse_matrix_coeffs(intra_matrix, arg);
3441 * Trivial log callback.
3442 * Only suitable for show_help and similar since it lacks prefix handling.
3444 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
3446 vfprintf(stdout, fmt, vl);
3449 static void show_help(void)
3451 av_log_set_callback(log_callback_help);
3452 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3453 "Hyper fast Audio and Video encoder\n");
3454 printf("\n");
3455 show_help_options(options, "Main options:\n",
3456 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3457 show_help_options(options, "\nAdvanced options:\n",
3458 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3459 OPT_EXPERT);
3460 show_help_options(options, "\nVideo options:\n",
3461 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3462 OPT_VIDEO);
3463 show_help_options(options, "\nAdvanced Video options:\n",
3464 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3465 OPT_VIDEO | OPT_EXPERT);
3466 show_help_options(options, "\nAudio options:\n",
3467 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3468 OPT_AUDIO);
3469 show_help_options(options, "\nAdvanced Audio options:\n",
3470 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3471 OPT_AUDIO | OPT_EXPERT);
3472 show_help_options(options, "\nSubtitle options:\n",
3473 OPT_SUBTITLE | OPT_GRAB,
3474 OPT_SUBTITLE);
3475 show_help_options(options, "\nAudio/Video grab options:\n",
3476 OPT_GRAB,
3477 OPT_GRAB);
3478 printf("\n");
3479 av_opt_show(avctx_opts[0], NULL);
3480 printf("\n");
3481 av_opt_show(avformat_opts, NULL);
3482 printf("\n");
3483 av_opt_show(sws_opts, NULL);
3486 static void opt_target(const char *arg)
3488 int norm = -1;
3489 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3491 if(!strncmp(arg, "pal-", 4)) {
3492 norm = 0;
3493 arg += 4;
3494 } else if(!strncmp(arg, "ntsc-", 5)) {
3495 norm = 1;
3496 arg += 5;
3497 } else if(!strncmp(arg, "film-", 5)) {
3498 norm = 2;
3499 arg += 5;
3500 } else {
3501 int fr;
3502 /* Calculate FR via float to avoid int overflow */
3503 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3504 if(fr == 25000) {
3505 norm = 0;
3506 } else if((fr == 29970) || (fr == 23976)) {
3507 norm = 1;
3508 } else {
3509 /* Try to determine PAL/NTSC by peeking in the input files */
3510 if(nb_input_files) {
3511 int i, j;
3512 for(j = 0; j < nb_input_files; j++) {
3513 for(i = 0; i < input_files[j]->nb_streams; i++) {
3514 AVCodecContext *c = input_files[j]->streams[i]->codec;
3515 if(c->codec_type != CODEC_TYPE_VIDEO)
3516 continue;
3517 fr = c->time_base.den * 1000 / c->time_base.num;
3518 if(fr == 25000) {
3519 norm = 0;
3520 break;
3521 } else if((fr == 29970) || (fr == 23976)) {
3522 norm = 1;
3523 break;
3526 if(norm >= 0)
3527 break;
3531 if(verbose && norm >= 0)
3532 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3535 if(norm < 0) {
3536 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3537 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3538 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3539 av_exit(1);
3542 if(!strcmp(arg, "vcd")) {
3544 opt_video_codec("mpeg1video");
3545 opt_audio_codec("mp2");
3546 opt_format("vcd");
3548 opt_frame_size(norm ? "352x240" : "352x288");
3549 opt_frame_rate(NULL, frame_rates[norm]);
3550 opt_default("gop", norm ? "18" : "15");
3552 opt_default("b", "1150000");
3553 opt_default("maxrate", "1150000");
3554 opt_default("minrate", "1150000");
3555 opt_default("bufsize", "327680"); // 40*1024*8;
3557 opt_default("ab", "224000");
3558 audio_sample_rate = 44100;
3559 audio_channels = 2;
3561 opt_default("packetsize", "2324");
3562 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3564 /* We have to offset the PTS, so that it is consistent with the SCR.
3565 SCR starts at 36000, but the first two packs contain only padding
3566 and the first pack from the other stream, respectively, may also have
3567 been written before.
3568 So the real data starts at SCR 36000+3*1200. */
3569 mux_preload= (36000+3*1200) / 90000.0; //0.44
3570 } else if(!strcmp(arg, "svcd")) {
3572 opt_video_codec("mpeg2video");
3573 opt_audio_codec("mp2");
3574 opt_format("svcd");
3576 opt_frame_size(norm ? "480x480" : "480x576");
3577 opt_frame_rate(NULL, frame_rates[norm]);
3578 opt_default("gop", norm ? "18" : "15");
3580 opt_default("b", "2040000");
3581 opt_default("maxrate", "2516000");
3582 opt_default("minrate", "0"); //1145000;
3583 opt_default("bufsize", "1835008"); //224*1024*8;
3584 opt_default("flags", "+scan_offset");
3587 opt_default("ab", "224000");
3588 audio_sample_rate = 44100;
3590 opt_default("packetsize", "2324");
3592 } else if(!strcmp(arg, "dvd")) {
3594 opt_video_codec("mpeg2video");
3595 opt_audio_codec("ac3");
3596 opt_format("dvd");
3598 opt_frame_size(norm ? "720x480" : "720x576");
3599 opt_frame_rate(NULL, frame_rates[norm]);
3600 opt_default("gop", norm ? "18" : "15");
3602 opt_default("b", "6000000");
3603 opt_default("maxrate", "9000000");
3604 opt_default("minrate", "0"); //1500000;
3605 opt_default("bufsize", "1835008"); //224*1024*8;
3607 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3608 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3610 opt_default("ab", "448000");
3611 audio_sample_rate = 48000;
3613 } else if(!strncmp(arg, "dv", 2)) {
3615 opt_format("dv");
3617 opt_frame_size(norm ? "720x480" : "720x576");
3618 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3619 (norm ? "yuv411p" : "yuv420p"));
3620 opt_frame_rate(NULL, frame_rates[norm]);
3622 audio_sample_rate = 48000;
3623 audio_channels = 2;
3625 } else {
3626 fprintf(stderr, "Unknown target: %s\n", arg);
3627 av_exit(1);
3631 static void opt_vstats_file (const char *arg)
3633 av_free (vstats_filename);
3634 vstats_filename=av_strdup (arg);
3637 static void opt_vstats (void)
3639 char filename[40];
3640 time_t today2 = time(NULL);
3641 struct tm *today = localtime(&today2);
3643 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3644 today->tm_sec);
3645 opt_vstats_file(filename);
3648 static int opt_bsf(const char *opt, const char *arg)
3650 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3651 AVBitStreamFilterContext **bsfp;
3653 if(!bsfc){
3654 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3655 av_exit(1);
3658 bsfp= *opt == 'v' ? &video_bitstream_filters :
3659 *opt == 'a' ? &audio_bitstream_filters :
3660 &subtitle_bitstream_filters;
3661 while(*bsfp)
3662 bsfp= &(*bsfp)->next;
3664 *bsfp= bsfc;
3666 return 0;
3669 static int opt_preset(const char *opt, const char *arg)
3671 FILE *f=NULL;
3672 char filename[1000], tmp[1000], tmp2[1000], line[1000];
3673 int i;
3674 const char *base[3]= { getenv("HOME"),
3675 "/usr/local/share",
3676 "/usr/share",
3679 for(i=!base[0]; i<3 && !f; i++){
3680 snprintf(filename, sizeof(filename), "%s/%sffmpeg/%s.ffpreset", base[i], i ? "" : ".", arg);
3681 f= fopen(filename, "r");
3682 if(!f){
3683 char *codec_name= *opt == 'v' ? video_codec_name :
3684 *opt == 'a' ? audio_codec_name :
3685 subtitle_codec_name;
3686 snprintf(filename, sizeof(filename), "%s/%sffmpeg/%s-%s.ffpreset", base[i], i ? "" : ".", codec_name, arg);
3687 f= fopen(filename, "r");
3690 if(!f && ((arg[0]=='.' && arg[1]=='/') || arg[0]=='/' ||
3691 is_dos_path(arg))){
3692 snprintf(filename, sizeof(filename), arg);
3693 f= fopen(filename, "r");
3696 if(!f){
3697 fprintf(stderr, "File for preset '%s' not found\n", arg);
3698 av_exit(1);
3701 while(!feof(f)){
3702 int e= fscanf(f, "%999[^\n]\n", line) - 1;
3703 if(line[0] == '#' && !e)
3704 continue;
3705 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
3706 if(e){
3707 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
3708 av_exit(1);
3710 if(!strcmp(tmp, "acodec")){
3711 opt_audio_codec(tmp2);
3712 }else if(!strcmp(tmp, "vcodec")){
3713 opt_video_codec(tmp2);
3714 }else if(!strcmp(tmp, "scodec")){
3715 opt_subtitle_codec(tmp2);
3716 }else if(opt_default(tmp, tmp2) < 0){
3717 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
3718 av_exit(1);
3722 fclose(f);
3724 return 0;
3727 static const OptionDef options[] = {
3728 /* main options */
3729 { "L", OPT_EXIT, {(void*)show_license}, "show license" },
3730 { "h", OPT_EXIT, {(void*)show_help}, "show help" },
3731 { "version", OPT_EXIT, {(void*)show_version}, "show version" },
3732 { "formats", OPT_EXIT, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3733 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3734 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3735 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3736 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3737 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3738 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3739 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3740 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3741 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3742 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
3743 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3744 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3745 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3746 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3747 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3748 { "genre", HAS_ARG | OPT_STRING, {(void*)&str_genre}, "set the genre", "string" },
3749 { "album", HAS_ARG | OPT_STRING, {(void*)&str_album}, "set the album", "string" },
3750 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3751 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3752 "add timings for benchmarking" },
3753 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3754 "dump each input packet" },
3755 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3756 "when dumping packets, also dump the payload" },
3757 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3758 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3759 { "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)", "" },
3760 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set the logging verbosity level", "number" },
3761 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3762 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3763 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3764 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3765 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3766 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3767 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)&copy_ts}, "copy timestamps" },
3768 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3769 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3770 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3771 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
3772 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)&copy_initial_nonkeyframes}, "copy initial non-keyframes" },
3774 /* video options */
3775 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3776 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3777 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3778 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3779 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3780 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3781 { "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" },
3782 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3783 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3784 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3785 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3786 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3787 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3788 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3789 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3790 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3791 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3792 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3793 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3794 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3795 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3796 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3797 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
3798 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3799 "use same video quality as source (implies VBR)" },
3800 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3801 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
3802 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3803 "deinterlace pictures" },
3804 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3805 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
3806 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
3807 #ifdef CONFIG_VHOOK
3808 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3809 #endif
3810 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3811 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3812 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3813 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3814 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3815 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3816 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3817 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
3819 /* audio options */
3820 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3821 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3822 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3823 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3824 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3825 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3826 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3827 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3828 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3829 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3830 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3831 { "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" },
3833 /* subtitle options */
3834 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
3835 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3836 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
3837 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3839 /* grab options */
3840 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3841 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3842 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3844 /* muxer options */
3845 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
3846 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
3848 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3849 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3850 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3852 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
3853 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
3854 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
3856 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
3857 { NULL, },
3860 int main(int argc, char **argv)
3862 int i;
3863 int64_t ti;
3865 avcodec_register_all();
3866 avdevice_register_all();
3867 av_register_all();
3869 if(isatty(STDIN_FILENO))
3870 url_set_interrupt_cb(decode_interrupt_cb);
3872 for(i=0; i<CODEC_TYPE_NB; i++){
3873 avctx_opts[i]= avcodec_alloc_context2(i);
3875 avformat_opts = av_alloc_format_context();
3876 sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
3878 show_banner();
3880 /* parse options */
3881 parse_options(argc, argv, options, opt_output_file);
3883 /* file converter / grab */
3884 if (nb_output_files <= 0) {
3885 fprintf(stderr, "At least one output file must be specified\n");
3886 av_exit(1);
3889 if (nb_input_files == 0) {
3890 fprintf(stderr, "At least one input file must be specified\n");
3891 av_exit(1);
3894 ti = getutime();
3895 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3896 stream_maps, nb_stream_maps);
3897 ti = getutime() - ti;
3898 if (do_benchmark) {
3899 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3902 return av_exit(0);