cosmetics after last commit
[FFMpeg-mirror/lagarith.git] / ffmpeg.c
blobe8991808a1feb01a149a4fc335adcc160a9fcde1
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 "libavcodec/opt.h"
38 #include "libavcodec/audioconvert.h"
39 #include "libavcodec/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/avstring.h"
42 #include "libavformat/os_support.h"
44 #if HAVE_SYS_RESOURCE_H
45 #include <sys/types.h>
46 #include <sys/resource.h>
47 #elif HAVE_GETPROCESSTIMES
48 #include <windows.h>
49 #endif
51 #if HAVE_SYS_SELECT_H
52 #include <sys/select.h>
53 #endif
55 #if HAVE_TERMIOS_H
56 #include <fcntl.h>
57 #include <sys/ioctl.h>
58 #include <sys/time.h>
59 #include <termios.h>
60 #elif HAVE_CONIO_H
61 #include <conio.h>
62 #endif
63 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
64 #include <time.h>
66 #include "cmdutils.h"
68 #undef NDEBUG
69 #include <assert.h>
71 #undef exit
73 const char program_name[] = "FFmpeg";
74 const int program_birth_year = 2000;
76 /* select an input stream for an output stream */
77 typedef struct AVStreamMap {
78 int file_index;
79 int stream_index;
80 int sync_file_index;
81 int sync_stream_index;
82 } AVStreamMap;
84 /** select an input file for an output file */
85 typedef struct AVMetaDataMap {
86 int out_file;
87 int in_file;
88 } AVMetaDataMap;
90 static const OptionDef options[];
92 #define MAX_FILES 20
94 static AVFormatContext *input_files[MAX_FILES];
95 static int64_t input_files_ts_offset[MAX_FILES];
96 static double input_files_ts_scale[MAX_FILES][MAX_STREAMS];
97 static AVCodec *input_codecs[MAX_FILES*MAX_STREAMS];
98 static int nb_input_files = 0;
99 static int nb_icodecs;
101 static AVFormatContext *output_files[MAX_FILES];
102 static AVCodec *output_codecs[MAX_FILES*MAX_STREAMS];
103 static int nb_output_files = 0;
104 static int nb_ocodecs;
106 static AVStreamMap stream_maps[MAX_FILES*MAX_STREAMS];
107 static int nb_stream_maps;
109 static AVMetaDataMap meta_data_maps[MAX_FILES];
110 static int nb_meta_data_maps;
112 static AVInputFormat *file_iformat;
113 static AVOutputFormat *file_oformat;
114 static int frame_width = 0;
115 static int frame_height = 0;
116 static float frame_aspect_ratio = 0;
117 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
118 static enum SampleFormat audio_sample_fmt = SAMPLE_FMT_NONE;
119 static int frame_padtop = 0;
120 static int frame_padbottom = 0;
121 static int frame_padleft = 0;
122 static int frame_padright = 0;
123 static int padcolor[3] = {16,128,128}; /* default to black */
124 static int frame_topBand = 0;
125 static int frame_bottomBand = 0;
126 static int frame_leftBand = 0;
127 static int frame_rightBand = 0;
128 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
129 static AVRational frame_rate;
130 static float video_qscale = 0;
131 static uint16_t *intra_matrix = NULL;
132 static uint16_t *inter_matrix = NULL;
133 #if 0 //experimental, (can be removed)
134 static float video_rc_qsquish=1.0;
135 static float video_rc_qmod_amp=0;
136 static int video_rc_qmod_freq=0;
137 #endif
138 static const char *video_rc_override_string=NULL;
139 static int video_disable = 0;
140 static int video_discard = 0;
141 static char *video_codec_name = NULL;
142 static int video_codec_tag = 0;
143 static int same_quality = 0;
144 static int do_deinterlace = 0;
145 static int top_field_first = -1;
146 static int me_threshold = 0;
147 static int intra_dc_precision = 8;
148 static int loop_input = 0;
149 static int loop_output = AVFMT_NOOUTPUTLOOP;
150 static int qp_hist = 0;
152 static int intra_only = 0;
153 static int audio_sample_rate = 44100;
154 static int64_t channel_layout = 0;
155 #define QSCALE_NONE -99999
156 static float audio_qscale = QSCALE_NONE;
157 static int audio_disable = 0;
158 static int audio_channels = 1;
159 static char *audio_codec_name = NULL;
160 static int audio_codec_tag = 0;
161 static char *audio_language = NULL;
163 static int subtitle_disable = 0;
164 static char *subtitle_codec_name = NULL;
165 static char *subtitle_language = NULL;
166 static int subtitle_codec_tag = 0;
168 static float mux_preload= 0.5;
169 static float mux_max_delay= 0.7;
171 static int64_t recording_time = INT64_MAX;
172 static int64_t start_time = 0;
173 static int64_t rec_timestamp = 0;
174 static int64_t input_ts_offset = 0;
175 static int file_overwrite = 0;
176 static int metadata_count;
177 static AVMetadataTag *metadata;
178 static int do_benchmark = 0;
179 static int do_hex_dump = 0;
180 static int do_pkt_dump = 0;
181 static int do_psnr = 0;
182 static int do_pass = 0;
183 static char *pass_logfilename_prefix = NULL;
184 static int audio_stream_copy = 0;
185 static int video_stream_copy = 0;
186 static int subtitle_stream_copy = 0;
187 static int video_sync_method= -1;
188 static int audio_sync_method= 0;
189 static float audio_drift_threshold= 0.1;
190 static int copy_ts= 0;
191 static int opt_shortest = 0;
192 static int video_global_header = 0;
193 static char *vstats_filename;
194 static FILE *vstats_file;
195 static int opt_programid = 0;
196 static int copy_initial_nonkeyframes = 0;
198 static int rate_emu = 0;
200 static int video_channel = 0;
201 static char *video_standard;
203 static int audio_volume = 256;
205 static int exit_on_error = 0;
206 static int using_stdin = 0;
207 static int verbose = 1;
208 static int thread_count= 1;
209 static int q_pressed = 0;
210 static int64_t video_size = 0;
211 static int64_t audio_size = 0;
212 static int64_t extra_size = 0;
213 static int nb_frames_dup = 0;
214 static int nb_frames_drop = 0;
215 static int input_sync;
216 static uint64_t limit_filesize = 0;
217 static int force_fps = 0;
219 static int pgmyuv_compatibility_hack=0;
220 static float dts_delta_threshold = 10;
222 static unsigned int sws_flags = SWS_BICUBIC;
224 static int64_t timer_start;
226 static uint8_t *audio_buf;
227 static uint8_t *audio_out;
228 static uint8_t *audio_out2;
230 static short *samples;
232 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
233 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
234 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
235 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
237 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
239 struct AVInputStream;
241 typedef struct AVOutputStream {
242 int file_index; /* file index */
243 int index; /* stream index in the output file */
244 int source_index; /* AVInputStream index */
245 AVStream *st; /* stream in the output file */
246 int encoding_needed; /* true if encoding needed for this stream */
247 int frame_number;
248 /* input pts and corresponding output pts
249 for A/V sync */
250 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
251 struct AVInputStream *sync_ist; /* input stream to sync against */
252 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
253 /* video only */
254 int video_resample;
255 AVFrame pict_tmp; /* temporary image for resampling */
256 struct SwsContext *img_resample_ctx; /* for image resampling */
257 int resample_height;
258 int resample_width;
259 int resample_pix_fmt;
261 /* full frame size of first frame */
262 int original_height;
263 int original_width;
265 /* cropping area sizes */
266 int video_crop;
267 int topBand;
268 int bottomBand;
269 int leftBand;
270 int rightBand;
272 /* cropping area of first frame */
273 int original_topBand;
274 int original_bottomBand;
275 int original_leftBand;
276 int original_rightBand;
278 /* padding area sizes */
279 int video_pad;
280 int padtop;
281 int padbottom;
282 int padleft;
283 int padright;
285 /* audio only */
286 int audio_resample;
287 ReSampleContext *resample; /* for audio resampling */
288 int reformat_pair;
289 AVAudioConvert *reformat_ctx;
290 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
291 FILE *logfile;
292 } AVOutputStream;
294 typedef struct AVInputStream {
295 int file_index;
296 int index;
297 AVStream *st;
298 int discard; /* true if stream data should be discarded */
299 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
300 int64_t sample_index; /* current sample */
302 int64_t start; /* time when read started */
303 int64_t next_pts; /* synthetic pts for cases where pkt.pts
304 is not defined */
305 int64_t pts; /* current pts */
306 int is_start; /* is 1 at the start and after a discontinuity */
307 } AVInputStream;
309 typedef struct AVInputFile {
310 int eof_reached; /* true if eof reached */
311 int ist_index; /* index of first stream in ist_table */
312 int buffer_size; /* current total buffer size */
313 int nb_streams; /* nb streams we are aware of */
314 } AVInputFile;
316 #if HAVE_TERMIOS_H
318 /* init terminal so that we can grab keys */
319 static struct termios oldtty;
320 #endif
322 static void term_exit(void)
324 #if HAVE_TERMIOS_H
325 tcsetattr (0, TCSANOW, &oldtty);
326 #endif
329 static volatile int received_sigterm = 0;
331 static void
332 sigterm_handler(int sig)
334 received_sigterm = sig;
335 term_exit();
338 static void term_init(void)
340 #if HAVE_TERMIOS_H
341 struct termios tty;
343 tcgetattr (0, &tty);
344 oldtty = tty;
346 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
347 |INLCR|IGNCR|ICRNL|IXON);
348 tty.c_oflag |= OPOST;
349 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
350 tty.c_cflag &= ~(CSIZE|PARENB);
351 tty.c_cflag |= CS8;
352 tty.c_cc[VMIN] = 1;
353 tty.c_cc[VTIME] = 0;
355 tcsetattr (0, TCSANOW, &tty);
356 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
357 #endif
359 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
360 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
362 register a function to be called at normal program termination
364 atexit(term_exit);
365 #if CONFIG_BEOS_NETSERVER
366 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
367 #endif
370 /* read a key without blocking */
371 static int read_key(void)
373 #if HAVE_TERMIOS_H
374 int n = 1;
375 unsigned char ch;
376 #if !CONFIG_BEOS_NETSERVER
377 struct timeval tv;
378 fd_set rfds;
380 FD_ZERO(&rfds);
381 FD_SET(0, &rfds);
382 tv.tv_sec = 0;
383 tv.tv_usec = 0;
384 n = select(1, &rfds, NULL, NULL, &tv);
385 #endif
386 if (n > 0) {
387 n = read(0, &ch, 1);
388 if (n == 1)
389 return ch;
391 return n;
393 #elif HAVE_CONIO_H
394 if(kbhit())
395 return(getch());
396 #endif
397 return -1;
400 static int decode_interrupt_cb(void)
402 return q_pressed || (q_pressed = read_key() == 'q');
405 static int av_exit(int ret)
407 int i;
409 /* close files */
410 for(i=0;i<nb_output_files;i++) {
411 /* maybe av_close_output_file ??? */
412 AVFormatContext *s = output_files[i];
413 int j;
414 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
415 url_fclose(s->pb);
416 for(j=0;j<s->nb_streams;j++) {
417 av_metadata_free(&s->streams[j]->metadata);
418 av_free(s->streams[j]->codec);
419 av_free(s->streams[j]);
421 for(j=0;j<s->nb_programs;j++) {
422 av_metadata_free(&s->programs[j]->metadata);
424 for(j=0;j<s->nb_chapters;j++) {
425 av_metadata_free(&s->chapters[j]->metadata);
427 av_metadata_free(&s->metadata);
428 av_free(s);
430 for(i=0;i<nb_input_files;i++)
431 av_close_input_file(input_files[i]);
433 av_free(intra_matrix);
434 av_free(inter_matrix);
436 if (vstats_file)
437 fclose(vstats_file);
438 av_free(vstats_filename);
440 av_free(opt_names);
442 av_free(video_codec_name);
443 av_free(audio_codec_name);
444 av_free(subtitle_codec_name);
446 av_free(video_standard);
448 #if CONFIG_POWERPC_PERF
449 void powerpc_display_perf_report(void);
450 powerpc_display_perf_report();
451 #endif /* CONFIG_POWERPC_PERF */
453 for (i=0;i<CODEC_TYPE_NB;i++)
454 av_free(avcodec_opts[i]);
455 av_free(avformat_opts);
456 av_free(sws_opts);
457 av_free(audio_buf);
458 av_free(audio_out);
459 av_free(audio_out2);
460 av_free(samples);
462 if (received_sigterm) {
463 fprintf(stderr,
464 "Received signal %d: terminating.\n",
465 (int) received_sigterm);
466 exit (255);
469 exit(ret); /* not all OS-es handle main() return value */
470 return ret;
473 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
475 int i, err;
476 AVFormatContext *ic;
477 int nopts = 0;
479 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
480 if (err < 0)
481 return err;
482 /* copy stream format */
483 s->nb_streams = ic->nb_streams;
484 for(i=0;i<ic->nb_streams;i++) {
485 AVStream *st;
487 // FIXME: a more elegant solution is needed
488 st = av_mallocz(sizeof(AVStream));
489 memcpy(st, ic->streams[i], sizeof(AVStream));
490 st->codec = avcodec_alloc_context();
491 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
492 s->streams[i] = st;
494 if (st->codec->codec_type == CODEC_TYPE_AUDIO && audio_stream_copy)
495 st->stream_copy = 1;
496 else if (st->codec->codec_type == CODEC_TYPE_VIDEO && video_stream_copy)
497 st->stream_copy = 1;
499 if(!st->codec->thread_count)
500 st->codec->thread_count = 1;
501 if(st->codec->thread_count>1)
502 avcodec_thread_init(st->codec, st->codec->thread_count);
504 if(st->codec->flags & CODEC_FLAG_BITEXACT)
505 nopts = 1;
508 if (!nopts)
509 s->timestamp = av_gettime();
511 av_close_input_file(ic);
512 return 0;
515 static double
516 get_sync_ipts(const AVOutputStream *ost)
518 const AVInputStream *ist = ost->sync_ist;
519 return (double)(ist->pts - start_time)/AV_TIME_BASE;
522 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
523 int ret;
525 while(bsfc){
526 AVPacket new_pkt= *pkt;
527 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
528 &new_pkt.data, &new_pkt.size,
529 pkt->data, pkt->size,
530 pkt->flags & PKT_FLAG_KEY);
531 if(a>0){
532 av_free_packet(pkt);
533 new_pkt.destruct= av_destruct_packet;
534 } else if(a<0){
535 fprintf(stderr, "%s failed for stream %d, codec %s",
536 bsfc->filter->name, pkt->stream_index,
537 avctx->codec ? avctx->codec->name : "copy");
538 print_error("", a);
539 if (exit_on_error)
540 av_exit(1);
542 *pkt= new_pkt;
544 bsfc= bsfc->next;
547 ret= av_interleaved_write_frame(s, pkt);
548 if(ret < 0){
549 print_error("av_interleaved_write_frame()", ret);
550 av_exit(1);
554 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
556 static void do_audio_out(AVFormatContext *s,
557 AVOutputStream *ost,
558 AVInputStream *ist,
559 unsigned char *buf, int size)
561 uint8_t *buftmp;
562 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
564 int size_out, frame_bytes, ret;
565 AVCodecContext *enc= ost->st->codec;
566 AVCodecContext *dec= ist->st->codec;
567 int osize= av_get_bits_per_sample_format(enc->sample_fmt)/8;
568 int isize= av_get_bits_per_sample_format(dec->sample_fmt)/8;
570 /* SC: dynamic allocation of buffers */
571 if (!audio_buf)
572 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
573 if (!audio_out)
574 audio_out = av_malloc(audio_out_size);
575 if (!audio_buf || !audio_out)
576 return; /* Should signal an error ! */
578 if (enc->channels != dec->channels)
579 ost->audio_resample = 1;
581 if (ost->audio_resample && !ost->resample) {
582 if (dec->sample_fmt != SAMPLE_FMT_S16)
583 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
584 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
585 enc->sample_rate, dec->sample_rate,
586 enc->sample_fmt, dec->sample_fmt,
587 16, 10, 0, 0.8);
588 if (!ost->resample) {
589 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
590 dec->channels, dec->sample_rate,
591 enc->channels, enc->sample_rate);
592 av_exit(1);
596 #define MAKE_SFMT_PAIR(a,b) ((a)+SAMPLE_FMT_NB*(b))
597 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
598 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
599 if (!audio_out2)
600 audio_out2 = av_malloc(audio_out_size);
601 if (!audio_out2)
602 av_exit(1);
603 if (ost->reformat_ctx)
604 av_audio_convert_free(ost->reformat_ctx);
605 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
606 dec->sample_fmt, 1, NULL, 0);
607 if (!ost->reformat_ctx) {
608 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
609 avcodec_get_sample_fmt_name(dec->sample_fmt),
610 avcodec_get_sample_fmt_name(enc->sample_fmt));
611 av_exit(1);
613 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
616 if(audio_sync_method){
617 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
618 - av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2);
619 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
620 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
622 //FIXME resample delay
623 if(fabs(delta) > 50){
624 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
625 if(byte_delta < 0){
626 byte_delta= FFMAX(byte_delta, -size);
627 size += byte_delta;
628 buf -= byte_delta;
629 if(verbose > 2)
630 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
631 if(!size)
632 return;
633 ist->is_start=0;
634 }else{
635 static uint8_t *input_tmp= NULL;
636 input_tmp= av_realloc(input_tmp, byte_delta + size);
638 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
639 ist->is_start=0;
640 else
641 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
643 memset(input_tmp, 0, byte_delta);
644 memcpy(input_tmp + byte_delta, buf, size);
645 buf= input_tmp;
646 size += byte_delta;
647 if(verbose > 2)
648 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
650 }else if(audio_sync_method>1){
651 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
652 assert(ost->audio_resample);
653 if(verbose > 2)
654 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
655 // 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));
656 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
659 }else
660 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
661 - av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
663 if (ost->audio_resample) {
664 buftmp = audio_buf;
665 size_out = audio_resample(ost->resample,
666 (short *)buftmp, (short *)buf,
667 size / (ist->st->codec->channels * isize));
668 size_out = size_out * enc->channels * osize;
669 } else {
670 buftmp = buf;
671 size_out = size;
674 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
675 const void *ibuf[6]= {buftmp};
676 void *obuf[6]= {audio_out2};
677 int istride[6]= {isize};
678 int ostride[6]= {osize};
679 int len= size_out/istride[0];
680 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
681 printf("av_audio_convert() failed\n");
682 if (exit_on_error)
683 av_exit(1);
684 return;
686 buftmp = audio_out2;
687 size_out = len*osize;
690 /* now encode as many frames as possible */
691 if (enc->frame_size > 1) {
692 /* output resampled raw samples */
693 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
694 fprintf(stderr, "av_fifo_realloc2() failed\n");
695 av_exit(1);
697 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
699 frame_bytes = enc->frame_size * osize * enc->channels;
701 while (av_fifo_size(ost->fifo) >= frame_bytes) {
702 AVPacket pkt;
703 av_init_packet(&pkt);
705 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
707 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
709 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
710 (short *)audio_buf);
711 if (ret < 0) {
712 fprintf(stderr, "Audio encoding failed\n");
713 av_exit(1);
715 audio_size += ret;
716 pkt.stream_index= ost->index;
717 pkt.data= audio_out;
718 pkt.size= ret;
719 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
720 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
721 pkt.flags |= PKT_FLAG_KEY;
722 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
724 ost->sync_opts += enc->frame_size;
726 } else {
727 AVPacket pkt;
728 int coded_bps = av_get_bits_per_sample(enc->codec->id)/8;
729 av_init_packet(&pkt);
731 ost->sync_opts += size_out / (osize * enc->channels);
733 /* output a pcm frame */
734 /* determine the size of the coded buffer */
735 size_out /= osize;
736 if (coded_bps)
737 size_out *= coded_bps;
739 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
740 ret = avcodec_encode_audio(enc, audio_out, size_out,
741 (short *)buftmp);
742 if (ret < 0) {
743 fprintf(stderr, "Audio encoding failed\n");
744 av_exit(1);
746 audio_size += ret;
747 pkt.stream_index= ost->index;
748 pkt.data= audio_out;
749 pkt.size= ret;
750 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
751 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
752 pkt.flags |= PKT_FLAG_KEY;
753 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
757 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
759 AVCodecContext *dec;
760 AVPicture *picture2;
761 AVPicture picture_tmp;
762 uint8_t *buf = 0;
764 dec = ist->st->codec;
766 /* deinterlace : must be done before any resize */
767 if (do_deinterlace) {
768 int size;
770 /* create temporary picture */
771 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
772 buf = av_malloc(size);
773 if (!buf)
774 return;
776 picture2 = &picture_tmp;
777 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
779 if(avpicture_deinterlace(picture2, picture,
780 dec->pix_fmt, dec->width, dec->height) < 0) {
781 /* if error, do not deinterlace */
782 fprintf(stderr, "Deinterlacing failed\n");
783 av_free(buf);
784 buf = NULL;
785 picture2 = picture;
787 } else {
788 picture2 = picture;
791 if (picture != picture2)
792 *picture = *picture2;
793 *bufp = buf;
796 /* we begin to correct av delay at this threshold */
797 #define AV_DELAY_MAX 0.100
799 static void do_subtitle_out(AVFormatContext *s,
800 AVOutputStream *ost,
801 AVInputStream *ist,
802 AVSubtitle *sub,
803 int64_t pts)
805 static uint8_t *subtitle_out = NULL;
806 int subtitle_out_max_size = 65536;
807 int subtitle_out_size, nb, i;
808 AVCodecContext *enc;
809 AVPacket pkt;
811 if (pts == AV_NOPTS_VALUE) {
812 fprintf(stderr, "Subtitle packets must have a pts\n");
813 if (exit_on_error)
814 av_exit(1);
815 return;
818 enc = ost->st->codec;
820 if (!subtitle_out) {
821 subtitle_out = av_malloc(subtitle_out_max_size);
824 /* Note: DVB subtitle need one packet to draw them and one other
825 packet to clear them */
826 /* XXX: signal it in the codec context ? */
827 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
828 nb = 2;
829 else
830 nb = 1;
832 for(i = 0; i < nb; i++) {
833 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
834 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
835 subtitle_out_max_size, sub);
837 av_init_packet(&pkt);
838 pkt.stream_index = ost->index;
839 pkt.data = subtitle_out;
840 pkt.size = subtitle_out_size;
841 pkt.pts = av_rescale_q(pts, ist->st->time_base, ost->st->time_base);
842 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
843 /* XXX: the pts correction is handled here. Maybe handling
844 it in the codec would be better */
845 if (i == 0)
846 pkt.pts += 90 * sub->start_display_time;
847 else
848 pkt.pts += 90 * sub->end_display_time;
850 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
854 static int bit_buffer_size= 1024*256;
855 static uint8_t *bit_buffer= NULL;
857 static void do_video_out(AVFormatContext *s,
858 AVOutputStream *ost,
859 AVInputStream *ist,
860 AVFrame *in_picture,
861 int *frame_size)
863 int nb_frames, i, ret;
864 int64_t topBand, bottomBand, leftBand, rightBand;
865 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
866 AVFrame picture_crop_temp, picture_pad_temp;
867 AVCodecContext *enc, *dec;
869 avcodec_get_frame_defaults(&picture_crop_temp);
870 avcodec_get_frame_defaults(&picture_pad_temp);
872 enc = ost->st->codec;
873 dec = ist->st->codec;
875 /* by default, we output a single frame */
876 nb_frames = 1;
878 *frame_size = 0;
880 if(video_sync_method>0 || (video_sync_method && av_q2d(enc->time_base) > 0.001)){
881 double vdelta;
882 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
883 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
884 if (vdelta < -1.1)
885 nb_frames = 0;
886 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
887 if(vdelta<=-0.6){
888 nb_frames=0;
889 }else if(vdelta>0.6)
890 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
891 }else if (vdelta > 1.1)
892 nb_frames = lrintf(vdelta);
893 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, get_sync_ipts(ost), nb_frames);
894 if (nb_frames == 0){
895 ++nb_frames_drop;
896 if (verbose>2)
897 fprintf(stderr, "*** drop!\n");
898 }else if (nb_frames > 1) {
899 nb_frames_dup += nb_frames;
900 if (verbose>2)
901 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
903 }else
904 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
906 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
907 if (nb_frames <= 0)
908 return;
910 if (ost->video_crop) {
911 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
912 fprintf(stderr, "error cropping picture\n");
913 if (exit_on_error)
914 av_exit(1);
915 return;
917 formatted_picture = &picture_crop_temp;
918 } else {
919 formatted_picture = in_picture;
922 final_picture = formatted_picture;
923 padding_src = formatted_picture;
924 resampling_dst = &ost->pict_tmp;
925 if (ost->video_pad) {
926 final_picture = &ost->pict_tmp;
927 if (ost->video_resample) {
928 if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
929 fprintf(stderr, "error padding picture\n");
930 if (exit_on_error)
931 av_exit(1);
932 return;
934 resampling_dst = &picture_pad_temp;
938 if (ost->video_resample) {
939 padding_src = NULL;
940 final_picture = &ost->pict_tmp;
941 if( (ost->resample_height != (ist->st->codec->height - (ost->topBand + ost->bottomBand)))
942 || (ost->resample_width != (ist->st->codec->width - (ost->leftBand + ost->rightBand)))
943 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
945 fprintf(stderr,"Input Stream #%d.%d frame size changed to %dx%d, %s\n", ist->file_index, ist->index, ist->st->codec->width, ist->st->codec->height,avcodec_get_pix_fmt_name(ist->st->codec->pix_fmt));
946 /* keep bands proportional to the frame size */
947 topBand = ((int64_t)ist->st->codec->height * ost->original_topBand / ost->original_height) & ~1;
948 bottomBand = ((int64_t)ist->st->codec->height * ost->original_bottomBand / ost->original_height) & ~1;
949 leftBand = ((int64_t)ist->st->codec->width * ost->original_leftBand / ost->original_width) & ~1;
950 rightBand = ((int64_t)ist->st->codec->width * ost->original_rightBand / ost->original_width) & ~1;
952 /* sanity check to ensure no bad band sizes sneak in */
953 assert(topBand <= INT_MAX && topBand >= 0);
954 assert(bottomBand <= INT_MAX && bottomBand >= 0);
955 assert(leftBand <= INT_MAX && leftBand >= 0);
956 assert(rightBand <= INT_MAX && rightBand >= 0);
958 ost->topBand = topBand;
959 ost->bottomBand = bottomBand;
960 ost->leftBand = leftBand;
961 ost->rightBand = rightBand;
963 ost->resample_height = ist->st->codec->height - (ost->topBand + ost->bottomBand);
964 ost->resample_width = ist->st->codec->width - (ost->leftBand + ost->rightBand);
965 ost->resample_pix_fmt= ist->st->codec->pix_fmt;
967 /* initialize a new scaler context */
968 sws_freeContext(ost->img_resample_ctx);
969 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
970 ost->img_resample_ctx = sws_getContext(
971 ist->st->codec->width - (ost->leftBand + ost->rightBand),
972 ist->st->codec->height - (ost->topBand + ost->bottomBand),
973 ist->st->codec->pix_fmt,
974 ost->st->codec->width - (ost->padleft + ost->padright),
975 ost->st->codec->height - (ost->padtop + ost->padbottom),
976 ost->st->codec->pix_fmt,
977 sws_flags, NULL, NULL, NULL);
978 if (ost->img_resample_ctx == NULL) {
979 fprintf(stderr, "Cannot get resampling context\n");
980 av_exit(1);
983 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
984 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
987 if (ost->video_pad) {
988 av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
989 enc->height, enc->width, enc->pix_fmt,
990 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
993 /* duplicates frame if needed */
994 for(i=0;i<nb_frames;i++) {
995 AVPacket pkt;
996 av_init_packet(&pkt);
997 pkt.stream_index= ost->index;
999 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1000 /* raw pictures are written as AVPicture structure to
1001 avoid any copies. We support temorarily the older
1002 method. */
1003 AVFrame* old_frame = enc->coded_frame;
1004 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1005 pkt.data= (uint8_t *)final_picture;
1006 pkt.size= sizeof(AVPicture);
1007 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1008 pkt.flags |= PKT_FLAG_KEY;
1010 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1011 enc->coded_frame = old_frame;
1012 } else {
1013 AVFrame big_picture;
1015 big_picture= *final_picture;
1016 /* better than nothing: use input picture interlaced
1017 settings */
1018 big_picture.interlaced_frame = in_picture->interlaced_frame;
1019 if(avcodec_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
1020 if(top_field_first == -1)
1021 big_picture.top_field_first = in_picture->top_field_first;
1022 else
1023 big_picture.top_field_first = top_field_first;
1026 /* handles sameq here. This is not correct because it may
1027 not be a global option */
1028 if (same_quality) {
1029 big_picture.quality = ist->st->quality;
1030 }else
1031 big_picture.quality = ost->st->quality;
1032 if(!me_threshold)
1033 big_picture.pict_type = 0;
1034 // big_picture.pts = AV_NOPTS_VALUE;
1035 big_picture.pts= ost->sync_opts;
1036 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1037 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1038 ret = avcodec_encode_video(enc,
1039 bit_buffer, bit_buffer_size,
1040 &big_picture);
1041 if (ret < 0) {
1042 fprintf(stderr, "Video encoding failed\n");
1043 av_exit(1);
1046 if(ret>0){
1047 pkt.data= bit_buffer;
1048 pkt.size= ret;
1049 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1050 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1051 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1052 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1053 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1055 if(enc->coded_frame->key_frame)
1056 pkt.flags |= PKT_FLAG_KEY;
1057 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1058 *frame_size = ret;
1059 video_size += ret;
1060 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1061 // enc->frame_number-1, ret, enc->pict_type);
1062 /* if two pass, output log */
1063 if (ost->logfile && enc->stats_out) {
1064 fprintf(ost->logfile, "%s", enc->stats_out);
1068 ost->sync_opts++;
1069 ost->frame_number++;
1073 static double psnr(double d){
1074 return -10.0*log(d)/log(10.0);
1077 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1078 int frame_size)
1080 AVCodecContext *enc;
1081 int frame_number;
1082 double ti1, bitrate, avg_bitrate;
1084 /* this is executed just the first time do_video_stats is called */
1085 if (!vstats_file) {
1086 vstats_file = fopen(vstats_filename, "w");
1087 if (!vstats_file) {
1088 perror("fopen");
1089 av_exit(1);
1093 enc = ost->st->codec;
1094 if (enc->codec_type == CODEC_TYPE_VIDEO) {
1095 frame_number = ost->frame_number;
1096 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1097 if (enc->flags&CODEC_FLAG_PSNR)
1098 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1100 fprintf(vstats_file,"f_size= %6d ", frame_size);
1101 /* compute pts value */
1102 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1103 if (ti1 < 0.01)
1104 ti1 = 0.01;
1106 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1107 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1108 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1109 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1110 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1114 static void print_report(AVFormatContext **output_files,
1115 AVOutputStream **ost_table, int nb_ostreams,
1116 int is_last_report)
1118 char buf[1024];
1119 AVOutputStream *ost;
1120 AVFormatContext *oc;
1121 int64_t total_size;
1122 AVCodecContext *enc;
1123 int frame_number, vid, i;
1124 double bitrate, ti1, pts;
1125 static int64_t last_time = -1;
1126 static int qp_histogram[52];
1128 if (!is_last_report) {
1129 int64_t cur_time;
1130 /* display the report every 0.5 seconds */
1131 cur_time = av_gettime();
1132 if (last_time == -1) {
1133 last_time = cur_time;
1134 return;
1136 if ((cur_time - last_time) < 500000)
1137 return;
1138 last_time = cur_time;
1142 oc = output_files[0];
1144 total_size = url_fsize(oc->pb);
1145 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1146 total_size= url_ftell(oc->pb);
1148 buf[0] = '\0';
1149 ti1 = 1e10;
1150 vid = 0;
1151 for(i=0;i<nb_ostreams;i++) {
1152 ost = ost_table[i];
1153 enc = ost->st->codec;
1154 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1155 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1156 !ost->st->stream_copy ?
1157 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1159 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1160 float t = (av_gettime()-timer_start) / 1000000.0;
1162 frame_number = ost->frame_number;
1163 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1164 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1165 !ost->st->stream_copy ?
1166 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1167 if(is_last_report)
1168 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1169 if(qp_hist){
1170 int j;
1171 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1172 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1173 qp_histogram[qp]++;
1174 for(j=0; j<32; j++)
1175 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1177 if (enc->flags&CODEC_FLAG_PSNR){
1178 int j;
1179 double error, error_sum=0;
1180 double scale, scale_sum=0;
1181 char type[3]= {'Y','U','V'};
1182 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1183 for(j=0; j<3; j++){
1184 if(is_last_report){
1185 error= enc->error[j];
1186 scale= enc->width*enc->height*255.0*255.0*frame_number;
1187 }else{
1188 error= enc->coded_frame->error[j];
1189 scale= enc->width*enc->height*255.0*255.0;
1191 if(j) scale/=4;
1192 error_sum += error;
1193 scale_sum += scale;
1194 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1196 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1198 vid = 1;
1200 /* compute min output value */
1201 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1202 if ((pts < ti1) && (pts > 0))
1203 ti1 = pts;
1205 if (ti1 < 0.01)
1206 ti1 = 0.01;
1208 if (verbose || is_last_report) {
1209 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1211 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1212 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1213 (double)total_size / 1024, ti1, bitrate);
1215 if (verbose > 1)
1216 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1217 nb_frames_dup, nb_frames_drop);
1219 if (verbose >= 0)
1220 fprintf(stderr, "%s \r", buf);
1222 fflush(stderr);
1225 if (is_last_report && verbose >= 0){
1226 int64_t raw= audio_size + video_size + extra_size;
1227 fprintf(stderr, "\n");
1228 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1229 video_size/1024.0,
1230 audio_size/1024.0,
1231 extra_size/1024.0,
1232 100.0*(total_size - raw)/raw
1237 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1238 static int output_packet(AVInputStream *ist, int ist_index,
1239 AVOutputStream **ost_table, int nb_ostreams,
1240 const AVPacket *pkt)
1242 AVFormatContext *os;
1243 AVOutputStream *ost;
1244 int ret, i;
1245 uint8_t *data_buf;
1246 int data_size, got_picture;
1247 AVFrame picture;
1248 void *buffer_to_free;
1249 static unsigned int samples_size= 0;
1250 AVSubtitle subtitle, *subtitle_to_free;
1251 int got_subtitle;
1252 AVPacket avpkt;
1254 if(ist->next_pts == AV_NOPTS_VALUE)
1255 ist->next_pts= ist->pts;
1257 if (pkt == NULL) {
1258 /* EOF handling */
1259 av_init_packet(&avpkt);
1260 avpkt.data = NULL;
1261 avpkt.size = 0;
1262 goto handle_eof;
1263 } else {
1264 avpkt = *pkt;
1267 if(pkt->dts != AV_NOPTS_VALUE)
1268 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1270 //while we have more to decode or while the decoder did output something on EOF
1271 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1272 handle_eof:
1273 ist->pts= ist->next_pts;
1275 if(avpkt.size && avpkt.size != pkt->size && verbose>0)
1276 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1278 /* decode the packet if needed */
1279 data_buf = NULL; /* fail safe */
1280 data_size = 0;
1281 subtitle_to_free = NULL;
1282 if (ist->decoding_needed) {
1283 switch(ist->st->codec->codec_type) {
1284 case CODEC_TYPE_AUDIO:{
1285 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1286 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1287 av_free(samples);
1288 samples= av_malloc(samples_size);
1290 data_size= samples_size;
1291 /* XXX: could avoid copy if PCM 16 bits with same
1292 endianness as CPU */
1293 ret = avcodec_decode_audio3(ist->st->codec, samples, &data_size,
1294 &avpkt);
1295 if (ret < 0)
1296 goto fail_decode;
1297 avpkt.data += ret;
1298 avpkt.size -= ret;
1299 /* Some bug in mpeg audio decoder gives */
1300 /* data_size < 0, it seems they are overflows */
1301 if (data_size <= 0) {
1302 /* no audio frame */
1303 continue;
1305 data_buf = (uint8_t *)samples;
1306 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1307 (ist->st->codec->sample_rate * ist->st->codec->channels);
1308 break;}
1309 case CODEC_TYPE_VIDEO:
1310 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1311 /* XXX: allocate picture correctly */
1312 avcodec_get_frame_defaults(&picture);
1314 ret = avcodec_decode_video2(ist->st->codec,
1315 &picture, &got_picture, &avpkt);
1316 ist->st->quality= picture.quality;
1317 if (ret < 0)
1318 goto fail_decode;
1319 if (!got_picture) {
1320 /* no picture yet */
1321 goto discard_packet;
1323 if (ist->st->codec->time_base.num != 0) {
1324 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1325 ist->next_pts += ((int64_t)AV_TIME_BASE *
1326 ist->st->codec->time_base.num * ticks) /
1327 ist->st->codec->time_base.den;
1329 avpkt.size = 0;
1330 break;
1331 case CODEC_TYPE_SUBTITLE:
1332 ret = avcodec_decode_subtitle2(ist->st->codec,
1333 &subtitle, &got_subtitle, &avpkt);
1334 if (ret < 0)
1335 goto fail_decode;
1336 if (!got_subtitle) {
1337 goto discard_packet;
1339 subtitle_to_free = &subtitle;
1340 avpkt.size = 0;
1341 break;
1342 default:
1343 goto fail_decode;
1345 } else {
1346 switch(ist->st->codec->codec_type) {
1347 case CODEC_TYPE_AUDIO:
1348 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1349 ist->st->codec->sample_rate;
1350 break;
1351 case CODEC_TYPE_VIDEO:
1352 if (ist->st->codec->time_base.num != 0) {
1353 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1354 ist->next_pts += ((int64_t)AV_TIME_BASE *
1355 ist->st->codec->time_base.num * ticks) /
1356 ist->st->codec->time_base.den;
1358 break;
1360 data_buf = avpkt.data;
1361 data_size = avpkt.size;
1362 ret = avpkt.size;
1363 avpkt.size = 0;
1366 buffer_to_free = NULL;
1367 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1368 pre_process_video_frame(ist, (AVPicture *)&picture,
1369 &buffer_to_free);
1372 // preprocess audio (volume)
1373 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1374 if (audio_volume != 256) {
1375 short *volp;
1376 volp = samples;
1377 for(i=0;i<(data_size / sizeof(short));i++) {
1378 int v = ((*volp) * audio_volume + 128) >> 8;
1379 if (v < -32768) v = -32768;
1380 if (v > 32767) v = 32767;
1381 *volp++ = v;
1386 /* frame rate emulation */
1387 if (rate_emu) {
1388 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1389 int64_t now = av_gettime() - ist->start;
1390 if (pts > now)
1391 usleep(pts - now);
1394 /* if output time reached then transcode raw format,
1395 encode packets and output them */
1396 if (start_time == 0 || ist->pts >= start_time)
1397 for(i=0;i<nb_ostreams;i++) {
1398 int frame_size;
1400 ost = ost_table[i];
1401 if (ost->source_index == ist_index) {
1402 os = output_files[ost->file_index];
1404 #if 0
1405 printf("%d: got pts=%0.3f %0.3f\n", i,
1406 (double)pkt->pts / AV_TIME_BASE,
1407 ((double)ist->pts / AV_TIME_BASE) -
1408 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1409 #endif
1410 /* set the input output pts pairs */
1411 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1413 if (ost->encoding_needed) {
1414 switch(ost->st->codec->codec_type) {
1415 case CODEC_TYPE_AUDIO:
1416 do_audio_out(os, ost, ist, data_buf, data_size);
1417 break;
1418 case CODEC_TYPE_VIDEO:
1419 do_video_out(os, ost, ist, &picture, &frame_size);
1420 if (vstats_filename && frame_size)
1421 do_video_stats(os, ost, frame_size);
1422 break;
1423 case CODEC_TYPE_SUBTITLE:
1424 do_subtitle_out(os, ost, ist, &subtitle,
1425 pkt->pts);
1426 break;
1427 default:
1428 abort();
1430 } else {
1431 AVFrame avframe; //FIXME/XXX remove this
1432 AVPacket opkt;
1433 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1435 av_init_packet(&opkt);
1437 if ((!ost->frame_number && !(pkt->flags & PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1438 continue;
1440 /* no reencoding needed : output the packet directly */
1441 /* force the input stream PTS */
1443 avcodec_get_frame_defaults(&avframe);
1444 ost->st->codec->coded_frame= &avframe;
1445 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1447 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1448 audio_size += data_size;
1449 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1450 video_size += data_size;
1451 ost->sync_opts++;
1454 opkt.stream_index= ost->index;
1455 if(pkt->pts != AV_NOPTS_VALUE)
1456 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1457 else
1458 opkt.pts= AV_NOPTS_VALUE;
1460 if (pkt->dts == AV_NOPTS_VALUE)
1461 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1462 else
1463 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1464 opkt.dts -= ost_tb_start_time;
1466 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1467 opkt.flags= pkt->flags;
1469 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1470 if(ost->st->codec->codec_id != CODEC_ID_H264) {
1471 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1472 opkt.destruct= av_destruct_packet;
1473 } else {
1474 opkt.data = data_buf;
1475 opkt.size = data_size;
1478 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][opkt.stream_index]);
1479 ost->st->codec->frame_number++;
1480 ost->frame_number++;
1481 av_free_packet(&opkt);
1485 av_free(buffer_to_free);
1486 /* XXX: allocate the subtitles in the codec ? */
1487 if (subtitle_to_free) {
1488 if (subtitle_to_free->rects != NULL) {
1489 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1490 av_freep(&subtitle_to_free->rects[i]->pict.data[0]);
1491 av_freep(&subtitle_to_free->rects[i]->pict.data[1]);
1492 av_freep(&subtitle_to_free->rects[i]);
1494 av_freep(&subtitle_to_free->rects);
1496 subtitle_to_free->num_rects = 0;
1497 subtitle_to_free = NULL;
1500 discard_packet:
1501 if (pkt == NULL) {
1502 /* EOF handling */
1504 for(i=0;i<nb_ostreams;i++) {
1505 ost = ost_table[i];
1506 if (ost->source_index == ist_index) {
1507 AVCodecContext *enc= ost->st->codec;
1508 os = output_files[ost->file_index];
1510 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1511 continue;
1512 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1513 continue;
1515 if (ost->encoding_needed) {
1516 for(;;) {
1517 AVPacket pkt;
1518 int fifo_bytes;
1519 av_init_packet(&pkt);
1520 pkt.stream_index= ost->index;
1522 switch(ost->st->codec->codec_type) {
1523 case CODEC_TYPE_AUDIO:
1524 fifo_bytes = av_fifo_size(ost->fifo);
1525 ret = 0;
1526 /* encode any samples remaining in fifo */
1527 if (fifo_bytes > 0) {
1528 int osize = av_get_bits_per_sample_format(enc->sample_fmt) >> 3;
1529 int fs_tmp = enc->frame_size;
1531 av_fifo_generic_read(ost->fifo, samples, fifo_bytes, NULL);
1532 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1533 enc->frame_size = fifo_bytes / (osize * enc->channels);
1534 } else { /* pad */
1535 int frame_bytes = enc->frame_size*osize*enc->channels;
1536 if (samples_size < frame_bytes)
1537 av_exit(1);
1538 memset((uint8_t*)samples+fifo_bytes, 0, frame_bytes - fifo_bytes);
1541 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1542 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1543 ost->st->time_base.num, enc->sample_rate);
1544 enc->frame_size = fs_tmp;
1546 if(ret <= 0) {
1547 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1549 if (ret < 0) {
1550 fprintf(stderr, "Audio encoding failed\n");
1551 av_exit(1);
1553 audio_size += ret;
1554 pkt.flags |= PKT_FLAG_KEY;
1555 break;
1556 case CODEC_TYPE_VIDEO:
1557 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1558 if (ret < 0) {
1559 fprintf(stderr, "Video encoding failed\n");
1560 av_exit(1);
1562 video_size += ret;
1563 if(enc->coded_frame && enc->coded_frame->key_frame)
1564 pkt.flags |= PKT_FLAG_KEY;
1565 if (ost->logfile && enc->stats_out) {
1566 fprintf(ost->logfile, "%s", enc->stats_out);
1568 break;
1569 default:
1570 ret=-1;
1573 if(ret<=0)
1574 break;
1575 pkt.data= bit_buffer;
1576 pkt.size= ret;
1577 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1578 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1579 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1586 return 0;
1587 fail_decode:
1588 return -1;
1591 static void print_sdp(AVFormatContext **avc, int n)
1593 char sdp[2048];
1595 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1596 printf("SDP:\n%s\n", sdp);
1597 fflush(stdout);
1600 static int stream_index_from_inputs(AVFormatContext **input_files,
1601 int nb_input_files,
1602 AVInputFile *file_table,
1603 AVInputStream **ist_table,
1604 enum CodecType type,
1605 int programid)
1607 int p, q, z;
1608 for(z=0; z<nb_input_files; z++) {
1609 AVFormatContext *ic = input_files[z];
1610 for(p=0; p<ic->nb_programs; p++) {
1611 AVProgram *program = ic->programs[p];
1612 if(program->id != programid)
1613 continue;
1614 for(q=0; q<program->nb_stream_indexes; q++) {
1615 int sidx = program->stream_index[q];
1616 int ris = file_table[z].ist_index + sidx;
1617 if(ist_table[ris]->discard && ic->streams[sidx]->codec->codec_type == type)
1618 return ris;
1623 return -1;
1627 * The following code is the main loop of the file converter
1629 static int av_encode(AVFormatContext **output_files,
1630 int nb_output_files,
1631 AVFormatContext **input_files,
1632 int nb_input_files,
1633 AVStreamMap *stream_maps, int nb_stream_maps)
1635 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1636 AVFormatContext *is, *os;
1637 AVCodecContext *codec, *icodec;
1638 AVOutputStream *ost, **ost_table = NULL;
1639 AVInputStream *ist, **ist_table = NULL;
1640 AVInputFile *file_table;
1641 char error[1024];
1642 int key;
1643 int want_sdp = 1;
1644 uint8_t no_packet[MAX_FILES]={0};
1645 int no_packet_count=0;
1647 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1648 if (!file_table)
1649 goto fail;
1651 /* input stream init */
1652 j = 0;
1653 for(i=0;i<nb_input_files;i++) {
1654 is = input_files[i];
1655 file_table[i].ist_index = j;
1656 file_table[i].nb_streams = is->nb_streams;
1657 j += is->nb_streams;
1659 nb_istreams = j;
1661 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1662 if (!ist_table)
1663 goto fail;
1665 for(i=0;i<nb_istreams;i++) {
1666 ist = av_mallocz(sizeof(AVInputStream));
1667 if (!ist)
1668 goto fail;
1669 ist_table[i] = ist;
1671 j = 0;
1672 for(i=0;i<nb_input_files;i++) {
1673 is = input_files[i];
1674 for(k=0;k<is->nb_streams;k++) {
1675 ist = ist_table[j++];
1676 ist->st = is->streams[k];
1677 ist->file_index = i;
1678 ist->index = k;
1679 ist->discard = 1; /* the stream is discarded by default
1680 (changed later) */
1682 if (rate_emu) {
1683 ist->start = av_gettime();
1688 /* output stream init */
1689 nb_ostreams = 0;
1690 for(i=0;i<nb_output_files;i++) {
1691 os = output_files[i];
1692 if (!os->nb_streams) {
1693 dump_format(output_files[i], i, output_files[i]->filename, 1);
1694 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1695 av_exit(1);
1697 nb_ostreams += os->nb_streams;
1699 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1700 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1701 av_exit(1);
1704 /* Sanity check the mapping args -- do the input files & streams exist? */
1705 for(i=0;i<nb_stream_maps;i++) {
1706 int fi = stream_maps[i].file_index;
1707 int si = stream_maps[i].stream_index;
1709 if (fi < 0 || fi > nb_input_files - 1 ||
1710 si < 0 || si > file_table[fi].nb_streams - 1) {
1711 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1712 av_exit(1);
1714 fi = stream_maps[i].sync_file_index;
1715 si = stream_maps[i].sync_stream_index;
1716 if (fi < 0 || fi > nb_input_files - 1 ||
1717 si < 0 || si > file_table[fi].nb_streams - 1) {
1718 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1719 av_exit(1);
1723 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1724 if (!ost_table)
1725 goto fail;
1726 for(i=0;i<nb_ostreams;i++) {
1727 ost = av_mallocz(sizeof(AVOutputStream));
1728 if (!ost)
1729 goto fail;
1730 ost_table[i] = ost;
1733 n = 0;
1734 for(k=0;k<nb_output_files;k++) {
1735 os = output_files[k];
1736 for(i=0;i<os->nb_streams;i++,n++) {
1737 int found;
1738 ost = ost_table[n];
1739 ost->file_index = k;
1740 ost->index = i;
1741 ost->st = os->streams[i];
1742 if (nb_stream_maps > 0) {
1743 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
1744 stream_maps[n].stream_index;
1746 /* Sanity check that the stream types match */
1747 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1748 int i= ost->file_index;
1749 dump_format(output_files[i], i, output_files[i]->filename, 1);
1750 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1751 stream_maps[n].file_index, stream_maps[n].stream_index,
1752 ost->file_index, ost->index);
1753 av_exit(1);
1756 } else {
1757 if(opt_programid) {
1758 found = 0;
1759 j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid);
1760 if(j != -1) {
1761 ost->source_index = j;
1762 found = 1;
1764 } else {
1765 /* get corresponding input stream index : we select the first one with the right type */
1766 found = 0;
1767 for(j=0;j<nb_istreams;j++) {
1768 ist = ist_table[j];
1769 if (ist->discard &&
1770 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1771 ost->source_index = j;
1772 found = 1;
1773 break;
1778 if (!found) {
1779 if(! opt_programid) {
1780 /* try again and reuse existing stream */
1781 for(j=0;j<nb_istreams;j++) {
1782 ist = ist_table[j];
1783 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1784 ost->source_index = j;
1785 found = 1;
1789 if (!found) {
1790 int i= ost->file_index;
1791 dump_format(output_files[i], i, output_files[i]->filename, 1);
1792 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1793 ost->file_index, ost->index);
1794 av_exit(1);
1798 ist = ist_table[ost->source_index];
1799 ist->discard = 0;
1800 ost->sync_ist = (nb_stream_maps > 0) ?
1801 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
1802 stream_maps[n].sync_stream_index] : ist;
1806 /* for each output stream, we compute the right encoding parameters */
1807 for(i=0;i<nb_ostreams;i++) {
1808 AVMetadataTag *lang;
1809 ost = ost_table[i];
1810 os = output_files[ost->file_index];
1811 ist = ist_table[ost->source_index];
1813 codec = ost->st->codec;
1814 icodec = ist->st->codec;
1816 if ((lang=av_metadata_get(ist->st->metadata, "language", NULL, 0))
1817 && !av_metadata_get(ost->st->metadata, "language", NULL, 0))
1818 av_metadata_set(&ost->st->metadata, "language", lang->value);
1820 ost->st->disposition = ist->st->disposition;
1821 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1822 codec->chroma_sample_location = icodec->chroma_sample_location;
1824 if (ost->st->stream_copy) {
1825 /* if stream_copy is selected, no need to decode or encode */
1826 codec->codec_id = icodec->codec_id;
1827 codec->codec_type = icodec->codec_type;
1829 if(!codec->codec_tag){
1830 if( !os->oformat->codec_tag
1831 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) > 0
1832 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1833 codec->codec_tag = icodec->codec_tag;
1836 codec->bit_rate = icodec->bit_rate;
1837 codec->extradata= icodec->extradata;
1838 codec->extradata_size= icodec->extradata_size;
1839 if(av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000){
1840 codec->time_base = icodec->time_base;
1841 codec->time_base.num *= icodec->ticks_per_frame;
1842 }else
1843 codec->time_base = ist->st->time_base;
1844 switch(codec->codec_type) {
1845 case CODEC_TYPE_AUDIO:
1846 if(audio_volume != 256) {
1847 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1848 av_exit(1);
1850 codec->channel_layout = icodec->channel_layout;
1851 codec->sample_rate = icodec->sample_rate;
1852 codec->channels = icodec->channels;
1853 codec->frame_size = icodec->frame_size;
1854 codec->block_align= icodec->block_align;
1855 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1856 codec->block_align= 0;
1857 if(codec->codec_id == CODEC_ID_AC3)
1858 codec->block_align= 0;
1859 break;
1860 case CODEC_TYPE_VIDEO:
1861 codec->pix_fmt = icodec->pix_fmt;
1862 codec->width = icodec->width;
1863 codec->height = icodec->height;
1864 codec->has_b_frames = icodec->has_b_frames;
1865 break;
1866 case CODEC_TYPE_SUBTITLE:
1867 codec->width = icodec->width;
1868 codec->height = icodec->height;
1869 break;
1870 default:
1871 abort();
1873 } else {
1874 switch(codec->codec_type) {
1875 case CODEC_TYPE_AUDIO:
1876 ost->fifo= av_fifo_alloc(1024);
1877 if(!ost->fifo)
1878 goto fail;
1879 ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
1880 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1881 icodec->request_channels = codec->channels;
1882 ist->decoding_needed = 1;
1883 ost->encoding_needed = 1;
1884 break;
1885 case CODEC_TYPE_VIDEO:
1886 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
1887 fprintf(stderr, "Video pixel format is unknown, stream cannot be decoded\n");
1888 av_exit(1);
1890 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1891 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1892 ost->video_resample = ((codec->width != icodec->width -
1893 (frame_leftBand + frame_rightBand) +
1894 (frame_padleft + frame_padright)) ||
1895 (codec->height != icodec->height -
1896 (frame_topBand + frame_bottomBand) +
1897 (frame_padtop + frame_padbottom)) ||
1898 (codec->pix_fmt != icodec->pix_fmt));
1899 if (ost->video_crop) {
1900 ost->topBand = ost->original_topBand = frame_topBand;
1901 ost->bottomBand = ost->original_bottomBand = frame_bottomBand;
1902 ost->leftBand = ost->original_leftBand = frame_leftBand;
1903 ost->rightBand = ost->original_rightBand = frame_rightBand;
1905 if (ost->video_pad) {
1906 ost->padtop = frame_padtop;
1907 ost->padleft = frame_padleft;
1908 ost->padbottom = frame_padbottom;
1909 ost->padright = frame_padright;
1910 if (!ost->video_resample) {
1911 avcodec_get_frame_defaults(&ost->pict_tmp);
1912 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1913 codec->width, codec->height))
1914 goto fail;
1917 if (ost->video_resample) {
1918 avcodec_get_frame_defaults(&ost->pict_tmp);
1919 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1920 codec->width, codec->height)) {
1921 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1922 av_exit(1);
1924 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1925 ost->img_resample_ctx = sws_getContext(
1926 icodec->width - (frame_leftBand + frame_rightBand),
1927 icodec->height - (frame_topBand + frame_bottomBand),
1928 icodec->pix_fmt,
1929 codec->width - (frame_padleft + frame_padright),
1930 codec->height - (frame_padtop + frame_padbottom),
1931 codec->pix_fmt,
1932 sws_flags, NULL, NULL, NULL);
1933 if (ost->img_resample_ctx == NULL) {
1934 fprintf(stderr, "Cannot get resampling context\n");
1935 av_exit(1);
1938 ost->original_height = icodec->height;
1939 ost->original_width = icodec->width;
1941 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1942 ost->resample_width = icodec->width - (frame_leftBand + frame_rightBand);
1943 ost->resample_pix_fmt= icodec->pix_fmt;
1944 codec->bits_per_raw_sample= 0;
1946 ost->encoding_needed = 1;
1947 ist->decoding_needed = 1;
1948 break;
1949 case CODEC_TYPE_SUBTITLE:
1950 ost->encoding_needed = 1;
1951 ist->decoding_needed = 1;
1952 break;
1953 default:
1954 abort();
1955 break;
1957 /* two pass mode */
1958 if (ost->encoding_needed &&
1959 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1960 char logfilename[1024];
1961 FILE *f;
1962 int size;
1963 char *logbuffer;
1965 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1966 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
1968 if (codec->flags & CODEC_FLAG_PASS1) {
1969 f = fopen(logfilename, "w");
1970 if (!f) {
1971 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
1972 av_exit(1);
1974 ost->logfile = f;
1975 } else {
1976 /* read the log file */
1977 f = fopen(logfilename, "r");
1978 if (!f) {
1979 fprintf(stderr, "Cannot read log file '%s' for pass-2 encoding: %s\n", logfilename, strerror(errno));
1980 av_exit(1);
1982 fseek(f, 0, SEEK_END);
1983 size = ftell(f);
1984 fseek(f, 0, SEEK_SET);
1985 logbuffer = av_malloc(size + 1);
1986 if (!logbuffer) {
1987 fprintf(stderr, "Could not allocate log buffer\n");
1988 av_exit(1);
1990 size = fread(logbuffer, 1, size, f);
1991 fclose(f);
1992 logbuffer[size] = '\0';
1993 codec->stats_in = logbuffer;
1997 if(codec->codec_type == CODEC_TYPE_VIDEO){
1998 int size= codec->width * codec->height;
1999 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2003 if (!bit_buffer)
2004 bit_buffer = av_malloc(bit_buffer_size);
2005 if (!bit_buffer) {
2006 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2007 bit_buffer_size);
2008 ret = AVERROR(ENOMEM);
2009 goto fail;
2012 /* open each encoder */
2013 for(i=0;i<nb_ostreams;i++) {
2014 ost = ost_table[i];
2015 if (ost->encoding_needed) {
2016 AVCodec *codec = output_codecs[i];
2017 if (!codec)
2018 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2019 if (!codec) {
2020 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2021 ost->st->codec->codec_id, ost->file_index, ost->index);
2022 ret = AVERROR(EINVAL);
2023 goto dump_format;
2025 if (avcodec_open(ost->st->codec, codec) < 0) {
2026 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2027 ost->file_index, ost->index);
2028 ret = AVERROR(EINVAL);
2029 goto dump_format;
2031 extra_size += ost->st->codec->extradata_size;
2035 /* open each decoder */
2036 for(i=0;i<nb_istreams;i++) {
2037 ist = ist_table[i];
2038 if (ist->decoding_needed) {
2039 AVCodec *codec = input_codecs[i];
2040 if (!codec)
2041 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2042 if (!codec) {
2043 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2044 ist->st->codec->codec_id, ist->file_index, ist->index);
2045 ret = AVERROR(EINVAL);
2046 goto dump_format;
2048 if (avcodec_open(ist->st->codec, codec) < 0) {
2049 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2050 ist->file_index, ist->index);
2051 ret = AVERROR(EINVAL);
2052 goto dump_format;
2054 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
2055 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2059 /* init pts */
2060 for(i=0;i<nb_istreams;i++) {
2061 ist = ist_table[i];
2062 ist->pts = 0;
2063 ist->next_pts = AV_NOPTS_VALUE;
2064 ist->is_start = 1;
2067 /* set meta data information from input file if required */
2068 for (i=0;i<nb_meta_data_maps;i++) {
2069 AVFormatContext *out_file;
2070 AVFormatContext *in_file;
2071 AVMetadataTag *mtag;
2073 int out_file_index = meta_data_maps[i].out_file;
2074 int in_file_index = meta_data_maps[i].in_file;
2075 if (out_file_index < 0 || out_file_index >= nb_output_files) {
2076 snprintf(error, sizeof(error), "Invalid output file index %d map_meta_data(%d,%d)",
2077 out_file_index, out_file_index, in_file_index);
2078 ret = AVERROR(EINVAL);
2079 goto dump_format;
2081 if (in_file_index < 0 || in_file_index >= nb_input_files) {
2082 snprintf(error, sizeof(error), "Invalid input file index %d map_meta_data(%d,%d)",
2083 in_file_index, out_file_index, in_file_index);
2084 ret = AVERROR(EINVAL);
2085 goto dump_format;
2088 out_file = output_files[out_file_index];
2089 in_file = input_files[in_file_index];
2092 mtag=NULL;
2093 while((mtag=av_metadata_get(in_file->metadata, "", mtag, AV_METADATA_IGNORE_SUFFIX)))
2094 av_metadata_set(&out_file->metadata, mtag->key, mtag->value);
2095 av_metadata_conv(out_file, out_file->oformat->metadata_conv,
2096 in_file->iformat->metadata_conv);
2099 /* open files and write file headers */
2100 for(i=0;i<nb_output_files;i++) {
2101 os = output_files[i];
2102 if (av_write_header(os) < 0) {
2103 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2104 ret = AVERROR(EINVAL);
2105 goto dump_format;
2107 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2108 want_sdp = 0;
2112 dump_format:
2113 /* dump the file output parameters - cannot be done before in case
2114 of stream copy */
2115 for(i=0;i<nb_output_files;i++) {
2116 dump_format(output_files[i], i, output_files[i]->filename, 1);
2119 /* dump the stream mapping */
2120 if (verbose >= 0) {
2121 fprintf(stderr, "Stream mapping:\n");
2122 for(i=0;i<nb_ostreams;i++) {
2123 ost = ost_table[i];
2124 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2125 ist_table[ost->source_index]->file_index,
2126 ist_table[ost->source_index]->index,
2127 ost->file_index,
2128 ost->index);
2129 if (ost->sync_ist != ist_table[ost->source_index])
2130 fprintf(stderr, " [sync #%d.%d]",
2131 ost->sync_ist->file_index,
2132 ost->sync_ist->index);
2133 fprintf(stderr, "\n");
2137 if (ret) {
2138 fprintf(stderr, "%s\n", error);
2139 goto fail;
2142 if (want_sdp) {
2143 print_sdp(output_files, nb_output_files);
2146 if (!using_stdin && verbose >= 0) {
2147 fprintf(stderr, "Press [q] to stop encoding\n");
2148 url_set_interrupt_cb(decode_interrupt_cb);
2150 term_init();
2152 timer_start = av_gettime();
2154 for(; received_sigterm == 0;) {
2155 int file_index, ist_index;
2156 AVPacket pkt;
2157 double ipts_min;
2158 double opts_min;
2160 redo:
2161 ipts_min= 1e100;
2162 opts_min= 1e100;
2163 /* if 'q' pressed, exits */
2164 if (!using_stdin) {
2165 if (q_pressed)
2166 break;
2167 /* read_key() returns 0 on EOF */
2168 key = read_key();
2169 if (key == 'q')
2170 break;
2173 /* select the stream that we must read now by looking at the
2174 smallest output pts */
2175 file_index = -1;
2176 for(i=0;i<nb_ostreams;i++) {
2177 double ipts, opts;
2178 ost = ost_table[i];
2179 os = output_files[ost->file_index];
2180 ist = ist_table[ost->source_index];
2181 if(no_packet[ist->file_index])
2182 continue;
2183 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
2184 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
2185 else
2186 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2187 ipts = (double)ist->pts;
2188 if (!file_table[ist->file_index].eof_reached){
2189 if(ipts < ipts_min) {
2190 ipts_min = ipts;
2191 if(input_sync ) file_index = ist->file_index;
2193 if(opts < opts_min) {
2194 opts_min = opts;
2195 if(!input_sync) file_index = ist->file_index;
2198 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2199 file_index= -1;
2200 break;
2203 /* if none, if is finished */
2204 if (file_index < 0) {
2205 if(no_packet_count){
2206 no_packet_count=0;
2207 memset(no_packet, 0, sizeof(no_packet));
2208 usleep(10000);
2209 continue;
2211 break;
2214 /* finish if recording time exhausted */
2215 if (opts_min >= (recording_time / 1000000.0))
2216 break;
2218 /* finish if limit size exhausted */
2219 if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
2220 break;
2222 /* read a frame from it and output it in the fifo */
2223 is = input_files[file_index];
2224 ret= av_read_frame(is, &pkt);
2225 if(ret == AVERROR(EAGAIN)){
2226 no_packet[file_index]=1;
2227 no_packet_count++;
2228 continue;
2230 if (ret < 0) {
2231 file_table[file_index].eof_reached = 1;
2232 if (opt_shortest)
2233 break;
2234 else
2235 continue;
2238 no_packet_count=0;
2239 memset(no_packet, 0, sizeof(no_packet));
2241 if (do_pkt_dump) {
2242 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2244 /* the following test is needed in case new streams appear
2245 dynamically in stream : we ignore them */
2246 if (pkt.stream_index >= file_table[file_index].nb_streams)
2247 goto discard_packet;
2248 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2249 ist = ist_table[ist_index];
2250 if (ist->discard)
2251 goto discard_packet;
2253 if (pkt.dts != AV_NOPTS_VALUE)
2254 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2255 if (pkt.pts != AV_NOPTS_VALUE)
2256 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2258 if(input_files_ts_scale[file_index][pkt.stream_index]){
2259 if(pkt.pts != AV_NOPTS_VALUE)
2260 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2261 if(pkt.dts != AV_NOPTS_VALUE)
2262 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2265 // 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);
2266 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2267 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2268 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2269 int64_t delta= pkt_dts - ist->next_pts;
2270 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2271 input_files_ts_offset[ist->file_index]-= delta;
2272 if (verbose > 2)
2273 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2274 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2275 if(pkt.pts != AV_NOPTS_VALUE)
2276 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2280 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2281 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2283 if (verbose >= 0)
2284 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2285 ist->file_index, ist->index);
2286 if (exit_on_error)
2287 av_exit(1);
2288 av_free_packet(&pkt);
2289 goto redo;
2292 discard_packet:
2293 av_free_packet(&pkt);
2295 /* dump report by using the output first video and audio streams */
2296 print_report(output_files, ost_table, nb_ostreams, 0);
2299 /* at the end of stream, we must flush the decoder buffers */
2300 for(i=0;i<nb_istreams;i++) {
2301 ist = ist_table[i];
2302 if (ist->decoding_needed) {
2303 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2307 term_exit();
2309 /* write the trailer if needed and close file */
2310 for(i=0;i<nb_output_files;i++) {
2311 os = output_files[i];
2312 av_write_trailer(os);
2315 /* dump report by using the first video and audio streams */
2316 print_report(output_files, ost_table, nb_ostreams, 1);
2318 /* close each encoder */
2319 for(i=0;i<nb_ostreams;i++) {
2320 ost = ost_table[i];
2321 if (ost->encoding_needed) {
2322 av_freep(&ost->st->codec->stats_in);
2323 avcodec_close(ost->st->codec);
2327 /* close each decoder */
2328 for(i=0;i<nb_istreams;i++) {
2329 ist = ist_table[i];
2330 if (ist->decoding_needed) {
2331 avcodec_close(ist->st->codec);
2335 /* finished ! */
2336 ret = 0;
2338 fail:
2339 av_freep(&bit_buffer);
2340 av_free(file_table);
2342 if (ist_table) {
2343 for(i=0;i<nb_istreams;i++) {
2344 ist = ist_table[i];
2345 av_free(ist);
2347 av_free(ist_table);
2349 if (ost_table) {
2350 for(i=0;i<nb_ostreams;i++) {
2351 ost = ost_table[i];
2352 if (ost) {
2353 if (ost->logfile) {
2354 fclose(ost->logfile);
2355 ost->logfile = NULL;
2357 av_fifo_free(ost->fifo); /* works even if fifo is not
2358 initialized but set to zero */
2359 av_free(ost->pict_tmp.data[0]);
2360 if (ost->video_resample)
2361 sws_freeContext(ost->img_resample_ctx);
2362 if (ost->resample)
2363 audio_resample_close(ost->resample);
2364 if (ost->reformat_ctx)
2365 av_audio_convert_free(ost->reformat_ctx);
2366 av_free(ost);
2369 av_free(ost_table);
2371 return ret;
2374 #if 0
2375 int file_read(const char *filename)
2377 URLContext *h;
2378 unsigned char buffer[1024];
2379 int len, i;
2381 if (url_open(&h, filename, O_RDONLY) < 0) {
2382 printf("could not open '%s'\n", filename);
2383 return -1;
2385 for(;;) {
2386 len = url_read(h, buffer, sizeof(buffer));
2387 if (len <= 0)
2388 break;
2389 for(i=0;i<len;i++) putchar(buffer[i]);
2391 url_close(h);
2392 return 0;
2394 #endif
2396 static void opt_format(const char *arg)
2398 /* compatibility stuff for pgmyuv */
2399 if (!strcmp(arg, "pgmyuv")) {
2400 pgmyuv_compatibility_hack=1;
2401 // opt_image_format(arg);
2402 arg = "image2";
2403 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2406 file_iformat = av_find_input_format(arg);
2407 file_oformat = guess_format(arg, NULL, NULL);
2408 if (!file_iformat && !file_oformat) {
2409 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2410 av_exit(1);
2414 static void opt_video_rc_override_string(const char *arg)
2416 video_rc_override_string = arg;
2419 static int opt_me_threshold(const char *opt, const char *arg)
2421 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2422 return 0;
2425 static int opt_verbose(const char *opt, const char *arg)
2427 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2428 return 0;
2431 static int opt_frame_rate(const char *opt, const char *arg)
2433 if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2434 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2435 av_exit(1);
2437 return 0;
2440 static int opt_bitrate(const char *opt, const char *arg)
2442 int codec_type = opt[0]=='a' ? CODEC_TYPE_AUDIO : CODEC_TYPE_VIDEO;
2444 opt_default(opt, arg);
2446 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2447 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2449 return 0;
2452 static void opt_frame_crop_top(const char *arg)
2454 frame_topBand = atoi(arg);
2455 if (frame_topBand < 0) {
2456 fprintf(stderr, "Incorrect top crop size\n");
2457 av_exit(1);
2459 if ((frame_topBand) >= frame_height){
2460 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2461 av_exit(1);
2463 frame_height -= frame_topBand;
2466 static void opt_frame_crop_bottom(const char *arg)
2468 frame_bottomBand = atoi(arg);
2469 if (frame_bottomBand < 0) {
2470 fprintf(stderr, "Incorrect bottom crop size\n");
2471 av_exit(1);
2473 if ((frame_bottomBand) >= frame_height){
2474 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2475 av_exit(1);
2477 frame_height -= frame_bottomBand;
2480 static void opt_frame_crop_left(const char *arg)
2482 frame_leftBand = atoi(arg);
2483 if (frame_leftBand < 0) {
2484 fprintf(stderr, "Incorrect left crop size\n");
2485 av_exit(1);
2487 if ((frame_leftBand) >= frame_width){
2488 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2489 av_exit(1);
2491 frame_width -= frame_leftBand;
2494 static void opt_frame_crop_right(const char *arg)
2496 frame_rightBand = atoi(arg);
2497 if (frame_rightBand < 0) {
2498 fprintf(stderr, "Incorrect right crop size\n");
2499 av_exit(1);
2501 if ((frame_rightBand) >= frame_width){
2502 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2503 av_exit(1);
2505 frame_width -= frame_rightBand;
2508 static void opt_frame_size(const char *arg)
2510 if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
2511 fprintf(stderr, "Incorrect frame size\n");
2512 av_exit(1);
2514 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2515 fprintf(stderr, "Frame size must be a multiple of 2\n");
2516 av_exit(1);
2520 static void opt_pad_color(const char *arg) {
2521 /* Input is expected to be six hex digits similar to
2522 how colors are expressed in html tags (but without the #) */
2523 int rgb = strtol(arg, NULL, 16);
2524 int r,g,b;
2526 r = (rgb >> 16);
2527 g = ((rgb >> 8) & 255);
2528 b = (rgb & 255);
2530 padcolor[0] = RGB_TO_Y(r,g,b);
2531 padcolor[1] = RGB_TO_U(r,g,b,0);
2532 padcolor[2] = RGB_TO_V(r,g,b,0);
2535 static void opt_frame_pad_top(const char *arg)
2537 frame_padtop = atoi(arg);
2538 if (frame_padtop < 0) {
2539 fprintf(stderr, "Incorrect top pad size\n");
2540 av_exit(1);
2544 static void opt_frame_pad_bottom(const char *arg)
2546 frame_padbottom = atoi(arg);
2547 if (frame_padbottom < 0) {
2548 fprintf(stderr, "Incorrect bottom pad size\n");
2549 av_exit(1);
2554 static void opt_frame_pad_left(const char *arg)
2556 frame_padleft = atoi(arg);
2557 if (frame_padleft < 0) {
2558 fprintf(stderr, "Incorrect left pad size\n");
2559 av_exit(1);
2564 static void opt_frame_pad_right(const char *arg)
2566 frame_padright = atoi(arg);
2567 if (frame_padright < 0) {
2568 fprintf(stderr, "Incorrect right pad size\n");
2569 av_exit(1);
2573 static void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts)
2575 int i;
2576 char fmt_str[128];
2577 for (i=-1; i < nb_fmts; i++) {
2578 get_fmt_string (fmt_str, sizeof(fmt_str), i);
2579 fprintf(stdout, "%s\n", fmt_str);
2583 static void opt_frame_pix_fmt(const char *arg)
2585 if (strcmp(arg, "list")) {
2586 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2587 if (frame_pix_fmt == PIX_FMT_NONE) {
2588 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2589 av_exit(1);
2591 } else {
2592 list_fmts(avcodec_pix_fmt_string, PIX_FMT_NB);
2593 av_exit(0);
2597 static void opt_frame_aspect_ratio(const char *arg)
2599 int x = 0, y = 0;
2600 double ar = 0;
2601 const char *p;
2602 char *end;
2604 p = strchr(arg, ':');
2605 if (p) {
2606 x = strtol(arg, &end, 10);
2607 if (end == p)
2608 y = strtol(end+1, &end, 10);
2609 if (x > 0 && y > 0)
2610 ar = (double)x / (double)y;
2611 } else
2612 ar = strtod(arg, NULL);
2614 if (!ar) {
2615 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2616 av_exit(1);
2618 frame_aspect_ratio = ar;
2621 static int opt_metadata(const char *opt, const char *arg)
2623 char *mid= strchr(arg, '=');
2625 if(!mid){
2626 fprintf(stderr, "Missing =\n");
2627 av_exit(1);
2629 *mid++= 0;
2631 metadata_count++;
2632 metadata= av_realloc(metadata, sizeof(*metadata)*metadata_count);
2633 metadata[metadata_count-1].key = av_strdup(arg);
2634 metadata[metadata_count-1].value= av_strdup(mid);
2636 return 0;
2639 static void opt_qscale(const char *arg)
2641 video_qscale = atof(arg);
2642 if (video_qscale <= 0 ||
2643 video_qscale > 255) {
2644 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2645 av_exit(1);
2649 static void opt_top_field_first(const char *arg)
2651 top_field_first= atoi(arg);
2654 static int opt_thread_count(const char *opt, const char *arg)
2656 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2657 #if !HAVE_THREADS
2658 if (verbose >= 0)
2659 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2660 #endif
2661 return 0;
2664 static void opt_audio_sample_fmt(const char *arg)
2666 if (strcmp(arg, "list"))
2667 audio_sample_fmt = avcodec_get_sample_fmt(arg);
2668 else {
2669 list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
2670 av_exit(0);
2674 static int opt_audio_rate(const char *opt, const char *arg)
2676 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2677 return 0;
2680 static int opt_audio_channels(const char *opt, const char *arg)
2682 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2683 return 0;
2686 static void opt_video_channel(const char *arg)
2688 video_channel = strtol(arg, NULL, 0);
2691 static void opt_video_standard(const char *arg)
2693 video_standard = av_strdup(arg);
2696 static void opt_codec(int *pstream_copy, char **pcodec_name,
2697 int codec_type, const char *arg)
2699 av_freep(pcodec_name);
2700 if (!strcmp(arg, "copy")) {
2701 *pstream_copy = 1;
2702 } else {
2703 *pcodec_name = av_strdup(arg);
2707 static void opt_audio_codec(const char *arg)
2709 opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg);
2712 static void opt_audio_tag(const char *arg)
2714 char *tail;
2715 audio_codec_tag= strtol(arg, &tail, 0);
2717 if(!tail || *tail)
2718 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2721 static void opt_video_tag(const char *arg)
2723 char *tail;
2724 video_codec_tag= strtol(arg, &tail, 0);
2726 if(!tail || *tail)
2727 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2730 static void opt_video_codec(const char *arg)
2732 opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg);
2735 static void opt_subtitle_codec(const char *arg)
2737 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
2740 static void opt_subtitle_tag(const char *arg)
2742 char *tail;
2743 subtitle_codec_tag= strtol(arg, &tail, 0);
2745 if(!tail || *tail)
2746 subtitle_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2749 static void opt_map(const char *arg)
2751 AVStreamMap *m;
2752 char *p;
2754 m = &stream_maps[nb_stream_maps++];
2756 m->file_index = strtol(arg, &p, 0);
2757 if (*p)
2758 p++;
2760 m->stream_index = strtol(p, &p, 0);
2761 if (*p) {
2762 p++;
2763 m->sync_file_index = strtol(p, &p, 0);
2764 if (*p)
2765 p++;
2766 m->sync_stream_index = strtol(p, &p, 0);
2767 } else {
2768 m->sync_file_index = m->file_index;
2769 m->sync_stream_index = m->stream_index;
2773 static void opt_map_meta_data(const char *arg)
2775 AVMetaDataMap *m;
2776 char *p;
2778 m = &meta_data_maps[nb_meta_data_maps++];
2780 m->out_file = strtol(arg, &p, 0);
2781 if (*p)
2782 p++;
2784 m->in_file = strtol(p, &p, 0);
2787 static void opt_input_ts_scale(const char *arg)
2789 unsigned int stream;
2790 double scale;
2791 char *p;
2793 stream = strtol(arg, &p, 0);
2794 if (*p)
2795 p++;
2796 scale= strtod(p, &p);
2798 if(stream >= MAX_STREAMS)
2799 av_exit(1);
2801 input_files_ts_scale[nb_input_files][stream]= scale;
2804 static int opt_recording_time(const char *opt, const char *arg)
2806 recording_time = parse_time_or_die(opt, arg, 1);
2807 return 0;
2810 static int opt_start_time(const char *opt, const char *arg)
2812 start_time = parse_time_or_die(opt, arg, 1);
2813 return 0;
2816 static int opt_rec_timestamp(const char *opt, const char *arg)
2818 rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
2819 return 0;
2822 static int opt_input_ts_offset(const char *opt, const char *arg)
2824 input_ts_offset = parse_time_or_die(opt, arg, 1);
2825 return 0;
2828 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
2830 const char *codec_string = encoder ? "encoder" : "decoder";
2831 AVCodec *codec;
2833 if(!name)
2834 return CODEC_ID_NONE;
2835 codec = encoder ?
2836 avcodec_find_encoder_by_name(name) :
2837 avcodec_find_decoder_by_name(name);
2838 if(!codec) {
2839 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
2840 av_exit(1);
2842 if(codec->type != type) {
2843 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
2844 av_exit(1);
2846 return codec->id;
2849 static void opt_input_file(const char *filename)
2851 AVFormatContext *ic;
2852 AVFormatParameters params, *ap = &params;
2853 int err, i, ret, rfps, rfps_base;
2854 int64_t timestamp;
2856 if (!strcmp(filename, "-"))
2857 filename = "pipe:";
2859 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2860 !strcmp(filename, "/dev/stdin");
2862 /* get default parameters from command line */
2863 ic = avformat_alloc_context();
2865 memset(ap, 0, sizeof(*ap));
2866 ap->prealloced_context = 1;
2867 ap->sample_rate = audio_sample_rate;
2868 ap->channels = audio_channels;
2869 ap->time_base.den = frame_rate.num;
2870 ap->time_base.num = frame_rate.den;
2871 ap->width = frame_width + frame_padleft + frame_padright;
2872 ap->height = frame_height + frame_padtop + frame_padbottom;
2873 ap->pix_fmt = frame_pix_fmt;
2874 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
2875 ap->channel = video_channel;
2876 ap->standard = video_standard;
2877 ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0);
2878 ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0);
2879 if(pgmyuv_compatibility_hack)
2880 ap->video_codec_id= CODEC_ID_PGMYUV;
2882 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
2884 ic->video_codec_id = find_codec_or_die(video_codec_name , CODEC_TYPE_VIDEO , 0);
2885 ic->audio_codec_id = find_codec_or_die(audio_codec_name , CODEC_TYPE_AUDIO , 0);
2886 ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 0);
2887 ic->flags |= AVFMT_FLAG_NONBLOCK;
2889 /* open the input file with generic libav function */
2890 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2891 if (err < 0) {
2892 print_error(filename, err);
2893 av_exit(1);
2895 if(opt_programid) {
2896 int i;
2897 for(i=0; i<ic->nb_programs; i++)
2898 if(ic->programs[i]->id != opt_programid)
2899 ic->programs[i]->discard = AVDISCARD_ALL;
2902 ic->loop_input = loop_input;
2904 /* If not enough info to get the stream parameters, we decode the
2905 first frames to get it. (used in mpeg case for example) */
2906 ret = av_find_stream_info(ic);
2907 if (ret < 0 && verbose >= 0) {
2908 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2909 av_exit(1);
2912 timestamp = start_time;
2913 /* add the stream start time */
2914 if (ic->start_time != AV_NOPTS_VALUE)
2915 timestamp += ic->start_time;
2917 /* if seeking requested, we execute it */
2918 if (start_time != 0) {
2919 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2920 if (ret < 0) {
2921 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2922 filename, (double)timestamp / AV_TIME_BASE);
2924 /* reset seek info */
2925 start_time = 0;
2928 /* update the current parameters so that they match the one of the input stream */
2929 for(i=0;i<ic->nb_streams;i++) {
2930 AVCodecContext *enc = ic->streams[i]->codec;
2931 if(thread_count>1)
2932 avcodec_thread_init(enc, thread_count);
2933 enc->thread_count= thread_count;
2934 switch(enc->codec_type) {
2935 case CODEC_TYPE_AUDIO:
2936 set_context_opts(enc, avcodec_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2937 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2938 channel_layout = enc->channel_layout;
2939 audio_channels = enc->channels;
2940 audio_sample_rate = enc->sample_rate;
2941 audio_sample_fmt = enc->sample_fmt;
2942 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(audio_codec_name);
2943 if(audio_disable)
2944 ic->streams[i]->discard= AVDISCARD_ALL;
2945 break;
2946 case CODEC_TYPE_VIDEO:
2947 set_context_opts(enc, avcodec_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2948 frame_height = enc->height;
2949 frame_width = enc->width;
2950 if(ic->streams[i]->sample_aspect_ratio.num)
2951 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
2952 else
2953 frame_aspect_ratio=av_q2d(enc->sample_aspect_ratio);
2954 frame_aspect_ratio *= (float) enc->width / enc->height;
2955 frame_pix_fmt = enc->pix_fmt;
2956 rfps = ic->streams[i]->r_frame_rate.num;
2957 rfps_base = ic->streams[i]->r_frame_rate.den;
2958 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2959 if(me_threshold)
2960 enc->debug |= FF_DEBUG_MV;
2962 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2964 if (verbose >= 0)
2965 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2966 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2968 (float)rfps / rfps_base, rfps, rfps_base);
2970 /* update the current frame rate to match the stream frame rate */
2971 frame_rate.num = rfps;
2972 frame_rate.den = rfps_base;
2974 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(video_codec_name);
2975 if(video_disable)
2976 ic->streams[i]->discard= AVDISCARD_ALL;
2977 else if(video_discard)
2978 ic->streams[i]->discard= video_discard;
2979 break;
2980 case CODEC_TYPE_DATA:
2981 break;
2982 case CODEC_TYPE_SUBTITLE:
2983 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(subtitle_codec_name);
2984 if(subtitle_disable)
2985 ic->streams[i]->discard = AVDISCARD_ALL;
2986 break;
2987 case CODEC_TYPE_ATTACHMENT:
2988 case CODEC_TYPE_UNKNOWN:
2989 nb_icodecs++;
2990 break;
2991 default:
2992 abort();
2996 input_files[nb_input_files] = ic;
2997 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2998 /* dump the file content */
2999 if (verbose >= 0)
3000 dump_format(ic, nb_input_files, filename, 0);
3002 nb_input_files++;
3003 file_iformat = NULL;
3004 file_oformat = NULL;
3006 video_channel = 0;
3008 av_freep(&video_codec_name);
3009 av_freep(&audio_codec_name);
3010 av_freep(&subtitle_codec_name);
3013 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3014 int *has_subtitle_ptr)
3016 int has_video, has_audio, has_subtitle, i, j;
3017 AVFormatContext *ic;
3019 has_video = 0;
3020 has_audio = 0;
3021 has_subtitle = 0;
3022 for(j=0;j<nb_input_files;j++) {
3023 ic = input_files[j];
3024 for(i=0;i<ic->nb_streams;i++) {
3025 AVCodecContext *enc = ic->streams[i]->codec;
3026 switch(enc->codec_type) {
3027 case CODEC_TYPE_AUDIO:
3028 has_audio = 1;
3029 break;
3030 case CODEC_TYPE_VIDEO:
3031 has_video = 1;
3032 break;
3033 case CODEC_TYPE_SUBTITLE:
3034 has_subtitle = 1;
3035 break;
3036 case CODEC_TYPE_DATA:
3037 case CODEC_TYPE_ATTACHMENT:
3038 case CODEC_TYPE_UNKNOWN:
3039 break;
3040 default:
3041 abort();
3045 *has_video_ptr = has_video;
3046 *has_audio_ptr = has_audio;
3047 *has_subtitle_ptr = has_subtitle;
3050 static void new_video_stream(AVFormatContext *oc)
3052 AVStream *st;
3053 AVCodecContext *video_enc;
3054 enum CodecID codec_id;
3056 st = av_new_stream(oc, oc->nb_streams);
3057 if (!st) {
3058 fprintf(stderr, "Could not alloc stream\n");
3059 av_exit(1);
3061 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
3062 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
3063 video_bitstream_filters= NULL;
3065 if(thread_count>1)
3066 avcodec_thread_init(st->codec, thread_count);
3068 video_enc = st->codec;
3070 if(video_codec_tag)
3071 video_enc->codec_tag= video_codec_tag;
3073 if( (video_global_header&1)
3074 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3075 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3076 avcodec_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3078 if(video_global_header&2){
3079 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3080 avcodec_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3083 if (video_stream_copy) {
3084 st->stream_copy = 1;
3085 video_enc->codec_type = CODEC_TYPE_VIDEO;
3086 video_enc->sample_aspect_ratio =
3087 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3088 } else {
3089 const char *p;
3090 int i;
3091 AVCodec *codec;
3092 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3094 if (video_codec_name) {
3095 codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
3096 codec = avcodec_find_encoder_by_name(video_codec_name);
3097 output_codecs[nb_ocodecs] = codec;
3098 } else {
3099 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
3100 codec = avcodec_find_encoder(codec_id);
3103 video_enc->codec_id = codec_id;
3105 set_context_opts(video_enc, avcodec_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3107 if (codec && codec->supported_framerates && !force_fps)
3108 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3109 video_enc->time_base.den = fps.num;
3110 video_enc->time_base.num = fps.den;
3112 video_enc->width = frame_width + frame_padright + frame_padleft;
3113 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3114 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3115 video_enc->pix_fmt = frame_pix_fmt;
3116 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3118 if(codec && codec->pix_fmts){
3119 const enum PixelFormat *p= codec->pix_fmts;
3120 for(; *p!=-1; p++){
3121 if(*p == video_enc->pix_fmt)
3122 break;
3124 if(*p == -1)
3125 video_enc->pix_fmt = codec->pix_fmts[0];
3128 if (intra_only)
3129 video_enc->gop_size = 0;
3130 if (video_qscale || same_quality) {
3131 video_enc->flags |= CODEC_FLAG_QSCALE;
3132 video_enc->global_quality=
3133 st->quality = FF_QP2LAMBDA * video_qscale;
3136 if(intra_matrix)
3137 video_enc->intra_matrix = intra_matrix;
3138 if(inter_matrix)
3139 video_enc->inter_matrix = inter_matrix;
3141 video_enc->thread_count = thread_count;
3142 p= video_rc_override_string;
3143 for(i=0; p; i++){
3144 int start, end, q;
3145 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3146 if(e!=3){
3147 fprintf(stderr, "error parsing rc_override\n");
3148 av_exit(1);
3150 video_enc->rc_override=
3151 av_realloc(video_enc->rc_override,
3152 sizeof(RcOverride)*(i+1));
3153 video_enc->rc_override[i].start_frame= start;
3154 video_enc->rc_override[i].end_frame = end;
3155 if(q>0){
3156 video_enc->rc_override[i].qscale= q;
3157 video_enc->rc_override[i].quality_factor= 1.0;
3159 else{
3160 video_enc->rc_override[i].qscale= 0;
3161 video_enc->rc_override[i].quality_factor= -q/100.0;
3163 p= strchr(p, '/');
3164 if(p) p++;
3166 video_enc->rc_override_count=i;
3167 if (!video_enc->rc_initial_buffer_occupancy)
3168 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3169 video_enc->me_threshold= me_threshold;
3170 video_enc->intra_dc_precision= intra_dc_precision - 8;
3172 if (do_psnr)
3173 video_enc->flags|= CODEC_FLAG_PSNR;
3175 /* two pass mode */
3176 if (do_pass) {
3177 if (do_pass == 1) {
3178 video_enc->flags |= CODEC_FLAG_PASS1;
3179 } else {
3180 video_enc->flags |= CODEC_FLAG_PASS2;
3184 nb_ocodecs++;
3186 /* reset some key parameters */
3187 video_disable = 0;
3188 av_freep(&video_codec_name);
3189 video_stream_copy = 0;
3192 static void new_audio_stream(AVFormatContext *oc)
3194 AVStream *st;
3195 AVCodecContext *audio_enc;
3196 enum CodecID codec_id;
3198 st = av_new_stream(oc, oc->nb_streams);
3199 if (!st) {
3200 fprintf(stderr, "Could not alloc stream\n");
3201 av_exit(1);
3203 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
3205 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
3206 audio_bitstream_filters= NULL;
3208 if(thread_count>1)
3209 avcodec_thread_init(st->codec, thread_count);
3211 audio_enc = st->codec;
3212 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3214 if(audio_codec_tag)
3215 audio_enc->codec_tag= audio_codec_tag;
3217 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3218 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3219 avcodec_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3221 if (audio_stream_copy) {
3222 st->stream_copy = 1;
3223 audio_enc->channels = audio_channels;
3224 } else {
3225 AVCodec *codec;
3227 set_context_opts(audio_enc, avcodec_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3229 if (audio_codec_name) {
3230 codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
3231 codec = avcodec_find_encoder_by_name(audio_codec_name);
3232 output_codecs[nb_ocodecs] = codec;
3233 } else {
3234 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3235 codec = avcodec_find_encoder(codec_id);
3237 audio_enc->codec_id = codec_id;
3239 if (audio_qscale > QSCALE_NONE) {
3240 audio_enc->flags |= CODEC_FLAG_QSCALE;
3241 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3243 audio_enc->thread_count = thread_count;
3244 audio_enc->channels = audio_channels;
3245 audio_enc->sample_fmt = audio_sample_fmt;
3246 audio_enc->channel_layout = channel_layout;
3247 if (avcodec_channel_layout_num_channels(channel_layout) != audio_channels)
3248 audio_enc->channel_layout = 0;
3250 if(codec && codec->sample_fmts){
3251 const enum SampleFormat *p= codec->sample_fmts;
3252 for(; *p!=-1; p++){
3253 if(*p == audio_enc->sample_fmt)
3254 break;
3256 if(*p == -1)
3257 audio_enc->sample_fmt = codec->sample_fmts[0];
3260 nb_ocodecs++;
3261 audio_enc->sample_rate = audio_sample_rate;
3262 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3263 if (audio_language) {
3264 av_metadata_set(&st->metadata, "language", audio_language);
3265 av_free(audio_language);
3266 audio_language = NULL;
3269 /* reset some key parameters */
3270 audio_disable = 0;
3271 av_freep(&audio_codec_name);
3272 audio_stream_copy = 0;
3275 static void new_subtitle_stream(AVFormatContext *oc)
3277 AVStream *st;
3278 AVCodecContext *subtitle_enc;
3280 st = av_new_stream(oc, oc->nb_streams);
3281 if (!st) {
3282 fprintf(stderr, "Could not alloc stream\n");
3283 av_exit(1);
3285 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
3287 bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
3288 subtitle_bitstream_filters= NULL;
3290 subtitle_enc = st->codec;
3291 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3293 if(subtitle_codec_tag)
3294 subtitle_enc->codec_tag= subtitle_codec_tag;
3296 if (subtitle_stream_copy) {
3297 st->stream_copy = 1;
3298 } else {
3299 set_context_opts(avcodec_opts[CODEC_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3300 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1);
3301 output_codecs[nb_ocodecs] = avcodec_find_encoder_by_name(subtitle_codec_name);
3303 nb_ocodecs++;
3305 if (subtitle_language) {
3306 av_metadata_set(&st->metadata, "language", subtitle_language);
3307 av_free(subtitle_language);
3308 subtitle_language = NULL;
3311 subtitle_disable = 0;
3312 av_freep(&subtitle_codec_name);
3313 subtitle_stream_copy = 0;
3316 static void opt_new_audio_stream(void)
3318 AVFormatContext *oc;
3319 if (nb_output_files <= 0) {
3320 fprintf(stderr, "At least one output file must be specified\n");
3321 av_exit(1);
3323 oc = output_files[nb_output_files - 1];
3324 new_audio_stream(oc);
3327 static void opt_new_video_stream(void)
3329 AVFormatContext *oc;
3330 if (nb_output_files <= 0) {
3331 fprintf(stderr, "At least one output file must be specified\n");
3332 av_exit(1);
3334 oc = output_files[nb_output_files - 1];
3335 new_video_stream(oc);
3338 static void opt_new_subtitle_stream(void)
3340 AVFormatContext *oc;
3341 if (nb_output_files <= 0) {
3342 fprintf(stderr, "At least one output file must be specified\n");
3343 av_exit(1);
3345 oc = output_files[nb_output_files - 1];
3346 new_subtitle_stream(oc);
3349 static void opt_output_file(const char *filename)
3351 AVFormatContext *oc;
3352 int use_video, use_audio, use_subtitle;
3353 int input_has_video, input_has_audio, input_has_subtitle;
3354 AVFormatParameters params, *ap = &params;
3356 if (!strcmp(filename, "-"))
3357 filename = "pipe:";
3359 oc = avformat_alloc_context();
3361 if (!file_oformat) {
3362 file_oformat = guess_format(NULL, filename, NULL);
3363 if (!file_oformat) {
3364 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3365 filename);
3366 av_exit(1);
3370 oc->oformat = file_oformat;
3371 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3373 if (!strcmp(file_oformat->name, "ffm") &&
3374 av_strstart(filename, "http:", NULL)) {
3375 /* special case for files sent to ffserver: we get the stream
3376 parameters from ffserver */
3377 int err = read_ffserver_streams(oc, filename);
3378 if (err < 0) {
3379 print_error(filename, err);
3380 av_exit(1);
3382 } else {
3383 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3384 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3385 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3387 /* disable if no corresponding type found and at least one
3388 input file */
3389 if (nb_input_files > 0) {
3390 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3391 &input_has_subtitle);
3392 if (!input_has_video)
3393 use_video = 0;
3394 if (!input_has_audio)
3395 use_audio = 0;
3396 if (!input_has_subtitle)
3397 use_subtitle = 0;
3400 /* manual disable */
3401 if (audio_disable) {
3402 use_audio = 0;
3404 if (video_disable) {
3405 use_video = 0;
3407 if (subtitle_disable) {
3408 use_subtitle = 0;
3411 if (use_video) {
3412 new_video_stream(oc);
3415 if (use_audio) {
3416 new_audio_stream(oc);
3419 if (use_subtitle) {
3420 new_subtitle_stream(oc);
3423 oc->timestamp = rec_timestamp;
3425 for(; metadata_count>0; metadata_count--){
3426 av_metadata_set(&oc->metadata, metadata[metadata_count-1].key,
3427 metadata[metadata_count-1].value);
3429 av_metadata_conv(oc, oc->oformat->metadata_conv, NULL);
3432 output_files[nb_output_files++] = oc;
3434 /* check filename in case of an image number is expected */
3435 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3436 if (!av_filename_number_test(oc->filename)) {
3437 print_error(oc->filename, AVERROR_NUMEXPECTED);
3438 av_exit(1);
3442 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3443 /* test if it already exists to avoid loosing precious files */
3444 if (!file_overwrite &&
3445 (strchr(filename, ':') == NULL ||
3446 filename[1] == ':' ||
3447 av_strstart(filename, "file:", NULL))) {
3448 if (url_exist(filename)) {
3449 if (!using_stdin) {
3450 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3451 fflush(stderr);
3452 if (!read_yesno()) {
3453 fprintf(stderr, "Not overwriting - exiting\n");
3454 av_exit(1);
3457 else {
3458 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3459 av_exit(1);
3464 /* open the file */
3465 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3466 fprintf(stderr, "Could not open '%s'\n", filename);
3467 av_exit(1);
3471 memset(ap, 0, sizeof(*ap));
3472 if (av_set_parameters(oc, ap) < 0) {
3473 fprintf(stderr, "%s: Invalid encoding parameters\n",
3474 oc->filename);
3475 av_exit(1);
3478 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3479 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3480 oc->loop_output = loop_output;
3481 oc->flags |= AVFMT_FLAG_NONBLOCK;
3483 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
3485 /* reset some options */
3486 file_oformat = NULL;
3487 file_iformat = NULL;
3490 /* same option as mencoder */
3491 static void opt_pass(const char *pass_str)
3493 int pass;
3494 pass = atoi(pass_str);
3495 if (pass != 1 && pass != 2) {
3496 fprintf(stderr, "pass number can be only 1 or 2\n");
3497 av_exit(1);
3499 do_pass = pass;
3502 static int64_t getutime(void)
3504 #if HAVE_GETRUSAGE
3505 struct rusage rusage;
3507 getrusage(RUSAGE_SELF, &rusage);
3508 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3509 #elif HAVE_GETPROCESSTIMES
3510 HANDLE proc;
3511 FILETIME c, e, k, u;
3512 proc = GetCurrentProcess();
3513 GetProcessTimes(proc, &c, &e, &k, &u);
3514 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3515 #else
3516 return av_gettime();
3517 #endif
3520 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3522 int i;
3523 const char *p = str;
3524 for(i = 0;; i++) {
3525 dest[i] = atoi(p);
3526 if(i == 63)
3527 break;
3528 p = strchr(p, ',');
3529 if(!p) {
3530 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3531 av_exit(1);
3533 p++;
3537 static void opt_inter_matrix(const char *arg)
3539 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3540 parse_matrix_coeffs(inter_matrix, arg);
3543 static void opt_intra_matrix(const char *arg)
3545 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3546 parse_matrix_coeffs(intra_matrix, arg);
3550 * Trivial log callback.
3551 * Only suitable for show_help and similar since it lacks prefix handling.
3553 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
3555 vfprintf(stdout, fmt, vl);
3558 static void show_help(void)
3560 av_log_set_callback(log_callback_help);
3561 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3562 "Hyper fast Audio and Video encoder\n");
3563 printf("\n");
3564 show_help_options(options, "Main options:\n",
3565 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3566 show_help_options(options, "\nAdvanced options:\n",
3567 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3568 OPT_EXPERT);
3569 show_help_options(options, "\nVideo options:\n",
3570 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3571 OPT_VIDEO);
3572 show_help_options(options, "\nAdvanced Video options:\n",
3573 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3574 OPT_VIDEO | OPT_EXPERT);
3575 show_help_options(options, "\nAudio options:\n",
3576 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3577 OPT_AUDIO);
3578 show_help_options(options, "\nAdvanced Audio options:\n",
3579 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3580 OPT_AUDIO | OPT_EXPERT);
3581 show_help_options(options, "\nSubtitle options:\n",
3582 OPT_SUBTITLE | OPT_GRAB,
3583 OPT_SUBTITLE);
3584 show_help_options(options, "\nAudio/Video grab options:\n",
3585 OPT_GRAB,
3586 OPT_GRAB);
3587 printf("\n");
3588 av_opt_show(avcodec_opts[0], NULL);
3589 printf("\n");
3590 av_opt_show(avformat_opts, NULL);
3591 printf("\n");
3592 av_opt_show(sws_opts, NULL);
3595 static void opt_target(const char *arg)
3597 int norm = -1;
3598 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3600 if(!strncmp(arg, "pal-", 4)) {
3601 norm = 0;
3602 arg += 4;
3603 } else if(!strncmp(arg, "ntsc-", 5)) {
3604 norm = 1;
3605 arg += 5;
3606 } else if(!strncmp(arg, "film-", 5)) {
3607 norm = 2;
3608 arg += 5;
3609 } else {
3610 int fr;
3611 /* Calculate FR via float to avoid int overflow */
3612 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3613 if(fr == 25000) {
3614 norm = 0;
3615 } else if((fr == 29970) || (fr == 23976)) {
3616 norm = 1;
3617 } else {
3618 /* Try to determine PAL/NTSC by peeking in the input files */
3619 if(nb_input_files) {
3620 int i, j;
3621 for(j = 0; j < nb_input_files; j++) {
3622 for(i = 0; i < input_files[j]->nb_streams; i++) {
3623 AVCodecContext *c = input_files[j]->streams[i]->codec;
3624 if(c->codec_type != CODEC_TYPE_VIDEO)
3625 continue;
3626 fr = c->time_base.den * 1000 / c->time_base.num;
3627 if(fr == 25000) {
3628 norm = 0;
3629 break;
3630 } else if((fr == 29970) || (fr == 23976)) {
3631 norm = 1;
3632 break;
3635 if(norm >= 0)
3636 break;
3640 if(verbose && norm >= 0)
3641 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3644 if(norm < 0) {
3645 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3646 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3647 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3648 av_exit(1);
3651 if(!strcmp(arg, "vcd")) {
3653 opt_video_codec("mpeg1video");
3654 opt_audio_codec("mp2");
3655 opt_format("vcd");
3657 opt_frame_size(norm ? "352x240" : "352x288");
3658 opt_frame_rate(NULL, frame_rates[norm]);
3659 opt_default("g", norm ? "18" : "15");
3661 opt_default("b", "1150000");
3662 opt_default("maxrate", "1150000");
3663 opt_default("minrate", "1150000");
3664 opt_default("bufsize", "327680"); // 40*1024*8;
3666 opt_default("ab", "224000");
3667 audio_sample_rate = 44100;
3668 audio_channels = 2;
3670 opt_default("packetsize", "2324");
3671 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3673 /* We have to offset the PTS, so that it is consistent with the SCR.
3674 SCR starts at 36000, but the first two packs contain only padding
3675 and the first pack from the other stream, respectively, may also have
3676 been written before.
3677 So the real data starts at SCR 36000+3*1200. */
3678 mux_preload= (36000+3*1200) / 90000.0; //0.44
3679 } else if(!strcmp(arg, "svcd")) {
3681 opt_video_codec("mpeg2video");
3682 opt_audio_codec("mp2");
3683 opt_format("svcd");
3685 opt_frame_size(norm ? "480x480" : "480x576");
3686 opt_frame_rate(NULL, frame_rates[norm]);
3687 opt_default("g", norm ? "18" : "15");
3689 opt_default("b", "2040000");
3690 opt_default("maxrate", "2516000");
3691 opt_default("minrate", "0"); //1145000;
3692 opt_default("bufsize", "1835008"); //224*1024*8;
3693 opt_default("flags", "+scan_offset");
3696 opt_default("ab", "224000");
3697 audio_sample_rate = 44100;
3699 opt_default("packetsize", "2324");
3701 } else if(!strcmp(arg, "dvd")) {
3703 opt_video_codec("mpeg2video");
3704 opt_audio_codec("ac3");
3705 opt_format("dvd");
3707 opt_frame_size(norm ? "720x480" : "720x576");
3708 opt_frame_rate(NULL, frame_rates[norm]);
3709 opt_default("g", norm ? "18" : "15");
3711 opt_default("b", "6000000");
3712 opt_default("maxrate", "9000000");
3713 opt_default("minrate", "0"); //1500000;
3714 opt_default("bufsize", "1835008"); //224*1024*8;
3716 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3717 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3719 opt_default("ab", "448000");
3720 audio_sample_rate = 48000;
3722 } else if(!strncmp(arg, "dv", 2)) {
3724 opt_format("dv");
3726 opt_frame_size(norm ? "720x480" : "720x576");
3727 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3728 (norm ? "yuv411p" : "yuv420p"));
3729 opt_frame_rate(NULL, frame_rates[norm]);
3731 audio_sample_rate = 48000;
3732 audio_channels = 2;
3734 } else {
3735 fprintf(stderr, "Unknown target: %s\n", arg);
3736 av_exit(1);
3740 static void opt_vstats_file (const char *arg)
3742 av_free (vstats_filename);
3743 vstats_filename=av_strdup (arg);
3746 static void opt_vstats (void)
3748 char filename[40];
3749 time_t today2 = time(NULL);
3750 struct tm *today = localtime(&today2);
3752 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3753 today->tm_sec);
3754 opt_vstats_file(filename);
3757 static int opt_bsf(const char *opt, const char *arg)
3759 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3760 AVBitStreamFilterContext **bsfp;
3762 if(!bsfc){
3763 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3764 av_exit(1);
3767 bsfp= *opt == 'v' ? &video_bitstream_filters :
3768 *opt == 'a' ? &audio_bitstream_filters :
3769 &subtitle_bitstream_filters;
3770 while(*bsfp)
3771 bsfp= &(*bsfp)->next;
3773 *bsfp= bsfc;
3775 return 0;
3778 static int opt_preset(const char *opt, const char *arg)
3780 FILE *f=NULL;
3781 char filename[1000], tmp[1000], tmp2[1000], line[1000];
3782 int i;
3783 const char *base[2]= { getenv("HOME"),
3784 FFMPEG_DATADIR,
3787 for(i=!base[0]; i<2 && !f; i++){
3788 snprintf(filename, sizeof(filename), "%s%s/%s.ffpreset", base[i], i ? "" : "/.ffmpeg", arg);
3789 f= fopen(filename, "r");
3790 if(!f){
3791 char *codec_name= *opt == 'v' ? video_codec_name :
3792 *opt == 'a' ? audio_codec_name :
3793 subtitle_codec_name;
3794 snprintf(filename, sizeof(filename), "%s%s/%s-%s.ffpreset", base[i], i ? "" : "/.ffmpeg", codec_name, arg);
3795 f= fopen(filename, "r");
3798 if(!f && ((arg[0]=='.' && arg[1]=='/') || arg[0]=='/' ||
3799 is_dos_path(arg))){
3800 av_strlcpy(filename, arg, sizeof(filename));
3801 f= fopen(filename, "r");
3804 if(!f){
3805 fprintf(stderr, "File for preset '%s' not found\n", arg);
3806 av_exit(1);
3809 while(!feof(f)){
3810 int e= fscanf(f, "%999[^\n]\n", line) - 1;
3811 if(line[0] == '#' && !e)
3812 continue;
3813 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
3814 if(e){
3815 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
3816 av_exit(1);
3818 if(!strcmp(tmp, "acodec")){
3819 opt_audio_codec(tmp2);
3820 }else if(!strcmp(tmp, "vcodec")){
3821 opt_video_codec(tmp2);
3822 }else if(!strcmp(tmp, "scodec")){
3823 opt_subtitle_codec(tmp2);
3824 }else if(opt_default(tmp, tmp2) < 0){
3825 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
3826 av_exit(1);
3830 fclose(f);
3832 return 0;
3835 static const OptionDef options[] = {
3836 /* main options */
3837 { "L", OPT_EXIT, {(void*)show_license}, "show license" },
3838 { "h", OPT_EXIT, {(void*)show_help}, "show help" },
3839 { "version", OPT_EXIT, {(void*)show_version}, "show version" },
3840 { "formats", OPT_EXIT, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3841 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3842 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3843 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3844 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3845 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3846 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3847 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3848 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3849 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3850 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
3851 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_rec_timestamp}, "set the timestamp ('now' to set the current time)", "time" },
3852 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
3853 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3854 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3855 "add timings for benchmarking" },
3856 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3857 "dump each input packet" },
3858 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3859 "when dumping packets, also dump the payload" },
3860 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3861 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3862 { "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)", "" },
3863 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
3864 { "loglevel", HAS_ARG | OPT_FUNC2, {(void*)opt_loglevel}, "set libav* logging level", "logging level number or string" },
3865 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3866 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3867 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3868 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3869 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3870 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3871 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)&copy_ts}, "copy timestamps" },
3872 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3873 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3874 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3875 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
3876 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)&copy_initial_nonkeyframes}, "copy initial non-keyframes" },
3878 /* video options */
3879 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3880 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3881 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3882 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3883 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3884 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3885 { "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" },
3886 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3887 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3888 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3889 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3890 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3891 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3892 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3893 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3894 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3895 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3896 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3897 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3898 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3899 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3900 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3901 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
3902 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3903 "use same video quality as source (implies VBR)" },
3904 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3905 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
3906 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3907 "deinterlace pictures" },
3908 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3909 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
3910 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
3911 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3912 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3913 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3914 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3915 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3916 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3917 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3918 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
3920 /* audio options */
3921 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3922 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3923 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3924 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3925 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3926 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3927 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3928 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3929 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3930 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3931 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3932 { "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" },
3934 /* subtitle options */
3935 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
3936 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3937 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
3938 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3939 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
3941 /* grab options */
3942 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3943 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3944 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3946 /* muxer options */
3947 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
3948 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
3950 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3951 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3952 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3954 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
3955 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
3956 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
3958 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
3959 { NULL, },
3962 int main(int argc, char **argv)
3964 int i;
3965 int64_t ti;
3967 avcodec_register_all();
3968 avdevice_register_all();
3969 av_register_all();
3971 #if HAVE_ISATTY
3972 if(isatty(STDIN_FILENO))
3973 url_set_interrupt_cb(decode_interrupt_cb);
3974 #endif
3976 for(i=0; i<CODEC_TYPE_NB; i++){
3977 avcodec_opts[i]= avcodec_alloc_context2(i);
3979 avformat_opts = avformat_alloc_context();
3980 sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
3982 show_banner();
3984 /* parse options */
3985 parse_options(argc, argv, options, opt_output_file);
3987 /* file converter / grab */
3988 if (nb_output_files <= 0) {
3989 fprintf(stderr, "At least one output file must be specified\n");
3990 av_exit(1);
3993 if (nb_input_files == 0) {
3994 fprintf(stderr, "At least one input file must be specified\n");
3995 av_exit(1);
3998 ti = getutime();
3999 if (av_encode(output_files, nb_output_files, input_files, nb_input_files,
4000 stream_maps, nb_stream_maps) < 0)
4001 av_exit(1);
4002 ti = getutime() - ti;
4003 if (do_benchmark) {
4004 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
4007 return av_exit(0);