Dirac encapsulation in MPEG-TS
[FFMpeg-mirror/ffmpeg-vdpau.git] / ffmpeg.c
blob53009d395f8dd4f2aebbc44fb3fb06345553b12b
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 "libavcodec/audioconvert.h"
36 #include "libavutil/fifo.h"
37 #include "libavutil/avstring.h"
38 #include "libavformat/os_support.h"
40 #ifdef HAVE_SYS_RESOURCE_H
41 #include <sys/types.h>
42 #include <sys/resource.h>
43 #elif defined(HAVE_GETPROCESSTIMES)
44 #include <windows.h>
45 #endif
47 #if defined(HAVE_TERMIOS_H)
48 #include <unistd.h>
49 #include <fcntl.h>
50 #include <sys/ioctl.h>
51 #include <sys/time.h>
52 #include <termios.h>
53 #elif defined(HAVE_CONIO_H)
54 #include <conio.h>
55 #endif
56 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
57 #include <time.h>
59 #include "cmdutils.h"
61 #undef NDEBUG
62 #include <assert.h>
64 #undef exit
66 const char program_name[] = "FFmpeg";
67 const int program_birth_year = 2000;
69 /* select an input stream for an output stream */
70 typedef struct AVStreamMap {
71 int file_index;
72 int stream_index;
73 int sync_file_index;
74 int sync_stream_index;
75 } AVStreamMap;
77 /** select an input file for an output file */
78 typedef struct AVMetaDataMap {
79 int out_file;
80 int in_file;
81 } AVMetaDataMap;
83 static const OptionDef options[];
85 #define MAX_FILES 20
87 static AVFormatContext *input_files[MAX_FILES];
88 static int64_t input_files_ts_offset[MAX_FILES];
89 static double input_files_ts_scale[MAX_FILES][MAX_STREAMS];
90 static int nb_input_files = 0;
92 static AVFormatContext *output_files[MAX_FILES];
93 static int nb_output_files = 0;
95 static AVStreamMap stream_maps[MAX_FILES*MAX_STREAMS];
96 static int nb_stream_maps;
98 static AVMetaDataMap meta_data_maps[MAX_FILES];
99 static int nb_meta_data_maps;
101 static AVInputFormat *file_iformat;
102 static AVOutputFormat *file_oformat;
103 static int frame_width = 0;
104 static int frame_height = 0;
105 static float frame_aspect_ratio = 0;
106 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
107 static enum SampleFormat audio_sample_fmt = SAMPLE_FMT_NONE;
108 static int frame_padtop = 0;
109 static int frame_padbottom = 0;
110 static int frame_padleft = 0;
111 static int frame_padright = 0;
112 static int padcolor[3] = {16,128,128}; /* default to black */
113 static int frame_topBand = 0;
114 static int frame_bottomBand = 0;
115 static int frame_leftBand = 0;
116 static int frame_rightBand = 0;
117 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
118 static AVRational frame_rate;
119 static float video_qscale = 0;
120 static uint16_t *intra_matrix = NULL;
121 static uint16_t *inter_matrix = NULL;
122 #if 0 //experimental, (can be removed)
123 static float video_rc_qsquish=1.0;
124 static float video_rc_qmod_amp=0;
125 static int video_rc_qmod_freq=0;
126 #endif
127 static const char *video_rc_override_string=NULL;
128 static int video_disable = 0;
129 static int video_discard = 0;
130 static char *video_codec_name = NULL;
131 static int video_codec_tag = 0;
132 static int same_quality = 0;
133 static int do_deinterlace = 0;
134 static int top_field_first = -1;
135 static int me_threshold = 0;
136 static int intra_dc_precision = 8;
137 static int loop_input = 0;
138 static int loop_output = AVFMT_NOOUTPUTLOOP;
139 static int qp_hist = 0;
141 static int intra_only = 0;
142 static int audio_sample_rate = 44100;
143 #define QSCALE_NONE -99999
144 static float audio_qscale = QSCALE_NONE;
145 static int audio_disable = 0;
146 static int audio_channels = 1;
147 static char *audio_codec_name = NULL;
148 static int audio_codec_tag = 0;
149 static char *audio_language = NULL;
151 static int subtitle_disable = 0;
152 static char *subtitle_codec_name = NULL;
153 static char *subtitle_language = NULL;
155 static float mux_preload= 0.5;
156 static float mux_max_delay= 0.7;
158 static int64_t recording_time = INT64_MAX;
159 static int64_t start_time = 0;
160 static int64_t rec_timestamp = 0;
161 static int64_t input_ts_offset = 0;
162 static int file_overwrite = 0;
163 static char *str_title = NULL;
164 static char *str_author = NULL;
165 static char *str_copyright = NULL;
166 static char *str_comment = NULL;
167 static char *str_genre = NULL;
168 static char *str_album = NULL;
169 static int do_benchmark = 0;
170 static int do_hex_dump = 0;
171 static int do_pkt_dump = 0;
172 static int do_psnr = 0;
173 static int do_pass = 0;
174 static char *pass_logfilename = NULL;
175 static int audio_stream_copy = 0;
176 static int video_stream_copy = 0;
177 static int subtitle_stream_copy = 0;
178 static int video_sync_method= -1;
179 static int audio_sync_method= 0;
180 static float audio_drift_threshold= 0.1;
181 static int copy_ts= 0;
182 static int opt_shortest = 0; //
183 static int video_global_header = 0;
184 static char *vstats_filename;
185 static FILE *vstats_file;
186 static int opt_programid = 0;
188 static int rate_emu = 0;
190 static int video_channel = 0;
191 static char *video_standard;
193 static int audio_volume = 256;
195 static int using_stdin = 0;
196 static int using_vhook = 0;
197 static int verbose = 1;
198 static int thread_count= 1;
199 static int q_pressed = 0;
200 static int64_t video_size = 0;
201 static int64_t audio_size = 0;
202 static int64_t extra_size = 0;
203 static int nb_frames_dup = 0;
204 static int nb_frames_drop = 0;
205 static int input_sync;
206 static uint64_t limit_filesize = 0; //
208 static int pgmyuv_compatibility_hack=0;
209 static float dts_delta_threshold = 10;
211 static unsigned int sws_flags = SWS_BICUBIC;
213 static const char **opt_names;
214 static int opt_name_count;
215 static AVCodecContext *avctx_opts[CODEC_TYPE_NB];
216 static AVFormatContext *avformat_opts;
217 static struct SwsContext *sws_opts;
218 static int64_t timer_start;
220 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
221 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
222 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
223 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
225 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
227 struct AVInputStream;
229 typedef struct AVOutputStream {
230 int file_index; /* file index */
231 int index; /* stream index in the output file */
232 int source_index; /* AVInputStream index */
233 AVStream *st; /* stream in the output file */
234 int encoding_needed; /* true if encoding needed for this stream */
235 int frame_number;
236 /* input pts and corresponding output pts
237 for A/V sync */
238 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
239 struct AVInputStream *sync_ist; /* input stream to sync against */
240 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
241 /* video only */
242 int video_resample;
243 AVFrame pict_tmp; /* temporary image for resampling */
244 struct SwsContext *img_resample_ctx; /* for image resampling */
245 int resample_height;
247 int video_crop;
248 int topBand; /* cropping area sizes */
249 int leftBand;
251 int video_pad;
252 int padtop; /* padding area sizes */
253 int padbottom;
254 int padleft;
255 int padright;
257 /* audio only */
258 int audio_resample;
259 ReSampleContext *resample; /* for audio resampling */
260 int reformat_pair;
261 AVAudioConvert *reformat_ctx;
262 AVFifoBuffer fifo; /* for compression: one audio fifo per codec */
263 FILE *logfile;
264 } AVOutputStream;
266 typedef struct AVInputStream {
267 int file_index;
268 int index;
269 AVStream *st;
270 int discard; /* true if stream data should be discarded */
271 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
272 int64_t sample_index; /* current sample */
274 int64_t start; /* time when read started */
275 unsigned long frame; /* current frame */
276 int64_t next_pts; /* synthetic pts for cases where pkt.pts
277 is not defined */
278 int64_t pts; /* current pts */
279 int is_start; /* is 1 at the start and after a discontinuity */
280 } AVInputStream;
282 typedef struct AVInputFile {
283 int eof_reached; /* true if eof reached */
284 int ist_index; /* index of first stream in ist_table */
285 int buffer_size; /* current total buffer size */
286 int nb_streams; /* nb streams we are aware of */
287 } AVInputFile;
289 #ifdef HAVE_TERMIOS_H
291 /* init terminal so that we can grab keys */
292 static struct termios oldtty;
293 #endif
295 static void term_exit(void)
297 #ifdef HAVE_TERMIOS_H
298 tcsetattr (0, TCSANOW, &oldtty);
299 #endif
302 static volatile sig_atomic_t received_sigterm = 0;
304 static void
305 sigterm_handler(int sig)
307 received_sigterm = sig;
308 term_exit();
311 static void term_init(void)
313 #ifdef HAVE_TERMIOS_H
314 struct termios tty;
316 tcgetattr (0, &tty);
317 oldtty = tty;
319 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
320 |INLCR|IGNCR|ICRNL|IXON);
321 tty.c_oflag |= OPOST;
322 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
323 tty.c_cflag &= ~(CSIZE|PARENB);
324 tty.c_cflag |= CS8;
325 tty.c_cc[VMIN] = 1;
326 tty.c_cc[VTIME] = 0;
328 tcsetattr (0, TCSANOW, &tty);
329 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
330 #endif
332 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
333 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
335 register a function to be called at normal program termination
337 atexit(term_exit);
338 #ifdef CONFIG_BEOS_NETSERVER
339 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
340 #endif
343 /* read a key without blocking */
344 static int read_key(void)
346 #if defined(HAVE_TERMIOS_H)
347 int n = 1;
348 unsigned char ch;
349 #ifndef CONFIG_BEOS_NETSERVER
350 struct timeval tv;
351 fd_set rfds;
353 FD_ZERO(&rfds);
354 FD_SET(0, &rfds);
355 tv.tv_sec = 0;
356 tv.tv_usec = 0;
357 n = select(1, &rfds, NULL, NULL, &tv);
358 #endif
359 if (n > 0) {
360 n = read(0, &ch, 1);
361 if (n == 1)
362 return ch;
364 return n;
366 #elif defined(HAVE_CONIO_H)
367 if(kbhit())
368 return(getch());
369 #endif
370 return -1;
373 static int decode_interrupt_cb(void)
375 return q_pressed || (q_pressed = read_key() == 'q');
378 static int av_exit(int ret)
380 int i;
382 /* close files */
383 for(i=0;i<nb_output_files;i++) {
384 /* maybe av_close_output_file ??? */
385 AVFormatContext *s = output_files[i];
386 int j;
387 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
388 url_fclose(s->pb);
389 for(j=0;j<s->nb_streams;j++) {
390 av_free(s->streams[j]->codec);
391 av_free(s->streams[j]);
393 av_free(s);
395 for(i=0;i<nb_input_files;i++)
396 av_close_input_file(input_files[i]);
398 av_free(intra_matrix);
399 av_free(inter_matrix);
401 if (vstats_file)
402 fclose(vstats_file);
403 av_free(vstats_filename);
405 av_free(opt_names);
407 av_free(video_codec_name);
408 av_free(audio_codec_name);
409 av_free(subtitle_codec_name);
411 av_free(video_standard);
413 #ifdef CONFIG_POWERPC_PERF
414 extern void powerpc_display_perf_report(void);
415 powerpc_display_perf_report();
416 #endif /* CONFIG_POWERPC_PERF */
418 if (received_sigterm) {
419 fprintf(stderr,
420 "Received signal %d: terminating.\n",
421 (int) received_sigterm);
422 exit (255);
425 exit(ret); /* not all OS-es handle main() return value */
426 return ret;
429 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
431 int i, err;
432 AVFormatContext *ic;
433 int nopts = 0;
435 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
436 if (err < 0)
437 return err;
438 /* copy stream format */
439 s->nb_streams = ic->nb_streams;
440 for(i=0;i<ic->nb_streams;i++) {
441 AVStream *st;
443 // FIXME: a more elegant solution is needed
444 st = av_mallocz(sizeof(AVStream));
445 memcpy(st, ic->streams[i], sizeof(AVStream));
446 st->codec = avcodec_alloc_context();
447 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
448 s->streams[i] = st;
450 if (st->codec->codec_type == CODEC_TYPE_AUDIO && audio_stream_copy)
451 st->stream_copy = 1;
452 else if (st->codec->codec_type == CODEC_TYPE_VIDEO && video_stream_copy)
453 st->stream_copy = 1;
455 if(!st->codec->thread_count)
456 st->codec->thread_count = 1;
457 if(st->codec->thread_count>1)
458 avcodec_thread_init(st->codec, st->codec->thread_count);
460 if(st->codec->flags & CODEC_FLAG_BITEXACT)
461 nopts = 1;
464 if (!nopts)
465 s->timestamp = av_gettime();
467 av_close_input_file(ic);
468 return 0;
471 static double
472 get_sync_ipts(const AVOutputStream *ost)
474 const AVInputStream *ist = ost->sync_ist;
475 return (double)(ist->pts - start_time)/AV_TIME_BASE;
478 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
479 int ret;
481 while(bsfc){
482 AVPacket new_pkt= *pkt;
483 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
484 &new_pkt.data, &new_pkt.size,
485 pkt->data, pkt->size,
486 pkt->flags & PKT_FLAG_KEY);
487 if(a>0){
488 av_free_packet(pkt);
489 new_pkt.destruct= av_destruct_packet;
490 } else if(a<0){
491 fprintf(stderr, "%s failed for stream %d, codec %s",
492 bsfc->filter->name, pkt->stream_index,
493 avctx->codec ? avctx->codec->name : "copy");
494 print_error("", a);
496 *pkt= new_pkt;
498 bsfc= bsfc->next;
501 ret= av_interleaved_write_frame(s, pkt);
502 if(ret < 0){
503 print_error("av_interleaved_write_frame()", ret);
504 av_exit(1);
508 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
510 static void do_audio_out(AVFormatContext *s,
511 AVOutputStream *ost,
512 AVInputStream *ist,
513 unsigned char *buf, int size)
515 uint8_t *buftmp;
516 static uint8_t *audio_buf = NULL;
517 static uint8_t *audio_out = NULL;
518 static uint8_t *audio_out2 = NULL;
519 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
521 int size_out, frame_bytes, ret;
522 AVCodecContext *enc= ost->st->codec;
523 AVCodecContext *dec= ist->st->codec;
525 /* SC: dynamic allocation of buffers */
526 if (!audio_buf)
527 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
528 if (!audio_out)
529 audio_out = av_malloc(audio_out_size);
530 if (!audio_buf || !audio_out)
531 return; /* Should signal an error ! */
533 if (enc->channels != dec->channels)
534 ost->audio_resample = 1;
536 if (ost->audio_resample && !ost->resample) {
537 ost->resample = audio_resample_init(enc->channels, dec->channels,
538 enc->sample_rate, dec->sample_rate);
539 if (!ost->resample) {
540 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
541 dec->channels, dec->sample_rate,
542 enc->channels, enc->sample_rate);
543 av_exit(1);
547 #define MAKE_SFMT_PAIR(a,b) ((a)+SAMPLE_FMT_NB*(b))
548 if (dec->sample_fmt!=enc->sample_fmt &&
549 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
550 if (!audio_out2)
551 audio_out2 = av_malloc(audio_out_size);
552 if (!audio_out2)
553 av_exit(1);
554 if (ost->reformat_ctx)
555 av_audio_convert_free(ost->reformat_ctx);
556 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
557 dec->sample_fmt, 1, NULL, 0);
558 if (!ost->reformat_ctx) {
559 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
560 avcodec_get_sample_fmt_name(dec->sample_fmt),
561 avcodec_get_sample_fmt_name(enc->sample_fmt));
562 av_exit(1);
564 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
567 if(audio_sync_method){
568 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
569 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2);
570 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
571 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
573 //FIXME resample delay
574 if(fabs(delta) > 50){
575 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
576 if(byte_delta < 0){
577 byte_delta= FFMAX(byte_delta, -size);
578 size += byte_delta;
579 buf -= byte_delta;
580 if(verbose > 2)
581 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
582 if(!size)
583 return;
584 ist->is_start=0;
585 }else{
586 static uint8_t *input_tmp= NULL;
587 input_tmp= av_realloc(input_tmp, byte_delta + size);
589 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
590 ist->is_start=0;
591 else
592 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
594 memset(input_tmp, 0, byte_delta);
595 memcpy(input_tmp + byte_delta, buf, size);
596 buf= input_tmp;
597 size += byte_delta;
598 if(verbose > 2)
599 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
601 }else if(audio_sync_method>1){
602 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
603 assert(ost->audio_resample);
604 if(verbose > 2)
605 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
606 // 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));
607 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
610 }else
611 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
612 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
614 if (ost->audio_resample) {
615 buftmp = audio_buf;
616 size_out = audio_resample(ost->resample,
617 (short *)buftmp, (short *)buf,
618 size / (ist->st->codec->channels * 2));
619 size_out = size_out * enc->channels * 2;
620 } else {
621 buftmp = buf;
622 size_out = size;
625 if (dec->sample_fmt!=enc->sample_fmt) {
626 const void *ibuf[6]= {buftmp};
627 void *obuf[6]= {audio_out2};
628 int istride[6]= {av_get_bits_per_sample_format(dec->sample_fmt)/8};
629 int ostride[6]= {av_get_bits_per_sample_format(enc->sample_fmt)/8};
630 int len= size_out/istride[0];
631 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
632 printf("av_audio_convert() failed\n");
633 return;
635 buftmp = audio_out2;
636 /* FIXME: existing code assume that size_out equals framesize*channels*2
637 remove this legacy cruft */
638 size_out = len*2;
641 /* now encode as many frames as possible */
642 if (enc->frame_size > 1) {
643 /* output resampled raw samples */
644 av_fifo_realloc(&ost->fifo, av_fifo_size(&ost->fifo) + size_out);
645 av_fifo_generic_write(&ost->fifo, buftmp, size_out, NULL);
647 frame_bytes = enc->frame_size * 2 * enc->channels;
649 while (av_fifo_size(&ost->fifo) >= frame_bytes) {
650 AVPacket pkt;
651 av_init_packet(&pkt);
653 av_fifo_read(&ost->fifo, audio_buf, frame_bytes);
655 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
657 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
658 (short *)audio_buf);
659 audio_size += ret;
660 pkt.stream_index= ost->index;
661 pkt.data= audio_out;
662 pkt.size= ret;
663 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
664 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
665 pkt.flags |= PKT_FLAG_KEY;
666 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
668 ost->sync_opts += enc->frame_size;
670 } else {
671 AVPacket pkt;
672 av_init_packet(&pkt);
674 ost->sync_opts += size_out / (2 * enc->channels);
676 /* output a pcm frame */
677 /* XXX: change encoding codec API to avoid this ? */
678 switch(enc->codec->id) {
679 case CODEC_ID_PCM_S32LE:
680 case CODEC_ID_PCM_S32BE:
681 case CODEC_ID_PCM_U32LE:
682 case CODEC_ID_PCM_U32BE:
683 case CODEC_ID_PCM_F32BE:
684 size_out = size_out << 1;
685 break;
686 case CODEC_ID_PCM_S24LE:
687 case CODEC_ID_PCM_S24BE:
688 case CODEC_ID_PCM_U24LE:
689 case CODEC_ID_PCM_U24BE:
690 case CODEC_ID_PCM_S24DAUD:
691 size_out = size_out / 2 * 3;
692 break;
693 case CODEC_ID_PCM_S16LE:
694 case CODEC_ID_PCM_S16BE:
695 case CODEC_ID_PCM_U16LE:
696 case CODEC_ID_PCM_U16BE:
697 break;
698 default:
699 size_out = size_out >> 1;
700 break;
702 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
703 ret = avcodec_encode_audio(enc, audio_out, size_out,
704 (short *)buftmp);
705 audio_size += ret;
706 pkt.stream_index= ost->index;
707 pkt.data= audio_out;
708 pkt.size= ret;
709 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
710 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
711 pkt.flags |= PKT_FLAG_KEY;
712 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
716 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
718 AVCodecContext *dec;
719 AVPicture *picture2;
720 AVPicture picture_tmp;
721 uint8_t *buf = 0;
723 dec = ist->st->codec;
725 /* deinterlace : must be done before any resize */
726 if (do_deinterlace || using_vhook) {
727 int size;
729 /* create temporary picture */
730 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
731 buf = av_malloc(size);
732 if (!buf)
733 return;
735 picture2 = &picture_tmp;
736 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
738 if (do_deinterlace){
739 if(avpicture_deinterlace(picture2, picture,
740 dec->pix_fmt, dec->width, dec->height) < 0) {
741 /* if error, do not deinterlace */
742 av_free(buf);
743 buf = NULL;
744 picture2 = picture;
746 } else {
747 av_picture_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
749 } else {
750 picture2 = picture;
753 if (ENABLE_VHOOK)
754 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height,
755 1000000 * ist->pts / AV_TIME_BASE);
757 if (picture != picture2)
758 *picture = *picture2;
759 *bufp = buf;
762 /* we begin to correct av delay at this threshold */
763 #define AV_DELAY_MAX 0.100
765 static void do_subtitle_out(AVFormatContext *s,
766 AVOutputStream *ost,
767 AVInputStream *ist,
768 AVSubtitle *sub,
769 int64_t pts)
771 static uint8_t *subtitle_out = NULL;
772 int subtitle_out_max_size = 65536;
773 int subtitle_out_size, nb, i;
774 AVCodecContext *enc;
775 AVPacket pkt;
777 if (pts == AV_NOPTS_VALUE) {
778 fprintf(stderr, "Subtitle packets must have a pts\n");
779 return;
782 enc = ost->st->codec;
784 if (!subtitle_out) {
785 subtitle_out = av_malloc(subtitle_out_max_size);
788 /* Note: DVB subtitle need one packet to draw them and one other
789 packet to clear them */
790 /* XXX: signal it in the codec context ? */
791 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
792 nb = 2;
793 else
794 nb = 1;
796 for(i = 0; i < nb; i++) {
797 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
798 subtitle_out_max_size, sub);
800 av_init_packet(&pkt);
801 pkt.stream_index = ost->index;
802 pkt.data = subtitle_out;
803 pkt.size = subtitle_out_size;
804 pkt.pts = av_rescale_q(pts, ist->st->time_base, ost->st->time_base);
805 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
806 /* XXX: the pts correction is handled here. Maybe handling
807 it in the codec would be better */
808 if (i == 0)
809 pkt.pts += 90 * sub->start_display_time;
810 else
811 pkt.pts += 90 * sub->end_display_time;
813 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
817 static int bit_buffer_size= 1024*256;
818 static uint8_t *bit_buffer= NULL;
820 static void do_video_out(AVFormatContext *s,
821 AVOutputStream *ost,
822 AVInputStream *ist,
823 AVFrame *in_picture,
824 int *frame_size)
826 int nb_frames, i, ret;
827 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
828 AVFrame picture_crop_temp, picture_pad_temp;
829 AVCodecContext *enc, *dec;
831 avcodec_get_frame_defaults(&picture_crop_temp);
832 avcodec_get_frame_defaults(&picture_pad_temp);
834 enc = ost->st->codec;
835 dec = ist->st->codec;
837 /* by default, we output a single frame */
838 nb_frames = 1;
840 *frame_size = 0;
842 if(video_sync_method>0 || (video_sync_method && av_q2d(enc->time_base) > 0.001)){
843 double vdelta;
844 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
845 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
846 if (vdelta < -1.1)
847 nb_frames = 0;
848 else if (video_sync_method == 2)
849 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
850 else if (vdelta > 1.1)
851 nb_frames = lrintf(vdelta);
852 //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);
853 if (nb_frames == 0){
854 ++nb_frames_drop;
855 if (verbose>2)
856 fprintf(stderr, "*** drop!\n");
857 }else if (nb_frames > 1) {
858 nb_frames_dup += nb_frames;
859 if (verbose>2)
860 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
862 }else
863 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
865 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
866 if (nb_frames <= 0)
867 return;
869 if (ost->video_crop) {
870 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
871 av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
872 return;
874 formatted_picture = &picture_crop_temp;
875 } else {
876 formatted_picture = in_picture;
879 final_picture = formatted_picture;
880 padding_src = formatted_picture;
881 resampling_dst = &ost->pict_tmp;
882 if (ost->video_pad) {
883 final_picture = &ost->pict_tmp;
884 if (ost->video_resample) {
885 if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
886 av_log(NULL, AV_LOG_ERROR, "error padding picture\n");
887 return;
889 resampling_dst = &picture_pad_temp;
893 if (ost->video_resample) {
894 padding_src = NULL;
895 final_picture = &ost->pict_tmp;
896 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
897 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
900 if (ost->video_pad) {
901 av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
902 enc->height, enc->width, enc->pix_fmt,
903 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
906 /* duplicates frame if needed */
907 for(i=0;i<nb_frames;i++) {
908 AVPacket pkt;
909 av_init_packet(&pkt);
910 pkt.stream_index= ost->index;
912 if (s->oformat->flags & AVFMT_RAWPICTURE) {
913 /* raw pictures are written as AVPicture structure to
914 avoid any copies. We support temorarily the older
915 method. */
916 AVFrame* old_frame = enc->coded_frame;
917 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
918 pkt.data= (uint8_t *)final_picture;
919 pkt.size= sizeof(AVPicture);
920 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
921 pkt.flags |= PKT_FLAG_KEY;
923 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
924 enc->coded_frame = old_frame;
925 } else {
926 AVFrame big_picture;
928 big_picture= *final_picture;
929 /* better than nothing: use input picture interlaced
930 settings */
931 big_picture.interlaced_frame = in_picture->interlaced_frame;
932 if(avctx_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
933 if(top_field_first == -1)
934 big_picture.top_field_first = in_picture->top_field_first;
935 else
936 big_picture.top_field_first = top_field_first;
939 /* handles sameq here. This is not correct because it may
940 not be a global option */
941 if (same_quality) {
942 big_picture.quality = ist->st->quality;
943 }else
944 big_picture.quality = ost->st->quality;
945 if(!me_threshold)
946 big_picture.pict_type = 0;
947 // big_picture.pts = AV_NOPTS_VALUE;
948 big_picture.pts= ost->sync_opts;
949 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
950 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
951 ret = avcodec_encode_video(enc,
952 bit_buffer, bit_buffer_size,
953 &big_picture);
954 if (ret == -1) {
955 fprintf(stderr, "Video encoding failed\n");
956 av_exit(1);
958 //enc->frame_number = enc->real_pict_num;
959 if(ret>0){
960 pkt.data= bit_buffer;
961 pkt.size= ret;
962 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
963 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
964 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
965 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
966 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
968 if(enc->coded_frame->key_frame)
969 pkt.flags |= PKT_FLAG_KEY;
970 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
971 *frame_size = ret;
972 video_size += ret;
973 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
974 // enc->frame_number-1, enc->real_pict_num, ret,
975 // enc->pict_type);
976 /* if two pass, output log */
977 if (ost->logfile && enc->stats_out) {
978 fprintf(ost->logfile, "%s", enc->stats_out);
982 ost->sync_opts++;
983 ost->frame_number++;
987 static double psnr(double d){
988 return -10.0*log(d)/log(10.0);
991 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
992 int frame_size)
994 AVCodecContext *enc;
995 int frame_number;
996 double ti1, bitrate, avg_bitrate;
998 /* this is executed just the first time do_video_stats is called */
999 if (!vstats_file) {
1000 vstats_file = fopen(vstats_filename, "w");
1001 if (!vstats_file) {
1002 perror("fopen");
1003 av_exit(1);
1007 enc = ost->st->codec;
1008 if (enc->codec_type == CODEC_TYPE_VIDEO) {
1009 frame_number = ost->frame_number;
1010 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1011 if (enc->flags&CODEC_FLAG_PSNR)
1012 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1014 fprintf(vstats_file,"f_size= %6d ", frame_size);
1015 /* compute pts value */
1016 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1017 if (ti1 < 0.01)
1018 ti1 = 0.01;
1020 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1021 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1022 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1023 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1024 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1028 static void print_report(AVFormatContext **output_files,
1029 AVOutputStream **ost_table, int nb_ostreams,
1030 int is_last_report)
1032 char buf[1024];
1033 AVOutputStream *ost;
1034 AVFormatContext *oc, *os;
1035 int64_t total_size;
1036 AVCodecContext *enc;
1037 int frame_number, vid, i;
1038 double bitrate, ti1, pts;
1039 static int64_t last_time = -1;
1040 static int qp_histogram[52];
1042 if (!is_last_report) {
1043 int64_t cur_time;
1044 /* display the report every 0.5 seconds */
1045 cur_time = av_gettime();
1046 if (last_time == -1) {
1047 last_time = cur_time;
1048 return;
1050 if ((cur_time - last_time) < 500000)
1051 return;
1052 last_time = cur_time;
1056 oc = output_files[0];
1058 total_size = url_fsize(oc->pb);
1059 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1060 total_size= url_ftell(oc->pb);
1062 buf[0] = '\0';
1063 ti1 = 1e10;
1064 vid = 0;
1065 for(i=0;i<nb_ostreams;i++) {
1066 ost = ost_table[i];
1067 os = output_files[ost->file_index];
1068 enc = ost->st->codec;
1069 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1070 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1071 !ost->st->stream_copy ?
1072 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1074 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1075 float t = (av_gettime()-timer_start) / 1000000.0;
1077 frame_number = ost->frame_number;
1078 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1079 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1080 !ost->st->stream_copy ?
1081 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1082 if(is_last_report)
1083 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1084 if(qp_hist){
1085 int j;
1086 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1087 if(qp>=0 && qp<sizeof(qp_histogram)/sizeof(int))
1088 qp_histogram[qp]++;
1089 for(j=0; j<32; j++)
1090 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1092 if (enc->flags&CODEC_FLAG_PSNR){
1093 int j;
1094 double error, error_sum=0;
1095 double scale, scale_sum=0;
1096 char type[3]= {'Y','U','V'};
1097 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1098 for(j=0; j<3; j++){
1099 if(is_last_report){
1100 error= enc->error[j];
1101 scale= enc->width*enc->height*255.0*255.0*frame_number;
1102 }else{
1103 error= enc->coded_frame->error[j];
1104 scale= enc->width*enc->height*255.0*255.0;
1106 if(j) scale/=4;
1107 error_sum += error;
1108 scale_sum += scale;
1109 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1111 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1113 vid = 1;
1115 /* compute min output value */
1116 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1117 if ((pts < ti1) && (pts > 0))
1118 ti1 = pts;
1120 if (ti1 < 0.01)
1121 ti1 = 0.01;
1123 if (verbose || is_last_report) {
1124 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1126 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1127 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1128 (double)total_size / 1024, ti1, bitrate);
1130 if (verbose > 1)
1131 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1132 nb_frames_dup, nb_frames_drop);
1134 if (verbose >= 0)
1135 fprintf(stderr, "%s \r", buf);
1137 fflush(stderr);
1140 if (is_last_report && verbose >= 0){
1141 int64_t raw= audio_size + video_size + extra_size;
1142 fprintf(stderr, "\n");
1143 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1144 video_size/1024.0,
1145 audio_size/1024.0,
1146 extra_size/1024.0,
1147 100.0*(total_size - raw)/raw
1152 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1153 static int output_packet(AVInputStream *ist, int ist_index,
1154 AVOutputStream **ost_table, int nb_ostreams,
1155 const AVPacket *pkt)
1157 AVFormatContext *os;
1158 AVOutputStream *ost;
1159 uint8_t *ptr;
1160 int len, ret, i;
1161 uint8_t *data_buf;
1162 int data_size, got_picture;
1163 AVFrame picture;
1164 void *buffer_to_free;
1165 static unsigned int samples_size= 0;
1166 static short *samples= NULL;
1167 AVSubtitle subtitle, *subtitle_to_free;
1168 int got_subtitle;
1170 if(ist->next_pts == AV_NOPTS_VALUE)
1171 ist->next_pts= ist->pts;
1173 if (pkt == NULL) {
1174 /* EOF handling */
1175 ptr = NULL;
1176 len = 0;
1177 goto handle_eof;
1180 if(pkt->dts != AV_NOPTS_VALUE)
1181 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1183 len = pkt->size;
1184 ptr = pkt->data;
1186 //while we have more to decode or while the decoder did output something on EOF
1187 while (len > 0 || (!pkt && ist->next_pts != ist->pts)) {
1188 handle_eof:
1189 ist->pts= ist->next_pts;
1191 if(len && len != pkt->size && verbose>0)
1192 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1194 /* decode the packet if needed */
1195 data_buf = NULL; /* fail safe */
1196 data_size = 0;
1197 subtitle_to_free = NULL;
1198 if (ist->decoding_needed) {
1199 switch(ist->st->codec->codec_type) {
1200 case CODEC_TYPE_AUDIO:{
1201 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1202 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1203 av_free(samples);
1204 samples= av_malloc(samples_size);
1206 data_size= samples_size;
1207 /* XXX: could avoid copy if PCM 16 bits with same
1208 endianness as CPU */
1209 ret = avcodec_decode_audio2(ist->st->codec, samples, &data_size,
1210 ptr, len);
1211 if (ret < 0)
1212 goto fail_decode;
1213 ptr += ret;
1214 len -= ret;
1215 /* Some bug in mpeg audio decoder gives */
1216 /* data_size < 0, it seems they are overflows */
1217 if (data_size <= 0) {
1218 /* no audio frame */
1219 continue;
1221 data_buf = (uint8_t *)samples;
1222 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1223 (ist->st->codec->sample_rate * ist->st->codec->channels);
1224 break;}
1225 case CODEC_TYPE_VIDEO:
1226 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1227 /* XXX: allocate picture correctly */
1228 avcodec_get_frame_defaults(&picture);
1230 ret = avcodec_decode_video(ist->st->codec,
1231 &picture, &got_picture, ptr, len);
1232 ist->st->quality= picture.quality;
1233 if (ret < 0)
1234 goto fail_decode;
1235 if (!got_picture) {
1236 /* no picture yet */
1237 goto discard_packet;
1239 if (ist->st->codec->time_base.num != 0) {
1240 ist->next_pts += ((int64_t)AV_TIME_BASE *
1241 ist->st->codec->time_base.num) /
1242 ist->st->codec->time_base.den;
1244 len = 0;
1245 break;
1246 case CODEC_TYPE_SUBTITLE:
1247 ret = avcodec_decode_subtitle(ist->st->codec,
1248 &subtitle, &got_subtitle, ptr, len);
1249 if (ret < 0)
1250 goto fail_decode;
1251 if (!got_subtitle) {
1252 goto discard_packet;
1254 subtitle_to_free = &subtitle;
1255 len = 0;
1256 break;
1257 default:
1258 goto fail_decode;
1260 } else {
1261 switch(ist->st->codec->codec_type) {
1262 case CODEC_TYPE_AUDIO:
1263 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1264 ist->st->codec->sample_rate;
1265 break;
1266 case CODEC_TYPE_VIDEO:
1267 if (ist->st->codec->time_base.num != 0) {
1268 ist->next_pts += ((int64_t)AV_TIME_BASE *
1269 ist->st->codec->time_base.num) /
1270 ist->st->codec->time_base.den;
1272 break;
1274 data_buf = ptr;
1275 data_size = len;
1276 ret = len;
1277 len = 0;
1280 buffer_to_free = NULL;
1281 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1282 pre_process_video_frame(ist, (AVPicture *)&picture,
1283 &buffer_to_free);
1286 // preprocess audio (volume)
1287 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1288 if (audio_volume != 256) {
1289 short *volp;
1290 volp = samples;
1291 for(i=0;i<(data_size / sizeof(short));i++) {
1292 int v = ((*volp) * audio_volume + 128) >> 8;
1293 if (v < -32768) v = -32768;
1294 if (v > 32767) v = 32767;
1295 *volp++ = v;
1300 /* frame rate emulation */
1301 if (ist->st->codec->rate_emu) {
1302 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
1303 int64_t now = av_gettime() - ist->start;
1304 if (pts > now)
1305 usleep(pts - now);
1307 ist->frame++;
1310 #if 0
1311 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1312 is the one of the next displayed one */
1313 /* XXX: add mpeg4 too ? */
1314 if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
1315 if (ist->st->codec->pict_type != B_TYPE) {
1316 int64_t tmp;
1317 tmp = ist->last_ip_pts;
1318 ist->last_ip_pts = ist->frac_pts.val;
1319 ist->frac_pts.val = tmp;
1322 #endif
1323 /* if output time reached then transcode raw format,
1324 encode packets and output them */
1325 if (start_time == 0 || ist->pts >= start_time)
1326 for(i=0;i<nb_ostreams;i++) {
1327 int frame_size;
1329 ost = ost_table[i];
1330 if (ost->source_index == ist_index) {
1331 os = output_files[ost->file_index];
1333 #if 0
1334 printf("%d: got pts=%0.3f %0.3f\n", i,
1335 (double)pkt->pts / AV_TIME_BASE,
1336 ((double)ist->pts / AV_TIME_BASE) -
1337 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1338 #endif
1339 /* set the input output pts pairs */
1340 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1342 if (ost->encoding_needed) {
1343 switch(ost->st->codec->codec_type) {
1344 case CODEC_TYPE_AUDIO:
1345 do_audio_out(os, ost, ist, data_buf, data_size);
1346 break;
1347 case CODEC_TYPE_VIDEO:
1348 do_video_out(os, ost, ist, &picture, &frame_size);
1349 if (vstats_filename && frame_size)
1350 do_video_stats(os, ost, frame_size);
1351 break;
1352 case CODEC_TYPE_SUBTITLE:
1353 do_subtitle_out(os, ost, ist, &subtitle,
1354 pkt->pts);
1355 break;
1356 default:
1357 abort();
1359 } else {
1360 AVFrame avframe; //FIXME/XXX remove this
1361 AVPacket opkt;
1362 av_init_packet(&opkt);
1364 if (!ost->frame_number && !(pkt->flags & PKT_FLAG_KEY))
1365 continue;
1367 /* no reencoding needed : output the packet directly */
1368 /* force the input stream PTS */
1370 avcodec_get_frame_defaults(&avframe);
1371 ost->st->codec->coded_frame= &avframe;
1372 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1374 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1375 audio_size += data_size;
1376 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1377 video_size += data_size;
1378 ost->sync_opts++;
1381 opkt.stream_index= ost->index;
1382 if(pkt->pts != AV_NOPTS_VALUE)
1383 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base);
1384 else
1385 opkt.pts= AV_NOPTS_VALUE;
1387 if (pkt->dts == AV_NOPTS_VALUE)
1388 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1389 else
1390 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1392 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1393 opkt.flags= pkt->flags;
1395 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1396 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1397 opkt.destruct= av_destruct_packet;
1399 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][opkt.stream_index]);
1400 ost->st->codec->frame_number++;
1401 ost->frame_number++;
1402 av_free_packet(&opkt);
1406 av_free(buffer_to_free);
1407 /* XXX: allocate the subtitles in the codec ? */
1408 if (subtitle_to_free) {
1409 if (subtitle_to_free->rects != NULL) {
1410 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1411 av_free(subtitle_to_free->rects[i].bitmap);
1412 av_free(subtitle_to_free->rects[i].rgba_palette);
1414 av_freep(&subtitle_to_free->rects);
1416 subtitle_to_free->num_rects = 0;
1417 subtitle_to_free = NULL;
1420 discard_packet:
1421 if (pkt == NULL) {
1422 /* EOF handling */
1424 for(i=0;i<nb_ostreams;i++) {
1425 ost = ost_table[i];
1426 if (ost->source_index == ist_index) {
1427 AVCodecContext *enc= ost->st->codec;
1428 os = output_files[ost->file_index];
1430 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1431 continue;
1432 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1433 continue;
1435 if (ost->encoding_needed) {
1436 for(;;) {
1437 AVPacket pkt;
1438 int fifo_bytes;
1439 av_init_packet(&pkt);
1440 pkt.stream_index= ost->index;
1442 switch(ost->st->codec->codec_type) {
1443 case CODEC_TYPE_AUDIO:
1444 fifo_bytes = av_fifo_size(&ost->fifo);
1445 ret = 0;
1446 /* encode any samples remaining in fifo */
1447 if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1448 int fs_tmp = enc->frame_size;
1449 enc->frame_size = fifo_bytes / (2 * enc->channels);
1450 av_fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes);
1451 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1452 enc->frame_size = fs_tmp;
1454 if(ret <= 0) {
1455 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1457 audio_size += ret;
1458 pkt.flags |= PKT_FLAG_KEY;
1459 break;
1460 case CODEC_TYPE_VIDEO:
1461 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1462 video_size += ret;
1463 if(enc->coded_frame && enc->coded_frame->key_frame)
1464 pkt.flags |= PKT_FLAG_KEY;
1465 if (ost->logfile && enc->stats_out) {
1466 fprintf(ost->logfile, "%s", enc->stats_out);
1468 break;
1469 default:
1470 ret=-1;
1473 if(ret<=0)
1474 break;
1475 pkt.data= bit_buffer;
1476 pkt.size= ret;
1477 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1478 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1479 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1486 return 0;
1487 fail_decode:
1488 return -1;
1491 static void print_sdp(AVFormatContext **avc, int n)
1493 char sdp[2048];
1495 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1496 printf("SDP:\n%s\n", sdp);
1499 static int stream_index_from_inputs(AVFormatContext **input_files,
1500 int nb_input_files,
1501 AVInputFile *file_table,
1502 AVInputStream **ist_table,
1503 enum CodecType type,
1504 int programid)
1506 int p, q, z;
1507 for(z=0; z<nb_input_files; z++) {
1508 AVFormatContext *ic = input_files[z];
1509 for(p=0; p<ic->nb_programs; p++) {
1510 AVProgram *program = ic->programs[p];
1511 if(program->id != programid)
1512 continue;
1513 for(q=0; q<program->nb_stream_indexes; q++) {
1514 int sidx = program->stream_index[q];
1515 int ris = file_table[z].ist_index + sidx;
1516 if(ist_table[ris]->discard && ic->streams[sidx]->codec->codec_type == type)
1517 return ris;
1522 return -1;
1526 * The following code is the main loop of the file converter
1528 static int av_encode(AVFormatContext **output_files,
1529 int nb_output_files,
1530 AVFormatContext **input_files,
1531 int nb_input_files,
1532 AVStreamMap *stream_maps, int nb_stream_maps)
1534 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1535 AVFormatContext *is, *os;
1536 AVCodecContext *codec, *icodec;
1537 AVOutputStream *ost, **ost_table = NULL;
1538 AVInputStream *ist, **ist_table = NULL;
1539 AVInputFile *file_table;
1540 int key;
1541 int want_sdp = 1;
1543 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1544 if (!file_table)
1545 goto fail;
1547 /* input stream init */
1548 j = 0;
1549 for(i=0;i<nb_input_files;i++) {
1550 is = input_files[i];
1551 file_table[i].ist_index = j;
1552 file_table[i].nb_streams = is->nb_streams;
1553 j += is->nb_streams;
1555 nb_istreams = j;
1557 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1558 if (!ist_table)
1559 goto fail;
1561 for(i=0;i<nb_istreams;i++) {
1562 ist = av_mallocz(sizeof(AVInputStream));
1563 if (!ist)
1564 goto fail;
1565 ist_table[i] = ist;
1567 j = 0;
1568 for(i=0;i<nb_input_files;i++) {
1569 is = input_files[i];
1570 for(k=0;k<is->nb_streams;k++) {
1571 ist = ist_table[j++];
1572 ist->st = is->streams[k];
1573 ist->file_index = i;
1574 ist->index = k;
1575 ist->discard = 1; /* the stream is discarded by default
1576 (changed later) */
1578 if (ist->st->codec->rate_emu) {
1579 ist->start = av_gettime();
1580 ist->frame = 0;
1585 /* output stream init */
1586 nb_ostreams = 0;
1587 for(i=0;i<nb_output_files;i++) {
1588 os = output_files[i];
1589 if (!os->nb_streams) {
1590 fprintf(stderr, "Output file does not contain any stream\n");
1591 av_exit(1);
1593 nb_ostreams += os->nb_streams;
1595 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1596 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1597 av_exit(1);
1600 /* Sanity check the mapping args -- do the input files & streams exist? */
1601 for(i=0;i<nb_stream_maps;i++) {
1602 int fi = stream_maps[i].file_index;
1603 int si = stream_maps[i].stream_index;
1605 if (fi < 0 || fi > nb_input_files - 1 ||
1606 si < 0 || si > file_table[fi].nb_streams - 1) {
1607 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1608 av_exit(1);
1610 fi = stream_maps[i].sync_file_index;
1611 si = stream_maps[i].sync_stream_index;
1612 if (fi < 0 || fi > nb_input_files - 1 ||
1613 si < 0 || si > file_table[fi].nb_streams - 1) {
1614 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1615 av_exit(1);
1619 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1620 if (!ost_table)
1621 goto fail;
1622 for(i=0;i<nb_ostreams;i++) {
1623 ost = av_mallocz(sizeof(AVOutputStream));
1624 if (!ost)
1625 goto fail;
1626 ost_table[i] = ost;
1629 n = 0;
1630 for(k=0;k<nb_output_files;k++) {
1631 os = output_files[k];
1632 for(i=0;i<os->nb_streams;i++) {
1633 int found;
1634 ost = ost_table[n++];
1635 ost->file_index = k;
1636 ost->index = i;
1637 ost->st = os->streams[i];
1638 if (nb_stream_maps > 0) {
1639 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1640 stream_maps[n-1].stream_index;
1642 /* Sanity check that the stream types match */
1643 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1644 int i= ost->file_index;
1645 dump_format(output_files[i], i, output_files[i]->filename, 1);
1646 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1647 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1648 ost->file_index, ost->index);
1649 av_exit(1);
1652 } else {
1653 if(opt_programid) {
1654 found = 0;
1655 j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid);
1656 if(j != -1) {
1657 ost->source_index = j;
1658 found = 1;
1660 } else {
1661 /* get corresponding input stream index : we select the first one with the right type */
1662 found = 0;
1663 for(j=0;j<nb_istreams;j++) {
1664 ist = ist_table[j];
1665 if (ist->discard &&
1666 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1667 ost->source_index = j;
1668 found = 1;
1669 break;
1674 if (!found) {
1675 if(! opt_programid) {
1676 /* try again and reuse existing stream */
1677 for(j=0;j<nb_istreams;j++) {
1678 ist = ist_table[j];
1679 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1680 ost->source_index = j;
1681 found = 1;
1685 if (!found) {
1686 int i= ost->file_index;
1687 dump_format(output_files[i], i, output_files[i]->filename, 1);
1688 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1689 ost->file_index, ost->index);
1690 av_exit(1);
1694 ist = ist_table[ost->source_index];
1695 ist->discard = 0;
1696 ost->sync_ist = (nb_stream_maps > 0) ?
1697 ist_table[file_table[stream_maps[n-1].sync_file_index].ist_index +
1698 stream_maps[n-1].sync_stream_index] : ist;
1702 /* for each output stream, we compute the right encoding parameters */
1703 for(i=0;i<nb_ostreams;i++) {
1704 ost = ost_table[i];
1705 os = output_files[ost->file_index];
1706 ist = ist_table[ost->source_index];
1708 codec = ost->st->codec;
1709 icodec = ist->st->codec;
1711 if (!ost->st->language[0])
1712 av_strlcpy(ost->st->language, ist->st->language,
1713 sizeof(ost->st->language));
1715 ost->st->disposition = ist->st->disposition;
1717 if (ost->st->stream_copy) {
1718 /* if stream_copy is selected, no need to decode or encode */
1719 codec->codec_id = icodec->codec_id;
1720 codec->codec_type = icodec->codec_type;
1722 if(!codec->codec_tag){
1723 if( !os->oformat->codec_tag
1724 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) > 0
1725 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1726 codec->codec_tag = icodec->codec_tag;
1729 codec->bit_rate = icodec->bit_rate;
1730 codec->extradata= icodec->extradata;
1731 codec->extradata_size= icodec->extradata_size;
1732 if(av_q2d(icodec->time_base) > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000)
1733 codec->time_base = icodec->time_base;
1734 else
1735 codec->time_base = ist->st->time_base;
1736 switch(codec->codec_type) {
1737 case CODEC_TYPE_AUDIO:
1738 if(audio_volume != 256) {
1739 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1740 av_exit(1);
1742 codec->sample_rate = icodec->sample_rate;
1743 codec->channels = icodec->channels;
1744 codec->frame_size = icodec->frame_size;
1745 codec->block_align= icodec->block_align;
1746 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1747 codec->block_align= 0;
1748 if(codec->codec_id == CODEC_ID_AC3)
1749 codec->block_align= 0;
1750 break;
1751 case CODEC_TYPE_VIDEO:
1752 if(using_vhook) {
1753 fprintf(stderr,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");
1754 av_exit(1);
1756 codec->pix_fmt = icodec->pix_fmt;
1757 codec->width = icodec->width;
1758 codec->height = icodec->height;
1759 codec->has_b_frames = icodec->has_b_frames;
1760 break;
1761 case CODEC_TYPE_SUBTITLE:
1762 break;
1763 default:
1764 abort();
1766 } else {
1767 switch(codec->codec_type) {
1768 case CODEC_TYPE_AUDIO:
1769 if (av_fifo_init(&ost->fifo, 1024))
1770 goto fail;
1771 ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
1772 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1773 icodec->request_channels = codec->channels;
1774 ist->decoding_needed = 1;
1775 ost->encoding_needed = 1;
1776 break;
1777 case CODEC_TYPE_VIDEO:
1778 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1779 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1780 ost->video_resample = ((codec->width != icodec->width -
1781 (frame_leftBand + frame_rightBand) +
1782 (frame_padleft + frame_padright)) ||
1783 (codec->height != icodec->height -
1784 (frame_topBand + frame_bottomBand) +
1785 (frame_padtop + frame_padbottom)) ||
1786 (codec->pix_fmt != icodec->pix_fmt));
1787 if (ost->video_crop) {
1788 ost->topBand = frame_topBand;
1789 ost->leftBand = frame_leftBand;
1791 if (ost->video_pad) {
1792 ost->padtop = frame_padtop;
1793 ost->padleft = frame_padleft;
1794 ost->padbottom = frame_padbottom;
1795 ost->padright = frame_padright;
1796 if (!ost->video_resample) {
1797 avcodec_get_frame_defaults(&ost->pict_tmp);
1798 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1799 codec->width, codec->height))
1800 goto fail;
1803 if (ost->video_resample) {
1804 avcodec_get_frame_defaults(&ost->pict_tmp);
1805 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1806 codec->width, codec->height)) {
1807 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1808 av_exit(1);
1810 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1811 ost->img_resample_ctx = sws_getContext(
1812 icodec->width - (frame_leftBand + frame_rightBand),
1813 icodec->height - (frame_topBand + frame_bottomBand),
1814 icodec->pix_fmt,
1815 codec->width - (frame_padleft + frame_padright),
1816 codec->height - (frame_padtop + frame_padbottom),
1817 codec->pix_fmt,
1818 sws_flags, NULL, NULL, NULL);
1819 if (ost->img_resample_ctx == NULL) {
1820 fprintf(stderr, "Cannot get resampling context\n");
1821 av_exit(1);
1823 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1825 ost->encoding_needed = 1;
1826 ist->decoding_needed = 1;
1827 break;
1828 case CODEC_TYPE_SUBTITLE:
1829 ost->encoding_needed = 1;
1830 ist->decoding_needed = 1;
1831 break;
1832 default:
1833 abort();
1834 break;
1836 /* two pass mode */
1837 if (ost->encoding_needed &&
1838 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1839 char logfilename[1024];
1840 FILE *f;
1841 int size;
1842 char *logbuffer;
1844 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1845 pass_logfilename ?
1846 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1847 if (codec->flags & CODEC_FLAG_PASS1) {
1848 f = fopen(logfilename, "w");
1849 if (!f) {
1850 perror(logfilename);
1851 av_exit(1);
1853 ost->logfile = f;
1854 } else {
1855 /* read the log file */
1856 f = fopen(logfilename, "r");
1857 if (!f) {
1858 perror(logfilename);
1859 av_exit(1);
1861 fseek(f, 0, SEEK_END);
1862 size = ftell(f);
1863 fseek(f, 0, SEEK_SET);
1864 logbuffer = av_malloc(size + 1);
1865 if (!logbuffer) {
1866 fprintf(stderr, "Could not allocate log buffer\n");
1867 av_exit(1);
1869 size = fread(logbuffer, 1, size, f);
1870 fclose(f);
1871 logbuffer[size] = '\0';
1872 codec->stats_in = logbuffer;
1876 if(codec->codec_type == CODEC_TYPE_VIDEO){
1877 int size= codec->width * codec->height;
1878 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1882 if (!bit_buffer)
1883 bit_buffer = av_malloc(bit_buffer_size);
1884 if (!bit_buffer)
1885 goto fail;
1887 /* dump the file output parameters - cannot be done before in case
1888 of stream copy */
1889 for(i=0;i<nb_output_files;i++) {
1890 dump_format(output_files[i], i, output_files[i]->filename, 1);
1893 /* dump the stream mapping */
1894 if (verbose >= 0) {
1895 fprintf(stderr, "Stream mapping:\n");
1896 for(i=0;i<nb_ostreams;i++) {
1897 ost = ost_table[i];
1898 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1899 ist_table[ost->source_index]->file_index,
1900 ist_table[ost->source_index]->index,
1901 ost->file_index,
1902 ost->index);
1903 if (ost->sync_ist != ist_table[ost->source_index])
1904 fprintf(stderr, " [sync #%d.%d]",
1905 ost->sync_ist->file_index,
1906 ost->sync_ist->index);
1907 fprintf(stderr, "\n");
1911 /* open each encoder */
1912 for(i=0;i<nb_ostreams;i++) {
1913 ost = ost_table[i];
1914 if (ost->encoding_needed) {
1915 AVCodec *codec;
1916 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1917 if (!codec) {
1918 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1919 ost->file_index, ost->index);
1920 av_exit(1);
1922 if (avcodec_open(ost->st->codec, codec) < 0) {
1923 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1924 ost->file_index, ost->index);
1925 av_exit(1);
1927 extra_size += ost->st->codec->extradata_size;
1931 /* open each decoder */
1932 for(i=0;i<nb_istreams;i++) {
1933 ist = ist_table[i];
1934 if (ist->decoding_needed) {
1935 AVCodec *codec;
1936 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1937 if (!codec) {
1938 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1939 ist->st->codec->codec_id, ist->file_index, ist->index);
1940 av_exit(1);
1942 if (avcodec_open(ist->st->codec, codec) < 0) {
1943 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1944 ist->file_index, ist->index);
1945 av_exit(1);
1947 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1948 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1952 /* init pts */
1953 for(i=0;i<nb_istreams;i++) {
1954 ist = ist_table[i];
1955 is = input_files[ist->file_index];
1956 ist->pts = 0;
1957 ist->next_pts = AV_NOPTS_VALUE;
1958 ist->is_start = 1;
1961 /* set meta data information from input file if required */
1962 for (i=0;i<nb_meta_data_maps;i++) {
1963 AVFormatContext *out_file;
1964 AVFormatContext *in_file;
1966 int out_file_index = meta_data_maps[i].out_file;
1967 int in_file_index = meta_data_maps[i].in_file;
1968 if (out_file_index < 0 || out_file_index >= nb_output_files) {
1969 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1970 ret = AVERROR(EINVAL);
1971 goto fail;
1973 if (in_file_index < 0 || in_file_index >= nb_input_files) {
1974 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1975 ret = AVERROR(EINVAL);
1976 goto fail;
1979 out_file = output_files[out_file_index];
1980 in_file = input_files[in_file_index];
1982 strcpy(out_file->title, in_file->title);
1983 strcpy(out_file->author, in_file->author);
1984 strcpy(out_file->copyright, in_file->copyright);
1985 strcpy(out_file->comment, in_file->comment);
1986 strcpy(out_file->album, in_file->album);
1987 out_file->year = in_file->year;
1988 out_file->track = in_file->track;
1989 strcpy(out_file->genre, in_file->genre);
1992 /* open files and write file headers */
1993 for(i=0;i<nb_output_files;i++) {
1994 os = output_files[i];
1995 if (av_write_header(os) < 0) {
1996 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1997 ret = AVERROR(EINVAL);
1998 goto fail;
2000 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2001 want_sdp = 0;
2004 if (want_sdp) {
2005 print_sdp(output_files, nb_output_files);
2008 if (!using_stdin && verbose >= 0) {
2009 fprintf(stderr, "Press [q] to stop encoding\n");
2010 url_set_interrupt_cb(decode_interrupt_cb);
2012 term_init();
2014 key = -1;
2015 timer_start = av_gettime();
2017 for(; received_sigterm == 0;) {
2018 int file_index, ist_index;
2019 AVPacket pkt;
2020 double ipts_min;
2021 double opts_min;
2023 redo:
2024 ipts_min= 1e100;
2025 opts_min= 1e100;
2026 /* if 'q' pressed, exits */
2027 if (!using_stdin) {
2028 if (q_pressed)
2029 break;
2030 /* read_key() returns 0 on EOF */
2031 key = read_key();
2032 if (key == 'q')
2033 break;
2036 /* select the stream that we must read now by looking at the
2037 smallest output pts */
2038 file_index = -1;
2039 for(i=0;i<nb_ostreams;i++) {
2040 double ipts, opts;
2041 ost = ost_table[i];
2042 os = output_files[ost->file_index];
2043 ist = ist_table[ost->source_index];
2044 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
2045 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
2046 else
2047 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2048 ipts = (double)ist->pts;
2049 if (!file_table[ist->file_index].eof_reached){
2050 if(ipts < ipts_min) {
2051 ipts_min = ipts;
2052 if(input_sync ) file_index = ist->file_index;
2054 if(opts < opts_min) {
2055 opts_min = opts;
2056 if(!input_sync) file_index = ist->file_index;
2059 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2060 file_index= -1;
2061 break;
2064 /* if none, if is finished */
2065 if (file_index < 0) {
2066 break;
2069 /* finish if recording time exhausted */
2070 if (opts_min >= (recording_time / 1000000.0))
2071 break;
2073 /* finish if limit size exhausted */
2074 if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
2075 break;
2077 /* read a frame from it and output it in the fifo */
2078 is = input_files[file_index];
2079 if (av_read_frame(is, &pkt) < 0) {
2080 file_table[file_index].eof_reached = 1;
2081 if (opt_shortest)
2082 break;
2083 else
2084 continue;
2087 if (do_pkt_dump) {
2088 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2090 /* the following test is needed in case new streams appear
2091 dynamically in stream : we ignore them */
2092 if (pkt.stream_index >= file_table[file_index].nb_streams)
2093 goto discard_packet;
2094 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2095 ist = ist_table[ist_index];
2096 if (ist->discard)
2097 goto discard_packet;
2099 if (pkt.dts != AV_NOPTS_VALUE)
2100 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2101 if (pkt.pts != AV_NOPTS_VALUE)
2102 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2104 if(input_files_ts_scale[file_index][pkt.stream_index]){
2105 if(pkt.pts != AV_NOPTS_VALUE)
2106 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2107 if(pkt.dts != AV_NOPTS_VALUE)
2108 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2111 // 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);
2112 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
2113 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2114 int64_t delta= pkt_dts - ist->next_pts;
2115 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2116 input_files_ts_offset[ist->file_index]-= delta;
2117 if (verbose > 2)
2118 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2119 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2120 if(pkt.pts != AV_NOPTS_VALUE)
2121 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2125 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2126 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2128 if (verbose >= 0)
2129 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2130 ist->file_index, ist->index);
2132 av_free_packet(&pkt);
2133 goto redo;
2136 discard_packet:
2137 av_free_packet(&pkt);
2139 /* dump report by using the output first video and audio streams */
2140 print_report(output_files, ost_table, nb_ostreams, 0);
2143 /* at the end of stream, we must flush the decoder buffers */
2144 for(i=0;i<nb_istreams;i++) {
2145 ist = ist_table[i];
2146 if (ist->decoding_needed) {
2147 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2151 term_exit();
2153 /* write the trailer if needed and close file */
2154 for(i=0;i<nb_output_files;i++) {
2155 os = output_files[i];
2156 av_write_trailer(os);
2159 /* dump report by using the first video and audio streams */
2160 print_report(output_files, ost_table, nb_ostreams, 1);
2162 /* close each encoder */
2163 for(i=0;i<nb_ostreams;i++) {
2164 ost = ost_table[i];
2165 if (ost->encoding_needed) {
2166 av_freep(&ost->st->codec->stats_in);
2167 avcodec_close(ost->st->codec);
2171 /* close each decoder */
2172 for(i=0;i<nb_istreams;i++) {
2173 ist = ist_table[i];
2174 if (ist->decoding_needed) {
2175 avcodec_close(ist->st->codec);
2179 /* finished ! */
2181 ret = 0;
2182 fail1:
2183 av_freep(&bit_buffer);
2184 av_free(file_table);
2186 if (ist_table) {
2187 for(i=0;i<nb_istreams;i++) {
2188 ist = ist_table[i];
2189 av_free(ist);
2191 av_free(ist_table);
2193 if (ost_table) {
2194 for(i=0;i<nb_ostreams;i++) {
2195 ost = ost_table[i];
2196 if (ost) {
2197 if (ost->logfile) {
2198 fclose(ost->logfile);
2199 ost->logfile = NULL;
2201 av_fifo_free(&ost->fifo); /* works even if fifo is not
2202 initialized but set to zero */
2203 av_free(ost->pict_tmp.data[0]);
2204 if (ost->video_resample)
2205 sws_freeContext(ost->img_resample_ctx);
2206 if (ost->resample)
2207 audio_resample_close(ost->resample);
2208 if (ost->reformat_ctx)
2209 av_audio_convert_free(ost->reformat_ctx);
2210 av_free(ost);
2213 av_free(ost_table);
2215 return ret;
2216 fail:
2217 ret = AVERROR(ENOMEM);
2218 goto fail1;
2221 #if 0
2222 int file_read(const char *filename)
2224 URLContext *h;
2225 unsigned char buffer[1024];
2226 int len, i;
2228 if (url_open(&h, filename, O_RDONLY) < 0) {
2229 printf("could not open '%s'\n", filename);
2230 return -1;
2232 for(;;) {
2233 len = url_read(h, buffer, sizeof(buffer));
2234 if (len <= 0)
2235 break;
2236 for(i=0;i<len;i++) putchar(buffer[i]);
2238 url_close(h);
2239 return 0;
2241 #endif
2243 static void opt_format(const char *arg)
2245 /* compatibility stuff for pgmyuv */
2246 if (!strcmp(arg, "pgmyuv")) {
2247 pgmyuv_compatibility_hack=1;
2248 // opt_image_format(arg);
2249 arg = "image2";
2250 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2253 file_iformat = av_find_input_format(arg);
2254 file_oformat = guess_format(arg, NULL, NULL);
2255 if (!file_iformat && !file_oformat) {
2256 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2257 av_exit(1);
2261 static int opt_default(const char *opt, const char *arg){
2262 int type;
2263 const AVOption *o= NULL;
2264 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
2266 for(type=0; type<CODEC_TYPE_NB; type++){
2267 const AVOption *o2 = av_find_opt(avctx_opts[0], opt, NULL, opt_types[type], opt_types[type]);
2268 if(o2)
2269 o = av_set_string2(avctx_opts[type], opt, arg, 1);
2271 if(!o)
2272 o = av_set_string2(avformat_opts, opt, arg, 1);
2273 if(!o)
2274 o = av_set_string2(sws_opts, opt, arg, 1);
2275 if(!o){
2276 if(opt[0] == 'a')
2277 o = av_set_string2(avctx_opts[CODEC_TYPE_AUDIO], opt+1, arg, 1);
2278 else if(opt[0] == 'v')
2279 o = av_set_string2(avctx_opts[CODEC_TYPE_VIDEO], opt+1, arg, 1);
2280 else if(opt[0] == 's')
2281 o = av_set_string2(avctx_opts[CODEC_TYPE_SUBTITLE], opt+1, arg, 1);
2283 if(!o)
2284 return -1;
2286 // 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));
2288 //FIXME we should always use avctx_opts, ... for storing options so there will not be any need to keep track of what i set over this
2289 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
2290 opt_names[opt_name_count++]= o->name;
2292 if(avctx_opts[0]->debug || avformat_opts->debug)
2293 av_log_set_level(AV_LOG_DEBUG);
2294 return 0;
2297 static void opt_video_rc_override_string(const char *arg)
2299 video_rc_override_string = arg;
2302 static int opt_me_threshold(const char *opt, const char *arg)
2304 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2305 return 0;
2308 static int opt_verbose(const char *opt, const char *arg)
2310 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2311 av_log_set_level(verbose);
2312 return 0;
2315 static void opt_frame_rate(const char *arg)
2317 if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2318 fprintf(stderr, "Incorrect frame rate\n");
2319 av_exit(1);
2323 static int opt_bitrate(const char *opt, const char *arg)
2325 int codec_type = opt[0]=='a' ? CODEC_TYPE_AUDIO : CODEC_TYPE_VIDEO;
2327 opt_default(opt, arg);
2329 if (av_get_int(avctx_opts[codec_type], "b", NULL) < 1000)
2330 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2332 return 0;
2335 static void opt_frame_crop_top(const char *arg)
2337 frame_topBand = atoi(arg);
2338 if (frame_topBand < 0) {
2339 fprintf(stderr, "Incorrect top crop size\n");
2340 av_exit(1);
2342 if ((frame_topBand % 2) != 0) {
2343 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2344 av_exit(1);
2346 if ((frame_topBand) >= frame_height){
2347 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2348 av_exit(1);
2350 frame_height -= frame_topBand;
2353 static void opt_frame_crop_bottom(const char *arg)
2355 frame_bottomBand = atoi(arg);
2356 if (frame_bottomBand < 0) {
2357 fprintf(stderr, "Incorrect bottom crop size\n");
2358 av_exit(1);
2360 if ((frame_bottomBand % 2) != 0) {
2361 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2362 av_exit(1);
2364 if ((frame_bottomBand) >= frame_height){
2365 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2366 av_exit(1);
2368 frame_height -= frame_bottomBand;
2371 static void opt_frame_crop_left(const char *arg)
2373 frame_leftBand = atoi(arg);
2374 if (frame_leftBand < 0) {
2375 fprintf(stderr, "Incorrect left crop size\n");
2376 av_exit(1);
2378 if ((frame_leftBand % 2) != 0) {
2379 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2380 av_exit(1);
2382 if ((frame_leftBand) >= frame_width){
2383 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2384 av_exit(1);
2386 frame_width -= frame_leftBand;
2389 static void opt_frame_crop_right(const char *arg)
2391 frame_rightBand = atoi(arg);
2392 if (frame_rightBand < 0) {
2393 fprintf(stderr, "Incorrect right crop size\n");
2394 av_exit(1);
2396 if ((frame_rightBand % 2) != 0) {
2397 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2398 av_exit(1);
2400 if ((frame_rightBand) >= frame_width){
2401 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2402 av_exit(1);
2404 frame_width -= frame_rightBand;
2407 static void opt_frame_size(const char *arg)
2409 if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
2410 fprintf(stderr, "Incorrect frame size\n");
2411 av_exit(1);
2413 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2414 fprintf(stderr, "Frame size must be a multiple of 2\n");
2415 av_exit(1);
2420 #define SCALEBITS 10
2421 #define ONE_HALF (1 << (SCALEBITS - 1))
2422 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2424 #define RGB_TO_Y(r, g, b) \
2425 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2426 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2428 #define RGB_TO_U(r1, g1, b1, shift)\
2429 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2430 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2432 #define RGB_TO_V(r1, g1, b1, shift)\
2433 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2434 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2436 static void opt_pad_color(const char *arg) {
2437 /* Input is expected to be six hex digits similar to
2438 how colors are expressed in html tags (but without the #) */
2439 int rgb = strtol(arg, NULL, 16);
2440 int r,g,b;
2442 r = (rgb >> 16);
2443 g = ((rgb >> 8) & 255);
2444 b = (rgb & 255);
2446 padcolor[0] = RGB_TO_Y(r,g,b);
2447 padcolor[1] = RGB_TO_U(r,g,b,0);
2448 padcolor[2] = RGB_TO_V(r,g,b,0);
2451 static void opt_frame_pad_top(const char *arg)
2453 frame_padtop = atoi(arg);
2454 if (frame_padtop < 0) {
2455 fprintf(stderr, "Incorrect top pad size\n");
2456 av_exit(1);
2458 if ((frame_padtop % 2) != 0) {
2459 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2460 av_exit(1);
2464 static void opt_frame_pad_bottom(const char *arg)
2466 frame_padbottom = atoi(arg);
2467 if (frame_padbottom < 0) {
2468 fprintf(stderr, "Incorrect bottom pad size\n");
2469 av_exit(1);
2471 if ((frame_padbottom % 2) != 0) {
2472 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2473 av_exit(1);
2478 static void opt_frame_pad_left(const char *arg)
2480 frame_padleft = atoi(arg);
2481 if (frame_padleft < 0) {
2482 fprintf(stderr, "Incorrect left pad size\n");
2483 av_exit(1);
2485 if ((frame_padleft % 2) != 0) {
2486 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2487 av_exit(1);
2492 static void opt_frame_pad_right(const char *arg)
2494 frame_padright = atoi(arg);
2495 if (frame_padright < 0) {
2496 fprintf(stderr, "Incorrect right pad size\n");
2497 av_exit(1);
2499 if ((frame_padright % 2) != 0) {
2500 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2501 av_exit(1);
2505 static void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts)
2507 int i;
2508 char fmt_str[128];
2509 for (i=-1; i < nb_fmts; i++) {
2510 get_fmt_string (fmt_str, sizeof(fmt_str), i);
2511 fprintf(stdout, "%s\n", fmt_str);
2515 static void opt_frame_pix_fmt(const char *arg)
2517 if (strcmp(arg, "list"))
2518 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2519 else {
2520 list_fmts(avcodec_pix_fmt_string, PIX_FMT_NB);
2521 av_exit(0);
2525 static void opt_frame_aspect_ratio(const char *arg)
2527 int x = 0, y = 0;
2528 double ar = 0;
2529 const char *p;
2530 char *end;
2532 p = strchr(arg, ':');
2533 if (p) {
2534 x = strtol(arg, &end, 10);
2535 if (end == p)
2536 y = strtol(end+1, &end, 10);
2537 if (x > 0 && y > 0)
2538 ar = (double)x / (double)y;
2539 } else
2540 ar = strtod(arg, NULL);
2542 if (!ar) {
2543 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2544 av_exit(1);
2546 frame_aspect_ratio = ar;
2549 static void opt_qscale(const char *arg)
2551 video_qscale = atof(arg);
2552 if (video_qscale <= 0 ||
2553 video_qscale > 255) {
2554 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2555 av_exit(1);
2559 static void opt_top_field_first(const char *arg)
2561 top_field_first= atoi(arg);
2564 static int opt_thread_count(const char *opt, const char *arg)
2566 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2567 #if !defined(HAVE_THREADS)
2568 if (verbose >= 0)
2569 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2570 #endif
2571 return 0;
2574 static void opt_audio_sample_fmt(const char *arg)
2576 if (strcmp(arg, "list"))
2577 audio_sample_fmt = avcodec_get_sample_fmt(arg);
2578 else {
2579 list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
2580 av_exit(0);
2584 static int opt_audio_rate(const char *opt, const char *arg)
2586 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2587 return 0;
2590 static int opt_audio_channels(const char *opt, const char *arg)
2592 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2593 return 0;
2596 static void opt_video_channel(const char *arg)
2598 video_channel = strtol(arg, NULL, 0);
2601 static void opt_video_standard(const char *arg)
2603 video_standard = av_strdup(arg);
2606 static void opt_codec(int *pstream_copy, char **pcodec_name,
2607 int codec_type, const char *arg)
2609 av_freep(pcodec_name);
2610 if (!strcmp(arg, "copy")) {
2611 *pstream_copy = 1;
2612 } else {
2613 *pcodec_name = av_strdup(arg);
2617 static void opt_audio_codec(const char *arg)
2619 opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg);
2622 static void opt_audio_tag(const char *arg)
2624 char *tail;
2625 audio_codec_tag= strtol(arg, &tail, 0);
2627 if(!tail || *tail)
2628 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2631 static void opt_video_tag(const char *arg)
2633 char *tail;
2634 video_codec_tag= strtol(arg, &tail, 0);
2636 if(!tail || *tail)
2637 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2640 #ifdef CONFIG_VHOOK
2641 static void add_frame_hooker(const char *arg)
2643 int argc = 0;
2644 char *argv[64];
2645 int i;
2646 char *args = av_strdup(arg);
2648 using_vhook = 1;
2650 argv[0] = strtok(args, " ");
2651 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2654 i = frame_hook_add(argc, argv);
2656 if (i != 0) {
2657 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2658 av_exit(1);
2661 #endif
2663 static void opt_video_codec(const char *arg)
2665 opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg);
2668 static void opt_subtitle_codec(const char *arg)
2670 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
2673 static void opt_map(const char *arg)
2675 AVStreamMap *m;
2676 char *p;
2678 m = &stream_maps[nb_stream_maps++];
2680 m->file_index = strtol(arg, &p, 0);
2681 if (*p)
2682 p++;
2684 m->stream_index = strtol(p, &p, 0);
2685 if (*p) {
2686 p++;
2687 m->sync_file_index = strtol(p, &p, 0);
2688 if (*p)
2689 p++;
2690 m->sync_stream_index = strtol(p, &p, 0);
2691 } else {
2692 m->sync_file_index = m->file_index;
2693 m->sync_stream_index = m->stream_index;
2697 static void opt_map_meta_data(const char *arg)
2699 AVMetaDataMap *m;
2700 char *p;
2702 m = &meta_data_maps[nb_meta_data_maps++];
2704 m->out_file = strtol(arg, &p, 0);
2705 if (*p)
2706 p++;
2708 m->in_file = strtol(p, &p, 0);
2711 static void opt_input_ts_scale(const char *arg)
2713 unsigned int stream;
2714 double scale;
2715 char *p;
2717 stream = strtol(arg, &p, 0);
2718 if (*p)
2719 p++;
2720 scale= strtod(p, &p);
2722 if(stream >= MAX_STREAMS)
2723 av_exit(1);
2725 input_files_ts_scale[nb_input_files][stream]= scale;
2728 static int opt_recording_time(const char *opt, const char *arg)
2730 recording_time = parse_time_or_die(opt, arg, 1);
2731 return 0;
2734 static int opt_start_time(const char *opt, const char *arg)
2736 start_time = parse_time_or_die(opt, arg, 1);
2737 return 0;
2740 static int opt_rec_timestamp(const char *opt, const char *arg)
2742 rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
2743 return 0;
2746 static int opt_input_ts_offset(const char *opt, const char *arg)
2748 input_ts_offset = parse_time_or_die(opt, arg, 1);
2749 return 0;
2752 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
2754 const char *codec_string = encoder ? "encoder" : "decoder";
2755 AVCodec *codec;
2757 if(!name)
2758 return CODEC_ID_NONE;
2759 codec = encoder ?
2760 avcodec_find_encoder_by_name(name) :
2761 avcodec_find_decoder_by_name(name);
2762 if(!codec) {
2763 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2764 av_exit(1);
2766 if(codec->type != type) {
2767 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2768 av_exit(1);
2770 return codec->id;
2773 static void set_context_opts(void *ctx, void *opts_ctx, int flags)
2775 int i;
2776 for(i=0; i<opt_name_count; i++){
2777 char buf[256];
2778 const AVOption *opt;
2779 const char *str= av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
2780 /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
2781 if(str && ((opt->flags & flags) == flags))
2782 av_set_string2(ctx, opt_names[i], str, 1);
2786 static void opt_input_file(const char *filename)
2788 AVFormatContext *ic;
2789 AVFormatParameters params, *ap = &params;
2790 int err, i, ret, rfps, rfps_base;
2791 int64_t timestamp;
2793 if (!strcmp(filename, "-"))
2794 filename = "pipe:";
2796 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2797 !strcmp(filename, "/dev/stdin");
2799 /* get default parameters from command line */
2800 ic = av_alloc_format_context();
2802 memset(ap, 0, sizeof(*ap));
2803 ap->prealloced_context = 1;
2804 ap->sample_rate = audio_sample_rate;
2805 ap->channels = audio_channels;
2806 ap->time_base.den = frame_rate.num;
2807 ap->time_base.num = frame_rate.den;
2808 ap->width = frame_width + frame_padleft + frame_padright;
2809 ap->height = frame_height + frame_padtop + frame_padbottom;
2810 ap->pix_fmt = frame_pix_fmt;
2811 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
2812 ap->channel = video_channel;
2813 ap->standard = video_standard;
2814 ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0);
2815 ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0);
2816 if(pgmyuv_compatibility_hack)
2817 ap->video_codec_id= CODEC_ID_PGMYUV;
2819 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
2821 ic->video_codec_id = find_codec_or_die(video_codec_name , CODEC_TYPE_VIDEO , 0);
2822 ic->audio_codec_id = find_codec_or_die(audio_codec_name , CODEC_TYPE_AUDIO , 0);
2823 ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 0);
2825 /* open the input file with generic libav function */
2826 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2827 if (err < 0) {
2828 print_error(filename, err);
2829 av_exit(1);
2831 if(opt_programid) {
2832 int i;
2833 for(i=0; i<ic->nb_programs; i++)
2834 if(ic->programs[i]->id != opt_programid)
2835 ic->programs[i]->discard = AVDISCARD_ALL;
2838 ic->loop_input = loop_input;
2840 /* If not enough info to get the stream parameters, we decode the
2841 first frames to get it. (used in mpeg case for example) */
2842 ret = av_find_stream_info(ic);
2843 if (ret < 0 && verbose >= 0) {
2844 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2845 av_exit(1);
2848 timestamp = start_time;
2849 /* add the stream start time */
2850 if (ic->start_time != AV_NOPTS_VALUE)
2851 timestamp += ic->start_time;
2853 /* if seeking requested, we execute it */
2854 if (start_time != 0) {
2855 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2856 if (ret < 0) {
2857 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2858 filename, (double)timestamp / AV_TIME_BASE);
2860 /* reset seek info */
2861 start_time = 0;
2864 /* update the current parameters so that they match the one of the input stream */
2865 for(i=0;i<ic->nb_streams;i++) {
2866 AVCodecContext *enc = ic->streams[i]->codec;
2867 if(thread_count>1)
2868 avcodec_thread_init(enc, thread_count);
2869 enc->thread_count= thread_count;
2870 switch(enc->codec_type) {
2871 case CODEC_TYPE_AUDIO:
2872 set_context_opts(enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2873 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2874 audio_channels = enc->channels;
2875 audio_sample_rate = enc->sample_rate;
2876 audio_sample_fmt = enc->sample_fmt;
2877 if(audio_disable)
2878 ic->streams[i]->discard= AVDISCARD_ALL;
2879 break;
2880 case CODEC_TYPE_VIDEO:
2881 set_context_opts(enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2882 frame_height = enc->height;
2883 frame_width = enc->width;
2884 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2885 frame_pix_fmt = enc->pix_fmt;
2886 rfps = ic->streams[i]->r_frame_rate.num;
2887 rfps_base = ic->streams[i]->r_frame_rate.den;
2888 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2889 if(me_threshold)
2890 enc->debug |= FF_DEBUG_MV;
2892 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2894 if (verbose >= 0)
2895 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2896 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2898 (float)rfps / rfps_base, rfps, rfps_base);
2900 /* update the current frame rate to match the stream frame rate */
2901 frame_rate.num = rfps;
2902 frame_rate.den = rfps_base;
2904 enc->rate_emu = rate_emu;
2905 if(video_disable)
2906 ic->streams[i]->discard= AVDISCARD_ALL;
2907 else if(video_discard)
2908 ic->streams[i]->discard= video_discard;
2909 break;
2910 case CODEC_TYPE_DATA:
2911 break;
2912 case CODEC_TYPE_SUBTITLE:
2913 if(subtitle_disable)
2914 ic->streams[i]->discard = AVDISCARD_ALL;
2915 break;
2916 case CODEC_TYPE_ATTACHMENT:
2917 case CODEC_TYPE_UNKNOWN:
2918 break;
2919 default:
2920 abort();
2924 input_files[nb_input_files] = ic;
2925 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2926 /* dump the file content */
2927 if (verbose >= 0)
2928 dump_format(ic, nb_input_files, filename, 0);
2930 nb_input_files++;
2931 file_iformat = NULL;
2932 file_oformat = NULL;
2934 video_channel = 0;
2936 rate_emu = 0;
2937 av_freep(&video_codec_name);
2938 av_freep(&audio_codec_name);
2939 av_freep(&subtitle_codec_name);
2942 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
2943 int *has_subtitle_ptr)
2945 int has_video, has_audio, has_subtitle, i, j;
2946 AVFormatContext *ic;
2948 has_video = 0;
2949 has_audio = 0;
2950 has_subtitle = 0;
2951 for(j=0;j<nb_input_files;j++) {
2952 ic = input_files[j];
2953 for(i=0;i<ic->nb_streams;i++) {
2954 AVCodecContext *enc = ic->streams[i]->codec;
2955 switch(enc->codec_type) {
2956 case CODEC_TYPE_AUDIO:
2957 has_audio = 1;
2958 break;
2959 case CODEC_TYPE_VIDEO:
2960 has_video = 1;
2961 break;
2962 case CODEC_TYPE_SUBTITLE:
2963 has_subtitle = 1;
2964 break;
2965 case CODEC_TYPE_DATA:
2966 case CODEC_TYPE_ATTACHMENT:
2967 case CODEC_TYPE_UNKNOWN:
2968 break;
2969 default:
2970 abort();
2974 *has_video_ptr = has_video;
2975 *has_audio_ptr = has_audio;
2976 *has_subtitle_ptr = has_subtitle;
2979 static void new_video_stream(AVFormatContext *oc)
2981 AVStream *st;
2982 AVCodecContext *video_enc;
2983 int codec_id;
2985 st = av_new_stream(oc, oc->nb_streams);
2986 if (!st) {
2987 fprintf(stderr, "Could not alloc stream\n");
2988 av_exit(1);
2990 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
2991 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
2992 video_bitstream_filters= NULL;
2994 if(thread_count>1)
2995 avcodec_thread_init(st->codec, thread_count);
2997 video_enc = st->codec;
2999 if(video_codec_tag)
3000 video_enc->codec_tag= video_codec_tag;
3002 if( (video_global_header&1)
3003 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3004 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3005 avctx_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3007 if(video_global_header&2){
3008 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3009 avctx_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3012 if (video_stream_copy) {
3013 st->stream_copy = 1;
3014 video_enc->codec_type = CODEC_TYPE_VIDEO;
3015 } else {
3016 const char *p;
3017 int i;
3018 AVCodec *codec;
3019 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3021 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
3022 if (video_codec_name)
3023 codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
3025 video_enc->codec_id = codec_id;
3026 codec = avcodec_find_encoder(codec_id);
3028 set_context_opts(video_enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3030 video_enc->time_base.den = fps.num;
3031 video_enc->time_base.num = fps.den;
3032 if(codec && codec->supported_framerates){
3033 const AVRational *p= codec->supported_framerates;
3034 const AVRational *best=NULL;
3035 AVRational best_error= (AVRational){INT_MAX, 1};
3036 for(; p->den!=0; p++){
3037 AVRational error= av_sub_q(fps, *p);
3038 if(error.num <0) error.num *= -1;
3039 if(av_cmp_q(error, best_error) < 0){
3040 best_error= error;
3041 best= p;
3044 video_enc->time_base.den= best->num;
3045 video_enc->time_base.num= best->den;
3048 video_enc->width = frame_width + frame_padright + frame_padleft;
3049 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3050 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3051 video_enc->pix_fmt = frame_pix_fmt;
3053 if(codec && codec->pix_fmts){
3054 const enum PixelFormat *p= codec->pix_fmts;
3055 for(; *p!=-1; p++){
3056 if(*p == video_enc->pix_fmt)
3057 break;
3059 if(*p == -1)
3060 video_enc->pix_fmt = codec->pix_fmts[0];
3063 if (intra_only)
3064 video_enc->gop_size = 0;
3065 if (video_qscale || same_quality) {
3066 video_enc->flags |= CODEC_FLAG_QSCALE;
3067 video_enc->global_quality=
3068 st->quality = FF_QP2LAMBDA * video_qscale;
3071 if(intra_matrix)
3072 video_enc->intra_matrix = intra_matrix;
3073 if(inter_matrix)
3074 video_enc->inter_matrix = inter_matrix;
3076 video_enc->thread_count = thread_count;
3077 p= video_rc_override_string;
3078 for(i=0; p; i++){
3079 int start, end, q;
3080 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3081 if(e!=3){
3082 fprintf(stderr, "error parsing rc_override\n");
3083 av_exit(1);
3085 video_enc->rc_override=
3086 av_realloc(video_enc->rc_override,
3087 sizeof(RcOverride)*(i+1));
3088 video_enc->rc_override[i].start_frame= start;
3089 video_enc->rc_override[i].end_frame = end;
3090 if(q>0){
3091 video_enc->rc_override[i].qscale= q;
3092 video_enc->rc_override[i].quality_factor= 1.0;
3094 else{
3095 video_enc->rc_override[i].qscale= 0;
3096 video_enc->rc_override[i].quality_factor= -q/100.0;
3098 p= strchr(p, '/');
3099 if(p) p++;
3101 video_enc->rc_override_count=i;
3102 if (!video_enc->rc_initial_buffer_occupancy)
3103 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3104 video_enc->me_threshold= me_threshold;
3105 video_enc->intra_dc_precision= intra_dc_precision - 8;
3107 if (do_psnr)
3108 video_enc->flags|= CODEC_FLAG_PSNR;
3110 /* two pass mode */
3111 if (do_pass) {
3112 if (do_pass == 1) {
3113 video_enc->flags |= CODEC_FLAG_PASS1;
3114 } else {
3115 video_enc->flags |= CODEC_FLAG_PASS2;
3120 /* reset some key parameters */
3121 video_disable = 0;
3122 av_freep(&video_codec_name);
3123 video_stream_copy = 0;
3126 static void new_audio_stream(AVFormatContext *oc)
3128 AVStream *st;
3129 AVCodecContext *audio_enc;
3130 int codec_id;
3132 st = av_new_stream(oc, oc->nb_streams);
3133 if (!st) {
3134 fprintf(stderr, "Could not alloc stream\n");
3135 av_exit(1);
3137 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
3139 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
3140 audio_bitstream_filters= NULL;
3142 if(thread_count>1)
3143 avcodec_thread_init(st->codec, thread_count);
3145 audio_enc = st->codec;
3146 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3148 if(audio_codec_tag)
3149 audio_enc->codec_tag= audio_codec_tag;
3151 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3152 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3153 avctx_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3155 if (audio_stream_copy) {
3156 st->stream_copy = 1;
3157 audio_enc->channels = audio_channels;
3158 } else {
3159 AVCodec *codec;
3160 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3162 set_context_opts(audio_enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3164 if (audio_codec_name)
3165 codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
3166 audio_enc->codec_id = codec_id;
3167 codec = avcodec_find_encoder(codec_id);
3169 if (audio_qscale > QSCALE_NONE) {
3170 audio_enc->flags |= CODEC_FLAG_QSCALE;
3171 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3173 audio_enc->thread_count = thread_count;
3174 audio_enc->channels = audio_channels;
3175 audio_enc->sample_fmt = audio_sample_fmt;
3177 if(codec && codec->sample_fmts){
3178 const enum SampleFormat *p= codec->sample_fmts;
3179 for(; *p!=-1; p++){
3180 if(*p == audio_enc->sample_fmt)
3181 break;
3183 if(*p == -1)
3184 audio_enc->sample_fmt = codec->sample_fmts[0];
3187 audio_enc->sample_rate = audio_sample_rate;
3188 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3189 if (audio_language) {
3190 av_strlcpy(st->language, audio_language, sizeof(st->language));
3191 av_free(audio_language);
3192 audio_language = NULL;
3195 /* reset some key parameters */
3196 audio_disable = 0;
3197 av_freep(&audio_codec_name);
3198 audio_stream_copy = 0;
3201 static void new_subtitle_stream(AVFormatContext *oc)
3203 AVStream *st;
3204 AVCodecContext *subtitle_enc;
3206 st = av_new_stream(oc, oc->nb_streams);
3207 if (!st) {
3208 fprintf(stderr, "Could not alloc stream\n");
3209 av_exit(1);
3211 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
3213 bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
3214 subtitle_bitstream_filters= NULL;
3216 subtitle_enc = st->codec;
3217 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3218 if (subtitle_stream_copy) {
3219 st->stream_copy = 1;
3220 } else {
3221 set_context_opts(avctx_opts[CODEC_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3222 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1);
3225 if (subtitle_language) {
3226 av_strlcpy(st->language, subtitle_language, sizeof(st->language));
3227 av_free(subtitle_language);
3228 subtitle_language = NULL;
3231 subtitle_disable = 0;
3232 av_freep(&subtitle_codec_name);
3233 subtitle_stream_copy = 0;
3236 static void opt_new_audio_stream(void)
3238 AVFormatContext *oc;
3239 if (nb_output_files <= 0) {
3240 fprintf(stderr, "At least one output file must be specified\n");
3241 av_exit(1);
3243 oc = output_files[nb_output_files - 1];
3244 new_audio_stream(oc);
3247 static void opt_new_video_stream(void)
3249 AVFormatContext *oc;
3250 if (nb_output_files <= 0) {
3251 fprintf(stderr, "At least one output file must be specified\n");
3252 av_exit(1);
3254 oc = output_files[nb_output_files - 1];
3255 new_video_stream(oc);
3258 static void opt_new_subtitle_stream(void)
3260 AVFormatContext *oc;
3261 if (nb_output_files <= 0) {
3262 fprintf(stderr, "At least one output file must be specified\n");
3263 av_exit(1);
3265 oc = output_files[nb_output_files - 1];
3266 new_subtitle_stream(oc);
3269 static void opt_output_file(const char *filename)
3271 AVFormatContext *oc;
3272 int use_video, use_audio, use_subtitle;
3273 int input_has_video, input_has_audio, input_has_subtitle;
3274 AVFormatParameters params, *ap = &params;
3276 if (!strcmp(filename, "-"))
3277 filename = "pipe:";
3279 oc = av_alloc_format_context();
3281 if (!file_oformat) {
3282 file_oformat = guess_format(NULL, filename, NULL);
3283 if (!file_oformat) {
3284 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3285 filename);
3286 av_exit(1);
3290 oc->oformat = file_oformat;
3291 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3293 if (!strcmp(file_oformat->name, "ffm") &&
3294 av_strstart(filename, "http:", NULL)) {
3295 /* special case for files sent to ffserver: we get the stream
3296 parameters from ffserver */
3297 int err = read_ffserver_streams(oc, filename);
3298 if (err < 0) {
3299 print_error(filename, err);
3300 av_exit(1);
3302 } else {
3303 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3304 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3305 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3307 /* disable if no corresponding type found and at least one
3308 input file */
3309 if (nb_input_files > 0) {
3310 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3311 &input_has_subtitle);
3312 if (!input_has_video)
3313 use_video = 0;
3314 if (!input_has_audio)
3315 use_audio = 0;
3316 if (!input_has_subtitle)
3317 use_subtitle = 0;
3320 /* manual disable */
3321 if (audio_disable) {
3322 use_audio = 0;
3324 if (video_disable) {
3325 use_video = 0;
3327 if (subtitle_disable) {
3328 use_subtitle = 0;
3331 if (use_video) {
3332 new_video_stream(oc);
3335 if (use_audio) {
3336 new_audio_stream(oc);
3339 if (use_subtitle) {
3340 new_subtitle_stream(oc);
3343 oc->timestamp = rec_timestamp;
3345 if (str_title)
3346 av_strlcpy(oc->title, str_title, sizeof(oc->title));
3347 if (str_author)
3348 av_strlcpy(oc->author, str_author, sizeof(oc->author));
3349 if (str_copyright)
3350 av_strlcpy(oc->copyright, str_copyright, sizeof(oc->copyright));
3351 if (str_comment)
3352 av_strlcpy(oc->comment, str_comment, sizeof(oc->comment));
3353 if (str_album)
3354 av_strlcpy(oc->album, str_album, sizeof(oc->album));
3355 if (str_genre)
3356 av_strlcpy(oc->genre, str_genre, sizeof(oc->genre));
3359 output_files[nb_output_files++] = oc;
3361 /* check filename in case of an image number is expected */
3362 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3363 if (!av_filename_number_test(oc->filename)) {
3364 print_error(oc->filename, AVERROR_NUMEXPECTED);
3365 av_exit(1);
3369 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3370 /* test if it already exists to avoid loosing precious files */
3371 if (!file_overwrite &&
3372 (strchr(filename, ':') == NULL ||
3373 filename[1] == ':' ||
3374 av_strstart(filename, "file:", NULL))) {
3375 if (url_exist(filename)) {
3376 int c;
3378 if (!using_stdin) {
3379 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3380 fflush(stderr);
3381 c = getchar();
3382 if (toupper(c) != 'Y') {
3383 fprintf(stderr, "Not overwriting - exiting\n");
3384 av_exit(1);
3387 else {
3388 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3389 av_exit(1);
3394 /* open the file */
3395 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3396 fprintf(stderr, "Could not open '%s'\n", filename);
3397 av_exit(1);
3401 memset(ap, 0, sizeof(*ap));
3402 if (av_set_parameters(oc, ap) < 0) {
3403 fprintf(stderr, "%s: Invalid encoding parameters\n",
3404 oc->filename);
3405 av_exit(1);
3408 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3409 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3410 oc->loop_output = loop_output;
3412 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
3414 /* reset some options */
3415 file_oformat = NULL;
3416 file_iformat = NULL;
3419 /* same option as mencoder */
3420 static void opt_pass(const char *pass_str)
3422 int pass;
3423 pass = atoi(pass_str);
3424 if (pass != 1 && pass != 2) {
3425 fprintf(stderr, "pass number can be only 1 or 2\n");
3426 av_exit(1);
3428 do_pass = pass;
3431 static int64_t getutime(void)
3433 #ifdef HAVE_GETRUSAGE
3434 struct rusage rusage;
3436 getrusage(RUSAGE_SELF, &rusage);
3437 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3438 #elif defined(HAVE_GETPROCESSTIMES)
3439 HANDLE proc;
3440 FILETIME c, e, k, u;
3441 proc = GetCurrentProcess();
3442 GetProcessTimes(proc, &c, &e, &k, &u);
3443 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3444 #else
3445 return av_gettime();
3446 #endif
3449 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3451 int i;
3452 const char *p = str;
3453 for(i = 0;; i++) {
3454 dest[i] = atoi(p);
3455 if(i == 63)
3456 break;
3457 p = strchr(p, ',');
3458 if(!p) {
3459 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3460 av_exit(1);
3462 p++;
3466 static void opt_inter_matrix(const char *arg)
3468 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3469 parse_matrix_coeffs(inter_matrix, arg);
3472 static void opt_intra_matrix(const char *arg)
3474 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3475 parse_matrix_coeffs(intra_matrix, arg);
3479 * Trivial log callback.
3480 * Only suitable for show_help and similar since it lacks prefix handling.
3482 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
3484 vfprintf(stdout, fmt, vl);
3487 static void show_help(void)
3489 av_log_set_callback(log_callback_help);
3490 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3491 "Hyper fast Audio and Video encoder\n");
3492 printf("\n");
3493 show_help_options(options, "Main options:\n",
3494 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3495 show_help_options(options, "\nAdvanced options:\n",
3496 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3497 OPT_EXPERT);
3498 show_help_options(options, "\nVideo options:\n",
3499 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3500 OPT_VIDEO);
3501 show_help_options(options, "\nAdvanced Video options:\n",
3502 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3503 OPT_VIDEO | OPT_EXPERT);
3504 show_help_options(options, "\nAudio options:\n",
3505 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3506 OPT_AUDIO);
3507 show_help_options(options, "\nAdvanced Audio options:\n",
3508 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3509 OPT_AUDIO | OPT_EXPERT);
3510 show_help_options(options, "\nSubtitle options:\n",
3511 OPT_SUBTITLE | OPT_GRAB,
3512 OPT_SUBTITLE);
3513 show_help_options(options, "\nAudio/Video grab options:\n",
3514 OPT_GRAB,
3515 OPT_GRAB);
3516 printf("\n");
3517 av_opt_show(avctx_opts[0], NULL);
3518 printf("\n");
3519 av_opt_show(avformat_opts, NULL);
3520 printf("\n");
3521 av_opt_show(sws_opts, NULL);
3524 static void opt_target(const char *arg)
3526 int norm = -1;
3527 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3529 if(!strncmp(arg, "pal-", 4)) {
3530 norm = 0;
3531 arg += 4;
3532 } else if(!strncmp(arg, "ntsc-", 5)) {
3533 norm = 1;
3534 arg += 5;
3535 } else if(!strncmp(arg, "film-", 5)) {
3536 norm = 2;
3537 arg += 5;
3538 } else {
3539 int fr;
3540 /* Calculate FR via float to avoid int overflow */
3541 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3542 if(fr == 25000) {
3543 norm = 0;
3544 } else if((fr == 29970) || (fr == 23976)) {
3545 norm = 1;
3546 } else {
3547 /* Try to determine PAL/NTSC by peeking in the input files */
3548 if(nb_input_files) {
3549 int i, j;
3550 for(j = 0; j < nb_input_files; j++) {
3551 for(i = 0; i < input_files[j]->nb_streams; i++) {
3552 AVCodecContext *c = input_files[j]->streams[i]->codec;
3553 if(c->codec_type != CODEC_TYPE_VIDEO)
3554 continue;
3555 fr = c->time_base.den * 1000 / c->time_base.num;
3556 if(fr == 25000) {
3557 norm = 0;
3558 break;
3559 } else if((fr == 29970) || (fr == 23976)) {
3560 norm = 1;
3561 break;
3564 if(norm >= 0)
3565 break;
3569 if(verbose && norm >= 0)
3570 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3573 if(norm < 0) {
3574 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3575 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3576 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3577 av_exit(1);
3580 if(!strcmp(arg, "vcd")) {
3582 opt_video_codec("mpeg1video");
3583 opt_audio_codec("mp2");
3584 opt_format("vcd");
3586 opt_frame_size(norm ? "352x240" : "352x288");
3587 opt_frame_rate(frame_rates[norm]);
3588 opt_default("gop", norm ? "18" : "15");
3590 opt_default("b", "1150000");
3591 opt_default("maxrate", "1150000");
3592 opt_default("minrate", "1150000");
3593 opt_default("bufsize", "327680"); // 40*1024*8;
3595 opt_default("ab", "224000");
3596 audio_sample_rate = 44100;
3597 audio_channels = 2;
3599 opt_default("packetsize", "2324");
3600 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3602 /* We have to offset the PTS, so that it is consistent with the SCR.
3603 SCR starts at 36000, but the first two packs contain only padding
3604 and the first pack from the other stream, respectively, may also have
3605 been written before.
3606 So the real data starts at SCR 36000+3*1200. */
3607 mux_preload= (36000+3*1200) / 90000.0; //0.44
3608 } else if(!strcmp(arg, "svcd")) {
3610 opt_video_codec("mpeg2video");
3611 opt_audio_codec("mp2");
3612 opt_format("svcd");
3614 opt_frame_size(norm ? "480x480" : "480x576");
3615 opt_frame_rate(frame_rates[norm]);
3616 opt_default("gop", norm ? "18" : "15");
3618 opt_default("b", "2040000");
3619 opt_default("maxrate", "2516000");
3620 opt_default("minrate", "0"); //1145000;
3621 opt_default("bufsize", "1835008"); //224*1024*8;
3622 opt_default("flags", "+SCAN_OFFSET");
3625 opt_default("ab", "224000");
3626 audio_sample_rate = 44100;
3628 opt_default("packetsize", "2324");
3630 } else if(!strcmp(arg, "dvd")) {
3632 opt_video_codec("mpeg2video");
3633 opt_audio_codec("ac3");
3634 opt_format("dvd");
3636 opt_frame_size(norm ? "720x480" : "720x576");
3637 opt_frame_rate(frame_rates[norm]);
3638 opt_default("gop", norm ? "18" : "15");
3640 opt_default("b", "6000000");
3641 opt_default("maxrate", "9000000");
3642 opt_default("minrate", "0"); //1500000;
3643 opt_default("bufsize", "1835008"); //224*1024*8;
3645 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3646 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3648 opt_default("ab", "448000");
3649 audio_sample_rate = 48000;
3651 } else if(!strncmp(arg, "dv", 2)) {
3653 opt_format("dv");
3655 opt_frame_size(norm ? "720x480" : "720x576");
3656 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3657 (norm ? "yuv411p" : "yuv420p"));
3658 opt_frame_rate(frame_rates[norm]);
3660 audio_sample_rate = 48000;
3661 audio_channels = 2;
3663 } else {
3664 fprintf(stderr, "Unknown target: %s\n", arg);
3665 av_exit(1);
3669 static void opt_vstats_file (const char *arg)
3671 av_free (vstats_filename);
3672 vstats_filename=av_strdup (arg);
3675 static void opt_vstats (void)
3677 char filename[40];
3678 time_t today2 = time(NULL);
3679 struct tm *today = localtime(&today2);
3681 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3682 today->tm_sec);
3683 opt_vstats_file(filename);
3686 static int opt_bsf(const char *opt, const char *arg)
3688 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3689 AVBitStreamFilterContext **bsfp;
3691 if(!bsfc){
3692 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3693 av_exit(1);
3696 bsfp= *opt == 'v' ? &video_bitstream_filters :
3697 *opt == 'a' ? &audio_bitstream_filters :
3698 &subtitle_bitstream_filters;
3699 while(*bsfp)
3700 bsfp= &(*bsfp)->next;
3702 *bsfp= bsfc;
3704 return 0;
3707 static int opt_preset(const char *opt, const char *arg)
3709 FILE *f=NULL;
3710 char tmp[1000], tmp2[1000];
3711 int i;
3712 const char *base[3]= { getenv("HOME"),
3713 "/usr/local/share",
3714 "/usr/share",
3717 for(i=!base[0]; i<3 && !f; i++){
3718 snprintf(tmp, sizeof(tmp), "%s/%sffmpeg/%s.ffpreset", base[i], i ? "" : ".", arg);
3719 f= fopen(tmp, "r");
3720 if(!f){
3721 char *codec_name= *opt == 'v' ? video_codec_name :
3722 *opt == 'a' ? audio_codec_name :
3723 subtitle_codec_name;
3724 snprintf(tmp, sizeof(tmp), "%s/%sffmpeg/%s-%s.ffpreset", base[i], i ? "" : ".", codec_name, arg);
3725 f= fopen(tmp, "r");
3729 if(!f){
3730 fprintf(stderr, "Preset file not found\n");
3731 av_exit(1);
3734 while(!feof(f)){
3735 int e= fscanf(f, "%999[^=]=%999[^\n]\n", tmp, tmp2);
3736 if(e!=2){
3737 fprintf(stderr, "Preset file invalid\n");
3738 av_exit(1);
3740 if(!strcmp(tmp, "acodec")){
3741 opt_audio_codec(tmp2);
3742 }else if(!strcmp(tmp, "vcodec")){
3743 opt_video_codec(tmp2);
3744 }else if(!strcmp(tmp, "scodec")){
3745 opt_subtitle_codec(tmp2);
3746 }else
3747 opt_default(tmp, tmp2);
3750 fclose(f);
3752 return 0;
3755 static const OptionDef options[] = {
3756 /* main options */
3757 { "L", OPT_EXIT, {(void*)show_license}, "show license" },
3758 { "h", OPT_EXIT, {(void*)show_help}, "show help" },
3759 { "version", OPT_EXIT, {(void*)show_version}, "show version" },
3760 { "formats", OPT_EXIT, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3761 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3762 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3763 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3764 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3765 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3766 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3767 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3768 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3769 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3770 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
3771 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3772 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3773 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3774 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3775 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3776 { "genre", HAS_ARG | OPT_STRING, {(void*)&str_genre}, "set the genre", "string" },
3777 { "album", HAS_ARG | OPT_STRING, {(void*)&str_album}, "set the album", "string" },
3778 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3779 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3780 "add timings for benchmarking" },
3781 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3782 "dump each input packet" },
3783 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3784 "when dumping packets, also dump the payload" },
3785 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3786 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3787 { "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)", "" },
3788 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set the logging verbosity level", "number" },
3789 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3790 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3791 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3792 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3793 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3794 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3795 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)&copy_ts}, "copy timestamps" },
3796 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3797 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3798 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3800 /* video options */
3801 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3802 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3803 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3804 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3805 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3806 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3807 { "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" },
3808 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3809 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3810 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3811 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3812 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3813 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3814 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3815 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3816 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3817 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3818 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3819 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3820 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3821 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3822 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3823 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
3824 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3825 "use same video quality as source (implies VBR)" },
3826 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3827 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3828 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3829 "deinterlace pictures" },
3830 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3831 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
3832 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
3833 #ifdef CONFIG_VHOOK
3834 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3835 #endif
3836 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3837 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3838 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3839 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3840 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3841 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3842 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3844 /* audio options */
3845 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3846 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3847 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3848 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3849 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3850 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3851 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3852 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3853 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3854 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3855 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3856 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_sample_fmt}, "set sample format, 'list' as argument shows all the sample formats supported", "format" },
3858 /* subtitle options */
3859 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
3860 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3861 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
3862 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3864 /* grab options */
3865 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3866 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3867 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3869 /* muxer options */
3870 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
3871 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
3873 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3874 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3875 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3877 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3878 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3879 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3881 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
3882 { NULL, },
3885 int main(int argc, char **argv)
3887 int i;
3888 int64_t ti;
3890 avcodec_register_all();
3891 avdevice_register_all();
3892 av_register_all();
3894 if(isatty(STDIN_FILENO))
3895 url_set_interrupt_cb(decode_interrupt_cb);
3897 for(i=0; i<CODEC_TYPE_NB; i++){
3898 avctx_opts[i]= avcodec_alloc_context2(i);
3900 avformat_opts = av_alloc_format_context();
3901 sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
3903 show_banner();
3904 if (argc <= 1) {
3905 show_help();
3906 av_exit(1);
3909 /* parse options */
3910 parse_options(argc, argv, options, opt_output_file);
3912 /* file converter / grab */
3913 if (nb_output_files <= 0) {
3914 fprintf(stderr, "Must supply at least one output file\n");
3915 av_exit(1);
3918 if (nb_input_files == 0) {
3919 fprintf(stderr, "Must supply at least one input file\n");
3920 av_exit(1);
3923 ti = getutime();
3924 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3925 stream_maps, nb_stream_maps);
3926 ti = getutime() - ti;
3927 if (do_benchmark) {
3928 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3931 return av_exit(0);