Remove offset_t typedef and use int64_t directly instead.
[FFMpeg-mirror/ffmpeg-vdpau.git] / ffmpeg.c
blobc64100c7af81abf0084c775a24dd0a2518b304f5
1 /*
2 * FFmpeg main
3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 /* needed for usleep() */
23 #define _XOPEN_SOURCE 600
25 #include "config.h"
26 #include <ctype.h>
27 #include <string.h>
28 #include <math.h>
29 #include <stdlib.h>
30 #include <errno.h>
31 #include <signal.h>
32 #include <limits.h>
33 #include <unistd.h>
34 #include "libavformat/avformat.h"
35 #include "libavdevice/avdevice.h"
36 #include "libswscale/swscale.h"
37 #include "libavformat/framehook.h"
38 #include "libavcodec/opt.h"
39 #include "libavcodec/audioconvert.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/avstring.h"
42 #include "libavformat/os_support.h"
44 #ifdef HAVE_SYS_RESOURCE_H
45 #include <sys/types.h>
46 #include <sys/resource.h>
47 #elif defined(HAVE_GETPROCESSTIMES)
48 #include <windows.h>
49 #endif
51 #ifdef HAVE_SYS_SELECT_H
52 #include <sys/select.h>
53 #endif
55 #ifdef HAVE_TERMIOS_H
56 #include <fcntl.h>
57 #include <sys/ioctl.h>
58 #include <sys/time.h>
59 #include <termios.h>
60 #elif defined(HAVE_CONIO_H)
61 #include <conio.h>
62 #endif
63 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
64 #include <time.h>
66 #include "cmdutils.h"
68 #undef NDEBUG
69 #include <assert.h>
71 #undef exit
73 const char program_name[] = "FFmpeg";
74 const int program_birth_year = 2000;
76 /* select an input stream for an output stream */
77 typedef struct AVStreamMap {
78 int file_index;
79 int stream_index;
80 int sync_file_index;
81 int sync_stream_index;
82 } AVStreamMap;
84 /** select an input file for an output file */
85 typedef struct AVMetaDataMap {
86 int out_file;
87 int in_file;
88 } AVMetaDataMap;
90 static const OptionDef options[];
92 #define MAX_FILES 20
94 static AVFormatContext *input_files[MAX_FILES];
95 static int64_t input_files_ts_offset[MAX_FILES];
96 static double input_files_ts_scale[MAX_FILES][MAX_STREAMS];
97 static int nb_input_files = 0;
99 static AVFormatContext *output_files[MAX_FILES];
100 static int nb_output_files = 0;
102 static AVStreamMap stream_maps[MAX_FILES*MAX_STREAMS];
103 static int nb_stream_maps;
105 static AVMetaDataMap meta_data_maps[MAX_FILES];
106 static int nb_meta_data_maps;
108 static AVInputFormat *file_iformat;
109 static AVOutputFormat *file_oformat;
110 static int frame_width = 0;
111 static int frame_height = 0;
112 static float frame_aspect_ratio = 0;
113 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
114 static enum SampleFormat audio_sample_fmt = SAMPLE_FMT_NONE;
115 static int frame_padtop = 0;
116 static int frame_padbottom = 0;
117 static int frame_padleft = 0;
118 static int frame_padright = 0;
119 static int padcolor[3] = {16,128,128}; /* default to black */
120 static int frame_topBand = 0;
121 static int frame_bottomBand = 0;
122 static int frame_leftBand = 0;
123 static int frame_rightBand = 0;
124 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
125 static AVRational frame_rate;
126 static float video_qscale = 0;
127 static uint16_t *intra_matrix = NULL;
128 static uint16_t *inter_matrix = NULL;
129 #if 0 //experimental, (can be removed)
130 static float video_rc_qsquish=1.0;
131 static float video_rc_qmod_amp=0;
132 static int video_rc_qmod_freq=0;
133 #endif
134 static const char *video_rc_override_string=NULL;
135 static int video_disable = 0;
136 static int video_discard = 0;
137 static char *video_codec_name = NULL;
138 static int video_codec_tag = 0;
139 static int same_quality = 0;
140 static int do_deinterlace = 0;
141 static int top_field_first = -1;
142 static int me_threshold = 0;
143 static int intra_dc_precision = 8;
144 static int loop_input = 0;
145 static int loop_output = AVFMT_NOOUTPUTLOOP;
146 static int qp_hist = 0;
148 static int intra_only = 0;
149 static int audio_sample_rate = 44100;
150 #define QSCALE_NONE -99999
151 static float audio_qscale = QSCALE_NONE;
152 static int audio_disable = 0;
153 static int audio_channels = 1;
154 static char *audio_codec_name = NULL;
155 static int audio_codec_tag = 0;
156 static char *audio_language = NULL;
158 static int subtitle_disable = 0;
159 static char *subtitle_codec_name = NULL;
160 static char *subtitle_language = NULL;
162 static float mux_preload= 0.5;
163 static float mux_max_delay= 0.7;
165 static int64_t recording_time = INT64_MAX;
166 static int64_t start_time = 0;
167 static int64_t rec_timestamp = 0;
168 static int64_t input_ts_offset = 0;
169 static int file_overwrite = 0;
170 static char *str_title = NULL;
171 static char *str_author = NULL;
172 static char *str_copyright = NULL;
173 static char *str_comment = NULL;
174 static char *str_genre = NULL;
175 static char *str_album = NULL;
176 static int do_benchmark = 0;
177 static int do_hex_dump = 0;
178 static int do_pkt_dump = 0;
179 static int do_psnr = 0;
180 static int do_pass = 0;
181 static char *pass_logfilename = NULL;
182 static int audio_stream_copy = 0;
183 static int video_stream_copy = 0;
184 static int subtitle_stream_copy = 0;
185 static int video_sync_method= -1;
186 static int audio_sync_method= 0;
187 static float audio_drift_threshold= 0.1;
188 static int copy_ts= 0;
189 static int opt_shortest = 0; //
190 static int video_global_header = 0;
191 static char *vstats_filename;
192 static FILE *vstats_file;
193 static int opt_programid = 0;
195 static int rate_emu = 0;
197 static int video_channel = 0;
198 static char *video_standard;
200 static int audio_volume = 256;
202 static int exit_on_error = 0;
203 static int using_stdin = 0;
204 static int using_vhook = 0;
205 static int verbose = 1;
206 static int thread_count= 1;
207 static int q_pressed = 0;
208 static int64_t video_size = 0;
209 static int64_t audio_size = 0;
210 static int64_t extra_size = 0;
211 static int nb_frames_dup = 0;
212 static int nb_frames_drop = 0;
213 static int input_sync;
214 static uint64_t limit_filesize = 0; //
215 static int force_fps = 0;
217 static int pgmyuv_compatibility_hack=0;
218 static float dts_delta_threshold = 10;
220 static unsigned int sws_flags = SWS_BICUBIC;
222 static int64_t timer_start;
224 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
225 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
226 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
227 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
229 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
231 struct AVInputStream;
233 typedef struct AVOutputStream {
234 int file_index; /* file index */
235 int index; /* stream index in the output file */
236 int source_index; /* AVInputStream index */
237 AVStream *st; /* stream in the output file */
238 int encoding_needed; /* true if encoding needed for this stream */
239 int frame_number;
240 /* input pts and corresponding output pts
241 for A/V sync */
242 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
243 struct AVInputStream *sync_ist; /* input stream to sync against */
244 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
245 /* video only */
246 int video_resample;
247 AVFrame pict_tmp; /* temporary image for resampling */
248 struct SwsContext *img_resample_ctx; /* for image resampling */
249 int resample_height;
251 int video_crop;
252 int topBand; /* cropping area sizes */
253 int leftBand;
255 int video_pad;
256 int padtop; /* padding area sizes */
257 int padbottom;
258 int padleft;
259 int padright;
261 /* audio only */
262 int audio_resample;
263 ReSampleContext *resample; /* for audio resampling */
264 int reformat_pair;
265 AVAudioConvert *reformat_ctx;
266 AVFifoBuffer fifo; /* for compression: one audio fifo per codec */
267 FILE *logfile;
268 } AVOutputStream;
270 typedef struct AVInputStream {
271 int file_index;
272 int index;
273 AVStream *st;
274 int discard; /* true if stream data should be discarded */
275 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
276 int64_t sample_index; /* current sample */
278 int64_t start; /* time when read started */
279 unsigned long frame; /* current frame */
280 int64_t next_pts; /* synthetic pts for cases where pkt.pts
281 is not defined */
282 int64_t pts; /* current pts */
283 int is_start; /* is 1 at the start and after a discontinuity */
284 } AVInputStream;
286 typedef struct AVInputFile {
287 int eof_reached; /* true if eof reached */
288 int ist_index; /* index of first stream in ist_table */
289 int buffer_size; /* current total buffer size */
290 int nb_streams; /* nb streams we are aware of */
291 } AVInputFile;
293 #ifdef HAVE_TERMIOS_H
295 /* init terminal so that we can grab keys */
296 static struct termios oldtty;
297 #endif
299 static void term_exit(void)
301 #ifdef HAVE_TERMIOS_H
302 tcsetattr (0, TCSANOW, &oldtty);
303 #endif
306 static volatile sig_atomic_t received_sigterm = 0;
308 static void
309 sigterm_handler(int sig)
311 received_sigterm = sig;
312 term_exit();
315 static void term_init(void)
317 #ifdef HAVE_TERMIOS_H
318 struct termios tty;
320 tcgetattr (0, &tty);
321 oldtty = tty;
323 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
324 |INLCR|IGNCR|ICRNL|IXON);
325 tty.c_oflag |= OPOST;
326 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
327 tty.c_cflag &= ~(CSIZE|PARENB);
328 tty.c_cflag |= CS8;
329 tty.c_cc[VMIN] = 1;
330 tty.c_cc[VTIME] = 0;
332 tcsetattr (0, TCSANOW, &tty);
333 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
334 #endif
336 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
337 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
339 register a function to be called at normal program termination
341 atexit(term_exit);
342 #ifdef CONFIG_BEOS_NETSERVER
343 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
344 #endif
347 /* read a key without blocking */
348 static int read_key(void)
350 #if defined(HAVE_TERMIOS_H)
351 int n = 1;
352 unsigned char ch;
353 #ifndef CONFIG_BEOS_NETSERVER
354 struct timeval tv;
355 fd_set rfds;
357 FD_ZERO(&rfds);
358 FD_SET(0, &rfds);
359 tv.tv_sec = 0;
360 tv.tv_usec = 0;
361 n = select(1, &rfds, NULL, NULL, &tv);
362 #endif
363 if (n > 0) {
364 n = read(0, &ch, 1);
365 if (n == 1)
366 return ch;
368 return n;
370 #elif defined(HAVE_CONIO_H)
371 if(kbhit())
372 return(getch());
373 #endif
374 return -1;
377 static int decode_interrupt_cb(void)
379 return q_pressed || (q_pressed = read_key() == 'q');
382 static int av_exit(int ret)
384 int i;
386 /* close files */
387 for(i=0;i<nb_output_files;i++) {
388 /* maybe av_close_output_file ??? */
389 AVFormatContext *s = output_files[i];
390 int j;
391 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
392 url_fclose(s->pb);
393 for(j=0;j<s->nb_streams;j++) {
394 av_free(s->streams[j]->codec);
395 av_free(s->streams[j]);
397 av_free(s);
399 for(i=0;i<nb_input_files;i++)
400 av_close_input_file(input_files[i]);
402 av_free(intra_matrix);
403 av_free(inter_matrix);
405 if (vstats_file)
406 fclose(vstats_file);
407 av_free(vstats_filename);
409 av_free(opt_names);
411 av_free(video_codec_name);
412 av_free(audio_codec_name);
413 av_free(subtitle_codec_name);
415 av_free(video_standard);
417 #ifdef CONFIG_POWERPC_PERF
418 extern void powerpc_display_perf_report(void);
419 powerpc_display_perf_report();
420 #endif /* CONFIG_POWERPC_PERF */
422 if (received_sigterm) {
423 fprintf(stderr,
424 "Received signal %d: terminating.\n",
425 (int) received_sigterm);
426 exit (255);
429 exit(ret); /* not all OS-es handle main() return value */
430 return ret;
433 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
435 int i, err;
436 AVFormatContext *ic;
437 int nopts = 0;
439 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
440 if (err < 0)
441 return err;
442 /* copy stream format */
443 s->nb_streams = ic->nb_streams;
444 for(i=0;i<ic->nb_streams;i++) {
445 AVStream *st;
447 // FIXME: a more elegant solution is needed
448 st = av_mallocz(sizeof(AVStream));
449 memcpy(st, ic->streams[i], sizeof(AVStream));
450 st->codec = avcodec_alloc_context();
451 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
452 s->streams[i] = st;
454 if (st->codec->codec_type == CODEC_TYPE_AUDIO && audio_stream_copy)
455 st->stream_copy = 1;
456 else if (st->codec->codec_type == CODEC_TYPE_VIDEO && video_stream_copy)
457 st->stream_copy = 1;
459 if(!st->codec->thread_count)
460 st->codec->thread_count = 1;
461 if(st->codec->thread_count>1)
462 avcodec_thread_init(st->codec, st->codec->thread_count);
464 if(st->codec->flags & CODEC_FLAG_BITEXACT)
465 nopts = 1;
468 if (!nopts)
469 s->timestamp = av_gettime();
471 av_close_input_file(ic);
472 return 0;
475 static double
476 get_sync_ipts(const AVOutputStream *ost)
478 const AVInputStream *ist = ost->sync_ist;
479 return (double)(ist->pts - start_time)/AV_TIME_BASE;
482 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
483 int ret;
485 while(bsfc){
486 AVPacket new_pkt= *pkt;
487 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
488 &new_pkt.data, &new_pkt.size,
489 pkt->data, pkt->size,
490 pkt->flags & PKT_FLAG_KEY);
491 if(a>0){
492 av_free_packet(pkt);
493 new_pkt.destruct= av_destruct_packet;
494 } else if(a<0){
495 fprintf(stderr, "%s failed for stream %d, codec %s",
496 bsfc->filter->name, pkt->stream_index,
497 avctx->codec ? avctx->codec->name : "copy");
498 print_error("", a);
499 if (exit_on_error)
500 av_exit(1);
502 *pkt= new_pkt;
504 bsfc= bsfc->next;
507 ret= av_interleaved_write_frame(s, pkt);
508 if(ret < 0){
509 print_error("av_interleaved_write_frame()", ret);
510 av_exit(1);
514 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
516 static void do_audio_out(AVFormatContext *s,
517 AVOutputStream *ost,
518 AVInputStream *ist,
519 unsigned char *buf, int size)
521 uint8_t *buftmp;
522 static uint8_t *audio_buf = NULL;
523 static uint8_t *audio_out = NULL;
524 static uint8_t *audio_out2 = NULL;
525 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
527 int size_out, frame_bytes, ret;
528 AVCodecContext *enc= ost->st->codec;
529 AVCodecContext *dec= ist->st->codec;
530 int osize= av_get_bits_per_sample_format(enc->sample_fmt)/8;
531 int isize= av_get_bits_per_sample_format(dec->sample_fmt)/8;
533 /* SC: dynamic allocation of buffers */
534 if (!audio_buf)
535 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
536 if (!audio_out)
537 audio_out = av_malloc(audio_out_size);
538 if (!audio_buf || !audio_out)
539 return; /* Should signal an error ! */
541 if (enc->channels != dec->channels)
542 ost->audio_resample = 1;
544 if (ost->audio_resample && !ost->resample) {
545 if (dec->sample_fmt != SAMPLE_FMT_S16) {
546 fprintf(stderr, "Audio resampler only works with 16 bits per sample, patch welcome.\n");
547 av_exit(1);
549 ost->resample = audio_resample_init(enc->channels, dec->channels,
550 enc->sample_rate, dec->sample_rate);
551 if (!ost->resample) {
552 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
553 dec->channels, dec->sample_rate,
554 enc->channels, enc->sample_rate);
555 av_exit(1);
559 #define MAKE_SFMT_PAIR(a,b) ((a)+SAMPLE_FMT_NB*(b))
560 if (dec->sample_fmt!=enc->sample_fmt &&
561 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
562 if (!audio_out2)
563 audio_out2 = av_malloc(audio_out_size);
564 if (!audio_out2)
565 av_exit(1);
566 if (ost->reformat_ctx)
567 av_audio_convert_free(ost->reformat_ctx);
568 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
569 dec->sample_fmt, 1, NULL, 0);
570 if (!ost->reformat_ctx) {
571 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
572 avcodec_get_sample_fmt_name(dec->sample_fmt),
573 avcodec_get_sample_fmt_name(enc->sample_fmt));
574 av_exit(1);
576 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
579 if(audio_sync_method){
580 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
581 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2);
582 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
583 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
585 //FIXME resample delay
586 if(fabs(delta) > 50){
587 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
588 if(byte_delta < 0){
589 byte_delta= FFMAX(byte_delta, -size);
590 size += byte_delta;
591 buf -= byte_delta;
592 if(verbose > 2)
593 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
594 if(!size)
595 return;
596 ist->is_start=0;
597 }else{
598 static uint8_t *input_tmp= NULL;
599 input_tmp= av_realloc(input_tmp, byte_delta + size);
601 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
602 ist->is_start=0;
603 else
604 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
606 memset(input_tmp, 0, byte_delta);
607 memcpy(input_tmp + byte_delta, buf, size);
608 buf= input_tmp;
609 size += byte_delta;
610 if(verbose > 2)
611 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
613 }else if(audio_sync_method>1){
614 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
615 assert(ost->audio_resample);
616 if(verbose > 2)
617 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
618 // 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));
619 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
622 }else
623 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
624 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
626 if (ost->audio_resample) {
627 buftmp = audio_buf;
628 size_out = audio_resample(ost->resample,
629 (short *)buftmp, (short *)buf,
630 size / (ist->st->codec->channels * isize));
631 size_out = size_out * enc->channels * osize;
632 } else {
633 buftmp = buf;
634 size_out = size;
637 if (dec->sample_fmt!=enc->sample_fmt) {
638 const void *ibuf[6]= {buftmp};
639 void *obuf[6]= {audio_out2};
640 int istride[6]= {isize};
641 int ostride[6]= {osize};
642 int len= size_out/istride[0];
643 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
644 printf("av_audio_convert() failed\n");
645 if (exit_on_error)
646 av_exit(1);
647 return;
649 buftmp = audio_out2;
650 size_out = len*osize;
653 /* now encode as many frames as possible */
654 if (enc->frame_size > 1) {
655 /* output resampled raw samples */
656 if (av_fifo_realloc2(&ost->fifo, av_fifo_size(&ost->fifo) + size_out) < 0) {
657 fprintf(stderr, "av_fifo_realloc2() failed\n");
658 av_exit(1);
660 av_fifo_generic_write(&ost->fifo, buftmp, size_out, NULL);
662 frame_bytes = enc->frame_size * osize * enc->channels;
664 while (av_fifo_size(&ost->fifo) >= frame_bytes) {
665 AVPacket pkt;
666 av_init_packet(&pkt);
668 av_fifo_read(&ost->fifo, audio_buf, frame_bytes);
670 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
672 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
673 (short *)audio_buf);
674 audio_size += ret;
675 pkt.stream_index= ost->index;
676 pkt.data= audio_out;
677 pkt.size= ret;
678 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
679 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
680 pkt.flags |= PKT_FLAG_KEY;
681 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
683 ost->sync_opts += enc->frame_size;
685 } else {
686 AVPacket pkt;
687 int coded_bps = av_get_bits_per_sample(enc->codec->id)/8;
688 av_init_packet(&pkt);
690 ost->sync_opts += size_out / (osize * enc->channels);
692 /* output a pcm frame */
693 /* determine the size of the coded buffer */
694 size_out /= osize;
695 if (coded_bps)
696 size_out *= coded_bps;
698 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
699 ret = avcodec_encode_audio(enc, audio_out, size_out,
700 (short *)buftmp);
701 audio_size += ret;
702 pkt.stream_index= ost->index;
703 pkt.data= audio_out;
704 pkt.size= ret;
705 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
706 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
707 pkt.flags |= PKT_FLAG_KEY;
708 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
712 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
714 AVCodecContext *dec;
715 AVPicture *picture2;
716 AVPicture picture_tmp;
717 uint8_t *buf = 0;
719 dec = ist->st->codec;
721 /* deinterlace : must be done before any resize */
722 if (do_deinterlace || using_vhook) {
723 int size;
725 /* create temporary picture */
726 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
727 buf = av_malloc(size);
728 if (!buf)
729 return;
731 picture2 = &picture_tmp;
732 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
734 if (do_deinterlace){
735 if(avpicture_deinterlace(picture2, picture,
736 dec->pix_fmt, dec->width, dec->height) < 0) {
737 /* if error, do not deinterlace */
738 fprintf(stderr, "Deinterlacing failed\n");
739 av_free(buf);
740 buf = NULL;
741 picture2 = picture;
743 } else {
744 av_picture_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
746 } else {
747 picture2 = picture;
750 if (ENABLE_VHOOK)
751 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height,
752 1000000 * ist->pts / AV_TIME_BASE);
754 if (picture != picture2)
755 *picture = *picture2;
756 *bufp = buf;
759 /* we begin to correct av delay at this threshold */
760 #define AV_DELAY_MAX 0.100
762 static void do_subtitle_out(AVFormatContext *s,
763 AVOutputStream *ost,
764 AVInputStream *ist,
765 AVSubtitle *sub,
766 int64_t pts)
768 static uint8_t *subtitle_out = NULL;
769 int subtitle_out_max_size = 65536;
770 int subtitle_out_size, nb, i;
771 AVCodecContext *enc;
772 AVPacket pkt;
774 if (pts == AV_NOPTS_VALUE) {
775 fprintf(stderr, "Subtitle packets must have a pts\n");
776 if (exit_on_error)
777 av_exit(1);
778 return;
781 enc = ost->st->codec;
783 if (!subtitle_out) {
784 subtitle_out = av_malloc(subtitle_out_max_size);
787 /* Note: DVB subtitle need one packet to draw them and one other
788 packet to clear them */
789 /* XXX: signal it in the codec context ? */
790 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
791 nb = 2;
792 else
793 nb = 1;
795 for(i = 0; i < nb; i++) {
796 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
797 subtitle_out_max_size, sub);
799 av_init_packet(&pkt);
800 pkt.stream_index = ost->index;
801 pkt.data = subtitle_out;
802 pkt.size = subtitle_out_size;
803 pkt.pts = av_rescale_q(pts, ist->st->time_base, ost->st->time_base);
804 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
805 /* XXX: the pts correction is handled here. Maybe handling
806 it in the codec would be better */
807 if (i == 0)
808 pkt.pts += 90 * sub->start_display_time;
809 else
810 pkt.pts += 90 * sub->end_display_time;
812 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
816 static int bit_buffer_size= 1024*256;
817 static uint8_t *bit_buffer= NULL;
819 static void do_video_out(AVFormatContext *s,
820 AVOutputStream *ost,
821 AVInputStream *ist,
822 AVFrame *in_picture,
823 int *frame_size)
825 int nb_frames, i, ret;
826 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
827 AVFrame picture_crop_temp, picture_pad_temp;
828 AVCodecContext *enc, *dec;
830 avcodec_get_frame_defaults(&picture_crop_temp);
831 avcodec_get_frame_defaults(&picture_pad_temp);
833 enc = ost->st->codec;
834 dec = ist->st->codec;
836 /* by default, we output a single frame */
837 nb_frames = 1;
839 *frame_size = 0;
841 if(video_sync_method>0 || (video_sync_method && av_q2d(enc->time_base) > 0.001)){
842 double vdelta;
843 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
844 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
845 if (vdelta < -1.1)
846 nb_frames = 0;
847 else if (video_sync_method == 2)
848 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
849 else if (vdelta > 1.1)
850 nb_frames = lrintf(vdelta);
851 //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);
852 if (nb_frames == 0){
853 ++nb_frames_drop;
854 if (verbose>2)
855 fprintf(stderr, "*** drop!\n");
856 }else if (nb_frames > 1) {
857 nb_frames_dup += nb_frames;
858 if (verbose>2)
859 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
861 }else
862 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
864 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
865 if (nb_frames <= 0)
866 return;
868 if (ost->video_crop) {
869 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
870 av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
871 if (exit_on_error)
872 av_exit(1);
873 return;
875 formatted_picture = &picture_crop_temp;
876 } else {
877 formatted_picture = in_picture;
880 final_picture = formatted_picture;
881 padding_src = formatted_picture;
882 resampling_dst = &ost->pict_tmp;
883 if (ost->video_pad) {
884 final_picture = &ost->pict_tmp;
885 if (ost->video_resample) {
886 if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
887 av_log(NULL, AV_LOG_ERROR, "error padding picture\n");
888 if (exit_on_error)
889 av_exit(1);
890 return;
892 resampling_dst = &picture_pad_temp;
896 if (ost->video_resample) {
897 padding_src = NULL;
898 final_picture = &ost->pict_tmp;
899 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
900 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
903 if (ost->video_pad) {
904 av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
905 enc->height, enc->width, enc->pix_fmt,
906 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
909 /* duplicates frame if needed */
910 for(i=0;i<nb_frames;i++) {
911 AVPacket pkt;
912 av_init_packet(&pkt);
913 pkt.stream_index= ost->index;
915 if (s->oformat->flags & AVFMT_RAWPICTURE) {
916 /* raw pictures are written as AVPicture structure to
917 avoid any copies. We support temorarily the older
918 method. */
919 AVFrame* old_frame = enc->coded_frame;
920 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
921 pkt.data= (uint8_t *)final_picture;
922 pkt.size= sizeof(AVPicture);
923 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
924 pkt.flags |= PKT_FLAG_KEY;
926 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
927 enc->coded_frame = old_frame;
928 } else {
929 AVFrame big_picture;
931 big_picture= *final_picture;
932 /* better than nothing: use input picture interlaced
933 settings */
934 big_picture.interlaced_frame = in_picture->interlaced_frame;
935 if(avctx_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
936 if(top_field_first == -1)
937 big_picture.top_field_first = in_picture->top_field_first;
938 else
939 big_picture.top_field_first = top_field_first;
942 /* handles sameq here. This is not correct because it may
943 not be a global option */
944 if (same_quality) {
945 big_picture.quality = ist->st->quality;
946 }else
947 big_picture.quality = ost->st->quality;
948 if(!me_threshold)
949 big_picture.pict_type = 0;
950 // big_picture.pts = AV_NOPTS_VALUE;
951 big_picture.pts= ost->sync_opts;
952 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
953 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
954 ret = avcodec_encode_video(enc,
955 bit_buffer, bit_buffer_size,
956 &big_picture);
957 if (ret == -1) {
958 fprintf(stderr, "Video encoding failed\n");
959 av_exit(1);
961 //enc->frame_number = enc->real_pict_num;
962 if(ret>0){
963 pkt.data= bit_buffer;
964 pkt.size= ret;
965 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
966 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
967 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
968 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
969 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
971 if(enc->coded_frame->key_frame)
972 pkt.flags |= PKT_FLAG_KEY;
973 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
974 *frame_size = ret;
975 video_size += ret;
976 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
977 // enc->frame_number-1, enc->real_pict_num, ret,
978 // enc->pict_type);
979 /* if two pass, output log */
980 if (ost->logfile && enc->stats_out) {
981 fprintf(ost->logfile, "%s", enc->stats_out);
985 ost->sync_opts++;
986 ost->frame_number++;
990 static double psnr(double d){
991 return -10.0*log(d)/log(10.0);
994 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
995 int frame_size)
997 AVCodecContext *enc;
998 int frame_number;
999 double ti1, bitrate, avg_bitrate;
1001 /* this is executed just the first time do_video_stats is called */
1002 if (!vstats_file) {
1003 vstats_file = fopen(vstats_filename, "w");
1004 if (!vstats_file) {
1005 perror("fopen");
1006 av_exit(1);
1010 enc = ost->st->codec;
1011 if (enc->codec_type == CODEC_TYPE_VIDEO) {
1012 frame_number = ost->frame_number;
1013 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1014 if (enc->flags&CODEC_FLAG_PSNR)
1015 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1017 fprintf(vstats_file,"f_size= %6d ", frame_size);
1018 /* compute pts value */
1019 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1020 if (ti1 < 0.01)
1021 ti1 = 0.01;
1023 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1024 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1025 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1026 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1027 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1031 static void print_report(AVFormatContext **output_files,
1032 AVOutputStream **ost_table, int nb_ostreams,
1033 int is_last_report)
1035 char buf[1024];
1036 AVOutputStream *ost;
1037 AVFormatContext *oc, *os;
1038 int64_t total_size;
1039 AVCodecContext *enc;
1040 int frame_number, vid, i;
1041 double bitrate, ti1, pts;
1042 static int64_t last_time = -1;
1043 static int qp_histogram[52];
1045 if (!is_last_report) {
1046 int64_t cur_time;
1047 /* display the report every 0.5 seconds */
1048 cur_time = av_gettime();
1049 if (last_time == -1) {
1050 last_time = cur_time;
1051 return;
1053 if ((cur_time - last_time) < 500000)
1054 return;
1055 last_time = cur_time;
1059 oc = output_files[0];
1061 total_size = url_fsize(oc->pb);
1062 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1063 total_size= url_ftell(oc->pb);
1065 buf[0] = '\0';
1066 ti1 = 1e10;
1067 vid = 0;
1068 for(i=0;i<nb_ostreams;i++) {
1069 ost = ost_table[i];
1070 os = output_files[ost->file_index];
1071 enc = ost->st->codec;
1072 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1073 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1074 !ost->st->stream_copy ?
1075 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1077 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1078 float t = (av_gettime()-timer_start) / 1000000.0;
1080 frame_number = ost->frame_number;
1081 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1082 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1083 !ost->st->stream_copy ?
1084 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1085 if(is_last_report)
1086 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1087 if(qp_hist){
1088 int j;
1089 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1090 if(qp>=0 && qp<sizeof(qp_histogram)/sizeof(int))
1091 qp_histogram[qp]++;
1092 for(j=0; j<32; j++)
1093 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1095 if (enc->flags&CODEC_FLAG_PSNR){
1096 int j;
1097 double error, error_sum=0;
1098 double scale, scale_sum=0;
1099 char type[3]= {'Y','U','V'};
1100 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1101 for(j=0; j<3; j++){
1102 if(is_last_report){
1103 error= enc->error[j];
1104 scale= enc->width*enc->height*255.0*255.0*frame_number;
1105 }else{
1106 error= enc->coded_frame->error[j];
1107 scale= enc->width*enc->height*255.0*255.0;
1109 if(j) scale/=4;
1110 error_sum += error;
1111 scale_sum += scale;
1112 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1114 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1116 vid = 1;
1118 /* compute min output value */
1119 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1120 if ((pts < ti1) && (pts > 0))
1121 ti1 = pts;
1123 if (ti1 < 0.01)
1124 ti1 = 0.01;
1126 if (verbose || is_last_report) {
1127 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1129 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1130 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1131 (double)total_size / 1024, ti1, bitrate);
1133 if (verbose > 1)
1134 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1135 nb_frames_dup, nb_frames_drop);
1137 if (verbose >= 0)
1138 fprintf(stderr, "%s \r", buf);
1140 fflush(stderr);
1143 if (is_last_report && verbose >= 0){
1144 int64_t raw= audio_size + video_size + extra_size;
1145 fprintf(stderr, "\n");
1146 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1147 video_size/1024.0,
1148 audio_size/1024.0,
1149 extra_size/1024.0,
1150 100.0*(total_size - raw)/raw
1155 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1156 static int output_packet(AVInputStream *ist, int ist_index,
1157 AVOutputStream **ost_table, int nb_ostreams,
1158 const AVPacket *pkt)
1160 AVFormatContext *os;
1161 AVOutputStream *ost;
1162 uint8_t *ptr;
1163 int len, ret, i;
1164 uint8_t *data_buf;
1165 int data_size, got_picture;
1166 AVFrame picture;
1167 void *buffer_to_free;
1168 static unsigned int samples_size= 0;
1169 static short *samples= NULL;
1170 AVSubtitle subtitle, *subtitle_to_free;
1171 int got_subtitle;
1173 if(ist->next_pts == AV_NOPTS_VALUE)
1174 ist->next_pts= ist->pts;
1176 if (pkt == NULL) {
1177 /* EOF handling */
1178 ptr = NULL;
1179 len = 0;
1180 goto handle_eof;
1183 if(pkt->dts != AV_NOPTS_VALUE)
1184 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1186 len = pkt->size;
1187 ptr = pkt->data;
1189 //while we have more to decode or while the decoder did output something on EOF
1190 while (len > 0 || (!pkt && ist->next_pts != ist->pts)) {
1191 handle_eof:
1192 ist->pts= ist->next_pts;
1194 if(len && len != pkt->size && verbose>0)
1195 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1197 /* decode the packet if needed */
1198 data_buf = NULL; /* fail safe */
1199 data_size = 0;
1200 subtitle_to_free = NULL;
1201 if (ist->decoding_needed) {
1202 switch(ist->st->codec->codec_type) {
1203 case CODEC_TYPE_AUDIO:{
1204 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1205 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1206 av_free(samples);
1207 samples= av_malloc(samples_size);
1209 data_size= samples_size;
1210 /* XXX: could avoid copy if PCM 16 bits with same
1211 endianness as CPU */
1212 ret = avcodec_decode_audio2(ist->st->codec, samples, &data_size,
1213 ptr, len);
1214 if (ret < 0)
1215 goto fail_decode;
1216 ptr += ret;
1217 len -= ret;
1218 /* Some bug in mpeg audio decoder gives */
1219 /* data_size < 0, it seems they are overflows */
1220 if (data_size <= 0) {
1221 /* no audio frame */
1222 continue;
1224 data_buf = (uint8_t *)samples;
1225 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1226 (ist->st->codec->sample_rate * ist->st->codec->channels);
1227 break;}
1228 case CODEC_TYPE_VIDEO:
1229 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1230 /* XXX: allocate picture correctly */
1231 avcodec_get_frame_defaults(&picture);
1233 ret = avcodec_decode_video(ist->st->codec,
1234 &picture, &got_picture, ptr, len);
1235 ist->st->quality= picture.quality;
1236 if (ret < 0)
1237 goto fail_decode;
1238 if (!got_picture) {
1239 /* no picture yet */
1240 goto discard_packet;
1242 if (ist->st->codec->time_base.num != 0) {
1243 ist->next_pts += ((int64_t)AV_TIME_BASE *
1244 ist->st->codec->time_base.num) /
1245 ist->st->codec->time_base.den;
1247 len = 0;
1248 break;
1249 case CODEC_TYPE_SUBTITLE:
1250 ret = avcodec_decode_subtitle(ist->st->codec,
1251 &subtitle, &got_subtitle, ptr, len);
1252 if (ret < 0)
1253 goto fail_decode;
1254 if (!got_subtitle) {
1255 goto discard_packet;
1257 subtitle_to_free = &subtitle;
1258 len = 0;
1259 break;
1260 default:
1261 goto fail_decode;
1263 } else {
1264 switch(ist->st->codec->codec_type) {
1265 case CODEC_TYPE_AUDIO:
1266 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1267 ist->st->codec->sample_rate;
1268 break;
1269 case CODEC_TYPE_VIDEO:
1270 if (ist->st->codec->time_base.num != 0) {
1271 ist->next_pts += ((int64_t)AV_TIME_BASE *
1272 ist->st->codec->time_base.num) /
1273 ist->st->codec->time_base.den;
1275 break;
1277 data_buf = ptr;
1278 data_size = len;
1279 ret = len;
1280 len = 0;
1283 buffer_to_free = NULL;
1284 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1285 pre_process_video_frame(ist, (AVPicture *)&picture,
1286 &buffer_to_free);
1289 // preprocess audio (volume)
1290 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1291 if (audio_volume != 256) {
1292 short *volp;
1293 volp = samples;
1294 for(i=0;i<(data_size / sizeof(short));i++) {
1295 int v = ((*volp) * audio_volume + 128) >> 8;
1296 if (v < -32768) v = -32768;
1297 if (v > 32767) v = 32767;
1298 *volp++ = v;
1303 /* frame rate emulation */
1304 if (ist->st->codec->rate_emu) {
1305 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
1306 int64_t now = av_gettime() - ist->start;
1307 if (pts > now)
1308 usleep(pts - now);
1310 ist->frame++;
1313 #if 0
1314 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1315 is the one of the next displayed one */
1316 /* XXX: add mpeg4 too ? */
1317 if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
1318 if (ist->st->codec->pict_type != B_TYPE) {
1319 int64_t tmp;
1320 tmp = ist->last_ip_pts;
1321 ist->last_ip_pts = ist->frac_pts.val;
1322 ist->frac_pts.val = tmp;
1325 #endif
1326 /* if output time reached then transcode raw format,
1327 encode packets and output them */
1328 if (start_time == 0 || ist->pts >= start_time)
1329 for(i=0;i<nb_ostreams;i++) {
1330 int frame_size;
1332 ost = ost_table[i];
1333 if (ost->source_index == ist_index) {
1334 os = output_files[ost->file_index];
1336 #if 0
1337 printf("%d: got pts=%0.3f %0.3f\n", i,
1338 (double)pkt->pts / AV_TIME_BASE,
1339 ((double)ist->pts / AV_TIME_BASE) -
1340 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1341 #endif
1342 /* set the input output pts pairs */
1343 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1345 if (ost->encoding_needed) {
1346 switch(ost->st->codec->codec_type) {
1347 case CODEC_TYPE_AUDIO:
1348 do_audio_out(os, ost, ist, data_buf, data_size);
1349 break;
1350 case CODEC_TYPE_VIDEO:
1351 do_video_out(os, ost, ist, &picture, &frame_size);
1352 if (vstats_filename && frame_size)
1353 do_video_stats(os, ost, frame_size);
1354 break;
1355 case CODEC_TYPE_SUBTITLE:
1356 do_subtitle_out(os, ost, ist, &subtitle,
1357 pkt->pts);
1358 break;
1359 default:
1360 abort();
1362 } else {
1363 AVFrame avframe; //FIXME/XXX remove this
1364 AVPacket opkt;
1365 av_init_packet(&opkt);
1367 if (!ost->frame_number && !(pkt->flags & PKT_FLAG_KEY))
1368 continue;
1370 /* no reencoding needed : output the packet directly */
1371 /* force the input stream PTS */
1373 avcodec_get_frame_defaults(&avframe);
1374 ost->st->codec->coded_frame= &avframe;
1375 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1377 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1378 audio_size += data_size;
1379 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1380 video_size += data_size;
1381 ost->sync_opts++;
1384 opkt.stream_index= ost->index;
1385 if(pkt->pts != AV_NOPTS_VALUE)
1386 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base);
1387 else
1388 opkt.pts= AV_NOPTS_VALUE;
1390 if (pkt->dts == AV_NOPTS_VALUE)
1391 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1392 else
1393 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1395 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1396 opkt.flags= pkt->flags;
1398 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1399 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1400 opkt.destruct= av_destruct_packet;
1402 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][opkt.stream_index]);
1403 ost->st->codec->frame_number++;
1404 ost->frame_number++;
1405 av_free_packet(&opkt);
1409 av_free(buffer_to_free);
1410 /* XXX: allocate the subtitles in the codec ? */
1411 if (subtitle_to_free) {
1412 if (subtitle_to_free->rects != NULL) {
1413 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1414 av_free(subtitle_to_free->rects[i].bitmap);
1415 av_free(subtitle_to_free->rects[i].rgba_palette);
1417 av_freep(&subtitle_to_free->rects);
1419 subtitle_to_free->num_rects = 0;
1420 subtitle_to_free = NULL;
1423 discard_packet:
1424 if (pkt == NULL) {
1425 /* EOF handling */
1427 for(i=0;i<nb_ostreams;i++) {
1428 ost = ost_table[i];
1429 if (ost->source_index == ist_index) {
1430 AVCodecContext *enc= ost->st->codec;
1431 os = output_files[ost->file_index];
1433 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1434 continue;
1435 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1436 continue;
1438 if (ost->encoding_needed) {
1439 for(;;) {
1440 AVPacket pkt;
1441 int fifo_bytes;
1442 av_init_packet(&pkt);
1443 pkt.stream_index= ost->index;
1445 switch(ost->st->codec->codec_type) {
1446 case CODEC_TYPE_AUDIO:
1447 fifo_bytes = av_fifo_size(&ost->fifo);
1448 ret = 0;
1449 /* encode any samples remaining in fifo */
1450 if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1451 int fs_tmp = enc->frame_size;
1452 enc->frame_size = fifo_bytes / (2 * enc->channels);
1453 av_fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes);
1454 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1455 enc->frame_size = fs_tmp;
1457 if(ret <= 0) {
1458 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1460 audio_size += ret;
1461 pkt.flags |= PKT_FLAG_KEY;
1462 break;
1463 case CODEC_TYPE_VIDEO:
1464 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1465 video_size += ret;
1466 if(enc->coded_frame && enc->coded_frame->key_frame)
1467 pkt.flags |= PKT_FLAG_KEY;
1468 if (ost->logfile && enc->stats_out) {
1469 fprintf(ost->logfile, "%s", enc->stats_out);
1471 break;
1472 default:
1473 ret=-1;
1476 if(ret<=0)
1477 break;
1478 pkt.data= bit_buffer;
1479 pkt.size= ret;
1480 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1481 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1482 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1489 return 0;
1490 fail_decode:
1491 return -1;
1494 static void print_sdp(AVFormatContext **avc, int n)
1496 char sdp[2048];
1498 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1499 printf("SDP:\n%s\n", sdp);
1502 static int stream_index_from_inputs(AVFormatContext **input_files,
1503 int nb_input_files,
1504 AVInputFile *file_table,
1505 AVInputStream **ist_table,
1506 enum CodecType type,
1507 int programid)
1509 int p, q, z;
1510 for(z=0; z<nb_input_files; z++) {
1511 AVFormatContext *ic = input_files[z];
1512 for(p=0; p<ic->nb_programs; p++) {
1513 AVProgram *program = ic->programs[p];
1514 if(program->id != programid)
1515 continue;
1516 for(q=0; q<program->nb_stream_indexes; q++) {
1517 int sidx = program->stream_index[q];
1518 int ris = file_table[z].ist_index + sidx;
1519 if(ist_table[ris]->discard && ic->streams[sidx]->codec->codec_type == type)
1520 return ris;
1525 return -1;
1529 * The following code is the main loop of the file converter
1531 static int av_encode(AVFormatContext **output_files,
1532 int nb_output_files,
1533 AVFormatContext **input_files,
1534 int nb_input_files,
1535 AVStreamMap *stream_maps, int nb_stream_maps)
1537 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1538 AVFormatContext *is, *os;
1539 AVCodecContext *codec, *icodec;
1540 AVOutputStream *ost, **ost_table = NULL;
1541 AVInputStream *ist, **ist_table = NULL;
1542 AVInputFile *file_table;
1543 int key;
1544 int want_sdp = 1;
1546 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1547 if (!file_table)
1548 goto fail;
1550 /* input stream init */
1551 j = 0;
1552 for(i=0;i<nb_input_files;i++) {
1553 is = input_files[i];
1554 file_table[i].ist_index = j;
1555 file_table[i].nb_streams = is->nb_streams;
1556 j += is->nb_streams;
1558 nb_istreams = j;
1560 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1561 if (!ist_table)
1562 goto fail;
1564 for(i=0;i<nb_istreams;i++) {
1565 ist = av_mallocz(sizeof(AVInputStream));
1566 if (!ist)
1567 goto fail;
1568 ist_table[i] = ist;
1570 j = 0;
1571 for(i=0;i<nb_input_files;i++) {
1572 is = input_files[i];
1573 for(k=0;k<is->nb_streams;k++) {
1574 ist = ist_table[j++];
1575 ist->st = is->streams[k];
1576 ist->file_index = i;
1577 ist->index = k;
1578 ist->discard = 1; /* the stream is discarded by default
1579 (changed later) */
1581 if (ist->st->codec->rate_emu) {
1582 ist->start = av_gettime();
1583 ist->frame = 0;
1588 /* output stream init */
1589 nb_ostreams = 0;
1590 for(i=0;i<nb_output_files;i++) {
1591 os = output_files[i];
1592 if (!os->nb_streams) {
1593 fprintf(stderr, "Output file does not contain any stream\n");
1594 av_exit(1);
1596 nb_ostreams += os->nb_streams;
1598 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1599 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1600 av_exit(1);
1603 /* Sanity check the mapping args -- do the input files & streams exist? */
1604 for(i=0;i<nb_stream_maps;i++) {
1605 int fi = stream_maps[i].file_index;
1606 int si = stream_maps[i].stream_index;
1608 if (fi < 0 || fi > nb_input_files - 1 ||
1609 si < 0 || si > file_table[fi].nb_streams - 1) {
1610 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1611 av_exit(1);
1613 fi = stream_maps[i].sync_file_index;
1614 si = stream_maps[i].sync_stream_index;
1615 if (fi < 0 || fi > nb_input_files - 1 ||
1616 si < 0 || si > file_table[fi].nb_streams - 1) {
1617 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1618 av_exit(1);
1622 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1623 if (!ost_table)
1624 goto fail;
1625 for(i=0;i<nb_ostreams;i++) {
1626 ost = av_mallocz(sizeof(AVOutputStream));
1627 if (!ost)
1628 goto fail;
1629 ost_table[i] = ost;
1632 n = 0;
1633 for(k=0;k<nb_output_files;k++) {
1634 os = output_files[k];
1635 for(i=0;i<os->nb_streams;i++,n++) {
1636 int found;
1637 ost = ost_table[n];
1638 ost->file_index = k;
1639 ost->index = i;
1640 ost->st = os->streams[i];
1641 if (nb_stream_maps > 0) {
1642 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
1643 stream_maps[n].stream_index;
1645 /* Sanity check that the stream types match */
1646 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1647 int i= ost->file_index;
1648 dump_format(output_files[i], i, output_files[i]->filename, 1);
1649 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1650 stream_maps[n].file_index, stream_maps[n].stream_index,
1651 ost->file_index, ost->index);
1652 av_exit(1);
1655 } else {
1656 if(opt_programid) {
1657 found = 0;
1658 j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid);
1659 if(j != -1) {
1660 ost->source_index = j;
1661 found = 1;
1663 } else {
1664 /* get corresponding input stream index : we select the first one with the right type */
1665 found = 0;
1666 for(j=0;j<nb_istreams;j++) {
1667 ist = ist_table[j];
1668 if (ist->discard &&
1669 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1670 ost->source_index = j;
1671 found = 1;
1672 break;
1677 if (!found) {
1678 if(! opt_programid) {
1679 /* try again and reuse existing stream */
1680 for(j=0;j<nb_istreams;j++) {
1681 ist = ist_table[j];
1682 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1683 ost->source_index = j;
1684 found = 1;
1688 if (!found) {
1689 int i= ost->file_index;
1690 dump_format(output_files[i], i, output_files[i]->filename, 1);
1691 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1692 ost->file_index, ost->index);
1693 av_exit(1);
1697 ist = ist_table[ost->source_index];
1698 ist->discard = 0;
1699 ost->sync_ist = (nb_stream_maps > 0) ?
1700 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
1701 stream_maps[n].sync_stream_index] : ist;
1705 /* for each output stream, we compute the right encoding parameters */
1706 for(i=0;i<nb_ostreams;i++) {
1707 ost = ost_table[i];
1708 os = output_files[ost->file_index];
1709 ist = ist_table[ost->source_index];
1711 codec = ost->st->codec;
1712 icodec = ist->st->codec;
1714 if (!ost->st->language[0])
1715 av_strlcpy(ost->st->language, ist->st->language,
1716 sizeof(ost->st->language));
1718 ost->st->disposition = ist->st->disposition;
1720 if (ost->st->stream_copy) {
1721 /* if stream_copy is selected, no need to decode or encode */
1722 codec->codec_id = icodec->codec_id;
1723 codec->codec_type = icodec->codec_type;
1725 if(!codec->codec_tag){
1726 if( !os->oformat->codec_tag
1727 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) > 0
1728 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1729 codec->codec_tag = icodec->codec_tag;
1732 codec->bit_rate = icodec->bit_rate;
1733 codec->extradata= icodec->extradata;
1734 codec->extradata_size= icodec->extradata_size;
1735 if(av_q2d(icodec->time_base) > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000)
1736 codec->time_base = icodec->time_base;
1737 else
1738 codec->time_base = ist->st->time_base;
1739 switch(codec->codec_type) {
1740 case CODEC_TYPE_AUDIO:
1741 if(audio_volume != 256) {
1742 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1743 av_exit(1);
1745 codec->sample_rate = icodec->sample_rate;
1746 codec->channels = icodec->channels;
1747 codec->frame_size = icodec->frame_size;
1748 codec->block_align= icodec->block_align;
1749 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1750 codec->block_align= 0;
1751 if(codec->codec_id == CODEC_ID_AC3)
1752 codec->block_align= 0;
1753 break;
1754 case CODEC_TYPE_VIDEO:
1755 if(using_vhook) {
1756 fprintf(stderr,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");
1757 av_exit(1);
1759 codec->pix_fmt = icodec->pix_fmt;
1760 codec->width = icodec->width;
1761 codec->height = icodec->height;
1762 codec->has_b_frames = icodec->has_b_frames;
1763 break;
1764 case CODEC_TYPE_SUBTITLE:
1765 break;
1766 default:
1767 abort();
1769 } else {
1770 switch(codec->codec_type) {
1771 case CODEC_TYPE_AUDIO:
1772 if (av_fifo_init(&ost->fifo, 1024))
1773 goto fail;
1774 ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
1775 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1776 icodec->request_channels = codec->channels;
1777 ist->decoding_needed = 1;
1778 ost->encoding_needed = 1;
1779 break;
1780 case CODEC_TYPE_VIDEO:
1781 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1782 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1783 ost->video_resample = ((codec->width != icodec->width -
1784 (frame_leftBand + frame_rightBand) +
1785 (frame_padleft + frame_padright)) ||
1786 (codec->height != icodec->height -
1787 (frame_topBand + frame_bottomBand) +
1788 (frame_padtop + frame_padbottom)) ||
1789 (codec->pix_fmt != icodec->pix_fmt));
1790 if (ost->video_crop) {
1791 ost->topBand = frame_topBand;
1792 ost->leftBand = frame_leftBand;
1794 if (ost->video_pad) {
1795 ost->padtop = frame_padtop;
1796 ost->padleft = frame_padleft;
1797 ost->padbottom = frame_padbottom;
1798 ost->padright = frame_padright;
1799 if (!ost->video_resample) {
1800 avcodec_get_frame_defaults(&ost->pict_tmp);
1801 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1802 codec->width, codec->height))
1803 goto fail;
1806 if (ost->video_resample) {
1807 avcodec_get_frame_defaults(&ost->pict_tmp);
1808 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1809 codec->width, codec->height)) {
1810 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1811 av_exit(1);
1813 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1814 ost->img_resample_ctx = sws_getContext(
1815 icodec->width - (frame_leftBand + frame_rightBand),
1816 icodec->height - (frame_topBand + frame_bottomBand),
1817 icodec->pix_fmt,
1818 codec->width - (frame_padleft + frame_padright),
1819 codec->height - (frame_padtop + frame_padbottom),
1820 codec->pix_fmt,
1821 sws_flags, NULL, NULL, NULL);
1822 if (ost->img_resample_ctx == NULL) {
1823 fprintf(stderr, "Cannot get resampling context\n");
1824 av_exit(1);
1826 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1828 ost->encoding_needed = 1;
1829 ist->decoding_needed = 1;
1830 break;
1831 case CODEC_TYPE_SUBTITLE:
1832 ost->encoding_needed = 1;
1833 ist->decoding_needed = 1;
1834 break;
1835 default:
1836 abort();
1837 break;
1839 /* two pass mode */
1840 if (ost->encoding_needed &&
1841 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1842 char logfilename[1024];
1843 FILE *f;
1844 int size;
1845 char *logbuffer;
1847 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1848 pass_logfilename ?
1849 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1850 if (codec->flags & CODEC_FLAG_PASS1) {
1851 f = fopen(logfilename, "w");
1852 if (!f) {
1853 perror(logfilename);
1854 av_exit(1);
1856 ost->logfile = f;
1857 } else {
1858 /* read the log file */
1859 f = fopen(logfilename, "r");
1860 if (!f) {
1861 perror(logfilename);
1862 av_exit(1);
1864 fseek(f, 0, SEEK_END);
1865 size = ftell(f);
1866 fseek(f, 0, SEEK_SET);
1867 logbuffer = av_malloc(size + 1);
1868 if (!logbuffer) {
1869 fprintf(stderr, "Could not allocate log buffer\n");
1870 av_exit(1);
1872 size = fread(logbuffer, 1, size, f);
1873 fclose(f);
1874 logbuffer[size] = '\0';
1875 codec->stats_in = logbuffer;
1879 if(codec->codec_type == CODEC_TYPE_VIDEO){
1880 int size= codec->width * codec->height;
1881 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1885 if (!bit_buffer)
1886 bit_buffer = av_malloc(bit_buffer_size);
1887 if (!bit_buffer)
1888 goto fail;
1890 /* dump the file output parameters - cannot be done before in case
1891 of stream copy */
1892 for(i=0;i<nb_output_files;i++) {
1893 dump_format(output_files[i], i, output_files[i]->filename, 1);
1896 /* dump the stream mapping */
1897 if (verbose >= 0) {
1898 fprintf(stderr, "Stream mapping:\n");
1899 for(i=0;i<nb_ostreams;i++) {
1900 ost = ost_table[i];
1901 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1902 ist_table[ost->source_index]->file_index,
1903 ist_table[ost->source_index]->index,
1904 ost->file_index,
1905 ost->index);
1906 if (ost->sync_ist != ist_table[ost->source_index])
1907 fprintf(stderr, " [sync #%d.%d]",
1908 ost->sync_ist->file_index,
1909 ost->sync_ist->index);
1910 fprintf(stderr, "\n");
1914 /* open each encoder */
1915 for(i=0;i<nb_ostreams;i++) {
1916 ost = ost_table[i];
1917 if (ost->encoding_needed) {
1918 AVCodec *codec;
1919 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1920 if (!codec) {
1921 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1922 ost->file_index, ost->index);
1923 av_exit(1);
1925 if (avcodec_open(ost->st->codec, codec) < 0) {
1926 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1927 ost->file_index, ost->index);
1928 av_exit(1);
1930 extra_size += ost->st->codec->extradata_size;
1934 /* open each decoder */
1935 for(i=0;i<nb_istreams;i++) {
1936 ist = ist_table[i];
1937 if (ist->decoding_needed) {
1938 AVCodec *codec;
1939 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1940 if (!codec) {
1941 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1942 ist->st->codec->codec_id, ist->file_index, ist->index);
1943 av_exit(1);
1945 if (avcodec_open(ist->st->codec, codec) < 0) {
1946 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1947 ist->file_index, ist->index);
1948 av_exit(1);
1950 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1951 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1955 /* init pts */
1956 for(i=0;i<nb_istreams;i++) {
1957 ist = ist_table[i];
1958 is = input_files[ist->file_index];
1959 ist->pts = 0;
1960 ist->next_pts = AV_NOPTS_VALUE;
1961 ist->is_start = 1;
1964 /* set meta data information from input file if required */
1965 for (i=0;i<nb_meta_data_maps;i++) {
1966 AVFormatContext *out_file;
1967 AVFormatContext *in_file;
1969 int out_file_index = meta_data_maps[i].out_file;
1970 int in_file_index = meta_data_maps[i].in_file;
1971 if (out_file_index < 0 || out_file_index >= nb_output_files) {
1972 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1973 ret = AVERROR(EINVAL);
1974 goto fail;
1976 if (in_file_index < 0 || in_file_index >= nb_input_files) {
1977 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1978 ret = AVERROR(EINVAL);
1979 goto fail;
1982 out_file = output_files[out_file_index];
1983 in_file = input_files[in_file_index];
1985 strcpy(out_file->title, in_file->title);
1986 strcpy(out_file->author, in_file->author);
1987 strcpy(out_file->copyright, in_file->copyright);
1988 strcpy(out_file->comment, in_file->comment);
1989 strcpy(out_file->album, in_file->album);
1990 out_file->year = in_file->year;
1991 out_file->track = in_file->track;
1992 strcpy(out_file->genre, in_file->genre);
1995 /* open files and write file headers */
1996 for(i=0;i<nb_output_files;i++) {
1997 os = output_files[i];
1998 if (av_write_header(os) < 0) {
1999 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
2000 ret = AVERROR(EINVAL);
2001 goto fail;
2003 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2004 want_sdp = 0;
2007 if (want_sdp) {
2008 print_sdp(output_files, nb_output_files);
2011 if (!using_stdin && verbose >= 0) {
2012 fprintf(stderr, "Press [q] to stop encoding\n");
2013 url_set_interrupt_cb(decode_interrupt_cb);
2015 term_init();
2017 key = -1;
2018 timer_start = av_gettime();
2020 for(; received_sigterm == 0;) {
2021 int file_index, ist_index;
2022 AVPacket pkt;
2023 double ipts_min;
2024 double opts_min;
2026 redo:
2027 ipts_min= 1e100;
2028 opts_min= 1e100;
2029 /* if 'q' pressed, exits */
2030 if (!using_stdin) {
2031 if (q_pressed)
2032 break;
2033 /* read_key() returns 0 on EOF */
2034 key = read_key();
2035 if (key == 'q')
2036 break;
2039 /* select the stream that we must read now by looking at the
2040 smallest output pts */
2041 file_index = -1;
2042 for(i=0;i<nb_ostreams;i++) {
2043 double ipts, opts;
2044 ost = ost_table[i];
2045 os = output_files[ost->file_index];
2046 ist = ist_table[ost->source_index];
2047 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
2048 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
2049 else
2050 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2051 ipts = (double)ist->pts;
2052 if (!file_table[ist->file_index].eof_reached){
2053 if(ipts < ipts_min) {
2054 ipts_min = ipts;
2055 if(input_sync ) file_index = ist->file_index;
2057 if(opts < opts_min) {
2058 opts_min = opts;
2059 if(!input_sync) file_index = ist->file_index;
2062 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2063 file_index= -1;
2064 break;
2067 /* if none, if is finished */
2068 if (file_index < 0) {
2069 break;
2072 /* finish if recording time exhausted */
2073 if (opts_min >= (recording_time / 1000000.0))
2074 break;
2076 /* finish if limit size exhausted */
2077 if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
2078 break;
2080 /* read a frame from it and output it in the fifo */
2081 is = input_files[file_index];
2082 if (av_read_frame(is, &pkt) < 0) {
2083 file_table[file_index].eof_reached = 1;
2084 if (opt_shortest)
2085 break;
2086 else
2087 continue;
2090 if (do_pkt_dump) {
2091 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2093 /* the following test is needed in case new streams appear
2094 dynamically in stream : we ignore them */
2095 if (pkt.stream_index >= file_table[file_index].nb_streams)
2096 goto discard_packet;
2097 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2098 ist = ist_table[ist_index];
2099 if (ist->discard)
2100 goto discard_packet;
2102 if (pkt.dts != AV_NOPTS_VALUE)
2103 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2104 if (pkt.pts != AV_NOPTS_VALUE)
2105 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2107 if(input_files_ts_scale[file_index][pkt.stream_index]){
2108 if(pkt.pts != AV_NOPTS_VALUE)
2109 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2110 if(pkt.dts != AV_NOPTS_VALUE)
2111 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2114 // 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);
2115 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
2116 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2117 int64_t delta= pkt_dts - ist->next_pts;
2118 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2119 input_files_ts_offset[ist->file_index]-= delta;
2120 if (verbose > 2)
2121 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2122 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2123 if(pkt.pts != AV_NOPTS_VALUE)
2124 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2128 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2129 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2131 if (verbose >= 0)
2132 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2133 ist->file_index, ist->index);
2134 if (exit_on_error)
2135 av_exit(1);
2136 av_free_packet(&pkt);
2137 goto redo;
2140 discard_packet:
2141 av_free_packet(&pkt);
2143 /* dump report by using the output first video and audio streams */
2144 print_report(output_files, ost_table, nb_ostreams, 0);
2147 /* at the end of stream, we must flush the decoder buffers */
2148 for(i=0;i<nb_istreams;i++) {
2149 ist = ist_table[i];
2150 if (ist->decoding_needed) {
2151 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2155 term_exit();
2157 /* write the trailer if needed and close file */
2158 for(i=0;i<nb_output_files;i++) {
2159 os = output_files[i];
2160 av_write_trailer(os);
2163 /* dump report by using the first video and audio streams */
2164 print_report(output_files, ost_table, nb_ostreams, 1);
2166 /* close each encoder */
2167 for(i=0;i<nb_ostreams;i++) {
2168 ost = ost_table[i];
2169 if (ost->encoding_needed) {
2170 av_freep(&ost->st->codec->stats_in);
2171 avcodec_close(ost->st->codec);
2175 /* close each decoder */
2176 for(i=0;i<nb_istreams;i++) {
2177 ist = ist_table[i];
2178 if (ist->decoding_needed) {
2179 avcodec_close(ist->st->codec);
2183 /* finished ! */
2185 ret = 0;
2186 fail1:
2187 av_freep(&bit_buffer);
2188 av_free(file_table);
2190 if (ist_table) {
2191 for(i=0;i<nb_istreams;i++) {
2192 ist = ist_table[i];
2193 av_free(ist);
2195 av_free(ist_table);
2197 if (ost_table) {
2198 for(i=0;i<nb_ostreams;i++) {
2199 ost = ost_table[i];
2200 if (ost) {
2201 if (ost->logfile) {
2202 fclose(ost->logfile);
2203 ost->logfile = NULL;
2205 av_fifo_free(&ost->fifo); /* works even if fifo is not
2206 initialized but set to zero */
2207 av_free(ost->pict_tmp.data[0]);
2208 if (ost->video_resample)
2209 sws_freeContext(ost->img_resample_ctx);
2210 if (ost->resample)
2211 audio_resample_close(ost->resample);
2212 if (ost->reformat_ctx)
2213 av_audio_convert_free(ost->reformat_ctx);
2214 av_free(ost);
2217 av_free(ost_table);
2219 return ret;
2220 fail:
2221 ret = AVERROR(ENOMEM);
2222 goto fail1;
2225 #if 0
2226 int file_read(const char *filename)
2228 URLContext *h;
2229 unsigned char buffer[1024];
2230 int len, i;
2232 if (url_open(&h, filename, O_RDONLY) < 0) {
2233 printf("could not open '%s'\n", filename);
2234 return -1;
2236 for(;;) {
2237 len = url_read(h, buffer, sizeof(buffer));
2238 if (len <= 0)
2239 break;
2240 for(i=0;i<len;i++) putchar(buffer[i]);
2242 url_close(h);
2243 return 0;
2245 #endif
2247 static void opt_format(const char *arg)
2249 /* compatibility stuff for pgmyuv */
2250 if (!strcmp(arg, "pgmyuv")) {
2251 pgmyuv_compatibility_hack=1;
2252 // opt_image_format(arg);
2253 arg = "image2";
2254 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2257 file_iformat = av_find_input_format(arg);
2258 file_oformat = guess_format(arg, NULL, NULL);
2259 if (!file_iformat && !file_oformat) {
2260 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2261 av_exit(1);
2265 static void opt_video_rc_override_string(const char *arg)
2267 video_rc_override_string = arg;
2270 static int opt_me_threshold(const char *opt, const char *arg)
2272 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2273 return 0;
2276 static int opt_verbose(const char *opt, const char *arg)
2278 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2279 av_log_set_level(verbose);
2280 return 0;
2283 static int opt_frame_rate(const char *opt, const char *arg)
2285 if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2286 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2287 av_exit(1);
2289 return 0;
2292 static int opt_bitrate(const char *opt, const char *arg)
2294 int codec_type = opt[0]=='a' ? CODEC_TYPE_AUDIO : CODEC_TYPE_VIDEO;
2296 opt_default(opt, arg);
2298 if (av_get_int(avctx_opts[codec_type], "b", NULL) < 1000)
2299 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2301 return 0;
2304 static void opt_frame_crop_top(const char *arg)
2306 frame_topBand = atoi(arg);
2307 if (frame_topBand < 0) {
2308 fprintf(stderr, "Incorrect top crop size\n");
2309 av_exit(1);
2311 if ((frame_topBand % 2) != 0) {
2312 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2313 av_exit(1);
2315 if ((frame_topBand) >= frame_height){
2316 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2317 av_exit(1);
2319 frame_height -= frame_topBand;
2322 static void opt_frame_crop_bottom(const char *arg)
2324 frame_bottomBand = atoi(arg);
2325 if (frame_bottomBand < 0) {
2326 fprintf(stderr, "Incorrect bottom crop size\n");
2327 av_exit(1);
2329 if ((frame_bottomBand % 2) != 0) {
2330 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2331 av_exit(1);
2333 if ((frame_bottomBand) >= frame_height){
2334 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2335 av_exit(1);
2337 frame_height -= frame_bottomBand;
2340 static void opt_frame_crop_left(const char *arg)
2342 frame_leftBand = atoi(arg);
2343 if (frame_leftBand < 0) {
2344 fprintf(stderr, "Incorrect left crop size\n");
2345 av_exit(1);
2347 if ((frame_leftBand % 2) != 0) {
2348 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2349 av_exit(1);
2351 if ((frame_leftBand) >= frame_width){
2352 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2353 av_exit(1);
2355 frame_width -= frame_leftBand;
2358 static void opt_frame_crop_right(const char *arg)
2360 frame_rightBand = atoi(arg);
2361 if (frame_rightBand < 0) {
2362 fprintf(stderr, "Incorrect right crop size\n");
2363 av_exit(1);
2365 if ((frame_rightBand % 2) != 0) {
2366 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2367 av_exit(1);
2369 if ((frame_rightBand) >= frame_width){
2370 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2371 av_exit(1);
2373 frame_width -= frame_rightBand;
2376 static void opt_frame_size(const char *arg)
2378 if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
2379 fprintf(stderr, "Incorrect frame size\n");
2380 av_exit(1);
2382 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2383 fprintf(stderr, "Frame size must be a multiple of 2\n");
2384 av_exit(1);
2389 #define SCALEBITS 10
2390 #define ONE_HALF (1 << (SCALEBITS - 1))
2391 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2393 #define RGB_TO_Y(r, g, b) \
2394 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2395 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2397 #define RGB_TO_U(r1, g1, b1, shift)\
2398 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2399 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2401 #define RGB_TO_V(r1, g1, b1, shift)\
2402 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2403 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2405 static void opt_pad_color(const char *arg) {
2406 /* Input is expected to be six hex digits similar to
2407 how colors are expressed in html tags (but without the #) */
2408 int rgb = strtol(arg, NULL, 16);
2409 int r,g,b;
2411 r = (rgb >> 16);
2412 g = ((rgb >> 8) & 255);
2413 b = (rgb & 255);
2415 padcolor[0] = RGB_TO_Y(r,g,b);
2416 padcolor[1] = RGB_TO_U(r,g,b,0);
2417 padcolor[2] = RGB_TO_V(r,g,b,0);
2420 static void opt_frame_pad_top(const char *arg)
2422 frame_padtop = atoi(arg);
2423 if (frame_padtop < 0) {
2424 fprintf(stderr, "Incorrect top pad size\n");
2425 av_exit(1);
2427 if ((frame_padtop % 2) != 0) {
2428 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2429 av_exit(1);
2433 static void opt_frame_pad_bottom(const char *arg)
2435 frame_padbottom = atoi(arg);
2436 if (frame_padbottom < 0) {
2437 fprintf(stderr, "Incorrect bottom pad size\n");
2438 av_exit(1);
2440 if ((frame_padbottom % 2) != 0) {
2441 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2442 av_exit(1);
2447 static void opt_frame_pad_left(const char *arg)
2449 frame_padleft = atoi(arg);
2450 if (frame_padleft < 0) {
2451 fprintf(stderr, "Incorrect left pad size\n");
2452 av_exit(1);
2454 if ((frame_padleft % 2) != 0) {
2455 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2456 av_exit(1);
2461 static void opt_frame_pad_right(const char *arg)
2463 frame_padright = atoi(arg);
2464 if (frame_padright < 0) {
2465 fprintf(stderr, "Incorrect right pad size\n");
2466 av_exit(1);
2468 if ((frame_padright % 2) != 0) {
2469 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2470 av_exit(1);
2474 static void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts)
2476 int i;
2477 char fmt_str[128];
2478 for (i=-1; i < nb_fmts; i++) {
2479 get_fmt_string (fmt_str, sizeof(fmt_str), i);
2480 fprintf(stdout, "%s\n", fmt_str);
2484 static void opt_frame_pix_fmt(const char *arg)
2486 if (strcmp(arg, "list"))
2487 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2488 else {
2489 list_fmts(avcodec_pix_fmt_string, PIX_FMT_NB);
2490 av_exit(0);
2494 static void opt_frame_aspect_ratio(const char *arg)
2496 int x = 0, y = 0;
2497 double ar = 0;
2498 const char *p;
2499 char *end;
2501 p = strchr(arg, ':');
2502 if (p) {
2503 x = strtol(arg, &end, 10);
2504 if (end == p)
2505 y = strtol(end+1, &end, 10);
2506 if (x > 0 && y > 0)
2507 ar = (double)x / (double)y;
2508 } else
2509 ar = strtod(arg, NULL);
2511 if (!ar) {
2512 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2513 av_exit(1);
2515 frame_aspect_ratio = ar;
2518 static void opt_qscale(const char *arg)
2520 video_qscale = atof(arg);
2521 if (video_qscale <= 0 ||
2522 video_qscale > 255) {
2523 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2524 av_exit(1);
2528 static void opt_top_field_first(const char *arg)
2530 top_field_first= atoi(arg);
2533 static int opt_thread_count(const char *opt, const char *arg)
2535 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2536 #if !defined(HAVE_THREADS)
2537 if (verbose >= 0)
2538 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2539 #endif
2540 return 0;
2543 static void opt_audio_sample_fmt(const char *arg)
2545 if (strcmp(arg, "list"))
2546 audio_sample_fmt = avcodec_get_sample_fmt(arg);
2547 else {
2548 list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
2549 av_exit(0);
2553 static int opt_audio_rate(const char *opt, const char *arg)
2555 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2556 return 0;
2559 static int opt_audio_channels(const char *opt, const char *arg)
2561 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2562 return 0;
2565 static void opt_video_channel(const char *arg)
2567 video_channel = strtol(arg, NULL, 0);
2570 static void opt_video_standard(const char *arg)
2572 video_standard = av_strdup(arg);
2575 static void opt_codec(int *pstream_copy, char **pcodec_name,
2576 int codec_type, const char *arg)
2578 av_freep(pcodec_name);
2579 if (!strcmp(arg, "copy")) {
2580 *pstream_copy = 1;
2581 } else {
2582 *pcodec_name = av_strdup(arg);
2586 static void opt_audio_codec(const char *arg)
2588 opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg);
2591 static void opt_audio_tag(const char *arg)
2593 char *tail;
2594 audio_codec_tag= strtol(arg, &tail, 0);
2596 if(!tail || *tail)
2597 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2600 static void opt_video_tag(const char *arg)
2602 char *tail;
2603 video_codec_tag= strtol(arg, &tail, 0);
2605 if(!tail || *tail)
2606 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2609 #ifdef CONFIG_VHOOK
2610 static void add_frame_hooker(const char *arg)
2612 int argc = 0;
2613 char *argv[64];
2614 int i;
2615 char *args = av_strdup(arg);
2617 using_vhook = 1;
2619 argv[0] = strtok(args, " ");
2620 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2623 i = frame_hook_add(argc, argv);
2625 if (i != 0) {
2626 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2627 av_exit(1);
2630 #endif
2632 static void opt_video_codec(const char *arg)
2634 opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg);
2637 static void opt_subtitle_codec(const char *arg)
2639 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
2642 static void opt_map(const char *arg)
2644 AVStreamMap *m;
2645 char *p;
2647 m = &stream_maps[nb_stream_maps++];
2649 m->file_index = strtol(arg, &p, 0);
2650 if (*p)
2651 p++;
2653 m->stream_index = strtol(p, &p, 0);
2654 if (*p) {
2655 p++;
2656 m->sync_file_index = strtol(p, &p, 0);
2657 if (*p)
2658 p++;
2659 m->sync_stream_index = strtol(p, &p, 0);
2660 } else {
2661 m->sync_file_index = m->file_index;
2662 m->sync_stream_index = m->stream_index;
2666 static void opt_map_meta_data(const char *arg)
2668 AVMetaDataMap *m;
2669 char *p;
2671 m = &meta_data_maps[nb_meta_data_maps++];
2673 m->out_file = strtol(arg, &p, 0);
2674 if (*p)
2675 p++;
2677 m->in_file = strtol(p, &p, 0);
2680 static void opt_input_ts_scale(const char *arg)
2682 unsigned int stream;
2683 double scale;
2684 char *p;
2686 stream = strtol(arg, &p, 0);
2687 if (*p)
2688 p++;
2689 scale= strtod(p, &p);
2691 if(stream >= MAX_STREAMS)
2692 av_exit(1);
2694 input_files_ts_scale[nb_input_files][stream]= scale;
2697 static int opt_recording_time(const char *opt, const char *arg)
2699 recording_time = parse_time_or_die(opt, arg, 1);
2700 return 0;
2703 static int opt_start_time(const char *opt, const char *arg)
2705 start_time = parse_time_or_die(opt, arg, 1);
2706 return 0;
2709 static int opt_rec_timestamp(const char *opt, const char *arg)
2711 rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
2712 return 0;
2715 static int opt_input_ts_offset(const char *opt, const char *arg)
2717 input_ts_offset = parse_time_or_die(opt, arg, 1);
2718 return 0;
2721 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
2723 const char *codec_string = encoder ? "encoder" : "decoder";
2724 AVCodec *codec;
2726 if(!name)
2727 return CODEC_ID_NONE;
2728 codec = encoder ?
2729 avcodec_find_encoder_by_name(name) :
2730 avcodec_find_decoder_by_name(name);
2731 if(!codec) {
2732 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2733 av_exit(1);
2735 if(codec->type != type) {
2736 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2737 av_exit(1);
2739 return codec->id;
2742 static void opt_input_file(const char *filename)
2744 AVFormatContext *ic;
2745 AVFormatParameters params, *ap = &params;
2746 int err, i, ret, rfps, rfps_base;
2747 int64_t timestamp;
2749 if (!strcmp(filename, "-"))
2750 filename = "pipe:";
2752 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2753 !strcmp(filename, "/dev/stdin");
2755 /* get default parameters from command line */
2756 ic = av_alloc_format_context();
2758 memset(ap, 0, sizeof(*ap));
2759 ap->prealloced_context = 1;
2760 ap->sample_rate = audio_sample_rate;
2761 ap->channels = audio_channels;
2762 ap->time_base.den = frame_rate.num;
2763 ap->time_base.num = frame_rate.den;
2764 ap->width = frame_width + frame_padleft + frame_padright;
2765 ap->height = frame_height + frame_padtop + frame_padbottom;
2766 ap->pix_fmt = frame_pix_fmt;
2767 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
2768 ap->channel = video_channel;
2769 ap->standard = video_standard;
2770 ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0);
2771 ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0);
2772 if(pgmyuv_compatibility_hack)
2773 ap->video_codec_id= CODEC_ID_PGMYUV;
2775 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
2777 ic->video_codec_id = find_codec_or_die(video_codec_name , CODEC_TYPE_VIDEO , 0);
2778 ic->audio_codec_id = find_codec_or_die(audio_codec_name , CODEC_TYPE_AUDIO , 0);
2779 ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 0);
2781 /* open the input file with generic libav function */
2782 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2783 if (err < 0) {
2784 print_error(filename, err);
2785 av_exit(1);
2787 if(opt_programid) {
2788 int i;
2789 for(i=0; i<ic->nb_programs; i++)
2790 if(ic->programs[i]->id != opt_programid)
2791 ic->programs[i]->discard = AVDISCARD_ALL;
2794 ic->loop_input = loop_input;
2796 /* If not enough info to get the stream parameters, we decode the
2797 first frames to get it. (used in mpeg case for example) */
2798 ret = av_find_stream_info(ic);
2799 if (ret < 0 && verbose >= 0) {
2800 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2801 av_exit(1);
2804 timestamp = start_time;
2805 /* add the stream start time */
2806 if (ic->start_time != AV_NOPTS_VALUE)
2807 timestamp += ic->start_time;
2809 /* if seeking requested, we execute it */
2810 if (start_time != 0) {
2811 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2812 if (ret < 0) {
2813 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2814 filename, (double)timestamp / AV_TIME_BASE);
2816 /* reset seek info */
2817 start_time = 0;
2820 /* update the current parameters so that they match the one of the input stream */
2821 for(i=0;i<ic->nb_streams;i++) {
2822 AVCodecContext *enc = ic->streams[i]->codec;
2823 if(thread_count>1)
2824 avcodec_thread_init(enc, thread_count);
2825 enc->thread_count= thread_count;
2826 switch(enc->codec_type) {
2827 case CODEC_TYPE_AUDIO:
2828 set_context_opts(enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2829 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2830 audio_channels = enc->channels;
2831 audio_sample_rate = enc->sample_rate;
2832 audio_sample_fmt = enc->sample_fmt;
2833 if(audio_disable)
2834 ic->streams[i]->discard= AVDISCARD_ALL;
2835 break;
2836 case CODEC_TYPE_VIDEO:
2837 set_context_opts(enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2838 frame_height = enc->height;
2839 frame_width = enc->width;
2840 if(ic->streams[i]->sample_aspect_ratio.num)
2841 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
2842 else
2843 frame_aspect_ratio=av_q2d(enc->sample_aspect_ratio);
2844 frame_aspect_ratio *= (float) enc->width / enc->height;
2845 frame_pix_fmt = enc->pix_fmt;
2846 rfps = ic->streams[i]->r_frame_rate.num;
2847 rfps_base = ic->streams[i]->r_frame_rate.den;
2848 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2849 if(me_threshold)
2850 enc->debug |= FF_DEBUG_MV;
2852 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2854 if (verbose >= 0)
2855 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2856 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2858 (float)rfps / rfps_base, rfps, rfps_base);
2860 /* update the current frame rate to match the stream frame rate */
2861 frame_rate.num = rfps;
2862 frame_rate.den = rfps_base;
2864 enc->rate_emu = rate_emu;
2865 if(video_disable)
2866 ic->streams[i]->discard= AVDISCARD_ALL;
2867 else if(video_discard)
2868 ic->streams[i]->discard= video_discard;
2869 break;
2870 case CODEC_TYPE_DATA:
2871 break;
2872 case CODEC_TYPE_SUBTITLE:
2873 if(subtitle_disable)
2874 ic->streams[i]->discard = AVDISCARD_ALL;
2875 break;
2876 case CODEC_TYPE_ATTACHMENT:
2877 case CODEC_TYPE_UNKNOWN:
2878 break;
2879 default:
2880 abort();
2884 input_files[nb_input_files] = ic;
2885 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2886 /* dump the file content */
2887 if (verbose >= 0)
2888 dump_format(ic, nb_input_files, filename, 0);
2890 nb_input_files++;
2891 file_iformat = NULL;
2892 file_oformat = NULL;
2894 video_channel = 0;
2896 rate_emu = 0;
2897 av_freep(&video_codec_name);
2898 av_freep(&audio_codec_name);
2899 av_freep(&subtitle_codec_name);
2902 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
2903 int *has_subtitle_ptr)
2905 int has_video, has_audio, has_subtitle, i, j;
2906 AVFormatContext *ic;
2908 has_video = 0;
2909 has_audio = 0;
2910 has_subtitle = 0;
2911 for(j=0;j<nb_input_files;j++) {
2912 ic = input_files[j];
2913 for(i=0;i<ic->nb_streams;i++) {
2914 AVCodecContext *enc = ic->streams[i]->codec;
2915 switch(enc->codec_type) {
2916 case CODEC_TYPE_AUDIO:
2917 has_audio = 1;
2918 break;
2919 case CODEC_TYPE_VIDEO:
2920 has_video = 1;
2921 break;
2922 case CODEC_TYPE_SUBTITLE:
2923 has_subtitle = 1;
2924 break;
2925 case CODEC_TYPE_DATA:
2926 case CODEC_TYPE_ATTACHMENT:
2927 case CODEC_TYPE_UNKNOWN:
2928 break;
2929 default:
2930 abort();
2934 *has_video_ptr = has_video;
2935 *has_audio_ptr = has_audio;
2936 *has_subtitle_ptr = has_subtitle;
2939 static void new_video_stream(AVFormatContext *oc)
2941 AVStream *st;
2942 AVCodecContext *video_enc;
2943 int codec_id;
2945 st = av_new_stream(oc, oc->nb_streams);
2946 if (!st) {
2947 fprintf(stderr, "Could not alloc stream\n");
2948 av_exit(1);
2950 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
2951 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
2952 video_bitstream_filters= NULL;
2954 if(thread_count>1)
2955 avcodec_thread_init(st->codec, thread_count);
2957 video_enc = st->codec;
2959 if(video_codec_tag)
2960 video_enc->codec_tag= video_codec_tag;
2962 if( (video_global_header&1)
2963 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
2964 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2965 avctx_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
2967 if(video_global_header&2){
2968 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
2969 avctx_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
2972 if (video_stream_copy) {
2973 st->stream_copy = 1;
2974 video_enc->codec_type = CODEC_TYPE_VIDEO;
2975 video_enc->sample_aspect_ratio =
2976 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
2977 } else {
2978 const char *p;
2979 int i;
2980 AVCodec *codec;
2981 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
2983 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
2984 if (video_codec_name)
2985 codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
2987 video_enc->codec_id = codec_id;
2988 codec = avcodec_find_encoder(codec_id);
2990 set_context_opts(video_enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
2992 if (codec && codec->supported_framerates && !force_fps)
2993 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
2994 video_enc->time_base.den = fps.num;
2995 video_enc->time_base.num = fps.den;
2997 video_enc->width = frame_width + frame_padright + frame_padleft;
2998 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2999 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3000 video_enc->pix_fmt = frame_pix_fmt;
3001 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3003 if(codec && codec->pix_fmts){
3004 const enum PixelFormat *p= codec->pix_fmts;
3005 for(; *p!=-1; p++){
3006 if(*p == video_enc->pix_fmt)
3007 break;
3009 if(*p == -1)
3010 video_enc->pix_fmt = codec->pix_fmts[0];
3013 if (intra_only)
3014 video_enc->gop_size = 0;
3015 if (video_qscale || same_quality) {
3016 video_enc->flags |= CODEC_FLAG_QSCALE;
3017 video_enc->global_quality=
3018 st->quality = FF_QP2LAMBDA * video_qscale;
3021 if(intra_matrix)
3022 video_enc->intra_matrix = intra_matrix;
3023 if(inter_matrix)
3024 video_enc->inter_matrix = inter_matrix;
3026 video_enc->thread_count = thread_count;
3027 p= video_rc_override_string;
3028 for(i=0; p; i++){
3029 int start, end, q;
3030 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3031 if(e!=3){
3032 fprintf(stderr, "error parsing rc_override\n");
3033 av_exit(1);
3035 video_enc->rc_override=
3036 av_realloc(video_enc->rc_override,
3037 sizeof(RcOverride)*(i+1));
3038 video_enc->rc_override[i].start_frame= start;
3039 video_enc->rc_override[i].end_frame = end;
3040 if(q>0){
3041 video_enc->rc_override[i].qscale= q;
3042 video_enc->rc_override[i].quality_factor= 1.0;
3044 else{
3045 video_enc->rc_override[i].qscale= 0;
3046 video_enc->rc_override[i].quality_factor= -q/100.0;
3048 p= strchr(p, '/');
3049 if(p) p++;
3051 video_enc->rc_override_count=i;
3052 if (!video_enc->rc_initial_buffer_occupancy)
3053 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3054 video_enc->me_threshold= me_threshold;
3055 video_enc->intra_dc_precision= intra_dc_precision - 8;
3057 if (do_psnr)
3058 video_enc->flags|= CODEC_FLAG_PSNR;
3060 /* two pass mode */
3061 if (do_pass) {
3062 if (do_pass == 1) {
3063 video_enc->flags |= CODEC_FLAG_PASS1;
3064 } else {
3065 video_enc->flags |= CODEC_FLAG_PASS2;
3070 /* reset some key parameters */
3071 video_disable = 0;
3072 av_freep(&video_codec_name);
3073 video_stream_copy = 0;
3076 static void new_audio_stream(AVFormatContext *oc)
3078 AVStream *st;
3079 AVCodecContext *audio_enc;
3080 int codec_id;
3082 st = av_new_stream(oc, oc->nb_streams);
3083 if (!st) {
3084 fprintf(stderr, "Could not alloc stream\n");
3085 av_exit(1);
3087 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
3089 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
3090 audio_bitstream_filters= NULL;
3092 if(thread_count>1)
3093 avcodec_thread_init(st->codec, thread_count);
3095 audio_enc = st->codec;
3096 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3098 if(audio_codec_tag)
3099 audio_enc->codec_tag= audio_codec_tag;
3101 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3102 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3103 avctx_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3105 if (audio_stream_copy) {
3106 st->stream_copy = 1;
3107 audio_enc->channels = audio_channels;
3108 } else {
3109 AVCodec *codec;
3110 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3112 set_context_opts(audio_enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3114 if (audio_codec_name)
3115 codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
3116 audio_enc->codec_id = codec_id;
3117 codec = avcodec_find_encoder(codec_id);
3119 if (audio_qscale > QSCALE_NONE) {
3120 audio_enc->flags |= CODEC_FLAG_QSCALE;
3121 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3123 audio_enc->thread_count = thread_count;
3124 audio_enc->channels = audio_channels;
3125 audio_enc->sample_fmt = audio_sample_fmt;
3127 if(codec && codec->sample_fmts){
3128 const enum SampleFormat *p= codec->sample_fmts;
3129 for(; *p!=-1; p++){
3130 if(*p == audio_enc->sample_fmt)
3131 break;
3133 if(*p == -1)
3134 audio_enc->sample_fmt = codec->sample_fmts[0];
3137 audio_enc->sample_rate = audio_sample_rate;
3138 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3139 if (audio_language) {
3140 av_strlcpy(st->language, audio_language, sizeof(st->language));
3141 av_free(audio_language);
3142 audio_language = NULL;
3145 /* reset some key parameters */
3146 audio_disable = 0;
3147 av_freep(&audio_codec_name);
3148 audio_stream_copy = 0;
3151 static void new_subtitle_stream(AVFormatContext *oc)
3153 AVStream *st;
3154 AVCodecContext *subtitle_enc;
3156 st = av_new_stream(oc, oc->nb_streams);
3157 if (!st) {
3158 fprintf(stderr, "Could not alloc stream\n");
3159 av_exit(1);
3161 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
3163 bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
3164 subtitle_bitstream_filters= NULL;
3166 subtitle_enc = st->codec;
3167 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3168 if (subtitle_stream_copy) {
3169 st->stream_copy = 1;
3170 } else {
3171 set_context_opts(avctx_opts[CODEC_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3172 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1);
3175 if (subtitle_language) {
3176 av_strlcpy(st->language, subtitle_language, sizeof(st->language));
3177 av_free(subtitle_language);
3178 subtitle_language = NULL;
3181 subtitle_disable = 0;
3182 av_freep(&subtitle_codec_name);
3183 subtitle_stream_copy = 0;
3186 static void opt_new_audio_stream(void)
3188 AVFormatContext *oc;
3189 if (nb_output_files <= 0) {
3190 fprintf(stderr, "At least one output file must be specified\n");
3191 av_exit(1);
3193 oc = output_files[nb_output_files - 1];
3194 new_audio_stream(oc);
3197 static void opt_new_video_stream(void)
3199 AVFormatContext *oc;
3200 if (nb_output_files <= 0) {
3201 fprintf(stderr, "At least one output file must be specified\n");
3202 av_exit(1);
3204 oc = output_files[nb_output_files - 1];
3205 new_video_stream(oc);
3208 static void opt_new_subtitle_stream(void)
3210 AVFormatContext *oc;
3211 if (nb_output_files <= 0) {
3212 fprintf(stderr, "At least one output file must be specified\n");
3213 av_exit(1);
3215 oc = output_files[nb_output_files - 1];
3216 new_subtitle_stream(oc);
3219 static void opt_output_file(const char *filename)
3221 AVFormatContext *oc;
3222 int use_video, use_audio, use_subtitle;
3223 int input_has_video, input_has_audio, input_has_subtitle;
3224 AVFormatParameters params, *ap = &params;
3226 if (!strcmp(filename, "-"))
3227 filename = "pipe:";
3229 oc = av_alloc_format_context();
3231 if (!file_oformat) {
3232 file_oformat = guess_format(NULL, filename, NULL);
3233 if (!file_oformat) {
3234 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3235 filename);
3236 av_exit(1);
3240 oc->oformat = file_oformat;
3241 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3243 if (!strcmp(file_oformat->name, "ffm") &&
3244 av_strstart(filename, "http:", NULL)) {
3245 /* special case for files sent to ffserver: we get the stream
3246 parameters from ffserver */
3247 int err = read_ffserver_streams(oc, filename);
3248 if (err < 0) {
3249 print_error(filename, err);
3250 av_exit(1);
3252 } else {
3253 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3254 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3255 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3257 /* disable if no corresponding type found and at least one
3258 input file */
3259 if (nb_input_files > 0) {
3260 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3261 &input_has_subtitle);
3262 if (!input_has_video)
3263 use_video = 0;
3264 if (!input_has_audio)
3265 use_audio = 0;
3266 if (!input_has_subtitle)
3267 use_subtitle = 0;
3270 /* manual disable */
3271 if (audio_disable) {
3272 use_audio = 0;
3274 if (video_disable) {
3275 use_video = 0;
3277 if (subtitle_disable) {
3278 use_subtitle = 0;
3281 if (use_video) {
3282 new_video_stream(oc);
3285 if (use_audio) {
3286 new_audio_stream(oc);
3289 if (use_subtitle) {
3290 new_subtitle_stream(oc);
3293 oc->timestamp = rec_timestamp;
3295 if (str_title)
3296 av_strlcpy(oc->title, str_title, sizeof(oc->title));
3297 if (str_author)
3298 av_strlcpy(oc->author, str_author, sizeof(oc->author));
3299 if (str_copyright)
3300 av_strlcpy(oc->copyright, str_copyright, sizeof(oc->copyright));
3301 if (str_comment)
3302 av_strlcpy(oc->comment, str_comment, sizeof(oc->comment));
3303 if (str_album)
3304 av_strlcpy(oc->album, str_album, sizeof(oc->album));
3305 if (str_genre)
3306 av_strlcpy(oc->genre, str_genre, sizeof(oc->genre));
3309 output_files[nb_output_files++] = oc;
3311 /* check filename in case of an image number is expected */
3312 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3313 if (!av_filename_number_test(oc->filename)) {
3314 print_error(oc->filename, AVERROR_NUMEXPECTED);
3315 av_exit(1);
3319 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3320 /* test if it already exists to avoid loosing precious files */
3321 if (!file_overwrite &&
3322 (strchr(filename, ':') == NULL ||
3323 filename[1] == ':' ||
3324 av_strstart(filename, "file:", NULL))) {
3325 if (url_exist(filename)) {
3326 int c;
3328 if (!using_stdin) {
3329 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3330 fflush(stderr);
3331 c = getchar();
3332 if (toupper(c) != 'Y') {
3333 fprintf(stderr, "Not overwriting - exiting\n");
3334 av_exit(1);
3337 else {
3338 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3339 av_exit(1);
3344 /* open the file */
3345 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3346 fprintf(stderr, "Could not open '%s'\n", filename);
3347 av_exit(1);
3351 memset(ap, 0, sizeof(*ap));
3352 if (av_set_parameters(oc, ap) < 0) {
3353 fprintf(stderr, "%s: Invalid encoding parameters\n",
3354 oc->filename);
3355 av_exit(1);
3358 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3359 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3360 oc->loop_output = loop_output;
3362 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
3364 /* reset some options */
3365 file_oformat = NULL;
3366 file_iformat = NULL;
3369 /* same option as mencoder */
3370 static void opt_pass(const char *pass_str)
3372 int pass;
3373 pass = atoi(pass_str);
3374 if (pass != 1 && pass != 2) {
3375 fprintf(stderr, "pass number can be only 1 or 2\n");
3376 av_exit(1);
3378 do_pass = pass;
3381 static int64_t getutime(void)
3383 #ifdef HAVE_GETRUSAGE
3384 struct rusage rusage;
3386 getrusage(RUSAGE_SELF, &rusage);
3387 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3388 #elif defined(HAVE_GETPROCESSTIMES)
3389 HANDLE proc;
3390 FILETIME c, e, k, u;
3391 proc = GetCurrentProcess();
3392 GetProcessTimes(proc, &c, &e, &k, &u);
3393 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3394 #else
3395 return av_gettime();
3396 #endif
3399 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3401 int i;
3402 const char *p = str;
3403 for(i = 0;; i++) {
3404 dest[i] = atoi(p);
3405 if(i == 63)
3406 break;
3407 p = strchr(p, ',');
3408 if(!p) {
3409 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3410 av_exit(1);
3412 p++;
3416 static void opt_inter_matrix(const char *arg)
3418 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3419 parse_matrix_coeffs(inter_matrix, arg);
3422 static void opt_intra_matrix(const char *arg)
3424 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3425 parse_matrix_coeffs(intra_matrix, arg);
3429 * Trivial log callback.
3430 * Only suitable for show_help and similar since it lacks prefix handling.
3432 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
3434 vfprintf(stdout, fmt, vl);
3437 static void show_help(void)
3439 av_log_set_callback(log_callback_help);
3440 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3441 "Hyper fast Audio and Video encoder\n");
3442 printf("\n");
3443 show_help_options(options, "Main options:\n",
3444 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3445 show_help_options(options, "\nAdvanced options:\n",
3446 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3447 OPT_EXPERT);
3448 show_help_options(options, "\nVideo options:\n",
3449 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3450 OPT_VIDEO);
3451 show_help_options(options, "\nAdvanced Video options:\n",
3452 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3453 OPT_VIDEO | OPT_EXPERT);
3454 show_help_options(options, "\nAudio options:\n",
3455 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3456 OPT_AUDIO);
3457 show_help_options(options, "\nAdvanced Audio options:\n",
3458 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3459 OPT_AUDIO | OPT_EXPERT);
3460 show_help_options(options, "\nSubtitle options:\n",
3461 OPT_SUBTITLE | OPT_GRAB,
3462 OPT_SUBTITLE);
3463 show_help_options(options, "\nAudio/Video grab options:\n",
3464 OPT_GRAB,
3465 OPT_GRAB);
3466 printf("\n");
3467 av_opt_show(avctx_opts[0], NULL);
3468 printf("\n");
3469 av_opt_show(avformat_opts, NULL);
3470 printf("\n");
3471 av_opt_show(sws_opts, NULL);
3474 static void opt_target(const char *arg)
3476 int norm = -1;
3477 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3479 if(!strncmp(arg, "pal-", 4)) {
3480 norm = 0;
3481 arg += 4;
3482 } else if(!strncmp(arg, "ntsc-", 5)) {
3483 norm = 1;
3484 arg += 5;
3485 } else if(!strncmp(arg, "film-", 5)) {
3486 norm = 2;
3487 arg += 5;
3488 } else {
3489 int fr;
3490 /* Calculate FR via float to avoid int overflow */
3491 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3492 if(fr == 25000) {
3493 norm = 0;
3494 } else if((fr == 29970) || (fr == 23976)) {
3495 norm = 1;
3496 } else {
3497 /* Try to determine PAL/NTSC by peeking in the input files */
3498 if(nb_input_files) {
3499 int i, j;
3500 for(j = 0; j < nb_input_files; j++) {
3501 for(i = 0; i < input_files[j]->nb_streams; i++) {
3502 AVCodecContext *c = input_files[j]->streams[i]->codec;
3503 if(c->codec_type != CODEC_TYPE_VIDEO)
3504 continue;
3505 fr = c->time_base.den * 1000 / c->time_base.num;
3506 if(fr == 25000) {
3507 norm = 0;
3508 break;
3509 } else if((fr == 29970) || (fr == 23976)) {
3510 norm = 1;
3511 break;
3514 if(norm >= 0)
3515 break;
3519 if(verbose && norm >= 0)
3520 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3523 if(norm < 0) {
3524 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3525 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3526 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3527 av_exit(1);
3530 if(!strcmp(arg, "vcd")) {
3532 opt_video_codec("mpeg1video");
3533 opt_audio_codec("mp2");
3534 opt_format("vcd");
3536 opt_frame_size(norm ? "352x240" : "352x288");
3537 opt_frame_rate(NULL, frame_rates[norm]);
3538 opt_default("gop", norm ? "18" : "15");
3540 opt_default("b", "1150000");
3541 opt_default("maxrate", "1150000");
3542 opt_default("minrate", "1150000");
3543 opt_default("bufsize", "327680"); // 40*1024*8;
3545 opt_default("ab", "224000");
3546 audio_sample_rate = 44100;
3547 audio_channels = 2;
3549 opt_default("packetsize", "2324");
3550 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3552 /* We have to offset the PTS, so that it is consistent with the SCR.
3553 SCR starts at 36000, but the first two packs contain only padding
3554 and the first pack from the other stream, respectively, may also have
3555 been written before.
3556 So the real data starts at SCR 36000+3*1200. */
3557 mux_preload= (36000+3*1200) / 90000.0; //0.44
3558 } else if(!strcmp(arg, "svcd")) {
3560 opt_video_codec("mpeg2video");
3561 opt_audio_codec("mp2");
3562 opt_format("svcd");
3564 opt_frame_size(norm ? "480x480" : "480x576");
3565 opt_frame_rate(NULL, frame_rates[norm]);
3566 opt_default("gop", norm ? "18" : "15");
3568 opt_default("b", "2040000");
3569 opt_default("maxrate", "2516000");
3570 opt_default("minrate", "0"); //1145000;
3571 opt_default("bufsize", "1835008"); //224*1024*8;
3572 opt_default("flags", "+scan_offset");
3575 opt_default("ab", "224000");
3576 audio_sample_rate = 44100;
3578 opt_default("packetsize", "2324");
3580 } else if(!strcmp(arg, "dvd")) {
3582 opt_video_codec("mpeg2video");
3583 opt_audio_codec("ac3");
3584 opt_format("dvd");
3586 opt_frame_size(norm ? "720x480" : "720x576");
3587 opt_frame_rate(NULL, frame_rates[norm]);
3588 opt_default("gop", norm ? "18" : "15");
3590 opt_default("b", "6000000");
3591 opt_default("maxrate", "9000000");
3592 opt_default("minrate", "0"); //1500000;
3593 opt_default("bufsize", "1835008"); //224*1024*8;
3595 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3596 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3598 opt_default("ab", "448000");
3599 audio_sample_rate = 48000;
3601 } else if(!strncmp(arg, "dv", 2)) {
3603 opt_format("dv");
3605 opt_frame_size(norm ? "720x480" : "720x576");
3606 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3607 (norm ? "yuv411p" : "yuv420p"));
3608 opt_frame_rate(NULL, frame_rates[norm]);
3610 audio_sample_rate = 48000;
3611 audio_channels = 2;
3613 } else {
3614 fprintf(stderr, "Unknown target: %s\n", arg);
3615 av_exit(1);
3619 static void opt_vstats_file (const char *arg)
3621 av_free (vstats_filename);
3622 vstats_filename=av_strdup (arg);
3625 static void opt_vstats (void)
3627 char filename[40];
3628 time_t today2 = time(NULL);
3629 struct tm *today = localtime(&today2);
3631 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3632 today->tm_sec);
3633 opt_vstats_file(filename);
3636 static int opt_bsf(const char *opt, const char *arg)
3638 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3639 AVBitStreamFilterContext **bsfp;
3641 if(!bsfc){
3642 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3643 av_exit(1);
3646 bsfp= *opt == 'v' ? &video_bitstream_filters :
3647 *opt == 'a' ? &audio_bitstream_filters :
3648 &subtitle_bitstream_filters;
3649 while(*bsfp)
3650 bsfp= &(*bsfp)->next;
3652 *bsfp= bsfc;
3654 return 0;
3657 static int opt_preset(const char *opt, const char *arg)
3659 FILE *f=NULL;
3660 char tmp[1000], tmp2[1000], line[1000];
3661 int i;
3662 const char *base[3]= { getenv("HOME"),
3663 "/usr/local/share",
3664 "/usr/share",
3667 for(i=!base[0]; i<3 && !f; i++){
3668 snprintf(tmp, sizeof(tmp), "%s/%sffmpeg/%s.ffpreset", base[i], i ? "" : ".", arg);
3669 f= fopen(tmp, "r");
3670 if(!f){
3671 char *codec_name= *opt == 'v' ? video_codec_name :
3672 *opt == 'a' ? audio_codec_name :
3673 subtitle_codec_name;
3674 snprintf(tmp, sizeof(tmp), "%s/%sffmpeg/%s-%s.ffpreset", base[i], i ? "" : ".", codec_name, arg);
3675 f= fopen(tmp, "r");
3678 if(!f && ((arg[0]=='.' && arg[1]=='/') || arg[0]=='/')){
3679 f= fopen(arg, "r");
3682 if(!f){
3683 fprintf(stderr, "Preset file not found\n");
3684 av_exit(1);
3687 while(!feof(f)){
3688 int e= fscanf(f, "%999[^\n]\n", line) - 1;
3689 if(line[0] == '#' && !e)
3690 continue;
3691 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
3692 if(e){
3693 fprintf(stderr, "Preset file invalid\n");
3694 av_exit(1);
3696 if(!strcmp(tmp, "acodec")){
3697 opt_audio_codec(tmp2);
3698 }else if(!strcmp(tmp, "vcodec")){
3699 opt_video_codec(tmp2);
3700 }else if(!strcmp(tmp, "scodec")){
3701 opt_subtitle_codec(tmp2);
3702 }else
3703 opt_default(tmp, tmp2);
3706 fclose(f);
3708 return 0;
3711 static const OptionDef options[] = {
3712 /* main options */
3713 { "L", OPT_EXIT, {(void*)show_license}, "show license" },
3714 { "h", OPT_EXIT, {(void*)show_help}, "show help" },
3715 { "version", OPT_EXIT, {(void*)show_version}, "show version" },
3716 { "formats", OPT_EXIT, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3717 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3718 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3719 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3720 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3721 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3722 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3723 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3724 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3725 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3726 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
3727 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3728 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3729 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3730 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3731 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3732 { "genre", HAS_ARG | OPT_STRING, {(void*)&str_genre}, "set the genre", "string" },
3733 { "album", HAS_ARG | OPT_STRING, {(void*)&str_album}, "set the album", "string" },
3734 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3735 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3736 "add timings for benchmarking" },
3737 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3738 "dump each input packet" },
3739 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3740 "when dumping packets, also dump the payload" },
3741 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3742 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3743 { "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)", "" },
3744 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set the logging verbosity level", "number" },
3745 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3746 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3747 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3748 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3749 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3750 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3751 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)&copy_ts}, "copy timestamps" },
3752 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3753 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3754 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3755 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
3757 /* video options */
3758 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3759 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3760 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3761 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3762 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3763 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3764 { "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" },
3765 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3766 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3767 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3768 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3769 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3770 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3771 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3772 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3773 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3774 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3775 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3776 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3777 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3778 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3779 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3780 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
3781 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3782 "use same video quality as source (implies VBR)" },
3783 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3784 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3785 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3786 "deinterlace pictures" },
3787 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3788 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
3789 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
3790 #ifdef CONFIG_VHOOK
3791 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3792 #endif
3793 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3794 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3795 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3796 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3797 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3798 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3799 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3800 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
3802 /* audio options */
3803 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3804 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3805 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3806 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3807 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3808 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3809 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3810 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3811 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3812 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3813 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3814 { "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" },
3816 /* subtitle options */
3817 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
3818 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3819 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
3820 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3822 /* grab options */
3823 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3824 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3825 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3827 /* muxer options */
3828 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
3829 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
3831 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3832 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3833 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3835 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3836 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3837 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3839 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
3840 { NULL, },
3843 int main(int argc, char **argv)
3845 int i;
3846 int64_t ti;
3848 avcodec_register_all();
3849 avdevice_register_all();
3850 av_register_all();
3852 if(isatty(STDIN_FILENO))
3853 url_set_interrupt_cb(decode_interrupt_cb);
3855 for(i=0; i<CODEC_TYPE_NB; i++){
3856 avctx_opts[i]= avcodec_alloc_context2(i);
3858 avformat_opts = av_alloc_format_context();
3859 sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
3861 show_banner();
3862 if (argc <= 1) {
3863 show_help();
3864 av_exit(1);
3867 /* parse options */
3868 parse_options(argc, argv, options, opt_output_file);
3870 /* file converter / grab */
3871 if (nb_output_files <= 0) {
3872 fprintf(stderr, "Must supply at least one output file\n");
3873 av_exit(1);
3876 if (nb_input_files == 0) {
3877 fprintf(stderr, "Must supply at least one input file\n");
3878 av_exit(1);
3881 ti = getutime();
3882 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3883 stream_maps, nb_stream_maps);
3884 ti = getutime() - ti;
3885 if (do_benchmark) {
3886 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3889 return av_exit(0);