It makes more sense to return 1 here in case of overflow.
[FFMpeg-mirror/DVCPRO-HD.git] / ffmpeg.c
blob37c4a64f530109a4c1b84e45754c406e27de81b0
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 #include "config.h"
23 #include <ctype.h>
24 #include <string.h>
25 #include <math.h>
26 #include <stdlib.h>
27 #include <errno.h>
28 #include <signal.h>
29 #include <limits.h>
30 #include "libavformat/avformat.h"
31 #include "libavdevice/avdevice.h"
32 #include "libswscale/swscale.h"
33 #include "libavformat/framehook.h"
34 #include "libavcodec/opt.h"
35 #include "libavutil/fifo.h"
36 #include "libavutil/avstring.h"
37 #include "libavformat/os_support.h"
39 #ifdef HAVE_SYS_RESOURCE_H
40 #include <sys/types.h>
41 #include <sys/resource.h>
42 #elif defined(HAVE_GETPROCESSTIMES)
43 #include <windows.h>
44 #endif
46 #if defined(HAVE_TERMIOS_H)
47 #include <unistd.h>
48 #include <fcntl.h>
49 #include <sys/ioctl.h>
50 #include <sys/time.h>
51 #include <termios.h>
52 #elif defined(HAVE_CONIO_H)
53 #include <conio.h>
54 #endif
55 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
56 #include <time.h>
58 #include "cmdutils.h"
60 #undef NDEBUG
61 #include <assert.h>
63 #undef exit
65 const char program_name[] = "FFmpeg";
66 const int program_birth_year = 2000;
68 /* select an input stream for an output stream */
69 typedef struct AVStreamMap {
70 int file_index;
71 int stream_index;
72 int sync_file_index;
73 int sync_stream_index;
74 } AVStreamMap;
76 /** select an input file for an output file */
77 typedef struct AVMetaDataMap {
78 int out_file;
79 int in_file;
80 } AVMetaDataMap;
82 static const OptionDef options[];
84 #define MAX_FILES 20
86 static AVFormatContext *input_files[MAX_FILES];
87 static int64_t input_files_ts_offset[MAX_FILES];
88 static int nb_input_files = 0;
90 static AVFormatContext *output_files[MAX_FILES];
91 static int nb_output_files = 0;
93 static AVStreamMap stream_maps[MAX_FILES];
94 static int nb_stream_maps;
96 static AVMetaDataMap meta_data_maps[MAX_FILES];
97 static int nb_meta_data_maps;
99 static AVInputFormat *file_iformat;
100 static AVOutputFormat *file_oformat;
101 static int frame_width = 0;
102 static int frame_height = 0;
103 static float frame_aspect_ratio = 0;
104 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
105 static int frame_padtop = 0;
106 static int frame_padbottom = 0;
107 static int frame_padleft = 0;
108 static int frame_padright = 0;
109 static int padcolor[3] = {16,128,128}; /* default to black */
110 static int frame_topBand = 0;
111 static int frame_bottomBand = 0;
112 static int frame_leftBand = 0;
113 static int frame_rightBand = 0;
114 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
115 static AVRational frame_rate = (AVRational) {0,0};
116 static float video_qscale = 0;
117 static int video_qdiff = 3;
118 static uint16_t *intra_matrix = NULL;
119 static uint16_t *inter_matrix = NULL;
120 #if 0 //experimental, (can be removed)
121 static float video_rc_qsquish=1.0;
122 static float video_rc_qmod_amp=0;
123 static int video_rc_qmod_freq=0;
124 #endif
125 static const char *video_rc_override_string=NULL;
126 static int video_disable = 0;
127 static int video_discard = 0;
128 static char *video_codec_name = NULL;
129 static int video_codec_tag = 0;
130 static int same_quality = 0;
131 static int do_deinterlace = 0;
132 static int strict = 0;
133 static int top_field_first = -1;
134 static int me_threshold = 0;
135 static int intra_dc_precision = 8;
136 static int loop_input = 0;
137 static int loop_output = AVFMT_NOOUTPUTLOOP;
138 static int qp_hist = 0;
140 static int intra_only = 0;
141 static int audio_sample_rate = 44100;
142 #define QSCALE_NONE -99999
143 static float audio_qscale = QSCALE_NONE;
144 static int audio_disable = 0;
145 static int audio_channels = 1;
146 static char *audio_codec_name = NULL;
147 static int audio_codec_tag = 0;
148 static char *audio_language = NULL;
150 static int subtitle_disable = 0;
151 static char *subtitle_codec_name = NULL;
152 static char *subtitle_language = NULL;
154 static float mux_preload= 0.5;
155 static float mux_max_delay= 0.7;
157 static int64_t recording_time = 0;
158 static int64_t start_time = 0;
159 static int64_t rec_timestamp = 0;
160 static int64_t input_ts_offset = 0;
161 static int file_overwrite = 0;
162 static char *str_title = NULL;
163 static char *str_author = NULL;
164 static char *str_copyright = NULL;
165 static char *str_comment = NULL;
166 static char *str_genre = NULL;
167 static char *str_album = NULL;
168 static int do_benchmark = 0;
169 static int do_hex_dump = 0;
170 static int do_pkt_dump = 0;
171 static int do_psnr = 0;
172 static int do_pass = 0;
173 static char *pass_logfilename = NULL;
174 static int audio_stream_copy = 0;
175 static int video_stream_copy = 0;
176 static int subtitle_stream_copy = 0;
177 static int video_sync_method= 1;
178 static int audio_sync_method= 0;
179 static float audio_drift_threshold= 0.1;
180 static int copy_ts= 0;
181 static int opt_shortest = 0; //
182 static int video_global_header = 0;
183 static char *vstats_filename;
184 static FILE *vstats_file;
185 static int opt_programid = 0;
187 static int rate_emu = 0;
189 static int video_channel = 0;
190 static char *video_standard;
192 static int audio_volume = 256;
194 static int using_stdin = 0;
195 static int using_vhook = 0;
196 static int verbose = 1;
197 static int thread_count= 1;
198 static int q_pressed = 0;
199 static int64_t video_size = 0;
200 static int64_t audio_size = 0;
201 static int64_t extra_size = 0;
202 static int nb_frames_dup = 0;
203 static int nb_frames_drop = 0;
204 static int input_sync;
205 static uint64_t limit_filesize = 0; //
207 static int pgmyuv_compatibility_hack=0;
208 static float dts_delta_threshold = 10;
210 static unsigned int sws_flags = SWS_BICUBIC;
212 static const char **opt_names;
213 static int opt_name_count;
214 static AVCodecContext *avctx_opts[CODEC_TYPE_NB];
215 static AVFormatContext *avformat_opts;
216 static struct SwsContext *sws_opts;
217 static int64_t timer_start;
219 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
220 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
221 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
222 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
224 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
226 struct AVInputStream;
228 typedef struct AVOutputStream {
229 int file_index; /* file index */
230 int index; /* stream index in the output file */
231 int source_index; /* AVInputStream index */
232 AVStream *st; /* stream in the output file */
233 int encoding_needed; /* true if encoding needed for this stream */
234 int frame_number;
235 /* input pts and corresponding output pts
236 for A/V sync */
237 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
238 struct AVInputStream *sync_ist; /* input stream to sync against */
239 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
240 /* video only */
241 int video_resample;
242 AVFrame pict_tmp; /* temporary image for resampling */
243 struct SwsContext *img_resample_ctx; /* for image resampling */
244 int resample_height;
246 int video_crop;
247 int topBand; /* cropping area sizes */
248 int leftBand;
250 int video_pad;
251 int padtop; /* padding area sizes */
252 int padbottom;
253 int padleft;
254 int padright;
256 /* audio only */
257 int audio_resample;
258 ReSampleContext *resample; /* for audio resampling */
259 AVFifoBuffer fifo; /* for compression: one audio fifo per codec */
260 FILE *logfile;
261 } AVOutputStream;
263 typedef struct AVInputStream {
264 int file_index;
265 int index;
266 AVStream *st;
267 int discard; /* true if stream data should be discarded */
268 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
269 int64_t sample_index; /* current sample */
271 int64_t start; /* time when read started */
272 unsigned long frame; /* current frame */
273 int64_t next_pts; /* synthetic pts for cases where pkt.pts
274 is not defined */
275 int64_t pts; /* current pts */
276 int is_start; /* is 1 at the start and after a discontinuity */
277 } AVInputStream;
279 typedef struct AVInputFile {
280 int eof_reached; /* true if eof reached */
281 int ist_index; /* index of first stream in ist_table */
282 int buffer_size; /* current total buffer size */
283 int nb_streams; /* nb streams we are aware of */
284 } AVInputFile;
286 #ifdef HAVE_TERMIOS_H
288 /* init terminal so that we can grab keys */
289 static struct termios oldtty;
290 #endif
292 static void term_exit(void)
294 #ifdef HAVE_TERMIOS_H
295 tcsetattr (0, TCSANOW, &oldtty);
296 #endif
299 static volatile sig_atomic_t received_sigterm = 0;
301 static void
302 sigterm_handler(int sig)
304 received_sigterm = sig;
305 term_exit();
308 static void term_init(void)
310 #ifdef HAVE_TERMIOS_H
311 struct termios tty;
313 tcgetattr (0, &tty);
314 oldtty = tty;
316 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
317 |INLCR|IGNCR|ICRNL|IXON);
318 tty.c_oflag |= OPOST;
319 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
320 tty.c_cflag &= ~(CSIZE|PARENB);
321 tty.c_cflag |= CS8;
322 tty.c_cc[VMIN] = 1;
323 tty.c_cc[VTIME] = 0;
325 tcsetattr (0, TCSANOW, &tty);
326 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
327 #endif
329 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
330 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
332 register a function to be called at normal program termination
334 atexit(term_exit);
335 #ifdef CONFIG_BEOS_NETSERVER
336 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
337 #endif
340 /* read a key without blocking */
341 static int read_key(void)
343 #if defined(HAVE_TERMIOS_H)
344 int n = 1;
345 unsigned char ch;
346 #ifndef CONFIG_BEOS_NETSERVER
347 struct timeval tv;
348 fd_set rfds;
350 FD_ZERO(&rfds);
351 FD_SET(0, &rfds);
352 tv.tv_sec = 0;
353 tv.tv_usec = 0;
354 n = select(1, &rfds, NULL, NULL, &tv);
355 #endif
356 if (n > 0) {
357 n = read(0, &ch, 1);
358 if (n == 1)
359 return ch;
361 return n;
363 #elif defined(HAVE_CONIO_H)
364 if(kbhit())
365 return(getch());
366 #endif
367 return -1;
370 static int decode_interrupt_cb(void)
372 return q_pressed || (q_pressed = read_key() == 'q');
375 static int av_exit(int ret)
377 int i;
379 /* close files */
380 for(i=0;i<nb_output_files;i++) {
381 /* maybe av_close_output_file ??? */
382 AVFormatContext *s = output_files[i];
383 int j;
384 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
385 url_fclose(s->pb);
386 for(j=0;j<s->nb_streams;j++) {
387 av_free(s->streams[j]->codec);
388 av_free(s->streams[j]);
390 av_free(s);
392 for(i=0;i<nb_input_files;i++)
393 av_close_input_file(input_files[i]);
395 av_free(intra_matrix);
396 av_free(inter_matrix);
398 if (vstats_file)
399 fclose(vstats_file);
400 av_free(vstats_filename);
402 av_free(opt_names);
404 av_free(video_codec_name);
405 av_free(audio_codec_name);
406 av_free(subtitle_codec_name);
408 av_free(video_standard);
410 #ifdef CONFIG_POWERPC_PERF
411 extern void powerpc_display_perf_report(void);
412 powerpc_display_perf_report();
413 #endif /* CONFIG_POWERPC_PERF */
415 if (received_sigterm) {
416 fprintf(stderr,
417 "Received signal %d: terminating.\n",
418 (int) received_sigterm);
419 exit (255);
422 exit(ret); /* not all OS-es handle main() return value */
423 return ret;
426 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
428 int i, err;
429 AVFormatContext *ic;
430 int nopts = 0;
432 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
433 if (err < 0)
434 return err;
435 /* copy stream format */
436 s->nb_streams = ic->nb_streams;
437 for(i=0;i<ic->nb_streams;i++) {
438 AVStream *st;
440 // FIXME: a more elegant solution is needed
441 st = av_mallocz(sizeof(AVStream));
442 memcpy(st, ic->streams[i], sizeof(AVStream));
443 st->codec = avcodec_alloc_context();
444 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
445 s->streams[i] = st;
447 if (st->codec->codec_type == CODEC_TYPE_AUDIO && audio_stream_copy)
448 st->stream_copy = 1;
449 else if (st->codec->codec_type == CODEC_TYPE_VIDEO && video_stream_copy)
450 st->stream_copy = 1;
452 if(!st->codec->thread_count)
453 st->codec->thread_count = 1;
454 if(st->codec->thread_count>1)
455 avcodec_thread_init(st->codec, st->codec->thread_count);
457 if(st->codec->flags & CODEC_FLAG_BITEXACT)
458 nopts = 1;
461 if (!nopts)
462 s->timestamp = av_gettime();
464 av_close_input_file(ic);
465 return 0;
468 static double
469 get_sync_ipts(const AVOutputStream *ost)
471 const AVInputStream *ist = ost->sync_ist;
472 return (double)(ist->pts - start_time)/AV_TIME_BASE;
475 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
476 int ret;
478 while(bsfc){
479 AVPacket new_pkt= *pkt;
480 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
481 &new_pkt.data, &new_pkt.size,
482 pkt->data, pkt->size,
483 pkt->flags & PKT_FLAG_KEY);
484 if(a>0){
485 av_free_packet(pkt);
486 new_pkt.destruct= av_destruct_packet;
487 } else if(a<0){
488 fprintf(stderr, "%s failed for stream %d, codec %s",
489 bsfc->filter->name, pkt->stream_index,
490 avctx->codec ? avctx->codec->name : "copy");
491 print_error("", a);
493 *pkt= new_pkt;
495 bsfc= bsfc->next;
498 ret= av_interleaved_write_frame(s, pkt);
499 if(ret < 0){
500 print_error("av_interleaved_write_frame()", ret);
501 av_exit(1);
505 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
507 static void do_audio_out(AVFormatContext *s,
508 AVOutputStream *ost,
509 AVInputStream *ist,
510 unsigned char *buf, int size)
512 uint8_t *buftmp;
513 static uint8_t *audio_buf = NULL;
514 static uint8_t *audio_out = NULL;
515 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
517 int size_out, frame_bytes, ret;
518 AVCodecContext *enc= ost->st->codec;
519 AVCodecContext *dec= ist->st->codec;
521 /* SC: dynamic allocation of buffers */
522 if (!audio_buf)
523 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
524 if (!audio_out)
525 audio_out = av_malloc(audio_out_size);
526 if (!audio_buf || !audio_out)
527 return; /* Should signal an error ! */
529 if (enc->channels != dec->channels)
530 ost->audio_resample = 1;
532 if (ost->audio_resample && !ost->resample) {
533 ost->resample = audio_resample_init(enc->channels, dec->channels,
534 enc->sample_rate, dec->sample_rate);
535 if (!ost->resample) {
536 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
537 dec->channels, dec->sample_rate,
538 enc->channels, enc->sample_rate);
539 av_exit(1);
543 if(audio_sync_method){
544 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
545 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2);
546 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
547 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
549 //FIXME resample delay
550 if(fabs(delta) > 50){
551 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
552 if(byte_delta < 0){
553 byte_delta= FFMAX(byte_delta, -size);
554 size += byte_delta;
555 buf -= byte_delta;
556 if(verbose > 2)
557 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
558 if(!size)
559 return;
560 ist->is_start=0;
561 }else{
562 static uint8_t *input_tmp= NULL;
563 input_tmp= av_realloc(input_tmp, byte_delta + size);
565 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
566 ist->is_start=0;
567 else
568 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
570 memset(input_tmp, 0, byte_delta);
571 memcpy(input_tmp + byte_delta, buf, size);
572 buf= input_tmp;
573 size += byte_delta;
574 if(verbose > 2)
575 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
577 }else if(audio_sync_method>1){
578 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
579 assert(ost->audio_resample);
580 if(verbose > 2)
581 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
582 // 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));
583 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
586 }else
587 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
588 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
590 if (ost->audio_resample) {
591 buftmp = audio_buf;
592 size_out = audio_resample(ost->resample,
593 (short *)buftmp, (short *)buf,
594 size / (ist->st->codec->channels * 2));
595 size_out = size_out * enc->channels * 2;
596 } else {
597 buftmp = buf;
598 size_out = size;
601 /* now encode as many frames as possible */
602 if (enc->frame_size > 1) {
603 /* output resampled raw samples */
604 av_fifo_realloc(&ost->fifo, av_fifo_size(&ost->fifo) + size_out);
605 av_fifo_generic_write(&ost->fifo, buftmp, size_out, NULL);
607 frame_bytes = enc->frame_size * 2 * enc->channels;
609 while (av_fifo_size(&ost->fifo) >= frame_bytes) {
610 AVPacket pkt;
611 av_init_packet(&pkt);
613 av_fifo_read(&ost->fifo, audio_buf, frame_bytes);
615 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
617 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
618 (short *)audio_buf);
619 audio_size += ret;
620 pkt.stream_index= ost->index;
621 pkt.data= audio_out;
622 pkt.size= ret;
623 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
624 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
625 pkt.flags |= PKT_FLAG_KEY;
626 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
628 ost->sync_opts += enc->frame_size;
630 } else {
631 AVPacket pkt;
632 av_init_packet(&pkt);
634 ost->sync_opts += size_out / (2 * enc->channels);
636 /* output a pcm frame */
637 /* XXX: change encoding codec API to avoid this ? */
638 switch(enc->codec->id) {
639 case CODEC_ID_PCM_S32LE:
640 case CODEC_ID_PCM_S32BE:
641 case CODEC_ID_PCM_U32LE:
642 case CODEC_ID_PCM_U32BE:
643 size_out = size_out << 1;
644 break;
645 case CODEC_ID_PCM_S24LE:
646 case CODEC_ID_PCM_S24BE:
647 case CODEC_ID_PCM_U24LE:
648 case CODEC_ID_PCM_U24BE:
649 case CODEC_ID_PCM_S24DAUD:
650 size_out = size_out / 2 * 3;
651 break;
652 case CODEC_ID_PCM_S16LE:
653 case CODEC_ID_PCM_S16BE:
654 case CODEC_ID_PCM_U16LE:
655 case CODEC_ID_PCM_U16BE:
656 break;
657 default:
658 size_out = size_out >> 1;
659 break;
661 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
662 ret = avcodec_encode_audio(enc, audio_out, size_out,
663 (short *)buftmp);
664 audio_size += ret;
665 pkt.stream_index= ost->index;
666 pkt.data= audio_out;
667 pkt.size= ret;
668 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
669 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
670 pkt.flags |= PKT_FLAG_KEY;
671 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
675 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
677 AVCodecContext *dec;
678 AVPicture *picture2;
679 AVPicture picture_tmp;
680 uint8_t *buf = 0;
682 dec = ist->st->codec;
684 /* deinterlace : must be done before any resize */
685 if (do_deinterlace || using_vhook) {
686 int size;
688 /* create temporary picture */
689 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
690 buf = av_malloc(size);
691 if (!buf)
692 return;
694 picture2 = &picture_tmp;
695 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
697 if (do_deinterlace){
698 if(avpicture_deinterlace(picture2, picture,
699 dec->pix_fmt, dec->width, dec->height) < 0) {
700 /* if error, do not deinterlace */
701 av_free(buf);
702 buf = NULL;
703 picture2 = picture;
705 } else {
706 av_picture_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
708 } else {
709 picture2 = picture;
712 if (ENABLE_VHOOK)
713 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height,
714 1000000 * ist->pts / AV_TIME_BASE);
716 if (picture != picture2)
717 *picture = *picture2;
718 *bufp = buf;
721 /* we begin to correct av delay at this threshold */
722 #define AV_DELAY_MAX 0.100
724 static void do_subtitle_out(AVFormatContext *s,
725 AVOutputStream *ost,
726 AVInputStream *ist,
727 AVSubtitle *sub,
728 int64_t pts)
730 static uint8_t *subtitle_out = NULL;
731 int subtitle_out_max_size = 65536;
732 int subtitle_out_size, nb, i;
733 AVCodecContext *enc;
734 AVPacket pkt;
736 if (pts == AV_NOPTS_VALUE) {
737 fprintf(stderr, "Subtitle packets must have a pts\n");
738 return;
741 enc = ost->st->codec;
743 if (!subtitle_out) {
744 subtitle_out = av_malloc(subtitle_out_max_size);
747 /* Note: DVB subtitle need one packet to draw them and one other
748 packet to clear them */
749 /* XXX: signal it in the codec context ? */
750 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
751 nb = 2;
752 else
753 nb = 1;
755 for(i = 0; i < nb; i++) {
756 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
757 subtitle_out_max_size, sub);
759 av_init_packet(&pkt);
760 pkt.stream_index = ost->index;
761 pkt.data = subtitle_out;
762 pkt.size = subtitle_out_size;
763 pkt.pts = av_rescale_q(pts, ist->st->time_base, ost->st->time_base);
764 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
765 /* XXX: the pts correction is handled here. Maybe handling
766 it in the codec would be better */
767 if (i == 0)
768 pkt.pts += 90 * sub->start_display_time;
769 else
770 pkt.pts += 90 * sub->end_display_time;
772 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
776 static int bit_buffer_size= 1024*256;
777 static uint8_t *bit_buffer= NULL;
779 static void do_video_out(AVFormatContext *s,
780 AVOutputStream *ost,
781 AVInputStream *ist,
782 AVFrame *in_picture,
783 int *frame_size)
785 int nb_frames, i, ret;
786 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
787 AVFrame picture_crop_temp, picture_pad_temp;
788 AVCodecContext *enc, *dec;
790 avcodec_get_frame_defaults(&picture_crop_temp);
791 avcodec_get_frame_defaults(&picture_pad_temp);
793 enc = ost->st->codec;
794 dec = ist->st->codec;
796 /* by default, we output a single frame */
797 nb_frames = 1;
799 *frame_size = 0;
801 if(video_sync_method){
802 double vdelta;
803 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
804 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
805 if (vdelta < -1.1)
806 nb_frames = 0;
807 else if (video_sync_method == 2)
808 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
809 else if (vdelta > 1.1)
810 nb_frames = lrintf(vdelta);
811 //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);
812 if (nb_frames == 0){
813 ++nb_frames_drop;
814 if (verbose>2)
815 fprintf(stderr, "*** drop!\n");
816 }else if (nb_frames > 1) {
817 nb_frames_dup += nb_frames;
818 if (verbose>2)
819 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
821 }else
822 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
824 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
825 if (nb_frames <= 0)
826 return;
828 if (ost->video_crop) {
829 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
830 av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
831 return;
833 formatted_picture = &picture_crop_temp;
834 } else {
835 formatted_picture = in_picture;
838 final_picture = formatted_picture;
839 padding_src = formatted_picture;
840 resampling_dst = &ost->pict_tmp;
841 if (ost->video_pad) {
842 final_picture = &ost->pict_tmp;
843 if (ost->video_resample) {
844 if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
845 av_log(NULL, AV_LOG_ERROR, "error padding picture\n");
846 return;
848 resampling_dst = &picture_pad_temp;
852 if (ost->video_resample) {
853 padding_src = NULL;
854 final_picture = &ost->pict_tmp;
855 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
856 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
859 if (ost->video_pad) {
860 av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
861 enc->height, enc->width, enc->pix_fmt,
862 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
865 /* duplicates frame if needed */
866 for(i=0;i<nb_frames;i++) {
867 AVPacket pkt;
868 av_init_packet(&pkt);
869 pkt.stream_index= ost->index;
871 if (s->oformat->flags & AVFMT_RAWPICTURE) {
872 /* raw pictures are written as AVPicture structure to
873 avoid any copies. We support temorarily the older
874 method. */
875 AVFrame* old_frame = enc->coded_frame;
876 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
877 pkt.data= (uint8_t *)final_picture;
878 pkt.size= sizeof(AVPicture);
879 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
880 pkt.flags |= PKT_FLAG_KEY;
882 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
883 enc->coded_frame = old_frame;
884 } else {
885 AVFrame big_picture;
887 big_picture= *final_picture;
888 /* better than nothing: use input picture interlaced
889 settings */
890 big_picture.interlaced_frame = in_picture->interlaced_frame;
891 if(avctx_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
892 if(top_field_first == -1)
893 big_picture.top_field_first = in_picture->top_field_first;
894 else
895 big_picture.top_field_first = top_field_first;
898 /* handles sameq here. This is not correct because it may
899 not be a global option */
900 if (same_quality) {
901 big_picture.quality = ist->st->quality;
902 }else
903 big_picture.quality = ost->st->quality;
904 if(!me_threshold)
905 big_picture.pict_type = 0;
906 // big_picture.pts = AV_NOPTS_VALUE;
907 big_picture.pts= ost->sync_opts;
908 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
909 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
910 ret = avcodec_encode_video(enc,
911 bit_buffer, bit_buffer_size,
912 &big_picture);
913 if (ret == -1) {
914 fprintf(stderr, "Video encoding failed\n");
915 av_exit(1);
917 //enc->frame_number = enc->real_pict_num;
918 if(ret>0){
919 pkt.data= bit_buffer;
920 pkt.size= ret;
921 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
922 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
923 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
924 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
925 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
927 if(enc->coded_frame->key_frame)
928 pkt.flags |= PKT_FLAG_KEY;
929 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
930 *frame_size = ret;
931 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
932 // enc->frame_number-1, enc->real_pict_num, ret,
933 // enc->pict_type);
934 /* if two pass, output log */
935 if (ost->logfile && enc->stats_out) {
936 fprintf(ost->logfile, "%s", enc->stats_out);
940 ost->sync_opts++;
941 ost->frame_number++;
945 static double psnr(double d){
946 return -10.0*log(d)/log(10.0);
949 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
950 int frame_size)
952 AVCodecContext *enc;
953 int frame_number;
954 double ti1, bitrate, avg_bitrate;
956 /* this is executed just the first time do_video_stats is called */
957 if (!vstats_file) {
958 vstats_file = fopen(vstats_filename, "w");
959 if (!vstats_file) {
960 perror("fopen");
961 av_exit(1);
965 enc = ost->st->codec;
966 if (enc->codec_type == CODEC_TYPE_VIDEO) {
967 frame_number = ost->frame_number;
968 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
969 if (enc->flags&CODEC_FLAG_PSNR)
970 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
972 fprintf(vstats_file,"f_size= %6d ", frame_size);
973 /* compute pts value */
974 ti1 = ost->sync_opts * av_q2d(enc->time_base);
975 if (ti1 < 0.01)
976 ti1 = 0.01;
978 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
979 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
980 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
981 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
982 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
986 static void print_report(AVFormatContext **output_files,
987 AVOutputStream **ost_table, int nb_ostreams,
988 int is_last_report)
990 char buf[1024];
991 AVOutputStream *ost;
992 AVFormatContext *oc, *os;
993 int64_t total_size;
994 AVCodecContext *enc;
995 int frame_number, vid, i;
996 double bitrate, ti1, pts;
997 static int64_t last_time = -1;
998 static int qp_histogram[52];
1000 if (!is_last_report) {
1001 int64_t cur_time;
1002 /* display the report every 0.5 seconds */
1003 cur_time = av_gettime();
1004 if (last_time == -1) {
1005 last_time = cur_time;
1006 return;
1008 if ((cur_time - last_time) < 500000)
1009 return;
1010 last_time = cur_time;
1014 oc = output_files[0];
1016 total_size = url_fsize(oc->pb);
1017 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1018 total_size= url_ftell(oc->pb);
1020 buf[0] = '\0';
1021 ti1 = 1e10;
1022 vid = 0;
1023 for(i=0;i<nb_ostreams;i++) {
1024 ost = ost_table[i];
1025 os = output_files[ost->file_index];
1026 enc = ost->st->codec;
1027 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1028 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1029 !ost->st->stream_copy ?
1030 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1032 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1033 float t = (av_gettime()-timer_start) / 1000000.0;
1035 frame_number = ost->frame_number;
1036 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1037 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1038 !ost->st->stream_copy ?
1039 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1040 if(is_last_report)
1041 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1042 if(qp_hist){
1043 int j;
1044 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1045 if(qp>=0 && qp<sizeof(qp_histogram)/sizeof(int))
1046 qp_histogram[qp]++;
1047 for(j=0; j<32; j++)
1048 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1050 if (enc->flags&CODEC_FLAG_PSNR){
1051 int j;
1052 double error, error_sum=0;
1053 double scale, scale_sum=0;
1054 char type[3]= {'Y','U','V'};
1055 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1056 for(j=0; j<3; j++){
1057 if(is_last_report){
1058 error= enc->error[j];
1059 scale= enc->width*enc->height*255.0*255.0*frame_number;
1060 }else{
1061 error= enc->coded_frame->error[j];
1062 scale= enc->width*enc->height*255.0*255.0;
1064 if(j) scale/=4;
1065 error_sum += error;
1066 scale_sum += scale;
1067 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1069 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1071 vid = 1;
1073 /* compute min output value */
1074 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1075 if ((pts < ti1) && (pts > 0))
1076 ti1 = pts;
1078 if (ti1 < 0.01)
1079 ti1 = 0.01;
1081 if (verbose || is_last_report) {
1082 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1084 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1085 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1086 (double)total_size / 1024, ti1, bitrate);
1088 if (verbose > 1)
1089 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1090 nb_frames_dup, nb_frames_drop);
1092 if (verbose >= 0)
1093 fprintf(stderr, "%s \r", buf);
1095 fflush(stderr);
1098 if (is_last_report && verbose >= 0){
1099 int64_t raw= audio_size + video_size + extra_size;
1100 fprintf(stderr, "\n");
1101 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1102 video_size/1024.0,
1103 audio_size/1024.0,
1104 extra_size/1024.0,
1105 100.0*(total_size - raw)/raw
1110 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1111 static int output_packet(AVInputStream *ist, int ist_index,
1112 AVOutputStream **ost_table, int nb_ostreams,
1113 const AVPacket *pkt)
1115 AVFormatContext *os;
1116 AVOutputStream *ost;
1117 uint8_t *ptr;
1118 int len, ret, i;
1119 uint8_t *data_buf;
1120 int data_size, got_picture;
1121 AVFrame picture;
1122 void *buffer_to_free;
1123 static unsigned int samples_size= 0;
1124 static short *samples= NULL;
1125 AVSubtitle subtitle, *subtitle_to_free;
1126 int got_subtitle;
1128 if(ist->next_pts == AV_NOPTS_VALUE)
1129 ist->next_pts= ist->pts;
1131 if (pkt == NULL) {
1132 /* EOF handling */
1133 ptr = NULL;
1134 len = 0;
1135 goto handle_eof;
1138 if(pkt->dts != AV_NOPTS_VALUE)
1139 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1141 len = pkt->size;
1142 ptr = pkt->data;
1143 while (len > 0) {
1144 handle_eof:
1145 ist->pts= ist->next_pts;
1147 if(len && len != pkt->size && verbose>0)
1148 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1150 /* decode the packet if needed */
1151 data_buf = NULL; /* fail safe */
1152 data_size = 0;
1153 subtitle_to_free = NULL;
1154 if (ist->decoding_needed) {
1155 switch(ist->st->codec->codec_type) {
1156 case CODEC_TYPE_AUDIO:{
1157 if(pkt)
1158 samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE));
1159 data_size= samples_size;
1160 /* XXX: could avoid copy if PCM 16 bits with same
1161 endianness as CPU */
1162 ret = avcodec_decode_audio2(ist->st->codec, samples, &data_size,
1163 ptr, len);
1164 if (ret < 0)
1165 goto fail_decode;
1166 ptr += ret;
1167 len -= ret;
1168 /* Some bug in mpeg audio decoder gives */
1169 /* data_size < 0, it seems they are overflows */
1170 if (data_size <= 0) {
1171 /* no audio frame */
1172 continue;
1174 data_buf = (uint8_t *)samples;
1175 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1176 (ist->st->codec->sample_rate * ist->st->codec->channels);
1177 break;}
1178 case CODEC_TYPE_VIDEO:
1179 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1180 /* XXX: allocate picture correctly */
1181 avcodec_get_frame_defaults(&picture);
1183 ret = avcodec_decode_video(ist->st->codec,
1184 &picture, &got_picture, ptr, len);
1185 ist->st->quality= picture.quality;
1186 if (ret < 0)
1187 goto fail_decode;
1188 if (!got_picture) {
1189 /* no picture yet */
1190 goto discard_packet;
1192 if (ist->st->codec->time_base.num != 0) {
1193 ist->next_pts += ((int64_t)AV_TIME_BASE *
1194 ist->st->codec->time_base.num) /
1195 ist->st->codec->time_base.den;
1197 len = 0;
1198 break;
1199 case CODEC_TYPE_SUBTITLE:
1200 ret = avcodec_decode_subtitle(ist->st->codec,
1201 &subtitle, &got_subtitle, ptr, len);
1202 if (ret < 0)
1203 goto fail_decode;
1204 if (!got_subtitle) {
1205 goto discard_packet;
1207 subtitle_to_free = &subtitle;
1208 len = 0;
1209 break;
1210 default:
1211 goto fail_decode;
1213 } else {
1214 switch(ist->st->codec->codec_type) {
1215 case CODEC_TYPE_AUDIO:
1216 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1217 ist->st->codec->sample_rate;
1218 break;
1219 case CODEC_TYPE_VIDEO:
1220 if (ist->st->codec->time_base.num != 0) {
1221 ist->next_pts += ((int64_t)AV_TIME_BASE *
1222 ist->st->codec->time_base.num) /
1223 ist->st->codec->time_base.den;
1225 break;
1227 data_buf = ptr;
1228 data_size = len;
1229 ret = len;
1230 len = 0;
1233 buffer_to_free = NULL;
1234 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1235 pre_process_video_frame(ist, (AVPicture *)&picture,
1236 &buffer_to_free);
1239 // preprocess audio (volume)
1240 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1241 if (audio_volume != 256) {
1242 short *volp;
1243 volp = samples;
1244 for(i=0;i<(data_size / sizeof(short));i++) {
1245 int v = ((*volp) * audio_volume + 128) >> 8;
1246 if (v < -32768) v = -32768;
1247 if (v > 32767) v = 32767;
1248 *volp++ = v;
1253 /* frame rate emulation */
1254 if (ist->st->codec->rate_emu) {
1255 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
1256 int64_t now = av_gettime() - ist->start;
1257 if (pts > now)
1258 usleep(pts - now);
1260 ist->frame++;
1263 #if 0
1264 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1265 is the one of the next displayed one */
1266 /* XXX: add mpeg4 too ? */
1267 if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
1268 if (ist->st->codec->pict_type != B_TYPE) {
1269 int64_t tmp;
1270 tmp = ist->last_ip_pts;
1271 ist->last_ip_pts = ist->frac_pts.val;
1272 ist->frac_pts.val = tmp;
1275 #endif
1276 /* if output time reached then transcode raw format,
1277 encode packets and output them */
1278 if (start_time == 0 || ist->pts >= start_time)
1279 for(i=0;i<nb_ostreams;i++) {
1280 int frame_size;
1282 ost = ost_table[i];
1283 if (ost->source_index == ist_index) {
1284 os = output_files[ost->file_index];
1286 #if 0
1287 printf("%d: got pts=%0.3f %0.3f\n", i,
1288 (double)pkt->pts / AV_TIME_BASE,
1289 ((double)ist->pts / AV_TIME_BASE) -
1290 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1291 #endif
1292 /* set the input output pts pairs */
1293 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1295 if (ost->encoding_needed) {
1296 switch(ost->st->codec->codec_type) {
1297 case CODEC_TYPE_AUDIO:
1298 do_audio_out(os, ost, ist, data_buf, data_size);
1299 break;
1300 case CODEC_TYPE_VIDEO:
1301 do_video_out(os, ost, ist, &picture, &frame_size);
1302 video_size += frame_size;
1303 if (vstats_filename && frame_size)
1304 do_video_stats(os, ost, frame_size);
1305 break;
1306 case CODEC_TYPE_SUBTITLE:
1307 do_subtitle_out(os, ost, ist, &subtitle,
1308 pkt->pts);
1309 break;
1310 default:
1311 abort();
1313 } else {
1314 AVFrame avframe; //FIXME/XXX remove this
1315 AVPacket opkt;
1316 av_init_packet(&opkt);
1318 if (!ost->frame_number && !(pkt->flags & PKT_FLAG_KEY))
1319 continue;
1321 /* no reencoding needed : output the packet directly */
1322 /* force the input stream PTS */
1324 avcodec_get_frame_defaults(&avframe);
1325 ost->st->codec->coded_frame= &avframe;
1326 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1328 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1329 audio_size += data_size;
1330 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1331 video_size += data_size;
1332 ost->sync_opts++;
1335 opkt.stream_index= ost->index;
1336 if(pkt->pts != AV_NOPTS_VALUE)
1337 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base);
1338 else
1339 opkt.pts= AV_NOPTS_VALUE;
1341 if (pkt->dts == AV_NOPTS_VALUE)
1342 opkt.dts = av_rescale_q(ist->next_pts, AV_TIME_BASE_Q, ost->st->time_base);
1343 else
1344 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1346 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1347 opkt.flags= pkt->flags;
1349 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1350 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1351 opkt.destruct= av_destruct_packet;
1353 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][opkt.stream_index]);
1354 ost->st->codec->frame_number++;
1355 ost->frame_number++;
1356 av_free_packet(&opkt);
1360 av_free(buffer_to_free);
1361 /* XXX: allocate the subtitles in the codec ? */
1362 if (subtitle_to_free) {
1363 if (subtitle_to_free->rects != NULL) {
1364 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1365 av_free(subtitle_to_free->rects[i].bitmap);
1366 av_free(subtitle_to_free->rects[i].rgba_palette);
1368 av_freep(&subtitle_to_free->rects);
1370 subtitle_to_free->num_rects = 0;
1371 subtitle_to_free = NULL;
1374 discard_packet:
1375 if (pkt == NULL) {
1376 /* EOF handling */
1378 for(i=0;i<nb_ostreams;i++) {
1379 ost = ost_table[i];
1380 if (ost->source_index == ist_index) {
1381 AVCodecContext *enc= ost->st->codec;
1382 os = output_files[ost->file_index];
1384 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1385 continue;
1386 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1387 continue;
1389 if (ost->encoding_needed) {
1390 for(;;) {
1391 AVPacket pkt;
1392 int fifo_bytes;
1393 av_init_packet(&pkt);
1394 pkt.stream_index= ost->index;
1396 switch(ost->st->codec->codec_type) {
1397 case CODEC_TYPE_AUDIO:
1398 fifo_bytes = av_fifo_size(&ost->fifo);
1399 ret = 0;
1400 /* encode any samples remaining in fifo */
1401 if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1402 int fs_tmp = enc->frame_size;
1403 enc->frame_size = fifo_bytes / (2 * enc->channels);
1404 av_fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes);
1405 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1406 enc->frame_size = fs_tmp;
1408 if(ret <= 0) {
1409 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1411 audio_size += ret;
1412 pkt.flags |= PKT_FLAG_KEY;
1413 break;
1414 case CODEC_TYPE_VIDEO:
1415 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1416 video_size += ret;
1417 if(enc->coded_frame && enc->coded_frame->key_frame)
1418 pkt.flags |= PKT_FLAG_KEY;
1419 if (ost->logfile && enc->stats_out) {
1420 fprintf(ost->logfile, "%s", enc->stats_out);
1422 break;
1423 default:
1424 ret=-1;
1427 if(ret<=0)
1428 break;
1429 pkt.data= bit_buffer;
1430 pkt.size= ret;
1431 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1432 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1433 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1440 return 0;
1441 fail_decode:
1442 return -1;
1445 static void print_sdp(AVFormatContext **avc, int n)
1447 char sdp[2048];
1449 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1450 printf("SDP:\n%s\n", sdp);
1453 static int stream_index_from_inputs(AVFormatContext **input_files,
1454 int nb_input_files,
1455 AVInputFile *file_table,
1456 AVInputStream **ist_table,
1457 enum CodecType type,
1458 int programid)
1460 int p, q, z;
1461 for(z=0; z<nb_input_files; z++) {
1462 AVFormatContext *ic = input_files[z];
1463 for(p=0; p<ic->nb_programs; p++) {
1464 AVProgram *program = ic->programs[p];
1465 if(program->id != programid)
1466 continue;
1467 for(q=0; q<program->nb_stream_indexes; q++) {
1468 int sidx = program->stream_index[q];
1469 int ris = file_table[z].ist_index + sidx;
1470 if(ist_table[ris]->discard && ic->streams[sidx]->codec->codec_type == type)
1471 return ris;
1476 return -1;
1480 * The following code is the main loop of the file converter
1482 static int av_encode(AVFormatContext **output_files,
1483 int nb_output_files,
1484 AVFormatContext **input_files,
1485 int nb_input_files,
1486 AVStreamMap *stream_maps, int nb_stream_maps)
1488 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1489 AVFormatContext *is, *os;
1490 AVCodecContext *codec, *icodec;
1491 AVOutputStream *ost, **ost_table = NULL;
1492 AVInputStream *ist, **ist_table = NULL;
1493 AVInputFile *file_table;
1494 int key;
1495 int want_sdp = 1;
1497 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1498 if (!file_table)
1499 goto fail;
1501 /* input stream init */
1502 j = 0;
1503 for(i=0;i<nb_input_files;i++) {
1504 is = input_files[i];
1505 file_table[i].ist_index = j;
1506 file_table[i].nb_streams = is->nb_streams;
1507 j += is->nb_streams;
1509 nb_istreams = j;
1511 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1512 if (!ist_table)
1513 goto fail;
1515 for(i=0;i<nb_istreams;i++) {
1516 ist = av_mallocz(sizeof(AVInputStream));
1517 if (!ist)
1518 goto fail;
1519 ist_table[i] = ist;
1521 j = 0;
1522 for(i=0;i<nb_input_files;i++) {
1523 is = input_files[i];
1524 for(k=0;k<is->nb_streams;k++) {
1525 ist = ist_table[j++];
1526 ist->st = is->streams[k];
1527 ist->file_index = i;
1528 ist->index = k;
1529 ist->discard = 1; /* the stream is discarded by default
1530 (changed later) */
1532 if (ist->st->codec->rate_emu) {
1533 ist->start = av_gettime();
1534 ist->frame = 0;
1539 /* output stream init */
1540 nb_ostreams = 0;
1541 for(i=0;i<nb_output_files;i++) {
1542 os = output_files[i];
1543 if (!os->nb_streams) {
1544 fprintf(stderr, "Output file does not contain any stream\n");
1545 av_exit(1);
1547 nb_ostreams += os->nb_streams;
1549 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1550 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1551 av_exit(1);
1554 /* Sanity check the mapping args -- do the input files & streams exist? */
1555 for(i=0;i<nb_stream_maps;i++) {
1556 int fi = stream_maps[i].file_index;
1557 int si = stream_maps[i].stream_index;
1559 if (fi < 0 || fi > nb_input_files - 1 ||
1560 si < 0 || si > file_table[fi].nb_streams - 1) {
1561 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1562 av_exit(1);
1564 fi = stream_maps[i].sync_file_index;
1565 si = stream_maps[i].sync_stream_index;
1566 if (fi < 0 || fi > nb_input_files - 1 ||
1567 si < 0 || si > file_table[fi].nb_streams - 1) {
1568 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1569 av_exit(1);
1573 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1574 if (!ost_table)
1575 goto fail;
1576 for(i=0;i<nb_ostreams;i++) {
1577 ost = av_mallocz(sizeof(AVOutputStream));
1578 if (!ost)
1579 goto fail;
1580 ost_table[i] = ost;
1583 n = 0;
1584 for(k=0;k<nb_output_files;k++) {
1585 os = output_files[k];
1586 for(i=0;i<os->nb_streams;i++) {
1587 int found;
1588 ost = ost_table[n++];
1589 ost->file_index = k;
1590 ost->index = i;
1591 ost->st = os->streams[i];
1592 if (nb_stream_maps > 0) {
1593 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1594 stream_maps[n-1].stream_index;
1596 /* Sanity check that the stream types match */
1597 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1598 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1599 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1600 ost->file_index, ost->index);
1601 av_exit(1);
1604 } else {
1605 if(opt_programid) {
1606 found = 0;
1607 j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid);
1608 if(j != -1) {
1609 ost->source_index = j;
1610 found = 1;
1612 } else {
1613 /* get corresponding input stream index : we select the first one with the right type */
1614 found = 0;
1615 for(j=0;j<nb_istreams;j++) {
1616 ist = ist_table[j];
1617 if (ist->discard &&
1618 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1619 ost->source_index = j;
1620 found = 1;
1621 break;
1626 if (!found) {
1627 if(! opt_programid) {
1628 /* try again and reuse existing stream */
1629 for(j=0;j<nb_istreams;j++) {
1630 ist = ist_table[j];
1631 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1632 ost->source_index = j;
1633 found = 1;
1637 if (!found) {
1638 int i= ost->file_index;
1639 dump_format(output_files[i], i, output_files[i]->filename, 1);
1640 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1641 ost->file_index, ost->index);
1642 av_exit(1);
1646 ist = ist_table[ost->source_index];
1647 ist->discard = 0;
1648 ost->sync_ist = (nb_stream_maps > 0) ?
1649 ist_table[file_table[stream_maps[n-1].sync_file_index].ist_index +
1650 stream_maps[n-1].sync_stream_index] : ist;
1654 /* for each output stream, we compute the right encoding parameters */
1655 for(i=0;i<nb_ostreams;i++) {
1656 ost = ost_table[i];
1657 os = output_files[ost->file_index];
1658 ist = ist_table[ost->source_index];
1660 codec = ost->st->codec;
1661 icodec = ist->st->codec;
1663 if (!ost->st->language[0])
1664 av_strlcpy(ost->st->language, ist->st->language,
1665 sizeof(ost->st->language));
1667 ost->st->disposition = ist->st->disposition;
1669 if (ost->st->stream_copy) {
1670 /* if stream_copy is selected, no need to decode or encode */
1671 codec->codec_id = icodec->codec_id;
1672 codec->codec_type = icodec->codec_type;
1674 if(!codec->codec_tag){
1675 if( !os->oformat->codec_tag
1676 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) > 0
1677 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1678 codec->codec_tag = icodec->codec_tag;
1681 codec->bit_rate = icodec->bit_rate;
1682 codec->extradata= icodec->extradata;
1683 codec->extradata_size= icodec->extradata_size;
1684 if(av_q2d(icodec->time_base) > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000)
1685 codec->time_base = icodec->time_base;
1686 else
1687 codec->time_base = ist->st->time_base;
1688 switch(codec->codec_type) {
1689 case CODEC_TYPE_AUDIO:
1690 codec->sample_rate = icodec->sample_rate;
1691 codec->channels = icodec->channels;
1692 codec->frame_size = icodec->frame_size;
1693 codec->block_align= icodec->block_align;
1694 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1695 codec->block_align= 0;
1696 if(codec->codec_id == CODEC_ID_AC3)
1697 codec->block_align= 0;
1698 break;
1699 case CODEC_TYPE_VIDEO:
1700 if(using_vhook) {
1701 fprintf(stderr,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");
1702 av_exit(1);
1704 codec->pix_fmt = icodec->pix_fmt;
1705 codec->width = icodec->width;
1706 codec->height = icodec->height;
1707 codec->has_b_frames = icodec->has_b_frames;
1708 break;
1709 case CODEC_TYPE_SUBTITLE:
1710 break;
1711 default:
1712 abort();
1714 } else {
1715 switch(codec->codec_type) {
1716 case CODEC_TYPE_AUDIO:
1717 if (av_fifo_init(&ost->fifo, 1024))
1718 goto fail;
1719 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1720 icodec->request_channels = codec->channels;
1721 ist->decoding_needed = 1;
1722 ost->encoding_needed = 1;
1723 break;
1724 case CODEC_TYPE_VIDEO:
1725 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1726 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1727 ost->video_resample = ((codec->width != icodec->width -
1728 (frame_leftBand + frame_rightBand) +
1729 (frame_padleft + frame_padright)) ||
1730 (codec->height != icodec->height -
1731 (frame_topBand + frame_bottomBand) +
1732 (frame_padtop + frame_padbottom)) ||
1733 (codec->pix_fmt != icodec->pix_fmt));
1734 if (ost->video_crop) {
1735 ost->topBand = frame_topBand;
1736 ost->leftBand = frame_leftBand;
1738 if (ost->video_pad) {
1739 ost->padtop = frame_padtop;
1740 ost->padleft = frame_padleft;
1741 ost->padbottom = frame_padbottom;
1742 ost->padright = frame_padright;
1743 if (!ost->video_resample) {
1744 avcodec_get_frame_defaults(&ost->pict_tmp);
1745 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1746 codec->width, codec->height))
1747 goto fail;
1750 if (ost->video_resample) {
1751 avcodec_get_frame_defaults(&ost->pict_tmp);
1752 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1753 codec->width, codec->height)) {
1754 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1755 av_exit(1);
1757 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1758 ost->img_resample_ctx = sws_getContext(
1759 icodec->width - (frame_leftBand + frame_rightBand),
1760 icodec->height - (frame_topBand + frame_bottomBand),
1761 icodec->pix_fmt,
1762 codec->width - (frame_padleft + frame_padright),
1763 codec->height - (frame_padtop + frame_padbottom),
1764 codec->pix_fmt,
1765 sws_flags, NULL, NULL, NULL);
1766 if (ost->img_resample_ctx == NULL) {
1767 fprintf(stderr, "Cannot get resampling context\n");
1768 av_exit(1);
1770 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1772 ost->encoding_needed = 1;
1773 ist->decoding_needed = 1;
1774 break;
1775 case CODEC_TYPE_SUBTITLE:
1776 ost->encoding_needed = 1;
1777 ist->decoding_needed = 1;
1778 break;
1779 default:
1780 abort();
1781 break;
1783 /* two pass mode */
1784 if (ost->encoding_needed &&
1785 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1786 char logfilename[1024];
1787 FILE *f;
1788 int size;
1789 char *logbuffer;
1791 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1792 pass_logfilename ?
1793 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1794 if (codec->flags & CODEC_FLAG_PASS1) {
1795 f = fopen(logfilename, "w");
1796 if (!f) {
1797 perror(logfilename);
1798 av_exit(1);
1800 ost->logfile = f;
1801 } else {
1802 /* read the log file */
1803 f = fopen(logfilename, "r");
1804 if (!f) {
1805 perror(logfilename);
1806 av_exit(1);
1808 fseek(f, 0, SEEK_END);
1809 size = ftell(f);
1810 fseek(f, 0, SEEK_SET);
1811 logbuffer = av_malloc(size + 1);
1812 if (!logbuffer) {
1813 fprintf(stderr, "Could not allocate log buffer\n");
1814 av_exit(1);
1816 size = fread(logbuffer, 1, size, f);
1817 fclose(f);
1818 logbuffer[size] = '\0';
1819 codec->stats_in = logbuffer;
1823 if(codec->codec_type == CODEC_TYPE_VIDEO){
1824 int size= codec->width * codec->height;
1825 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1829 if (!bit_buffer)
1830 bit_buffer = av_malloc(bit_buffer_size);
1831 if (!bit_buffer)
1832 goto fail;
1834 /* dump the file output parameters - cannot be done before in case
1835 of stream copy */
1836 for(i=0;i<nb_output_files;i++) {
1837 dump_format(output_files[i], i, output_files[i]->filename, 1);
1840 /* dump the stream mapping */
1841 if (verbose >= 0) {
1842 fprintf(stderr, "Stream mapping:\n");
1843 for(i=0;i<nb_ostreams;i++) {
1844 ost = ost_table[i];
1845 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1846 ist_table[ost->source_index]->file_index,
1847 ist_table[ost->source_index]->index,
1848 ost->file_index,
1849 ost->index);
1850 if (ost->sync_ist != ist_table[ost->source_index])
1851 fprintf(stderr, " [sync #%d.%d]",
1852 ost->sync_ist->file_index,
1853 ost->sync_ist->index);
1854 fprintf(stderr, "\n");
1858 /* open each encoder */
1859 for(i=0;i<nb_ostreams;i++) {
1860 ost = ost_table[i];
1861 if (ost->encoding_needed) {
1862 AVCodec *codec;
1863 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1864 if (!codec) {
1865 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1866 ost->file_index, ost->index);
1867 av_exit(1);
1869 if (avcodec_open(ost->st->codec, codec) < 0) {
1870 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1871 ost->file_index, ost->index);
1872 av_exit(1);
1874 extra_size += ost->st->codec->extradata_size;
1878 /* open each decoder */
1879 for(i=0;i<nb_istreams;i++) {
1880 ist = ist_table[i];
1881 if (ist->decoding_needed) {
1882 AVCodec *codec;
1883 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1884 if (!codec) {
1885 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1886 ist->st->codec->codec_id, ist->file_index, ist->index);
1887 av_exit(1);
1889 if (avcodec_open(ist->st->codec, codec) < 0) {
1890 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1891 ist->file_index, ist->index);
1892 av_exit(1);
1894 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1895 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1899 /* init pts */
1900 for(i=0;i<nb_istreams;i++) {
1901 ist = ist_table[i];
1902 is = input_files[ist->file_index];
1903 ist->pts = 0;
1904 ist->next_pts = AV_NOPTS_VALUE;
1905 ist->is_start = 1;
1908 /* set meta data information from input file if required */
1909 for (i=0;i<nb_meta_data_maps;i++) {
1910 AVFormatContext *out_file;
1911 AVFormatContext *in_file;
1913 int out_file_index = meta_data_maps[i].out_file;
1914 int in_file_index = meta_data_maps[i].in_file;
1915 if (out_file_index < 0 || out_file_index >= nb_output_files) {
1916 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1917 ret = AVERROR(EINVAL);
1918 goto fail;
1920 if (in_file_index < 0 || in_file_index >= nb_input_files) {
1921 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1922 ret = AVERROR(EINVAL);
1923 goto fail;
1926 out_file = output_files[out_file_index];
1927 in_file = input_files[in_file_index];
1929 strcpy(out_file->title, in_file->title);
1930 strcpy(out_file->author, in_file->author);
1931 strcpy(out_file->copyright, in_file->copyright);
1932 strcpy(out_file->comment, in_file->comment);
1933 strcpy(out_file->album, in_file->album);
1934 out_file->year = in_file->year;
1935 out_file->track = in_file->track;
1936 strcpy(out_file->genre, in_file->genre);
1939 /* open files and write file headers */
1940 for(i=0;i<nb_output_files;i++) {
1941 os = output_files[i];
1942 if (av_write_header(os) < 0) {
1943 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1944 ret = AVERROR(EINVAL);
1945 goto fail;
1947 if (strcmp(output_files[i]->oformat->name, "rtp")) {
1948 want_sdp = 0;
1951 if (want_sdp) {
1952 print_sdp(output_files, nb_output_files);
1955 if (!using_stdin && verbose >= 0) {
1956 fprintf(stderr, "Press [q] to stop encoding\n");
1957 url_set_interrupt_cb(decode_interrupt_cb);
1959 term_init();
1961 key = -1;
1962 timer_start = av_gettime();
1964 for(; received_sigterm == 0;) {
1965 int file_index, ist_index;
1966 AVPacket pkt;
1967 double ipts_min;
1968 double opts_min;
1970 redo:
1971 ipts_min= 1e100;
1972 opts_min= 1e100;
1973 /* if 'q' pressed, exits */
1974 if (!using_stdin) {
1975 if (q_pressed)
1976 break;
1977 /* read_key() returns 0 on EOF */
1978 key = read_key();
1979 if (key == 'q')
1980 break;
1983 /* select the stream that we must read now by looking at the
1984 smallest output pts */
1985 file_index = -1;
1986 for(i=0;i<nb_ostreams;i++) {
1987 double ipts, opts;
1988 ost = ost_table[i];
1989 os = output_files[ost->file_index];
1990 ist = ist_table[ost->source_index];
1991 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
1992 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
1993 else
1994 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
1995 ipts = (double)ist->pts;
1996 if (!file_table[ist->file_index].eof_reached){
1997 if(ipts < ipts_min) {
1998 ipts_min = ipts;
1999 if(input_sync ) file_index = ist->file_index;
2001 if(opts < opts_min) {
2002 opts_min = opts;
2003 if(!input_sync) file_index = ist->file_index;
2006 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2007 file_index= -1;
2008 break;
2011 /* if none, if is finished */
2012 if (file_index < 0) {
2013 break;
2016 /* finish if recording time exhausted */
2017 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
2018 break;
2020 /* finish if limit size exhausted */
2021 if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
2022 break;
2024 /* read a frame from it and output it in the fifo */
2025 is = input_files[file_index];
2026 if (av_read_frame(is, &pkt) < 0) {
2027 file_table[file_index].eof_reached = 1;
2028 if (opt_shortest)
2029 break;
2030 else
2031 continue;
2034 if (do_pkt_dump) {
2035 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2037 /* the following test is needed in case new streams appear
2038 dynamically in stream : we ignore them */
2039 if (pkt.stream_index >= file_table[file_index].nb_streams)
2040 goto discard_packet;
2041 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2042 ist = ist_table[ist_index];
2043 if (ist->discard)
2044 goto discard_packet;
2046 if (pkt.dts != AV_NOPTS_VALUE)
2047 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2048 if (pkt.pts != AV_NOPTS_VALUE)
2049 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2051 // 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);
2052 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
2053 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2054 int64_t delta= pkt_dts - ist->next_pts;
2055 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2056 input_files_ts_offset[ist->file_index]-= delta;
2057 if (verbose > 2)
2058 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2059 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2060 if(pkt.pts != AV_NOPTS_VALUE)
2061 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2065 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2066 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2068 if (verbose >= 0)
2069 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2070 ist->file_index, ist->index);
2072 av_free_packet(&pkt);
2073 goto redo;
2076 discard_packet:
2077 av_free_packet(&pkt);
2079 /* dump report by using the output first video and audio streams */
2080 print_report(output_files, ost_table, nb_ostreams, 0);
2083 /* at the end of stream, we must flush the decoder buffers */
2084 for(i=0;i<nb_istreams;i++) {
2085 ist = ist_table[i];
2086 if (ist->decoding_needed) {
2087 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2091 term_exit();
2093 /* write the trailer if needed and close file */
2094 for(i=0;i<nb_output_files;i++) {
2095 os = output_files[i];
2096 av_write_trailer(os);
2099 /* dump report by using the first video and audio streams */
2100 print_report(output_files, ost_table, nb_ostreams, 1);
2102 /* close each encoder */
2103 for(i=0;i<nb_ostreams;i++) {
2104 ost = ost_table[i];
2105 if (ost->encoding_needed) {
2106 av_freep(&ost->st->codec->stats_in);
2107 avcodec_close(ost->st->codec);
2111 /* close each decoder */
2112 for(i=0;i<nb_istreams;i++) {
2113 ist = ist_table[i];
2114 if (ist->decoding_needed) {
2115 avcodec_close(ist->st->codec);
2119 /* finished ! */
2121 ret = 0;
2122 fail1:
2123 av_freep(&bit_buffer);
2124 av_free(file_table);
2126 if (ist_table) {
2127 for(i=0;i<nb_istreams;i++) {
2128 ist = ist_table[i];
2129 av_free(ist);
2131 av_free(ist_table);
2133 if (ost_table) {
2134 for(i=0;i<nb_ostreams;i++) {
2135 ost = ost_table[i];
2136 if (ost) {
2137 if (ost->logfile) {
2138 fclose(ost->logfile);
2139 ost->logfile = NULL;
2141 av_fifo_free(&ost->fifo); /* works even if fifo is not
2142 initialized but set to zero */
2143 av_free(ost->pict_tmp.data[0]);
2144 if (ost->video_resample)
2145 sws_freeContext(ost->img_resample_ctx);
2146 if (ost->resample)
2147 audio_resample_close(ost->resample);
2148 av_free(ost);
2151 av_free(ost_table);
2153 return ret;
2154 fail:
2155 ret = AVERROR(ENOMEM);
2156 goto fail1;
2159 #if 0
2160 int file_read(const char *filename)
2162 URLContext *h;
2163 unsigned char buffer[1024];
2164 int len, i;
2166 if (url_open(&h, filename, O_RDONLY) < 0) {
2167 printf("could not open '%s'\n", filename);
2168 return -1;
2170 for(;;) {
2171 len = url_read(h, buffer, sizeof(buffer));
2172 if (len <= 0)
2173 break;
2174 for(i=0;i<len;i++) putchar(buffer[i]);
2176 url_close(h);
2177 return 0;
2179 #endif
2181 static void opt_format(const char *arg)
2183 /* compatibility stuff for pgmyuv */
2184 if (!strcmp(arg, "pgmyuv")) {
2185 pgmyuv_compatibility_hack=1;
2186 // opt_image_format(arg);
2187 arg = "image2";
2188 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2191 file_iformat = av_find_input_format(arg);
2192 file_oformat = guess_format(arg, NULL, NULL);
2193 if (!file_iformat && !file_oformat) {
2194 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2195 av_exit(1);
2199 static int opt_default(const char *opt, const char *arg){
2200 int type;
2201 const AVOption *o= NULL;
2202 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
2204 for(type=0; type<CODEC_TYPE_NB; type++){
2205 const AVOption *o2 = av_find_opt(avctx_opts[0], opt, NULL, opt_types[type], opt_types[type]);
2206 if(o2)
2207 o = av_set_string(avctx_opts[type], opt, arg);
2209 if(!o)
2210 o = av_set_string(avformat_opts, opt, arg);
2211 if(!o)
2212 o = av_set_string(sws_opts, opt, arg);
2213 if(!o){
2214 if(opt[0] == 'a')
2215 o = av_set_string(avctx_opts[CODEC_TYPE_AUDIO], opt+1, arg);
2216 else if(opt[0] == 'v')
2217 o = av_set_string(avctx_opts[CODEC_TYPE_VIDEO], opt+1, arg);
2218 else if(opt[0] == 's')
2219 o = av_set_string(avctx_opts[CODEC_TYPE_SUBTITLE], opt+1, arg);
2221 if(!o)
2222 return -1;
2224 // av_log(NULL, AV_LOG_ERROR, "%s:%s: %f 0x%0X\n", opt, arg, av_get_double(avctx_opts, opt, NULL), (int)av_get_int(avctx_opts, opt, NULL));
2226 //FIXME we should always use avctx_opts, ... for storing options so there wont be any need to keep track of whats set over this
2227 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
2228 opt_names[opt_name_count++]= o->name;
2230 if(avctx_opts[0]->debug || avformat_opts->debug)
2231 av_log_set_level(AV_LOG_DEBUG);
2232 return 0;
2235 static void opt_video_rc_override_string(const char *arg)
2237 video_rc_override_string = arg;
2240 static int opt_me_threshold(const char *opt, const char *arg)
2242 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2243 return 0;
2246 static int opt_verbose(const char *opt, const char *arg)
2248 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2249 av_log_set_level(verbose);
2250 return 0;
2253 static void opt_frame_rate(const char *arg)
2255 if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2256 fprintf(stderr, "Incorrect frame rate\n");
2257 av_exit(1);
2261 static int opt_bitrate(const char *opt, const char *arg)
2263 int codec_type = opt[0]=='a' ? CODEC_TYPE_AUDIO : CODEC_TYPE_VIDEO;
2265 opt_default(opt, arg);
2267 if (av_get_int(avctx_opts[codec_type], "b", NULL) < 1000)
2268 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2270 return 0;
2273 static void opt_frame_crop_top(const char *arg)
2275 frame_topBand = atoi(arg);
2276 if (frame_topBand < 0) {
2277 fprintf(stderr, "Incorrect top crop size\n");
2278 av_exit(1);
2280 if ((frame_topBand % 2) != 0) {
2281 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2282 av_exit(1);
2284 if ((frame_topBand) >= frame_height){
2285 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2286 av_exit(1);
2288 frame_height -= frame_topBand;
2291 static void opt_frame_crop_bottom(const char *arg)
2293 frame_bottomBand = atoi(arg);
2294 if (frame_bottomBand < 0) {
2295 fprintf(stderr, "Incorrect bottom crop size\n");
2296 av_exit(1);
2298 if ((frame_bottomBand % 2) != 0) {
2299 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2300 av_exit(1);
2302 if ((frame_bottomBand) >= frame_height){
2303 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2304 av_exit(1);
2306 frame_height -= frame_bottomBand;
2309 static void opt_frame_crop_left(const char *arg)
2311 frame_leftBand = atoi(arg);
2312 if (frame_leftBand < 0) {
2313 fprintf(stderr, "Incorrect left crop size\n");
2314 av_exit(1);
2316 if ((frame_leftBand % 2) != 0) {
2317 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2318 av_exit(1);
2320 if ((frame_leftBand) >= frame_width){
2321 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2322 av_exit(1);
2324 frame_width -= frame_leftBand;
2327 static void opt_frame_crop_right(const char *arg)
2329 frame_rightBand = atoi(arg);
2330 if (frame_rightBand < 0) {
2331 fprintf(stderr, "Incorrect right crop size\n");
2332 av_exit(1);
2334 if ((frame_rightBand % 2) != 0) {
2335 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2336 av_exit(1);
2338 if ((frame_rightBand) >= frame_width){
2339 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2340 av_exit(1);
2342 frame_width -= frame_rightBand;
2345 static void opt_frame_size(const char *arg)
2347 if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
2348 fprintf(stderr, "Incorrect frame size\n");
2349 av_exit(1);
2351 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2352 fprintf(stderr, "Frame size must be a multiple of 2\n");
2353 av_exit(1);
2358 #define SCALEBITS 10
2359 #define ONE_HALF (1 << (SCALEBITS - 1))
2360 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2362 #define RGB_TO_Y(r, g, b) \
2363 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2364 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2366 #define RGB_TO_U(r1, g1, b1, shift)\
2367 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2368 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2370 #define RGB_TO_V(r1, g1, b1, shift)\
2371 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2372 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2374 static void opt_pad_color(const char *arg) {
2375 /* Input is expected to be six hex digits similar to
2376 how colors are expressed in html tags (but without the #) */
2377 int rgb = strtol(arg, NULL, 16);
2378 int r,g,b;
2380 r = (rgb >> 16);
2381 g = ((rgb >> 8) & 255);
2382 b = (rgb & 255);
2384 padcolor[0] = RGB_TO_Y(r,g,b);
2385 padcolor[1] = RGB_TO_U(r,g,b,0);
2386 padcolor[2] = RGB_TO_V(r,g,b,0);
2389 static void opt_frame_pad_top(const char *arg)
2391 frame_padtop = atoi(arg);
2392 if (frame_padtop < 0) {
2393 fprintf(stderr, "Incorrect top pad size\n");
2394 av_exit(1);
2396 if ((frame_padtop % 2) != 0) {
2397 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2398 av_exit(1);
2402 static void opt_frame_pad_bottom(const char *arg)
2404 frame_padbottom = atoi(arg);
2405 if (frame_padbottom < 0) {
2406 fprintf(stderr, "Incorrect bottom pad size\n");
2407 av_exit(1);
2409 if ((frame_padbottom % 2) != 0) {
2410 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2411 av_exit(1);
2416 static void opt_frame_pad_left(const char *arg)
2418 frame_padleft = atoi(arg);
2419 if (frame_padleft < 0) {
2420 fprintf(stderr, "Incorrect left pad size\n");
2421 av_exit(1);
2423 if ((frame_padleft % 2) != 0) {
2424 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2425 av_exit(1);
2430 static void opt_frame_pad_right(const char *arg)
2432 frame_padright = atoi(arg);
2433 if (frame_padright < 0) {
2434 fprintf(stderr, "Incorrect right pad size\n");
2435 av_exit(1);
2437 if ((frame_padright % 2) != 0) {
2438 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2439 av_exit(1);
2443 static void list_pix_fmts(void)
2445 int i;
2446 char pix_fmt_str[128];
2447 for (i=-1; i < PIX_FMT_NB; i++) {
2448 avcodec_pix_fmt_string (pix_fmt_str, sizeof(pix_fmt_str), i);
2449 fprintf(stdout, "%s\n", pix_fmt_str);
2453 static void opt_frame_pix_fmt(const char *arg)
2455 if (strcmp(arg, "list"))
2456 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2457 else {
2458 list_pix_fmts();
2459 av_exit(0);
2463 static void opt_frame_aspect_ratio(const char *arg)
2465 int x = 0, y = 0;
2466 double ar = 0;
2467 const char *p;
2468 char *end;
2470 p = strchr(arg, ':');
2471 if (p) {
2472 x = strtol(arg, &end, 10);
2473 if (end == p)
2474 y = strtol(end+1, &end, 10);
2475 if (x > 0 && y > 0)
2476 ar = (double)x / (double)y;
2477 } else
2478 ar = strtod(arg, NULL);
2480 if (!ar) {
2481 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2482 av_exit(1);
2484 frame_aspect_ratio = ar;
2487 static void opt_qscale(const char *arg)
2489 video_qscale = atof(arg);
2490 if (video_qscale <= 0 ||
2491 video_qscale > 255) {
2492 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2493 av_exit(1);
2497 static void opt_qdiff(const char *arg)
2499 video_qdiff = atoi(arg);
2500 if (video_qdiff < 0 ||
2501 video_qdiff > 31) {
2502 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2503 av_exit(1);
2507 static void opt_strict(const char *arg)
2509 strict= atoi(arg);
2512 static void opt_top_field_first(const char *arg)
2514 top_field_first= atoi(arg);
2517 static int opt_thread_count(const char *opt, const char *arg)
2519 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2520 #if !defined(HAVE_THREADS)
2521 if (verbose >= 0)
2522 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2523 #endif
2524 return 0;
2527 static int opt_audio_rate(const char *opt, const char *arg)
2529 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2530 return 0;
2533 static int opt_audio_channels(const char *opt, const char *arg)
2535 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2536 return 0;
2539 static void opt_video_channel(const char *arg)
2541 video_channel = strtol(arg, NULL, 0);
2544 static void opt_video_standard(const char *arg)
2546 video_standard = av_strdup(arg);
2549 static void opt_codec(int *pstream_copy, char **pcodec_name,
2550 int codec_type, const char *arg)
2552 av_freep(pcodec_name);
2553 if (!strcmp(arg, "copy")) {
2554 *pstream_copy = 1;
2555 } else {
2556 *pcodec_name = av_strdup(arg);
2560 static void opt_audio_codec(const char *arg)
2562 opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg);
2565 static void opt_audio_tag(const char *arg)
2567 char *tail;
2568 audio_codec_tag= strtol(arg, &tail, 0);
2570 if(!tail || *tail)
2571 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2574 static void opt_video_tag(const char *arg)
2576 char *tail;
2577 video_codec_tag= strtol(arg, &tail, 0);
2579 if(!tail || *tail)
2580 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2583 #ifdef CONFIG_VHOOK
2584 static void add_frame_hooker(const char *arg)
2586 int argc = 0;
2587 char *argv[64];
2588 int i;
2589 char *args = av_strdup(arg);
2591 using_vhook = 1;
2593 argv[0] = strtok(args, " ");
2594 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2597 i = frame_hook_add(argc, argv);
2599 if (i != 0) {
2600 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2601 av_exit(1);
2604 #endif
2606 static void opt_video_codec(const char *arg)
2608 opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg);
2611 static void opt_subtitle_codec(const char *arg)
2613 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
2616 static void opt_map(const char *arg)
2618 AVStreamMap *m;
2619 char *p;
2621 m = &stream_maps[nb_stream_maps++];
2623 m->file_index = strtol(arg, &p, 0);
2624 if (*p)
2625 p++;
2627 m->stream_index = strtol(p, &p, 0);
2628 if (*p) {
2629 p++;
2630 m->sync_file_index = strtol(p, &p, 0);
2631 if (*p)
2632 p++;
2633 m->sync_stream_index = strtol(p, &p, 0);
2634 } else {
2635 m->sync_file_index = m->file_index;
2636 m->sync_stream_index = m->stream_index;
2640 static void opt_map_meta_data(const char *arg)
2642 AVMetaDataMap *m;
2643 char *p;
2645 m = &meta_data_maps[nb_meta_data_maps++];
2647 m->out_file = strtol(arg, &p, 0);
2648 if (*p)
2649 p++;
2651 m->in_file = strtol(p, &p, 0);
2654 static int opt_recording_time(const char *opt, const char *arg)
2656 recording_time = parse_time_or_die(opt, arg, 1);
2657 return 0;
2660 static int opt_start_time(const char *opt, const char *arg)
2662 start_time = parse_time_or_die(opt, arg, 1);
2663 return 0;
2666 static int opt_rec_timestamp(const char *opt, const char *arg)
2668 rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
2669 return 0;
2672 static int opt_input_ts_offset(const char *opt, const char *arg)
2674 input_ts_offset = parse_time_or_die(opt, arg, 1);
2675 return 0;
2678 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
2680 const char *codec_string = encoder ? "encoder" : "decoder";
2681 AVCodec *codec;
2683 if(!name)
2684 return CODEC_ID_NONE;
2685 codec = encoder ?
2686 avcodec_find_encoder_by_name(name) :
2687 avcodec_find_decoder_by_name(name);
2688 if(!codec) {
2689 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2690 av_exit(1);
2692 if(codec->type != type) {
2693 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2694 av_exit(1);
2696 return codec->id;
2699 static void set_context_opts(void *ctx, void *opts_ctx, int flags)
2701 int i;
2702 for(i=0; i<opt_name_count; i++){
2703 char buf[256];
2704 const AVOption *opt;
2705 const char *str= av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
2706 /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
2707 if(str && ((opt->flags & flags) == flags))
2708 av_set_string(ctx, opt_names[i], str);
2712 static void opt_input_file(const char *filename)
2714 AVFormatContext *ic;
2715 AVFormatParameters params, *ap = &params;
2716 int err, i, ret, rfps, rfps_base;
2717 int64_t timestamp;
2719 if (!strcmp(filename, "-"))
2720 filename = "pipe:";
2722 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2723 !strcmp(filename, "/dev/stdin");
2725 /* get default parameters from command line */
2726 ic = av_alloc_format_context();
2728 memset(ap, 0, sizeof(*ap));
2729 ap->prealloced_context = 1;
2730 ap->sample_rate = audio_sample_rate;
2731 ap->channels = audio_channels;
2732 ap->time_base.den = frame_rate.num;
2733 ap->time_base.num = frame_rate.den;
2734 ap->width = frame_width + frame_padleft + frame_padright;
2735 ap->height = frame_height + frame_padtop + frame_padbottom;
2736 ap->pix_fmt = frame_pix_fmt;
2737 ap->channel = video_channel;
2738 ap->standard = video_standard;
2739 ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0);
2740 ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0);
2741 if(pgmyuv_compatibility_hack)
2742 ap->video_codec_id= CODEC_ID_PGMYUV;
2744 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
2746 ic->video_codec_id = find_codec_or_die(video_codec_name , CODEC_TYPE_VIDEO , 0);
2747 ic->audio_codec_id = find_codec_or_die(audio_codec_name , CODEC_TYPE_AUDIO , 0);
2748 ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 0);
2750 /* open the input file with generic libav function */
2751 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2752 if (err < 0) {
2753 print_error(filename, err);
2754 av_exit(1);
2756 if(opt_programid) {
2757 int i;
2758 for(i=0; i<ic->nb_programs; i++)
2759 if(ic->programs[i]->id != opt_programid)
2760 ic->programs[i]->discard = AVDISCARD_ALL;
2763 ic->loop_input = loop_input;
2765 /* If not enough info to get the stream parameters, we decode the
2766 first frames to get it. (used in mpeg case for example) */
2767 ret = av_find_stream_info(ic);
2768 if (ret < 0 && verbose >= 0) {
2769 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2770 av_exit(1);
2773 timestamp = start_time;
2774 /* add the stream start time */
2775 if (ic->start_time != AV_NOPTS_VALUE)
2776 timestamp += ic->start_time;
2778 /* if seeking requested, we execute it */
2779 if (start_time != 0) {
2780 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2781 if (ret < 0) {
2782 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2783 filename, (double)timestamp / AV_TIME_BASE);
2785 /* reset seek info */
2786 start_time = 0;
2789 /* update the current parameters so that they match the one of the input stream */
2790 for(i=0;i<ic->nb_streams;i++) {
2791 AVCodecContext *enc = ic->streams[i]->codec;
2792 if(thread_count>1)
2793 avcodec_thread_init(enc, thread_count);
2794 enc->thread_count= thread_count;
2795 switch(enc->codec_type) {
2796 case CODEC_TYPE_AUDIO:
2797 set_context_opts(enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2798 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2799 audio_channels = enc->channels;
2800 audio_sample_rate = enc->sample_rate;
2801 if(audio_disable)
2802 ic->streams[i]->discard= AVDISCARD_ALL;
2803 break;
2804 case CODEC_TYPE_VIDEO:
2805 set_context_opts(enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2806 frame_height = enc->height;
2807 frame_width = enc->width;
2808 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2809 frame_pix_fmt = enc->pix_fmt;
2810 rfps = ic->streams[i]->r_frame_rate.num;
2811 rfps_base = ic->streams[i]->r_frame_rate.den;
2812 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2813 if(me_threshold)
2814 enc->debug |= FF_DEBUG_MV;
2816 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2818 if (verbose >= 0)
2819 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2820 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2822 (float)rfps / rfps_base, rfps, rfps_base);
2824 /* update the current frame rate to match the stream frame rate */
2825 frame_rate.num = rfps;
2826 frame_rate.den = rfps_base;
2828 enc->rate_emu = rate_emu;
2829 if(video_disable)
2830 ic->streams[i]->discard= AVDISCARD_ALL;
2831 else if(video_discard)
2832 ic->streams[i]->discard= video_discard;
2833 break;
2834 case CODEC_TYPE_DATA:
2835 break;
2836 case CODEC_TYPE_SUBTITLE:
2837 if(subtitle_disable)
2838 ic->streams[i]->discard = AVDISCARD_ALL;
2839 break;
2840 case CODEC_TYPE_ATTACHMENT:
2841 case CODEC_TYPE_UNKNOWN:
2842 break;
2843 default:
2844 abort();
2848 input_files[nb_input_files] = ic;
2849 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2850 /* dump the file content */
2851 if (verbose >= 0)
2852 dump_format(ic, nb_input_files, filename, 0);
2854 nb_input_files++;
2855 file_iformat = NULL;
2856 file_oformat = NULL;
2858 video_channel = 0;
2860 rate_emu = 0;
2861 av_freep(&video_codec_name);
2862 av_freep(&audio_codec_name);
2863 av_freep(&subtitle_codec_name);
2866 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
2867 int *has_subtitle_ptr)
2869 int has_video, has_audio, has_subtitle, i, j;
2870 AVFormatContext *ic;
2872 has_video = 0;
2873 has_audio = 0;
2874 has_subtitle = 0;
2875 for(j=0;j<nb_input_files;j++) {
2876 ic = input_files[j];
2877 for(i=0;i<ic->nb_streams;i++) {
2878 AVCodecContext *enc = ic->streams[i]->codec;
2879 switch(enc->codec_type) {
2880 case CODEC_TYPE_AUDIO:
2881 has_audio = 1;
2882 break;
2883 case CODEC_TYPE_VIDEO:
2884 has_video = 1;
2885 break;
2886 case CODEC_TYPE_SUBTITLE:
2887 has_subtitle = 1;
2888 break;
2889 case CODEC_TYPE_DATA:
2890 case CODEC_TYPE_ATTACHMENT:
2891 case CODEC_TYPE_UNKNOWN:
2892 break;
2893 default:
2894 abort();
2898 *has_video_ptr = has_video;
2899 *has_audio_ptr = has_audio;
2900 *has_subtitle_ptr = has_subtitle;
2903 static void new_video_stream(AVFormatContext *oc)
2905 AVStream *st;
2906 AVCodecContext *video_enc;
2907 int codec_id;
2909 st = av_new_stream(oc, oc->nb_streams);
2910 if (!st) {
2911 fprintf(stderr, "Could not alloc stream\n");
2912 av_exit(1);
2914 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
2915 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
2916 video_bitstream_filters= NULL;
2918 if(thread_count>1)
2919 avcodec_thread_init(st->codec, thread_count);
2921 video_enc = st->codec;
2923 if(video_codec_tag)
2924 video_enc->codec_tag= video_codec_tag;
2926 if( (video_global_header&1)
2927 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
2928 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2929 avctx_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
2931 if(video_global_header&2){
2932 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
2933 avctx_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
2936 if (video_stream_copy) {
2937 st->stream_copy = 1;
2938 video_enc->codec_type = CODEC_TYPE_VIDEO;
2939 } else {
2940 const char *p;
2941 int i;
2942 AVCodec *codec;
2943 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
2945 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
2946 if (video_codec_name)
2947 codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
2949 video_enc->codec_id = codec_id;
2950 codec = avcodec_find_encoder(codec_id);
2952 set_context_opts(video_enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
2954 video_enc->time_base.den = fps.num;
2955 video_enc->time_base.num = fps.den;
2956 if(codec && codec->supported_framerates){
2957 const AVRational *p= codec->supported_framerates;
2958 const AVRational *best=NULL;
2959 AVRational best_error= (AVRational){INT_MAX, 1};
2960 for(; p->den!=0; p++){
2961 AVRational error= av_sub_q(fps, *p);
2962 if(error.num <0) error.num *= -1;
2963 if(av_cmp_q(error, best_error) < 0){
2964 best_error= error;
2965 best= p;
2968 video_enc->time_base.den= best->num;
2969 video_enc->time_base.num= best->den;
2972 video_enc->width = frame_width + frame_padright + frame_padleft;
2973 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2974 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
2975 video_enc->pix_fmt = frame_pix_fmt;
2977 if(codec && codec->pix_fmts){
2978 const enum PixelFormat *p= codec->pix_fmts;
2979 for(; *p!=-1; p++){
2980 if(*p == video_enc->pix_fmt)
2981 break;
2983 if(*p == -1)
2984 video_enc->pix_fmt = codec->pix_fmts[0];
2987 if (intra_only)
2988 video_enc->gop_size = 0;
2989 if (video_qscale || same_quality) {
2990 video_enc->flags |= CODEC_FLAG_QSCALE;
2991 video_enc->global_quality=
2992 st->quality = FF_QP2LAMBDA * video_qscale;
2995 if(intra_matrix)
2996 video_enc->intra_matrix = intra_matrix;
2997 if(inter_matrix)
2998 video_enc->inter_matrix = inter_matrix;
3000 video_enc->max_qdiff = video_qdiff;
3001 video_enc->thread_count = thread_count;
3002 p= video_rc_override_string;
3003 for(i=0; p; i++){
3004 int start, end, q;
3005 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3006 if(e!=3){
3007 fprintf(stderr, "error parsing rc_override\n");
3008 av_exit(1);
3010 video_enc->rc_override=
3011 av_realloc(video_enc->rc_override,
3012 sizeof(RcOverride)*(i+1));
3013 video_enc->rc_override[i].start_frame= start;
3014 video_enc->rc_override[i].end_frame = end;
3015 if(q>0){
3016 video_enc->rc_override[i].qscale= q;
3017 video_enc->rc_override[i].quality_factor= 1.0;
3019 else{
3020 video_enc->rc_override[i].qscale= 0;
3021 video_enc->rc_override[i].quality_factor= -q/100.0;
3023 p= strchr(p, '/');
3024 if(p) p++;
3026 video_enc->rc_override_count=i;
3027 if (!video_enc->rc_initial_buffer_occupancy)
3028 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3029 video_enc->me_threshold= me_threshold;
3030 video_enc->intra_dc_precision= intra_dc_precision - 8;
3031 video_enc->strict_std_compliance = strict;
3033 if (do_psnr)
3034 video_enc->flags|= CODEC_FLAG_PSNR;
3036 /* two pass mode */
3037 if (do_pass) {
3038 if (do_pass == 1) {
3039 video_enc->flags |= CODEC_FLAG_PASS1;
3040 } else {
3041 video_enc->flags |= CODEC_FLAG_PASS2;
3046 /* reset some key parameters */
3047 video_disable = 0;
3048 av_freep(&video_codec_name);
3049 video_stream_copy = 0;
3052 static void new_audio_stream(AVFormatContext *oc)
3054 AVStream *st;
3055 AVCodecContext *audio_enc;
3056 int codec_id;
3058 st = av_new_stream(oc, oc->nb_streams);
3059 if (!st) {
3060 fprintf(stderr, "Could not alloc stream\n");
3061 av_exit(1);
3063 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
3065 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
3066 audio_bitstream_filters= NULL;
3068 if(thread_count>1)
3069 avcodec_thread_init(st->codec, thread_count);
3071 audio_enc = st->codec;
3072 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3073 audio_enc->strict_std_compliance = strict;
3075 if(audio_codec_tag)
3076 audio_enc->codec_tag= audio_codec_tag;
3078 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3079 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3080 avctx_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3082 if (audio_stream_copy) {
3083 st->stream_copy = 1;
3084 audio_enc->channels = audio_channels;
3085 } else {
3086 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3088 set_context_opts(audio_enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3090 if (audio_codec_name)
3091 codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
3092 audio_enc->codec_id = codec_id;
3094 if (audio_qscale > QSCALE_NONE) {
3095 audio_enc->flags |= CODEC_FLAG_QSCALE;
3096 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3098 audio_enc->thread_count = thread_count;
3099 audio_enc->channels = audio_channels;
3101 audio_enc->sample_rate = audio_sample_rate;
3102 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3103 if (audio_language) {
3104 av_strlcpy(st->language, audio_language, sizeof(st->language));
3105 av_free(audio_language);
3106 audio_language = NULL;
3109 /* reset some key parameters */
3110 audio_disable = 0;
3111 av_freep(&audio_codec_name);
3112 audio_stream_copy = 0;
3115 static void new_subtitle_stream(AVFormatContext *oc)
3117 AVStream *st;
3118 AVCodecContext *subtitle_enc;
3120 st = av_new_stream(oc, oc->nb_streams);
3121 if (!st) {
3122 fprintf(stderr, "Could not alloc stream\n");
3123 av_exit(1);
3125 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
3127 bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
3128 subtitle_bitstream_filters= NULL;
3130 subtitle_enc = st->codec;
3131 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3132 if (subtitle_stream_copy) {
3133 st->stream_copy = 1;
3134 } else {
3135 set_context_opts(avctx_opts[CODEC_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3136 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1);
3139 if (subtitle_language) {
3140 av_strlcpy(st->language, subtitle_language, sizeof(st->language));
3141 av_free(subtitle_language);
3142 subtitle_language = NULL;
3145 subtitle_disable = 0;
3146 av_freep(&subtitle_codec_name);
3147 subtitle_stream_copy = 0;
3150 static void opt_new_audio_stream(void)
3152 AVFormatContext *oc;
3153 if (nb_output_files <= 0) {
3154 fprintf(stderr, "At least one output file must be specified\n");
3155 av_exit(1);
3157 oc = output_files[nb_output_files - 1];
3158 new_audio_stream(oc);
3161 static void opt_new_video_stream(void)
3163 AVFormatContext *oc;
3164 if (nb_output_files <= 0) {
3165 fprintf(stderr, "At least one output file must be specified\n");
3166 av_exit(1);
3168 oc = output_files[nb_output_files - 1];
3169 new_video_stream(oc);
3172 static void opt_new_subtitle_stream(void)
3174 AVFormatContext *oc;
3175 if (nb_output_files <= 0) {
3176 fprintf(stderr, "At least one output file must be specified\n");
3177 av_exit(1);
3179 oc = output_files[nb_output_files - 1];
3180 new_subtitle_stream(oc);
3183 static void opt_output_file(const char *filename)
3185 AVFormatContext *oc;
3186 int use_video, use_audio, use_subtitle;
3187 int input_has_video, input_has_audio, input_has_subtitle;
3188 AVFormatParameters params, *ap = &params;
3190 if (!strcmp(filename, "-"))
3191 filename = "pipe:";
3193 oc = av_alloc_format_context();
3195 if (!file_oformat) {
3196 file_oformat = guess_format(NULL, filename, NULL);
3197 if (!file_oformat) {
3198 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3199 filename);
3200 av_exit(1);
3204 oc->oformat = file_oformat;
3205 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3207 if (!strcmp(file_oformat->name, "ffm") &&
3208 av_strstart(filename, "http:", NULL)) {
3209 /* special case for files sent to ffserver: we get the stream
3210 parameters from ffserver */
3211 int err = read_ffserver_streams(oc, filename);
3212 if (err < 0) {
3213 print_error(filename, err);
3214 av_exit(1);
3216 } else {
3217 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3218 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3219 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3221 /* disable if no corresponding type found and at least one
3222 input file */
3223 if (nb_input_files > 0) {
3224 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3225 &input_has_subtitle);
3226 if (!input_has_video)
3227 use_video = 0;
3228 if (!input_has_audio)
3229 use_audio = 0;
3230 if (!input_has_subtitle)
3231 use_subtitle = 0;
3234 /* manual disable */
3235 if (audio_disable) {
3236 use_audio = 0;
3238 if (video_disable) {
3239 use_video = 0;
3241 if (subtitle_disable) {
3242 use_subtitle = 0;
3245 if (use_video) {
3246 new_video_stream(oc);
3249 if (use_audio) {
3250 new_audio_stream(oc);
3253 if (use_subtitle) {
3254 new_subtitle_stream(oc);
3257 oc->timestamp = rec_timestamp;
3259 if (str_title)
3260 av_strlcpy(oc->title, str_title, sizeof(oc->title));
3261 if (str_author)
3262 av_strlcpy(oc->author, str_author, sizeof(oc->author));
3263 if (str_copyright)
3264 av_strlcpy(oc->copyright, str_copyright, sizeof(oc->copyright));
3265 if (str_comment)
3266 av_strlcpy(oc->comment, str_comment, sizeof(oc->comment));
3267 if (str_album)
3268 av_strlcpy(oc->album, str_album, sizeof(oc->album));
3269 if (str_genre)
3270 av_strlcpy(oc->genre, str_genre, sizeof(oc->genre));
3273 output_files[nb_output_files++] = oc;
3275 /* check filename in case of an image number is expected */
3276 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3277 if (!av_filename_number_test(oc->filename)) {
3278 print_error(oc->filename, AVERROR_NUMEXPECTED);
3279 av_exit(1);
3283 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3284 /* test if it already exists to avoid loosing precious files */
3285 if (!file_overwrite &&
3286 (strchr(filename, ':') == NULL ||
3287 filename[1] == ':' ||
3288 av_strstart(filename, "file:", NULL))) {
3289 if (url_exist(filename)) {
3290 int c;
3292 if (!using_stdin) {
3293 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3294 fflush(stderr);
3295 c = getchar();
3296 if (toupper(c) != 'Y') {
3297 fprintf(stderr, "Not overwriting - exiting\n");
3298 av_exit(1);
3301 else {
3302 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3303 av_exit(1);
3308 /* open the file */
3309 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3310 fprintf(stderr, "Could not open '%s'\n", filename);
3311 av_exit(1);
3315 memset(ap, 0, sizeof(*ap));
3316 if (av_set_parameters(oc, ap) < 0) {
3317 fprintf(stderr, "%s: Invalid encoding parameters\n",
3318 oc->filename);
3319 av_exit(1);
3322 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3323 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3324 oc->loop_output = loop_output;
3326 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
3328 /* reset some options */
3329 file_oformat = NULL;
3330 file_iformat = NULL;
3333 /* same option as mencoder */
3334 static void opt_pass(const char *pass_str)
3336 int pass;
3337 pass = atoi(pass_str);
3338 if (pass != 1 && pass != 2) {
3339 fprintf(stderr, "pass number can be only 1 or 2\n");
3340 av_exit(1);
3342 do_pass = pass;
3345 static int64_t getutime(void)
3347 #ifdef HAVE_GETRUSAGE
3348 struct rusage rusage;
3350 getrusage(RUSAGE_SELF, &rusage);
3351 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3352 #elif defined(HAVE_GETPROCESSTIMES)
3353 HANDLE proc;
3354 FILETIME c, e, k, u;
3355 proc = GetCurrentProcess();
3356 GetProcessTimes(proc, &c, &e, &k, &u);
3357 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3358 #else
3359 return av_gettime();
3360 #endif
3363 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3365 int i;
3366 const char *p = str;
3367 for(i = 0;; i++) {
3368 dest[i] = atoi(p);
3369 if(i == 63)
3370 break;
3371 p = strchr(p, ',');
3372 if(!p) {
3373 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3374 av_exit(1);
3376 p++;
3380 static void opt_inter_matrix(const char *arg)
3382 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3383 parse_matrix_coeffs(inter_matrix, arg);
3386 static void opt_intra_matrix(const char *arg)
3388 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3389 parse_matrix_coeffs(intra_matrix, arg);
3393 * Trivial log callback.
3394 * Only suitable for show_help and similar since it lacks prefix handling.
3396 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
3398 vfprintf(stdout, fmt, vl);
3401 static void show_help(void)
3403 av_log_set_callback(log_callback_help);
3404 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3405 "Hyper fast Audio and Video encoder\n");
3406 printf("\n");
3407 show_help_options(options, "Main options:\n",
3408 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3409 show_help_options(options, "\nAdvanced options:\n",
3410 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3411 OPT_EXPERT);
3412 show_help_options(options, "\nVideo options:\n",
3413 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3414 OPT_VIDEO);
3415 show_help_options(options, "\nAdvanced Video options:\n",
3416 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3417 OPT_VIDEO | OPT_EXPERT);
3418 show_help_options(options, "\nAudio options:\n",
3419 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3420 OPT_AUDIO);
3421 show_help_options(options, "\nAdvanced Audio options:\n",
3422 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3423 OPT_AUDIO | OPT_EXPERT);
3424 show_help_options(options, "\nSubtitle options:\n",
3425 OPT_SUBTITLE | OPT_GRAB,
3426 OPT_SUBTITLE);
3427 show_help_options(options, "\nAudio/Video grab options:\n",
3428 OPT_GRAB,
3429 OPT_GRAB);
3430 printf("\n");
3431 av_opt_show(avctx_opts[0], NULL);
3432 printf("\n");
3433 av_opt_show(avformat_opts, NULL);
3434 printf("\n");
3435 av_opt_show(sws_opts, NULL);
3438 static void opt_target(const char *arg)
3440 int norm = -1;
3441 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3443 if(!strncmp(arg, "pal-", 4)) {
3444 norm = 0;
3445 arg += 4;
3446 } else if(!strncmp(arg, "ntsc-", 5)) {
3447 norm = 1;
3448 arg += 5;
3449 } else if(!strncmp(arg, "film-", 5)) {
3450 norm = 2;
3451 arg += 5;
3452 } else {
3453 int fr;
3454 /* Calculate FR via float to avoid int overflow */
3455 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3456 if(fr == 25000) {
3457 norm = 0;
3458 } else if((fr == 29970) || (fr == 23976)) {
3459 norm = 1;
3460 } else {
3461 /* Try to determine PAL/NTSC by peeking in the input files */
3462 if(nb_input_files) {
3463 int i, j;
3464 for(j = 0; j < nb_input_files; j++) {
3465 for(i = 0; i < input_files[j]->nb_streams; i++) {
3466 AVCodecContext *c = input_files[j]->streams[i]->codec;
3467 if(c->codec_type != CODEC_TYPE_VIDEO)
3468 continue;
3469 fr = c->time_base.den * 1000 / c->time_base.num;
3470 if(fr == 25000) {
3471 norm = 0;
3472 break;
3473 } else if((fr == 29970) || (fr == 23976)) {
3474 norm = 1;
3475 break;
3478 if(norm >= 0)
3479 break;
3483 if(verbose && norm >= 0)
3484 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3487 if(norm < 0) {
3488 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3489 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3490 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3491 av_exit(1);
3494 if(!strcmp(arg, "vcd")) {
3496 opt_video_codec("mpeg1video");
3497 opt_audio_codec("mp2");
3498 opt_format("vcd");
3500 opt_frame_size(norm ? "352x240" : "352x288");
3501 opt_frame_rate(frame_rates[norm]);
3502 opt_default("gop", norm ? "18" : "15");
3504 opt_default("b", "1150000");
3505 opt_default("maxrate", "1150000");
3506 opt_default("minrate", "1150000");
3507 opt_default("bufsize", "327680"); // 40*1024*8;
3509 opt_default("ab", "224000");
3510 audio_sample_rate = 44100;
3511 audio_channels = 2;
3513 opt_default("packetsize", "2324");
3514 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3516 /* We have to offset the PTS, so that it is consistent with the SCR.
3517 SCR starts at 36000, but the first two packs contain only padding
3518 and the first pack from the other stream, respectively, may also have
3519 been written before.
3520 So the real data starts at SCR 36000+3*1200. */
3521 mux_preload= (36000+3*1200) / 90000.0; //0.44
3522 } else if(!strcmp(arg, "svcd")) {
3524 opt_video_codec("mpeg2video");
3525 opt_audio_codec("mp2");
3526 opt_format("svcd");
3528 opt_frame_size(norm ? "480x480" : "480x576");
3529 opt_frame_rate(frame_rates[norm]);
3530 opt_default("gop", norm ? "18" : "15");
3532 opt_default("b", "2040000");
3533 opt_default("maxrate", "2516000");
3534 opt_default("minrate", "0"); //1145000;
3535 opt_default("bufsize", "1835008"); //224*1024*8;
3536 opt_default("flags", "+SCAN_OFFSET");
3539 opt_default("ab", "224000");
3540 audio_sample_rate = 44100;
3542 opt_default("packetsize", "2324");
3544 } else if(!strcmp(arg, "dvd")) {
3546 opt_video_codec("mpeg2video");
3547 opt_audio_codec("ac3");
3548 opt_format("dvd");
3550 opt_frame_size(norm ? "720x480" : "720x576");
3551 opt_frame_rate(frame_rates[norm]);
3552 opt_default("gop", norm ? "18" : "15");
3554 opt_default("b", "6000000");
3555 opt_default("maxrate", "9000000");
3556 opt_default("minrate", "0"); //1500000;
3557 opt_default("bufsize", "1835008"); //224*1024*8;
3559 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3560 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3562 opt_default("ab", "448000");
3563 audio_sample_rate = 48000;
3565 } else if(!strncmp(arg, "dv", 2)) {
3567 opt_format("dv");
3569 opt_frame_size(norm ? "720x480" : "720x576");
3570 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3571 (norm ? "yuv411p" : "yuv420p"));
3572 opt_frame_rate(frame_rates[norm]);
3574 audio_sample_rate = 48000;
3575 audio_channels = 2;
3577 } else {
3578 fprintf(stderr, "Unknown target: %s\n", arg);
3579 av_exit(1);
3583 static void opt_vstats_file (const char *arg)
3585 av_free (vstats_filename);
3586 vstats_filename=av_strdup (arg);
3589 static void opt_vstats (void)
3591 char filename[40];
3592 time_t today2 = time(NULL);
3593 struct tm *today = localtime(&today2);
3595 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3596 today->tm_sec);
3597 opt_vstats_file(filename);
3600 static int opt_bsf(const char *opt, const char *arg)
3602 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3603 AVBitStreamFilterContext **bsfp;
3605 if(!bsfc){
3606 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3607 av_exit(1);
3610 bsfp= *opt == 'v' ? &video_bitstream_filters :
3611 *opt == 'a' ? &audio_bitstream_filters :
3612 &subtitle_bitstream_filters;
3613 while(*bsfp)
3614 bsfp= &(*bsfp)->next;
3616 *bsfp= bsfc;
3618 return 0;
3621 static int opt_preset(const char *opt, const char *arg)
3623 FILE *f=NULL;
3624 char tmp[1000], tmp2[1000];
3625 int i;
3626 const char *base[3]= { getenv("HOME"),
3627 "/usr/local/share",
3628 "/usr/share",
3631 for(i=!base[0]; i<3 && !f; i++){
3632 snprintf(tmp, sizeof(tmp), "%s/%sffmpeg/%s.ffpreset", base[i], i ? "" : ".", arg);
3633 f= fopen(tmp, "r");
3634 if(!f){
3635 char *codec_name= *opt == 'v' ? video_codec_name :
3636 *opt == 'a' ? audio_codec_name :
3637 subtitle_codec_name;
3638 snprintf(tmp, sizeof(tmp), "%s/%sffmpeg/%s-%s.ffpreset", base[i], i ? "" : ".", codec_name, arg);
3639 f= fopen(tmp, "r");
3643 if(!f){
3644 fprintf(stderr, "Preset file not found\n");
3645 av_exit(1);
3648 while(!feof(f)){
3649 int e= fscanf(f, "%999[^=]=%999[^\n]\n", tmp, tmp2);
3650 if(e!=2){
3651 fprintf(stderr, "Preset file invalid\n");
3652 av_exit(1);
3654 opt_default(tmp, tmp2);
3657 fclose(f);
3659 return 0;
3662 static const OptionDef options[] = {
3663 /* main options */
3664 { "L", OPT_EXIT, {(void*)show_license}, "show license" },
3665 { "h", OPT_EXIT, {(void*)show_help}, "show help" },
3666 { "version", OPT_EXIT, {(void*)show_version}, "show version" },
3667 { "formats", OPT_EXIT, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3668 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3669 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3670 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3671 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3672 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3673 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3674 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3675 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3676 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3677 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3678 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3679 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3680 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3681 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3682 { "genre", HAS_ARG | OPT_STRING, {(void*)&str_genre}, "set the genre", "string" },
3683 { "album", HAS_ARG | OPT_STRING, {(void*)&str_album}, "set the album", "string" },
3684 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3685 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3686 "add timings for benchmarking" },
3687 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3688 "dump each input packet" },
3689 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3690 "when dumping packets, also dump the payload" },
3691 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3692 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3693 { "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)", "" },
3694 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set the logging verbosity level", "number" },
3695 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3696 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3697 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3698 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3699 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3700 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3701 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)&copy_ts}, "copy timestamps" },
3702 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3703 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3704 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3706 /* video options */
3707 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3708 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3709 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3710 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3711 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3712 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3713 { "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" },
3714 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3715 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3716 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3717 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3718 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3719 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3720 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3721 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3722 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3723 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3724 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3725 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3726 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3727 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantizer scale (VBR)", "q" },
3728 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3729 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3730 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
3731 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3732 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3733 "use same video quality as source (implies VBR)" },
3734 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3735 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3736 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3737 "deinterlace pictures" },
3738 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3739 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
3740 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
3741 #ifdef CONFIG_VHOOK
3742 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3743 #endif
3744 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3745 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3746 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3747 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3748 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3749 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3750 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3752 /* audio options */
3753 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3754 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3755 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3756 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3757 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3758 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3759 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3760 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3761 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3762 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3763 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3765 /* subtitle options */
3766 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
3767 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3768 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
3769 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3771 /* grab options */
3772 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3773 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3774 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3776 /* muxer options */
3777 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
3778 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
3780 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3781 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3782 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3784 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3785 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3786 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3788 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
3789 { NULL, },
3792 int main(int argc, char **argv)
3794 int i;
3795 int64_t ti;
3797 avcodec_register_all();
3798 avdevice_register_all();
3799 av_register_all();
3801 for(i=0; i<CODEC_TYPE_NB; i++){
3802 avctx_opts[i]= avcodec_alloc_context2(i);
3804 avformat_opts = av_alloc_format_context();
3805 sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
3807 show_banner();
3808 if (argc <= 1) {
3809 show_help();
3810 av_exit(1);
3813 /* parse options */
3814 parse_options(argc, argv, options, opt_output_file);
3816 /* file converter / grab */
3817 if (nb_output_files <= 0) {
3818 fprintf(stderr, "Must supply at least one output file\n");
3819 av_exit(1);
3822 if (nb_input_files == 0) {
3823 fprintf(stderr, "Must supply at least one input file\n");
3824 av_exit(1);
3827 ti = getutime();
3828 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3829 stream_maps, nb_stream_maps);
3830 ti = getutime() - ti;
3831 if (do_benchmark) {
3832 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3835 return av_exit(0);