Remove unused vars, patch by Ramiro Polla.
[ffmpeg-lucabe.git] / ffmpeg.c
blobe54947f9237e424f7af6f96a183a0d9e142f3d69
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
21 #define HAVE_AV_CONFIG_H
22 #include <signal.h>
23 #include <limits.h>
24 #include "avformat.h"
25 #include "swscale.h"
26 #include "framehook.h"
27 #include "opt.h"
28 #include "fifo.h"
30 #ifdef __MINGW32__
31 #include <conio.h>
32 #else
33 #include <unistd.h>
34 #include <fcntl.h>
35 #include <sys/ioctl.h>
36 #include <sys/time.h>
37 #include <termios.h>
38 #include <sys/resource.h>
39 #endif
40 #ifdef CONFIG_OS2
41 #include <sys/types.h>
42 #include <sys/select.h>
43 #include <stdlib.h>
44 #endif
45 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
46 #include <time.h>
48 #include "version.h"
49 #include "cmdutils.h"
51 #undef NDEBUG
52 #include <assert.h>
54 #if !defined(INFINITY) && defined(HUGE_VAL)
55 #define INFINITY HUGE_VAL
56 #endif
58 #undef exit
60 /* select an input stream for an output stream */
61 typedef struct AVStreamMap {
62 int file_index;
63 int stream_index;
64 int sync_file_index;
65 int sync_stream_index;
66 } AVStreamMap;
68 /** select an input file for an output file */
69 typedef struct AVMetaDataMap {
70 int out_file;
71 int in_file;
72 } AVMetaDataMap;
74 extern const OptionDef options[];
76 static void show_help(void);
77 static void show_license(void);
78 static int opt_default(const char *opt, const char *arg);
80 #define MAX_FILES 20
82 static AVFormatContext *input_files[MAX_FILES];
83 static int64_t input_files_ts_offset[MAX_FILES];
84 static int nb_input_files = 0;
86 static AVFormatContext *output_files[MAX_FILES];
87 static int nb_output_files = 0;
89 static AVStreamMap stream_maps[MAX_FILES];
90 static int nb_stream_maps;
92 static AVMetaDataMap meta_data_maps[MAX_FILES];
93 static int nb_meta_data_maps;
95 static AVInputFormat *file_iformat;
96 static AVOutputFormat *file_oformat;
97 static int frame_width = 0;
98 static int frame_height = 0;
99 static float frame_aspect_ratio = 0;
100 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
101 static int frame_padtop = 0;
102 static int frame_padbottom = 0;
103 static int frame_padleft = 0;
104 static int frame_padright = 0;
105 static int padcolor[3] = {16,128,128}; /* default to black */
106 static int frame_topBand = 0;
107 static int frame_bottomBand = 0;
108 static int frame_leftBand = 0;
109 static int frame_rightBand = 0;
110 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
111 static int frame_rate = 25;
112 static int frame_rate_base = 1;
113 static float video_qscale = 0;
114 static int video_qdiff = 3;
115 static uint16_t *intra_matrix = NULL;
116 static uint16_t *inter_matrix = NULL;
117 #if 0 //experimental, (can be removed)
118 static float video_rc_qsquish=1.0;
119 static float video_rc_qmod_amp=0;
120 static int video_rc_qmod_freq=0;
121 #endif
122 static char *video_rc_override_string=NULL;
123 static char *video_rc_eq="tex^qComp";
124 static int me_method = ME_EPZS;
125 static int video_disable = 0;
126 static int video_discard = 0;
127 static int video_codec_id = CODEC_ID_NONE;
128 static int video_codec_tag = 0;
129 static int same_quality = 0;
130 static int do_deinterlace = 0;
131 static int strict = 0;
132 static int top_field_first = -1;
133 static int me_threshold = 0;
134 static int intra_dc_precision = 8;
135 static int loop_input = 0;
136 static int loop_output = AVFMT_NOOUTPUTLOOP;
137 static int qp_hist = 0;
139 static int intra_only = 0;
140 static int audio_sample_rate = 44100;
141 #define QSCALE_NONE -99999
142 static float audio_qscale = QSCALE_NONE;
143 static int audio_disable = 0;
144 static int audio_channels = 1;
145 static int audio_codec_id = CODEC_ID_NONE;
146 static int audio_codec_tag = 0;
147 static char *audio_language = NULL;
149 static int subtitle_codec_id = CODEC_ID_NONE;
150 static char *subtitle_language = NULL;
152 static float mux_preload= 0.5;
153 static float mux_max_delay= 0.7;
155 static int64_t recording_time = 0;
156 static int64_t start_time = 0;
157 static int64_t rec_timestamp = 0;
158 static int64_t input_ts_offset = 0;
159 static int file_overwrite = 0;
160 static char *str_title = NULL;
161 static char *str_author = NULL;
162 static char *str_copyright = NULL;
163 static char *str_comment = NULL;
164 static char *str_album = NULL;
165 static int do_benchmark = 0;
166 static int do_hex_dump = 0;
167 static int do_pkt_dump = 0;
168 static int do_psnr = 0;
169 static int do_vstats = 0;
170 static int do_pass = 0;
171 static char *pass_logfilename = NULL;
172 static int audio_stream_copy = 0;
173 static int video_stream_copy = 0;
174 static int subtitle_stream_copy = 0;
175 static int video_sync_method= 1;
176 static int audio_sync_method= 0;
177 static int copy_ts= 0;
178 static int opt_shortest = 0; //
179 static int video_global_header = 0;
181 static int rate_emu = 0;
183 static int video_channel = 0;
184 static char *video_standard = "ntsc";
186 static int audio_volume = 256;
188 static int using_stdin = 0;
189 static int using_vhook = 0;
190 static int verbose = 1;
191 static int thread_count= 1;
192 static int q_pressed = 0;
193 static int64_t video_size = 0;
194 static int64_t audio_size = 0;
195 static int64_t extra_size = 0;
196 static int nb_frames_dup = 0;
197 static int nb_frames_drop = 0;
198 static int input_sync;
199 static uint64_t limit_filesize = 0; //
201 static int pgmyuv_compatibility_hack=0;
202 static int dts_delta_threshold = 10;
204 static int sws_flags = SWS_BICUBIC;
206 const char **opt_names=NULL;
207 int opt_name_count=0;
208 AVCodecContext *avctx_opts[CODEC_TYPE_NB];
209 AVFormatContext *avformat_opts;
210 static int64_t timer_start = 0;
212 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
213 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
214 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
216 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
218 struct AVInputStream;
220 typedef struct AVOutputStream {
221 int file_index; /* file index */
222 int index; /* stream index in the output file */
223 int source_index; /* AVInputStream index */
224 AVStream *st; /* stream in the output file */
225 int encoding_needed; /* true if encoding needed for this stream */
226 int frame_number;
227 /* input pts and corresponding output pts
228 for A/V sync */
229 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
230 struct AVInputStream *sync_ist; /* input stream to sync against */
231 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
232 /* video only */
233 int video_resample;
234 AVFrame pict_tmp; /* temporary image for resampling */
235 struct SwsContext *img_resample_ctx; /* for image resampling */
236 int resample_height;
238 int video_crop;
239 int topBand; /* cropping area sizes */
240 int leftBand;
242 int video_pad;
243 int padtop; /* padding area sizes */
244 int padbottom;
245 int padleft;
246 int padright;
248 /* audio only */
249 int audio_resample;
250 ReSampleContext *resample; /* for audio resampling */
251 AVFifoBuffer fifo; /* for compression: one audio fifo per codec */
252 FILE *logfile;
253 } AVOutputStream;
255 typedef struct AVInputStream {
256 int file_index;
257 int index;
258 AVStream *st;
259 int discard; /* true if stream data should be discarded */
260 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
261 int64_t sample_index; /* current sample */
263 int64_t start; /* time when read started */
264 unsigned long frame; /* current frame */
265 int64_t next_pts; /* synthetic pts for cases where pkt.pts
266 is not defined */
267 int64_t pts; /* current pts */
268 int is_start; /* is 1 at the start and after a discontinuity */
269 } AVInputStream;
271 typedef struct AVInputFile {
272 int eof_reached; /* true if eof reached */
273 int ist_index; /* index of first stream in ist_table */
274 int buffer_size; /* current total buffer size */
275 int nb_streams; /* nb streams we are aware of */
276 } AVInputFile;
278 #ifndef __MINGW32__
280 /* init terminal so that we can grab keys */
281 static struct termios oldtty;
282 #endif
284 static void term_exit(void)
286 #ifndef __MINGW32__
287 tcsetattr (0, TCSANOW, &oldtty);
288 #endif
291 static volatile sig_atomic_t received_sigterm = 0;
293 static void
294 sigterm_handler(int sig)
296 received_sigterm = sig;
297 term_exit();
300 static void term_init(void)
302 #ifndef __MINGW32__
303 struct termios tty;
305 tcgetattr (0, &tty);
306 oldtty = tty;
308 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
309 |INLCR|IGNCR|ICRNL|IXON);
310 tty.c_oflag |= OPOST;
311 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
312 tty.c_cflag &= ~(CSIZE|PARENB);
313 tty.c_cflag |= CS8;
314 tty.c_cc[VMIN] = 1;
315 tty.c_cc[VTIME] = 0;
317 tcsetattr (0, TCSANOW, &tty);
318 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
319 #endif
321 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
322 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
324 register a function to be called at normal program termination
326 atexit(term_exit);
327 #ifdef CONFIG_BEOS_NETSERVER
328 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
329 #endif
332 /* read a key without blocking */
333 static int read_key(void)
335 #ifdef __MINGW32__
336 if(kbhit())
337 return(getch());
338 #else
339 int n = 1;
340 unsigned char ch;
341 #ifndef CONFIG_BEOS_NETSERVER
342 struct timeval tv;
343 fd_set rfds;
345 FD_ZERO(&rfds);
346 FD_SET(0, &rfds);
347 tv.tv_sec = 0;
348 tv.tv_usec = 0;
349 n = select(1, &rfds, NULL, NULL, &tv);
350 #endif
351 if (n > 0) {
352 n = read(0, &ch, 1);
353 if (n == 1)
354 return ch;
356 return n;
358 #endif
359 return -1;
362 static int decode_interrupt_cb(void)
364 return q_pressed || (q_pressed = read_key() == 'q');
367 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
369 int i, err;
370 AVFormatContext *ic;
372 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
373 if (err < 0)
374 return err;
375 /* copy stream format */
376 s->nb_streams = ic->nb_streams;
377 for(i=0;i<ic->nb_streams;i++) {
378 AVStream *st;
380 // FIXME: a more elegant solution is needed
381 st = av_mallocz(sizeof(AVStream));
382 memcpy(st, ic->streams[i], sizeof(AVStream));
383 st->codec = avcodec_alloc_context();
384 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
385 s->streams[i] = st;
388 av_close_input_file(ic);
389 return 0;
392 static double
393 get_sync_ipts(const AVOutputStream *ost)
395 const AVInputStream *ist = ost->sync_ist;
396 return (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/AV_TIME_BASE;
399 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
400 while(bsfc){
401 AVPacket new_pkt= *pkt;
402 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
403 &new_pkt.data, &new_pkt.size,
404 pkt->data, pkt->size,
405 pkt->flags & PKT_FLAG_KEY);
406 if(a){
407 av_free_packet(pkt);
408 new_pkt.destruct= av_destruct_packet;
410 *pkt= new_pkt;
412 bsfc= bsfc->next;
415 av_interleaved_write_frame(s, pkt);
418 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
420 static void do_audio_out(AVFormatContext *s,
421 AVOutputStream *ost,
422 AVInputStream *ist,
423 unsigned char *buf, int size)
425 uint8_t *buftmp;
426 static uint8_t *audio_buf = NULL;
427 static uint8_t *audio_out = NULL;
428 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
430 int size_out, frame_bytes, ret;
431 AVCodecContext *enc= ost->st->codec;
433 /* SC: dynamic allocation of buffers */
434 if (!audio_buf)
435 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
436 if (!audio_out)
437 audio_out = av_malloc(audio_out_size);
438 if (!audio_buf || !audio_out)
439 return; /* Should signal an error ! */
441 if(audio_sync_method){
442 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
443 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2);
444 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
445 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
447 //FIXME resample delay
448 if(fabs(delta) > 50){
449 if(ist->is_start){
450 if(byte_delta < 0){
451 byte_delta= FFMAX(byte_delta, -size);
452 size += byte_delta;
453 buf -= byte_delta;
454 if(verbose > 2)
455 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
456 if(!size)
457 return;
458 ist->is_start=0;
459 }else{
460 static uint8_t *input_tmp= NULL;
461 input_tmp= av_realloc(input_tmp, byte_delta + size);
463 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
464 ist->is_start=0;
465 else
466 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
468 memset(input_tmp, 0, byte_delta);
469 memcpy(input_tmp + byte_delta, buf, size);
470 buf= input_tmp;
471 size += byte_delta;
472 if(verbose > 2)
473 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
475 }else if(audio_sync_method>1){
476 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
477 assert(ost->audio_resample);
478 if(verbose > 2)
479 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
480 // 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));
481 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
484 }else
485 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
486 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
488 if (ost->audio_resample) {
489 buftmp = audio_buf;
490 size_out = audio_resample(ost->resample,
491 (short *)buftmp, (short *)buf,
492 size / (ist->st->codec->channels * 2));
493 size_out = size_out * enc->channels * 2;
494 } else {
495 buftmp = buf;
496 size_out = size;
499 /* now encode as many frames as possible */
500 if (enc->frame_size > 1) {
501 /* output resampled raw samples */
502 av_fifo_write(&ost->fifo, buftmp, size_out);
504 frame_bytes = enc->frame_size * 2 * enc->channels;
506 while (av_fifo_read(&ost->fifo, audio_buf, frame_bytes) == 0) {
507 AVPacket pkt;
508 av_init_packet(&pkt);
510 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
511 (short *)audio_buf);
512 audio_size += ret;
513 pkt.stream_index= ost->index;
514 pkt.data= audio_out;
515 pkt.size= ret;
516 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
517 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
518 pkt.flags |= PKT_FLAG_KEY;
519 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
521 ost->sync_opts += enc->frame_size;
523 } else {
524 AVPacket pkt;
525 av_init_packet(&pkt);
527 ost->sync_opts += size_out / (2 * enc->channels);
529 /* output a pcm frame */
530 /* XXX: change encoding codec API to avoid this ? */
531 switch(enc->codec->id) {
532 case CODEC_ID_PCM_S32LE:
533 case CODEC_ID_PCM_S32BE:
534 case CODEC_ID_PCM_U32LE:
535 case CODEC_ID_PCM_U32BE:
536 size_out = size_out << 1;
537 break;
538 case CODEC_ID_PCM_S24LE:
539 case CODEC_ID_PCM_S24BE:
540 case CODEC_ID_PCM_U24LE:
541 case CODEC_ID_PCM_U24BE:
542 case CODEC_ID_PCM_S24DAUD:
543 size_out = size_out / 2 * 3;
544 break;
545 case CODEC_ID_PCM_S16LE:
546 case CODEC_ID_PCM_S16BE:
547 case CODEC_ID_PCM_U16LE:
548 case CODEC_ID_PCM_U16BE:
549 break;
550 default:
551 size_out = size_out >> 1;
552 break;
554 ret = avcodec_encode_audio(enc, audio_out, size_out,
555 (short *)buftmp);
556 audio_size += ret;
557 pkt.stream_index= ost->index;
558 pkt.data= audio_out;
559 pkt.size= ret;
560 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
561 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
562 pkt.flags |= PKT_FLAG_KEY;
563 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
567 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
569 AVCodecContext *dec;
570 AVPicture *picture2;
571 AVPicture picture_tmp;
572 uint8_t *buf = 0;
574 dec = ist->st->codec;
576 /* deinterlace : must be done before any resize */
577 if (do_deinterlace || using_vhook) {
578 int size;
580 /* create temporary picture */
581 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
582 buf = av_malloc(size);
583 if (!buf)
584 return;
586 picture2 = &picture_tmp;
587 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
589 if (do_deinterlace){
590 if(avpicture_deinterlace(picture2, picture,
591 dec->pix_fmt, dec->width, dec->height) < 0) {
592 /* if error, do not deinterlace */
593 av_free(buf);
594 buf = NULL;
595 picture2 = picture;
597 } else {
598 av_picture_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
600 } else {
601 picture2 = picture;
604 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height,
605 1000000 * ist->pts / AV_TIME_BASE);
607 if (picture != picture2)
608 *picture = *picture2;
609 *bufp = buf;
612 /* we begin to correct av delay at this threshold */
613 #define AV_DELAY_MAX 0.100
615 static void do_subtitle_out(AVFormatContext *s,
616 AVOutputStream *ost,
617 AVInputStream *ist,
618 AVSubtitle *sub,
619 int64_t pts)
621 static uint8_t *subtitle_out = NULL;
622 int subtitle_out_max_size = 65536;
623 int subtitle_out_size, nb, i;
624 AVCodecContext *enc;
625 AVPacket pkt;
627 if (pts == AV_NOPTS_VALUE) {
628 fprintf(stderr, "Subtitle packets must have a pts\n");
629 return;
632 enc = ost->st->codec;
634 if (!subtitle_out) {
635 subtitle_out = av_malloc(subtitle_out_max_size);
638 /* Note: DVB subtitle need one packet to draw them and one other
639 packet to clear them */
640 /* XXX: signal it in the codec context ? */
641 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
642 nb = 2;
643 else
644 nb = 1;
646 for(i = 0; i < nb; i++) {
647 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
648 subtitle_out_max_size, sub);
650 av_init_packet(&pkt);
651 pkt.stream_index = ost->index;
652 pkt.data = subtitle_out;
653 pkt.size = subtitle_out_size;
654 pkt.pts = av_rescale_q(av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q) + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
655 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
656 /* XXX: the pts correction is handled here. Maybe handling
657 it in the codec would be better */
658 if (i == 0)
659 pkt.pts += 90 * sub->start_display_time;
660 else
661 pkt.pts += 90 * sub->end_display_time;
663 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
667 static int bit_buffer_size= 1024*256;
668 static uint8_t *bit_buffer= NULL;
670 static void do_video_out(AVFormatContext *s,
671 AVOutputStream *ost,
672 AVInputStream *ist,
673 AVFrame *in_picture,
674 int *frame_size)
676 int nb_frames, i, ret;
677 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
678 AVFrame picture_crop_temp, picture_pad_temp;
679 AVCodecContext *enc, *dec;
681 avcodec_get_frame_defaults(&picture_crop_temp);
682 avcodec_get_frame_defaults(&picture_pad_temp);
684 enc = ost->st->codec;
685 dec = ist->st->codec;
687 /* by default, we output a single frame */
688 nb_frames = 1;
690 *frame_size = 0;
692 if(video_sync_method){
693 double vdelta;
694 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
695 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
696 if (vdelta < -1.1)
697 nb_frames = 0;
698 else if (vdelta > 1.1)
699 nb_frames = lrintf(vdelta);
700 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, ost->sync_ipts, nb_frames);
701 if (nb_frames == 0){
702 ++nb_frames_drop;
703 if (verbose>2)
704 fprintf(stderr, "*** drop!\n");
705 }else if (nb_frames > 1) {
706 nb_frames_dup += nb_frames;
707 if (verbose>2)
708 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
710 }else
711 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
713 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
714 if (nb_frames <= 0)
715 return;
717 if (ost->video_crop) {
718 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
719 av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
720 return;
722 formatted_picture = &picture_crop_temp;
723 } else {
724 formatted_picture = in_picture;
727 final_picture = formatted_picture;
728 padding_src = formatted_picture;
729 resampling_dst = &ost->pict_tmp;
730 if (ost->video_pad) {
731 final_picture = &ost->pict_tmp;
732 if (ost->video_resample) {
733 if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
734 av_log(NULL, AV_LOG_ERROR, "error padding picture\n");
735 return;
737 resampling_dst = &picture_pad_temp;
741 if (ost->video_resample) {
742 padding_src = NULL;
743 final_picture = &ost->pict_tmp;
744 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
745 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
748 if (ost->video_pad) {
749 av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
750 enc->height, enc->width, enc->pix_fmt,
751 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
754 /* duplicates frame if needed */
755 for(i=0;i<nb_frames;i++) {
756 AVPacket pkt;
757 av_init_packet(&pkt);
758 pkt.stream_index= ost->index;
760 if (s->oformat->flags & AVFMT_RAWPICTURE) {
761 /* raw pictures are written as AVPicture structure to
762 avoid any copies. We support temorarily the older
763 method. */
764 AVFrame* old_frame = enc->coded_frame;
765 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
766 pkt.data= (uint8_t *)final_picture;
767 pkt.size= sizeof(AVPicture);
768 if(dec->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
769 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
770 if(dec->coded_frame && dec->coded_frame->key_frame)
771 pkt.flags |= PKT_FLAG_KEY;
773 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
774 enc->coded_frame = old_frame;
775 } else {
776 AVFrame big_picture;
778 big_picture= *final_picture;
779 /* better than nothing: use input picture interlaced
780 settings */
781 big_picture.interlaced_frame = in_picture->interlaced_frame;
782 if(avctx_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
783 if(top_field_first == -1)
784 big_picture.top_field_first = in_picture->top_field_first;
785 else
786 big_picture.top_field_first = top_field_first;
789 /* handles sameq here. This is not correct because it may
790 not be a global option */
791 if (same_quality) {
792 big_picture.quality = ist->st->quality;
793 }else
794 big_picture.quality = ost->st->quality;
795 if(!me_threshold)
796 big_picture.pict_type = 0;
797 // big_picture.pts = AV_NOPTS_VALUE;
798 big_picture.pts= ost->sync_opts;
799 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
800 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
801 ret = avcodec_encode_video(enc,
802 bit_buffer, bit_buffer_size,
803 &big_picture);
804 if (ret == -1) {
805 fprintf(stderr, "Video encoding failed\n");
806 exit(1);
808 //enc->frame_number = enc->real_pict_num;
809 if(ret>0){
810 pkt.data= bit_buffer;
811 pkt.size= ret;
812 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
813 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
814 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
815 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
816 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
818 if(enc->coded_frame && enc->coded_frame->key_frame)
819 pkt.flags |= PKT_FLAG_KEY;
820 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
821 *frame_size = ret;
822 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
823 // enc->frame_number-1, enc->real_pict_num, ret,
824 // enc->pict_type);
825 /* if two pass, output log */
826 if (ost->logfile && enc->stats_out) {
827 fprintf(ost->logfile, "%s", enc->stats_out);
831 ost->sync_opts++;
832 ost->frame_number++;
836 static double psnr(double d){
837 if(d==0) return INFINITY;
838 return -10.0*log(d)/log(10.0);
841 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
842 int frame_size)
844 static FILE *fvstats=NULL;
845 char filename[40];
846 time_t today2;
847 struct tm *today;
848 AVCodecContext *enc;
849 int frame_number;
850 int64_t ti;
851 double ti1, bitrate, avg_bitrate;
853 if (!fvstats) {
854 today2 = time(NULL);
855 today = localtime(&today2);
856 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour,
857 today->tm_min,
858 today->tm_sec);
859 fvstats = fopen(filename,"w");
860 if (!fvstats) {
861 perror("fopen");
862 exit(1);
866 ti = INT64_MAX;
867 enc = ost->st->codec;
868 if (enc->codec_type == CODEC_TYPE_VIDEO) {
869 frame_number = ost->frame_number;
870 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
871 if (enc->flags&CODEC_FLAG_PSNR)
872 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
874 fprintf(fvstats,"f_size= %6d ", frame_size);
875 /* compute pts value */
876 ti1 = ost->sync_opts * av_q2d(enc->time_base);
877 if (ti1 < 0.01)
878 ti1 = 0.01;
880 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
881 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
882 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
883 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
884 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
888 static void print_report(AVFormatContext **output_files,
889 AVOutputStream **ost_table, int nb_ostreams,
890 int is_last_report)
892 char buf[1024];
893 AVOutputStream *ost;
894 AVFormatContext *oc, *os;
895 int64_t total_size;
896 AVCodecContext *enc;
897 int frame_number, vid, i;
898 double bitrate, ti1, pts;
899 static int64_t last_time = -1;
900 static int qp_histogram[52];
902 if (!is_last_report) {
903 int64_t cur_time;
904 /* display the report every 0.5 seconds */
905 cur_time = av_gettime();
906 if (last_time == -1) {
907 last_time = cur_time;
908 return;
910 if ((cur_time - last_time) < 500000)
911 return;
912 last_time = cur_time;
916 oc = output_files[0];
918 total_size = url_fsize(&oc->pb);
919 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
920 total_size= url_ftell(&oc->pb);
922 buf[0] = '\0';
923 ti1 = 1e10;
924 vid = 0;
925 for(i=0;i<nb_ostreams;i++) {
926 ost = ost_table[i];
927 os = output_files[ost->file_index];
928 enc = ost->st->codec;
929 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
930 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
931 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
933 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
934 float t = (av_gettime()-timer_start) / 1000000.0;
936 frame_number = ost->frame_number;
937 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
938 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
939 enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
940 if(is_last_report)
941 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
942 if(qp_hist && enc->coded_frame){
943 int j;
944 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
945 if(qp>=0 && qp<sizeof(qp_histogram)/sizeof(int))
946 qp_histogram[qp]++;
947 for(j=0; j<32; j++)
948 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
950 if (enc->flags&CODEC_FLAG_PSNR){
951 int j;
952 double error, error_sum=0;
953 double scale, scale_sum=0;
954 char type[3]= {'Y','U','V'};
955 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
956 for(j=0; j<3; j++){
957 if(is_last_report){
958 error= enc->error[j];
959 scale= enc->width*enc->height*255.0*255.0*frame_number;
960 }else{
961 error= enc->coded_frame->error[j];
962 scale= enc->width*enc->height*255.0*255.0;
964 if(j) scale/=4;
965 error_sum += error;
966 scale_sum += scale;
967 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
969 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
971 vid = 1;
973 /* compute min output value */
974 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
975 if ((pts < ti1) && (pts > 0))
976 ti1 = pts;
978 if (ti1 < 0.01)
979 ti1 = 0.01;
981 if (verbose || is_last_report) {
982 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
984 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
985 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
986 (double)total_size / 1024, ti1, bitrate);
988 if (verbose > 1)
989 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
990 nb_frames_dup, nb_frames_drop);
992 if (verbose >= 0)
993 fprintf(stderr, "%s \r", buf);
995 fflush(stderr);
998 if (is_last_report && verbose >= 0){
999 int64_t raw= audio_size + video_size + extra_size;
1000 fprintf(stderr, "\n");
1001 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1002 video_size/1024.0,
1003 audio_size/1024.0,
1004 extra_size/1024.0,
1005 100.0*(total_size - raw)/raw
1010 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1011 static int output_packet(AVInputStream *ist, int ist_index,
1012 AVOutputStream **ost_table, int nb_ostreams,
1013 const AVPacket *pkt)
1015 AVFormatContext *os;
1016 AVOutputStream *ost;
1017 uint8_t *ptr;
1018 int len, ret, i;
1019 uint8_t *data_buf;
1020 int data_size, got_picture;
1021 AVFrame picture;
1022 void *buffer_to_free;
1023 static unsigned int samples_size= 0;
1024 static short *samples= NULL;
1025 AVSubtitle subtitle, *subtitle_to_free;
1026 int got_subtitle;
1028 if(!pkt){
1029 ist->pts= ist->next_pts; // needed for last packet if vsync=0
1030 } else if (pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1031 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1032 } else {
1033 // assert(ist->pts == ist->next_pts);
1036 if (pkt == NULL) {
1037 /* EOF handling */
1038 ptr = NULL;
1039 len = 0;
1040 goto handle_eof;
1043 len = pkt->size;
1044 ptr = pkt->data;
1045 while (len > 0) {
1046 handle_eof:
1047 /* decode the packet if needed */
1048 data_buf = NULL; /* fail safe */
1049 data_size = 0;
1050 subtitle_to_free = NULL;
1051 if (ist->decoding_needed) {
1052 switch(ist->st->codec->codec_type) {
1053 case CODEC_TYPE_AUDIO:{
1054 if(pkt)
1055 samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE));
1056 data_size= samples_size;
1057 /* XXX: could avoid copy if PCM 16 bits with same
1058 endianness as CPU */
1059 ret = avcodec_decode_audio2(ist->st->codec, samples, &data_size,
1060 ptr, len);
1061 if (ret < 0)
1062 goto fail_decode;
1063 ptr += ret;
1064 len -= ret;
1065 /* Some bug in mpeg audio decoder gives */
1066 /* data_size < 0, it seems they are overflows */
1067 if (data_size <= 0) {
1068 /* no audio frame */
1069 continue;
1071 data_buf = (uint8_t *)samples;
1072 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1073 (ist->st->codec->sample_rate * ist->st->codec->channels);
1074 break;}
1075 case CODEC_TYPE_VIDEO:
1076 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1077 /* XXX: allocate picture correctly */
1078 avcodec_get_frame_defaults(&picture);
1080 ret = avcodec_decode_video(ist->st->codec,
1081 &picture, &got_picture, ptr, len);
1082 ist->st->quality= picture.quality;
1083 if (ret < 0)
1084 goto fail_decode;
1085 if (!got_picture) {
1086 /* no picture yet */
1087 goto discard_packet;
1089 if (ist->st->codec->time_base.num != 0) {
1090 ist->next_pts += ((int64_t)AV_TIME_BASE *
1091 ist->st->codec->time_base.num) /
1092 ist->st->codec->time_base.den;
1094 len = 0;
1095 break;
1096 case CODEC_TYPE_SUBTITLE:
1097 ret = avcodec_decode_subtitle(ist->st->codec,
1098 &subtitle, &got_subtitle, ptr, len);
1099 if (ret < 0)
1100 goto fail_decode;
1101 if (!got_subtitle) {
1102 goto discard_packet;
1104 subtitle_to_free = &subtitle;
1105 len = 0;
1106 break;
1107 default:
1108 goto fail_decode;
1110 } else {
1111 switch(ist->st->codec->codec_type) {
1112 case CODEC_TYPE_AUDIO:
1113 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1114 (ist->st->codec->sample_rate * ist->st->codec->channels);
1115 break;
1116 case CODEC_TYPE_VIDEO:
1117 if (ist->st->codec->time_base.num != 0) {
1118 ist->next_pts += ((int64_t)AV_TIME_BASE *
1119 ist->st->codec->time_base.num) /
1120 ist->st->codec->time_base.den;
1122 break;
1124 data_buf = ptr;
1125 data_size = len;
1126 ret = len;
1127 len = 0;
1130 buffer_to_free = NULL;
1131 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1132 pre_process_video_frame(ist, (AVPicture *)&picture,
1133 &buffer_to_free);
1136 // preprocess audio (volume)
1137 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1138 if (audio_volume != 256) {
1139 short *volp;
1140 volp = samples;
1141 for(i=0;i<(data_size / sizeof(short));i++) {
1142 int v = ((*volp) * audio_volume + 128) >> 8;
1143 if (v < -32768) v = -32768;
1144 if (v > 32767) v = 32767;
1145 *volp++ = v;
1150 /* frame rate emulation */
1151 if (ist->st->codec->rate_emu) {
1152 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
1153 int64_t now = av_gettime() - ist->start;
1154 if (pts > now)
1155 usleep(pts - now);
1157 ist->frame++;
1160 #if 0
1161 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1162 is the one of the next displayed one */
1163 /* XXX: add mpeg4 too ? */
1164 if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
1165 if (ist->st->codec->pict_type != B_TYPE) {
1166 int64_t tmp;
1167 tmp = ist->last_ip_pts;
1168 ist->last_ip_pts = ist->frac_pts.val;
1169 ist->frac_pts.val = tmp;
1172 #endif
1173 /* if output time reached then transcode raw format,
1174 encode packets and output them */
1175 if (start_time == 0 || ist->pts >= start_time)
1176 for(i=0;i<nb_ostreams;i++) {
1177 int frame_size;
1179 ost = ost_table[i];
1180 if (ost->source_index == ist_index) {
1181 os = output_files[ost->file_index];
1183 #if 0
1184 printf("%d: got pts=%0.3f %0.3f\n", i,
1185 (double)pkt->pts / AV_TIME_BASE,
1186 ((double)ist->pts / AV_TIME_BASE) -
1187 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1188 #endif
1189 /* set the input output pts pairs */
1190 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1192 if (ost->encoding_needed) {
1193 switch(ost->st->codec->codec_type) {
1194 case CODEC_TYPE_AUDIO:
1195 do_audio_out(os, ost, ist, data_buf, data_size);
1196 break;
1197 case CODEC_TYPE_VIDEO:
1198 do_video_out(os, ost, ist, &picture, &frame_size);
1199 video_size += frame_size;
1200 if (do_vstats && frame_size)
1201 do_video_stats(os, ost, frame_size);
1202 break;
1203 case CODEC_TYPE_SUBTITLE:
1204 do_subtitle_out(os, ost, ist, &subtitle,
1205 pkt->pts);
1206 break;
1207 default:
1208 av_abort();
1210 } else {
1211 AVFrame avframe; //FIXME/XXX remove this
1212 AVPacket opkt;
1213 av_init_packet(&opkt);
1215 /* no reencoding needed : output the packet directly */
1216 /* force the input stream PTS */
1218 avcodec_get_frame_defaults(&avframe);
1219 ost->st->codec->coded_frame= &avframe;
1220 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1222 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1223 audio_size += data_size;
1224 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1225 video_size += data_size;
1226 ost->sync_opts++;
1229 opkt.stream_index= ost->index;
1230 if(pkt->pts != AV_NOPTS_VALUE)
1231 opkt.pts= av_rescale_q(av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q) + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
1232 else
1233 opkt.pts= AV_NOPTS_VALUE;
1236 int64_t dts;
1237 if (pkt->dts == AV_NOPTS_VALUE)
1238 dts = ist->next_pts;
1239 else
1240 dts= av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1241 opkt.dts= av_rescale_q(dts + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
1243 opkt.flags= pkt->flags;
1245 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1246 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1247 opkt.destruct= av_destruct_packet;
1249 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][pkt->stream_index]);
1250 ost->st->codec->frame_number++;
1251 ost->frame_number++;
1252 av_free_packet(&opkt);
1256 av_free(buffer_to_free);
1257 /* XXX: allocate the subtitles in the codec ? */
1258 if (subtitle_to_free) {
1259 if (subtitle_to_free->rects != NULL) {
1260 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1261 av_free(subtitle_to_free->rects[i].bitmap);
1262 av_free(subtitle_to_free->rects[i].rgba_palette);
1264 av_freep(&subtitle_to_free->rects);
1266 subtitle_to_free->num_rects = 0;
1267 subtitle_to_free = NULL;
1270 discard_packet:
1271 if (pkt == NULL) {
1272 /* EOF handling */
1274 for(i=0;i<nb_ostreams;i++) {
1275 ost = ost_table[i];
1276 if (ost->source_index == ist_index) {
1277 AVCodecContext *enc= ost->st->codec;
1278 os = output_files[ost->file_index];
1280 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1281 continue;
1282 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1283 continue;
1285 if (ost->encoding_needed) {
1286 for(;;) {
1287 AVPacket pkt;
1288 int fifo_bytes;
1289 av_init_packet(&pkt);
1290 pkt.stream_index= ost->index;
1292 switch(ost->st->codec->codec_type) {
1293 case CODEC_TYPE_AUDIO:
1294 fifo_bytes = av_fifo_size(&ost->fifo);
1295 ret = 0;
1296 /* encode any samples remaining in fifo */
1297 if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1298 int fs_tmp = enc->frame_size;
1299 enc->frame_size = fifo_bytes / (2 * enc->channels);
1300 if(av_fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes) == 0) {
1301 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1303 enc->frame_size = fs_tmp;
1305 if(ret <= 0) {
1306 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1308 audio_size += ret;
1309 pkt.flags |= PKT_FLAG_KEY;
1310 break;
1311 case CODEC_TYPE_VIDEO:
1312 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1313 video_size += ret;
1314 if(enc->coded_frame && enc->coded_frame->key_frame)
1315 pkt.flags |= PKT_FLAG_KEY;
1316 if (ost->logfile && enc->stats_out) {
1317 fprintf(ost->logfile, "%s", enc->stats_out);
1319 break;
1320 default:
1321 ret=-1;
1324 if(ret<=0)
1325 break;
1326 pkt.data= bit_buffer;
1327 pkt.size= ret;
1328 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1329 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1330 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1337 return 0;
1338 fail_decode:
1339 return -1;
1344 * The following code is the main loop of the file converter
1346 static int av_encode(AVFormatContext **output_files,
1347 int nb_output_files,
1348 AVFormatContext **input_files,
1349 int nb_input_files,
1350 AVStreamMap *stream_maps, int nb_stream_maps)
1352 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1353 AVFormatContext *is, *os;
1354 AVCodecContext *codec, *icodec;
1355 AVOutputStream *ost, **ost_table = NULL;
1356 AVInputStream *ist, **ist_table = NULL;
1357 AVInputFile *file_table;
1358 int key;
1360 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1361 if (!file_table)
1362 goto fail;
1364 /* input stream init */
1365 j = 0;
1366 for(i=0;i<nb_input_files;i++) {
1367 is = input_files[i];
1368 file_table[i].ist_index = j;
1369 file_table[i].nb_streams = is->nb_streams;
1370 j += is->nb_streams;
1372 nb_istreams = j;
1374 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1375 if (!ist_table)
1376 goto fail;
1378 for(i=0;i<nb_istreams;i++) {
1379 ist = av_mallocz(sizeof(AVInputStream));
1380 if (!ist)
1381 goto fail;
1382 ist_table[i] = ist;
1384 j = 0;
1385 for(i=0;i<nb_input_files;i++) {
1386 is = input_files[i];
1387 for(k=0;k<is->nb_streams;k++) {
1388 ist = ist_table[j++];
1389 ist->st = is->streams[k];
1390 ist->file_index = i;
1391 ist->index = k;
1392 ist->discard = 1; /* the stream is discarded by default
1393 (changed later) */
1395 if (ist->st->codec->rate_emu) {
1396 ist->start = av_gettime();
1397 ist->frame = 0;
1402 /* output stream init */
1403 nb_ostreams = 0;
1404 for(i=0;i<nb_output_files;i++) {
1405 os = output_files[i];
1406 if (!os->nb_streams) {
1407 fprintf(stderr, "Output file does not contain any stream\n");
1408 exit(1);
1410 nb_ostreams += os->nb_streams;
1412 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1413 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1414 exit(1);
1417 /* Sanity check the mapping args -- do the input files & streams exist? */
1418 for(i=0;i<nb_stream_maps;i++) {
1419 int fi = stream_maps[i].file_index;
1420 int si = stream_maps[i].stream_index;
1422 if (fi < 0 || fi > nb_input_files - 1 ||
1423 si < 0 || si > file_table[fi].nb_streams - 1) {
1424 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1425 exit(1);
1427 fi = stream_maps[i].sync_file_index;
1428 si = stream_maps[i].sync_stream_index;
1429 if (fi < 0 || fi > nb_input_files - 1 ||
1430 si < 0 || si > file_table[fi].nb_streams - 1) {
1431 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1432 exit(1);
1436 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1437 if (!ost_table)
1438 goto fail;
1439 for(i=0;i<nb_ostreams;i++) {
1440 ost = av_mallocz(sizeof(AVOutputStream));
1441 if (!ost)
1442 goto fail;
1443 ost_table[i] = ost;
1446 n = 0;
1447 for(k=0;k<nb_output_files;k++) {
1448 os = output_files[k];
1449 for(i=0;i<os->nb_streams;i++) {
1450 int found;
1451 ost = ost_table[n++];
1452 ost->file_index = k;
1453 ost->index = i;
1454 ost->st = os->streams[i];
1455 if (nb_stream_maps > 0) {
1456 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1457 stream_maps[n-1].stream_index;
1459 /* Sanity check that the stream types match */
1460 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1461 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1462 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1463 ost->file_index, ost->index);
1464 exit(1);
1467 } else {
1468 /* get corresponding input stream index : we select the first one with the right type */
1469 found = 0;
1470 for(j=0;j<nb_istreams;j++) {
1471 ist = ist_table[j];
1472 if (ist->discard &&
1473 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1474 ost->source_index = j;
1475 found = 1;
1476 break;
1480 if (!found) {
1481 /* try again and reuse existing stream */
1482 for(j=0;j<nb_istreams;j++) {
1483 ist = ist_table[j];
1484 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1485 ost->source_index = j;
1486 found = 1;
1489 if (!found) {
1490 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1491 ost->file_index, ost->index);
1492 exit(1);
1496 ist = ist_table[ost->source_index];
1497 ist->discard = 0;
1498 ost->sync_ist = (nb_stream_maps > 0) ?
1499 ist_table[file_table[stream_maps[n-1].sync_file_index].ist_index +
1500 stream_maps[n-1].sync_stream_index] : ist;
1504 /* for each output stream, we compute the right encoding parameters */
1505 for(i=0;i<nb_ostreams;i++) {
1506 ost = ost_table[i];
1507 ist = ist_table[ost->source_index];
1509 codec = ost->st->codec;
1510 icodec = ist->st->codec;
1512 if (ost->st->stream_copy) {
1513 /* if stream_copy is selected, no need to decode or encode */
1514 codec->codec_id = icodec->codec_id;
1515 codec->codec_type = icodec->codec_type;
1516 if(!codec->codec_tag) codec->codec_tag = icodec->codec_tag;
1517 codec->bit_rate = icodec->bit_rate;
1518 codec->extradata= icodec->extradata;
1519 codec->extradata_size= icodec->extradata_size;
1520 if(av_q2d(icodec->time_base) > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000)
1521 codec->time_base = icodec->time_base;
1522 else
1523 codec->time_base = ist->st->time_base;
1524 switch(codec->codec_type) {
1525 case CODEC_TYPE_AUDIO:
1526 codec->sample_rate = icodec->sample_rate;
1527 codec->channels = icodec->channels;
1528 codec->frame_size = icodec->frame_size;
1529 codec->block_align= icodec->block_align;
1530 break;
1531 case CODEC_TYPE_VIDEO:
1532 if(using_vhook) {
1533 fprintf(stderr,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");
1534 exit(1);
1536 codec->pix_fmt = icodec->pix_fmt;
1537 codec->width = icodec->width;
1538 codec->height = icodec->height;
1539 codec->has_b_frames = icodec->has_b_frames;
1540 break;
1541 case CODEC_TYPE_SUBTITLE:
1542 break;
1543 default:
1544 av_abort();
1546 } else {
1547 switch(codec->codec_type) {
1548 case CODEC_TYPE_AUDIO:
1549 if (av_fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1550 goto fail;
1552 if (codec->channels == icodec->channels &&
1553 codec->sample_rate == icodec->sample_rate) {
1554 ost->audio_resample = 0;
1555 } else {
1556 if (codec->channels != icodec->channels &&
1557 (icodec->codec_id == CODEC_ID_AC3 ||
1558 icodec->codec_id == CODEC_ID_DTS)) {
1559 /* Special case for 5:1 AC3 and DTS input */
1560 /* and mono or stereo output */
1561 /* Request specific number of channels */
1562 icodec->channels = codec->channels;
1563 if (codec->sample_rate == icodec->sample_rate)
1564 ost->audio_resample = 0;
1565 else {
1566 ost->audio_resample = 1;
1568 } else {
1569 ost->audio_resample = 1;
1572 if(audio_sync_method>1)
1573 ost->audio_resample = 1;
1575 if(ost->audio_resample){
1576 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1577 codec->sample_rate, icodec->sample_rate);
1578 if(!ost->resample){
1579 printf("Can't resample. Aborting.\n");
1580 av_abort();
1583 ist->decoding_needed = 1;
1584 ost->encoding_needed = 1;
1585 break;
1586 case CODEC_TYPE_VIDEO:
1587 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1588 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1589 ost->video_resample = ((codec->width != icodec->width -
1590 (frame_leftBand + frame_rightBand) +
1591 (frame_padleft + frame_padright)) ||
1592 (codec->height != icodec->height -
1593 (frame_topBand + frame_bottomBand) +
1594 (frame_padtop + frame_padbottom)) ||
1595 (codec->pix_fmt != icodec->pix_fmt));
1596 if (ost->video_crop) {
1597 ost->topBand = frame_topBand;
1598 ost->leftBand = frame_leftBand;
1600 if (ost->video_pad) {
1601 ost->padtop = frame_padtop;
1602 ost->padleft = frame_padleft;
1603 ost->padbottom = frame_padbottom;
1604 ost->padright = frame_padright;
1605 if (!ost->video_resample) {
1606 avcodec_get_frame_defaults(&ost->pict_tmp);
1607 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1608 codec->width, codec->height ) )
1609 goto fail;
1612 if (ost->video_resample) {
1613 avcodec_get_frame_defaults(&ost->pict_tmp);
1614 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1615 codec->width, codec->height ) ) {
1616 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1617 exit(1);
1619 ost->img_resample_ctx = sws_getContext(
1620 icodec->width - (frame_leftBand + frame_rightBand),
1621 icodec->height - (frame_topBand + frame_bottomBand),
1622 icodec->pix_fmt,
1623 codec->width - (frame_padleft + frame_padright),
1624 codec->height - (frame_padtop + frame_padbottom),
1625 codec->pix_fmt,
1626 sws_flags, NULL, NULL, NULL);
1627 if (ost->img_resample_ctx == NULL) {
1628 fprintf(stderr, "Cannot get resampling context\n");
1629 exit(1);
1631 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1633 ost->encoding_needed = 1;
1634 ist->decoding_needed = 1;
1635 break;
1636 case CODEC_TYPE_SUBTITLE:
1637 ost->encoding_needed = 1;
1638 ist->decoding_needed = 1;
1639 break;
1640 default:
1641 av_abort();
1642 break;
1644 /* two pass mode */
1645 if (ost->encoding_needed &&
1646 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1647 char logfilename[1024];
1648 FILE *f;
1649 int size;
1650 char *logbuffer;
1652 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1653 pass_logfilename ?
1654 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1655 if (codec->flags & CODEC_FLAG_PASS1) {
1656 f = fopen(logfilename, "w");
1657 if (!f) {
1658 perror(logfilename);
1659 exit(1);
1661 ost->logfile = f;
1662 } else {
1663 /* read the log file */
1664 f = fopen(logfilename, "r");
1665 if (!f) {
1666 perror(logfilename);
1667 exit(1);
1669 fseek(f, 0, SEEK_END);
1670 size = ftell(f);
1671 fseek(f, 0, SEEK_SET);
1672 logbuffer = av_malloc(size + 1);
1673 if (!logbuffer) {
1674 fprintf(stderr, "Could not allocate log buffer\n");
1675 exit(1);
1677 size = fread(logbuffer, 1, size, f);
1678 fclose(f);
1679 logbuffer[size] = '\0';
1680 codec->stats_in = logbuffer;
1684 if(codec->codec_type == CODEC_TYPE_VIDEO){
1685 int size= codec->width * codec->height;
1686 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1690 if (!bit_buffer)
1691 bit_buffer = av_malloc(bit_buffer_size);
1692 if (!bit_buffer)
1693 goto fail;
1695 /* dump the file output parameters - cannot be done before in case
1696 of stream copy */
1697 for(i=0;i<nb_output_files;i++) {
1698 dump_format(output_files[i], i, output_files[i]->filename, 1);
1701 /* dump the stream mapping */
1702 if (verbose >= 0) {
1703 fprintf(stderr, "Stream mapping:\n");
1704 for(i=0;i<nb_ostreams;i++) {
1705 ost = ost_table[i];
1706 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1707 ist_table[ost->source_index]->file_index,
1708 ist_table[ost->source_index]->index,
1709 ost->file_index,
1710 ost->index);
1711 if (ost->sync_ist != ist_table[ost->source_index])
1712 fprintf(stderr, " [sync #%d.%d]",
1713 ost->sync_ist->file_index,
1714 ost->sync_ist->index);
1715 fprintf(stderr, "\n");
1719 /* open each encoder */
1720 for(i=0;i<nb_ostreams;i++) {
1721 ost = ost_table[i];
1722 if (ost->encoding_needed) {
1723 AVCodec *codec;
1724 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1725 if (!codec) {
1726 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1727 ost->file_index, ost->index);
1728 exit(1);
1730 if (avcodec_open(ost->st->codec, codec) < 0) {
1731 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1732 ost->file_index, ost->index);
1733 exit(1);
1735 extra_size += ost->st->codec->extradata_size;
1739 /* open each decoder */
1740 for(i=0;i<nb_istreams;i++) {
1741 ist = ist_table[i];
1742 if (ist->decoding_needed) {
1743 AVCodec *codec;
1744 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1745 if (!codec) {
1746 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1747 ist->st->codec->codec_id, ist->file_index, ist->index);
1748 exit(1);
1750 if (avcodec_open(ist->st->codec, codec) < 0) {
1751 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1752 ist->file_index, ist->index);
1753 exit(1);
1755 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1756 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1760 /* init pts */
1761 for(i=0;i<nb_istreams;i++) {
1762 ist = ist_table[i];
1763 is = input_files[ist->file_index];
1764 ist->pts = 0;
1765 ist->next_pts = av_rescale_q(ist->st->start_time, ist->st->time_base, AV_TIME_BASE_Q);
1766 if(ist->st->start_time == AV_NOPTS_VALUE)
1767 ist->next_pts=0;
1768 if(input_files_ts_offset[ist->file_index])
1769 ist->next_pts= AV_NOPTS_VALUE;
1770 ist->is_start = 1;
1773 /* set meta data information from input file if required */
1774 for (i=0;i<nb_meta_data_maps;i++) {
1775 AVFormatContext *out_file;
1776 AVFormatContext *in_file;
1778 int out_file_index = meta_data_maps[i].out_file;
1779 int in_file_index = meta_data_maps[i].in_file;
1780 if ( out_file_index < 0 || out_file_index >= nb_output_files ) {
1781 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1782 ret = AVERROR(EINVAL);
1783 goto fail;
1785 if ( in_file_index < 0 || in_file_index >= nb_input_files ) {
1786 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1787 ret = AVERROR(EINVAL);
1788 goto fail;
1791 out_file = output_files[out_file_index];
1792 in_file = input_files[in_file_index];
1794 strcpy(out_file->title, in_file->title);
1795 strcpy(out_file->author, in_file->author);
1796 strcpy(out_file->copyright, in_file->copyright);
1797 strcpy(out_file->comment, in_file->comment);
1798 strcpy(out_file->album, in_file->album);
1799 out_file->year = in_file->year;
1800 out_file->track = in_file->track;
1801 strcpy(out_file->genre, in_file->genre);
1804 /* open files and write file headers */
1805 for(i=0;i<nb_output_files;i++) {
1806 os = output_files[i];
1807 if (av_write_header(os) < 0) {
1808 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1809 ret = AVERROR(EINVAL);
1810 goto fail;
1814 if ( !using_stdin && verbose >= 0) {
1815 fprintf(stderr, "Press [q] to stop encoding\n");
1816 url_set_interrupt_cb(decode_interrupt_cb);
1818 term_init();
1820 key = -1;
1821 timer_start = av_gettime();
1823 for(; received_sigterm == 0;) {
1824 int file_index, ist_index;
1825 AVPacket pkt;
1826 double ipts_min;
1827 double opts_min;
1829 redo:
1830 ipts_min= 1e100;
1831 opts_min= 1e100;
1832 /* if 'q' pressed, exits */
1833 if (!using_stdin) {
1834 if (q_pressed)
1835 break;
1836 /* read_key() returns 0 on EOF */
1837 key = read_key();
1838 if (key == 'q')
1839 break;
1842 /* select the stream that we must read now by looking at the
1843 smallest output pts */
1844 file_index = -1;
1845 for(i=0;i<nb_ostreams;i++) {
1846 double ipts, opts;
1847 ost = ost_table[i];
1848 os = output_files[ost->file_index];
1849 ist = ist_table[ost->source_index];
1850 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
1851 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
1852 else
1853 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
1854 ipts = (double)ist->pts;
1855 if (!file_table[ist->file_index].eof_reached){
1856 if(ipts < ipts_min) {
1857 ipts_min = ipts;
1858 if(input_sync ) file_index = ist->file_index;
1860 if(opts < opts_min) {
1861 opts_min = opts;
1862 if(!input_sync) file_index = ist->file_index;
1865 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
1866 file_index= -1;
1867 break;
1870 /* if none, if is finished */
1871 if (file_index < 0) {
1872 break;
1875 /* finish if recording time exhausted */
1876 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
1877 break;
1879 /* finish if limit size exhausted */
1880 if (limit_filesize != 0 && limit_filesize < url_ftell(&output_files[0]->pb))
1881 break;
1883 /* read a frame from it and output it in the fifo */
1884 is = input_files[file_index];
1885 if (av_read_frame(is, &pkt) < 0) {
1886 file_table[file_index].eof_reached = 1;
1887 if (opt_shortest) break; else continue; //
1890 if (do_pkt_dump) {
1891 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
1893 /* the following test is needed in case new streams appear
1894 dynamically in stream : we ignore them */
1895 if (pkt.stream_index >= file_table[file_index].nb_streams)
1896 goto discard_packet;
1897 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1898 ist = ist_table[ist_index];
1899 if (ist->discard)
1900 goto discard_packet;
1902 // 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);
1903 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
1904 int64_t delta= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q) - ist->next_pts;
1905 if(FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE && !copy_ts){
1906 input_files_ts_offset[ist->file_index]-= delta;
1907 if (verbose > 2)
1908 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
1909 for(i=0; i<file_table[file_index].nb_streams; i++){
1910 int index= file_table[file_index].ist_index + i;
1911 ist_table[index]->next_pts += delta;
1912 ist_table[index]->is_start=1;
1917 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1918 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1920 if (verbose >= 0)
1921 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1922 ist->file_index, ist->index);
1924 av_free_packet(&pkt);
1925 goto redo;
1928 discard_packet:
1929 av_free_packet(&pkt);
1931 /* dump report by using the output first video and audio streams */
1932 print_report(output_files, ost_table, nb_ostreams, 0);
1935 /* at the end of stream, we must flush the decoder buffers */
1936 for(i=0;i<nb_istreams;i++) {
1937 ist = ist_table[i];
1938 if (ist->decoding_needed) {
1939 output_packet(ist, i, ost_table, nb_ostreams, NULL);
1943 term_exit();
1945 /* write the trailer if needed and close file */
1946 for(i=0;i<nb_output_files;i++) {
1947 os = output_files[i];
1948 av_write_trailer(os);
1951 /* dump report by using the first video and audio streams */
1952 print_report(output_files, ost_table, nb_ostreams, 1);
1954 /* close each encoder */
1955 for(i=0;i<nb_ostreams;i++) {
1956 ost = ost_table[i];
1957 if (ost->encoding_needed) {
1958 av_freep(&ost->st->codec->stats_in);
1959 avcodec_close(ost->st->codec);
1963 /* close each decoder */
1964 for(i=0;i<nb_istreams;i++) {
1965 ist = ist_table[i];
1966 if (ist->decoding_needed) {
1967 avcodec_close(ist->st->codec);
1971 /* finished ! */
1973 ret = 0;
1974 fail1:
1975 av_freep(&bit_buffer);
1976 av_free(file_table);
1978 if (ist_table) {
1979 for(i=0;i<nb_istreams;i++) {
1980 ist = ist_table[i];
1981 av_free(ist);
1983 av_free(ist_table);
1985 if (ost_table) {
1986 for(i=0;i<nb_ostreams;i++) {
1987 ost = ost_table[i];
1988 if (ost) {
1989 if (ost->logfile) {
1990 fclose(ost->logfile);
1991 ost->logfile = NULL;
1993 av_fifo_free(&ost->fifo); /* works even if fifo is not
1994 initialized but set to zero */
1995 av_free(ost->pict_tmp.data[0]);
1996 if (ost->video_resample)
1997 sws_freeContext(ost->img_resample_ctx);
1998 if (ost->audio_resample)
1999 audio_resample_close(ost->resample);
2000 av_free(ost);
2003 av_free(ost_table);
2005 return ret;
2006 fail:
2007 ret = AVERROR(ENOMEM);
2008 goto fail1;
2011 #if 0
2012 int file_read(const char *filename)
2014 URLContext *h;
2015 unsigned char buffer[1024];
2016 int len, i;
2018 if (url_open(&h, filename, O_RDONLY) < 0) {
2019 printf("could not open '%s'\n", filename);
2020 return -1;
2022 for(;;) {
2023 len = url_read(h, buffer, sizeof(buffer));
2024 if (len <= 0)
2025 break;
2026 for(i=0;i<len;i++) putchar(buffer[i]);
2028 url_close(h);
2029 return 0;
2031 #endif
2033 static void opt_format(const char *arg)
2035 /* compatibility stuff for pgmyuv */
2036 if (!strcmp(arg, "pgmyuv")) {
2037 pgmyuv_compatibility_hack=1;
2038 // opt_image_format(arg);
2039 arg = "image2";
2040 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2043 file_iformat = av_find_input_format(arg);
2044 file_oformat = guess_format(arg, NULL, NULL);
2045 if (!file_iformat && !file_oformat) {
2046 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2047 exit(1);
2051 static void opt_video_rc_eq(char *arg)
2053 video_rc_eq = arg;
2056 static void opt_video_rc_override_string(char *arg)
2058 video_rc_override_string = arg;
2061 static void opt_me_threshold(const char *arg)
2063 me_threshold = atoi(arg);
2066 static void opt_verbose(const char *arg)
2068 verbose = atoi(arg);
2069 av_log_level = atoi(arg);
2072 static void opt_frame_rate(const char *arg)
2074 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
2075 fprintf(stderr, "Incorrect frame rate\n");
2076 exit(1);
2080 static void opt_frame_crop_top(const char *arg)
2082 frame_topBand = atoi(arg);
2083 if (frame_topBand < 0) {
2084 fprintf(stderr, "Incorrect top crop size\n");
2085 exit(1);
2087 if ((frame_topBand % 2) != 0) {
2088 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2089 exit(1);
2091 if ((frame_topBand) >= frame_height){
2092 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2093 exit(1);
2095 frame_height -= frame_topBand;
2098 static void opt_frame_crop_bottom(const char *arg)
2100 frame_bottomBand = atoi(arg);
2101 if (frame_bottomBand < 0) {
2102 fprintf(stderr, "Incorrect bottom crop size\n");
2103 exit(1);
2105 if ((frame_bottomBand % 2) != 0) {
2106 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2107 exit(1);
2109 if ((frame_bottomBand) >= frame_height){
2110 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2111 exit(1);
2113 frame_height -= frame_bottomBand;
2116 static void opt_frame_crop_left(const char *arg)
2118 frame_leftBand = atoi(arg);
2119 if (frame_leftBand < 0) {
2120 fprintf(stderr, "Incorrect left crop size\n");
2121 exit(1);
2123 if ((frame_leftBand % 2) != 0) {
2124 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2125 exit(1);
2127 if ((frame_leftBand) >= frame_width){
2128 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2129 exit(1);
2131 frame_width -= frame_leftBand;
2134 static void opt_frame_crop_right(const char *arg)
2136 frame_rightBand = atoi(arg);
2137 if (frame_rightBand < 0) {
2138 fprintf(stderr, "Incorrect right crop size\n");
2139 exit(1);
2141 if ((frame_rightBand % 2) != 0) {
2142 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2143 exit(1);
2145 if ((frame_rightBand) >= frame_width){
2146 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2147 exit(1);
2149 frame_width -= frame_rightBand;
2152 static void opt_frame_size(const char *arg)
2154 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2155 fprintf(stderr, "Incorrect frame size\n");
2156 exit(1);
2158 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2159 fprintf(stderr, "Frame size must be a multiple of 2\n");
2160 exit(1);
2165 #define SCALEBITS 10
2166 #define ONE_HALF (1 << (SCALEBITS - 1))
2167 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2169 #define RGB_TO_Y(r, g, b) \
2170 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2171 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2173 #define RGB_TO_U(r1, g1, b1, shift)\
2174 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2175 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2177 #define RGB_TO_V(r1, g1, b1, shift)\
2178 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2179 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2181 static void opt_pad_color(const char *arg) {
2182 /* Input is expected to be six hex digits similar to
2183 how colors are expressed in html tags (but without the #) */
2184 int rgb = strtol(arg, NULL, 16);
2185 int r,g,b;
2187 r = (rgb >> 16);
2188 g = ((rgb >> 8) & 255);
2189 b = (rgb & 255);
2191 padcolor[0] = RGB_TO_Y(r,g,b);
2192 padcolor[1] = RGB_TO_U(r,g,b,0);
2193 padcolor[2] = RGB_TO_V(r,g,b,0);
2196 static void opt_frame_pad_top(const char *arg)
2198 frame_padtop = atoi(arg);
2199 if (frame_padtop < 0) {
2200 fprintf(stderr, "Incorrect top pad size\n");
2201 exit(1);
2203 if ((frame_padtop % 2) != 0) {
2204 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2205 exit(1);
2209 static void opt_frame_pad_bottom(const char *arg)
2211 frame_padbottom = atoi(arg);
2212 if (frame_padbottom < 0) {
2213 fprintf(stderr, "Incorrect bottom pad size\n");
2214 exit(1);
2216 if ((frame_padbottom % 2) != 0) {
2217 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2218 exit(1);
2223 static void opt_frame_pad_left(const char *arg)
2225 frame_padleft = atoi(arg);
2226 if (frame_padleft < 0) {
2227 fprintf(stderr, "Incorrect left pad size\n");
2228 exit(1);
2230 if ((frame_padleft % 2) != 0) {
2231 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2232 exit(1);
2237 static void opt_frame_pad_right(const char *arg)
2239 frame_padright = atoi(arg);
2240 if (frame_padright < 0) {
2241 fprintf(stderr, "Incorrect right pad size\n");
2242 exit(1);
2244 if ((frame_padright % 2) != 0) {
2245 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2246 exit(1);
2251 static void opt_frame_pix_fmt(const char *arg)
2253 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2256 static void opt_frame_aspect_ratio(const char *arg)
2258 int x = 0, y = 0;
2259 double ar = 0;
2260 const char *p;
2262 p = strchr(arg, ':');
2263 if (p) {
2264 x = strtol(arg, (char **)&arg, 10);
2265 if (arg == p)
2266 y = strtol(arg+1, (char **)&arg, 10);
2267 if (x > 0 && y > 0)
2268 ar = (double)x / (double)y;
2269 } else
2270 ar = strtod(arg, (char **)&arg);
2272 if (!ar) {
2273 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2274 exit(1);
2276 frame_aspect_ratio = ar;
2279 static void opt_qscale(const char *arg)
2281 video_qscale = atof(arg);
2282 if (video_qscale <= 0 ||
2283 video_qscale > 255) {
2284 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2285 exit(1);
2289 static void opt_qdiff(const char *arg)
2291 video_qdiff = atoi(arg);
2292 if (video_qdiff < 0 ||
2293 video_qdiff > 31) {
2294 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2295 exit(1);
2299 static void opt_strict(const char *arg)
2301 strict= atoi(arg);
2304 static void opt_top_field_first(const char *arg)
2306 top_field_first= atoi(arg);
2309 static void opt_thread_count(const char *arg)
2311 thread_count= atoi(arg);
2312 #if !defined(HAVE_THREADS)
2313 if (verbose >= 0)
2314 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2315 #endif
2318 static void opt_audio_rate(const char *arg)
2320 audio_sample_rate = atoi(arg);
2323 static void opt_audio_channels(const char *arg)
2325 audio_channels = atoi(arg);
2328 static void opt_video_channel(const char *arg)
2330 video_channel = strtol(arg, NULL, 0);
2333 static void opt_video_standard(const char *arg)
2335 video_standard = av_strdup(arg);
2338 static void opt_codec(int *pstream_copy, int *pcodec_id,
2339 int codec_type, const char *arg)
2341 AVCodec *p;
2343 if (!strcmp(arg, "copy")) {
2344 *pstream_copy = 1;
2345 } else {
2346 p = first_avcodec;
2347 while (p) {
2348 if (!strcmp(p->name, arg) && p->type == codec_type)
2349 break;
2350 p = p->next;
2352 if (p == NULL) {
2353 fprintf(stderr, "Unknown codec '%s'\n", arg);
2354 exit(1);
2355 } else {
2356 *pcodec_id = p->id;
2361 static void opt_audio_codec(const char *arg)
2363 opt_codec(&audio_stream_copy, &audio_codec_id, CODEC_TYPE_AUDIO, arg);
2366 static void opt_audio_tag(const char *arg)
2368 char *tail;
2369 audio_codec_tag= strtol(arg, &tail, 0);
2371 if(!tail || *tail)
2372 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2375 static void opt_video_tag(const char *arg)
2377 char *tail;
2378 video_codec_tag= strtol(arg, &tail, 0);
2380 if(!tail || *tail)
2381 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2384 static void add_frame_hooker(const char *arg)
2386 int argc = 0;
2387 char *argv[64];
2388 int i;
2389 char *args = av_strdup(arg);
2391 using_vhook = 1;
2393 argv[0] = strtok(args, " ");
2394 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2397 i = frame_hook_add(argc, argv);
2399 if (i != 0) {
2400 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2401 exit(1);
2405 const char *motion_str[] = {
2406 "zero",
2407 "full",
2408 "log",
2409 "phods",
2410 "epzs",
2411 "x1",
2412 "hex",
2413 "umh",
2414 "iter",
2415 NULL,
2418 static void opt_motion_estimation(const char *arg)
2420 const char **p;
2421 p = motion_str;
2422 for(;;) {
2423 if (!*p) {
2424 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2425 exit(1);
2427 if (!strcmp(*p, arg))
2428 break;
2429 p++;
2431 me_method = (p - motion_str) + 1;
2434 static void opt_video_codec(const char *arg)
2436 opt_codec(&video_stream_copy, &video_codec_id, CODEC_TYPE_VIDEO, arg);
2439 static void opt_subtitle_codec(const char *arg)
2441 opt_codec(&subtitle_stream_copy, &subtitle_codec_id, CODEC_TYPE_SUBTITLE, arg);
2444 static void opt_map(const char *arg)
2446 AVStreamMap *m;
2447 const char *p;
2449 p = arg;
2450 m = &stream_maps[nb_stream_maps++];
2452 m->file_index = strtol(arg, (char **)&p, 0);
2453 if (*p)
2454 p++;
2456 m->stream_index = strtol(p, (char **)&p, 0);
2457 if (*p) {
2458 p++;
2459 m->sync_file_index = strtol(p, (char **)&p, 0);
2460 if (*p)
2461 p++;
2462 m->sync_stream_index = strtol(p, (char **)&p, 0);
2463 } else {
2464 m->sync_file_index = m->file_index;
2465 m->sync_stream_index = m->stream_index;
2469 static void opt_map_meta_data(const char *arg)
2471 AVMetaDataMap *m;
2472 const char *p;
2474 p = arg;
2475 m = &meta_data_maps[nb_meta_data_maps++];
2477 m->out_file = strtol(arg, (char **)&p, 0);
2478 if (*p)
2479 p++;
2481 m->in_file = strtol(p, (char **)&p, 0);
2484 static void opt_recording_time(const char *arg)
2486 recording_time = parse_date(arg, 1);
2489 static void opt_start_time(const char *arg)
2491 start_time = parse_date(arg, 1);
2494 static void opt_rec_timestamp(const char *arg)
2496 rec_timestamp = parse_date(arg, 0) / 1000000;
2499 static void opt_input_ts_offset(const char *arg)
2501 input_ts_offset = parse_date(arg, 1);
2504 static void opt_input_file(const char *filename)
2506 AVFormatContext *ic;
2507 AVFormatParameters params, *ap = &params;
2508 int err, i, ret, rfps, rfps_base;
2509 int64_t timestamp;
2511 if (!strcmp(filename, "-"))
2512 filename = "pipe:";
2514 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2515 !strcmp( filename, "/dev/stdin" );
2517 /* get default parameters from command line */
2518 ic = av_alloc_format_context();
2520 memset(ap, 0, sizeof(*ap));
2521 ap->prealloced_context = 1;
2522 ap->sample_rate = audio_sample_rate;
2523 ap->channels = audio_channels;
2524 ap->time_base.den = frame_rate;
2525 ap->time_base.num = frame_rate_base;
2526 ap->width = frame_width + frame_padleft + frame_padright;
2527 ap->height = frame_height + frame_padtop + frame_padbottom;
2528 ap->pix_fmt = frame_pix_fmt;
2529 ap->channel = video_channel;
2530 ap->standard = video_standard;
2531 ap->video_codec_id = video_codec_id;
2532 ap->audio_codec_id = audio_codec_id;
2533 if(pgmyuv_compatibility_hack)
2534 ap->video_codec_id= CODEC_ID_PGMYUV;
2536 for(i=0; i<opt_name_count; i++){
2537 const AVOption *opt;
2538 double d= av_get_double(avformat_opts, opt_names[i], &opt);
2539 if(d==d && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2540 av_set_double(ic, opt_names[i], d);
2542 /* open the input file with generic libav function */
2543 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2544 if (err < 0) {
2545 print_error(filename, err);
2546 exit(1);
2549 ic->loop_input = loop_input;
2551 /* If not enough info to get the stream parameters, we decode the
2552 first frames to get it. (used in mpeg case for example) */
2553 ret = av_find_stream_info(ic);
2554 if (ret < 0 && verbose >= 0) {
2555 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2556 exit(1);
2559 timestamp = start_time;
2560 /* add the stream start time */
2561 if (ic->start_time != AV_NOPTS_VALUE)
2562 timestamp += ic->start_time;
2564 /* if seeking requested, we execute it */
2565 if (start_time != 0) {
2566 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2567 if (ret < 0) {
2568 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2569 filename, (double)timestamp / AV_TIME_BASE);
2571 /* reset seek info */
2572 start_time = 0;
2575 /* update the current parameters so that they match the one of the input stream */
2576 for(i=0;i<ic->nb_streams;i++) {
2577 int j;
2578 AVCodecContext *enc = ic->streams[i]->codec;
2579 if(thread_count>1)
2580 avcodec_thread_init(enc, thread_count);
2581 enc->thread_count= thread_count;
2582 switch(enc->codec_type) {
2583 case CODEC_TYPE_AUDIO:
2584 for(j=0; j<opt_name_count; j++){
2585 const AVOption *opt;
2586 double d= av_get_double(avctx_opts[CODEC_TYPE_AUDIO], opt_names[j], &opt);
2587 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2588 av_set_double(enc, opt_names[j], d);
2590 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2591 audio_channels = enc->channels;
2592 audio_sample_rate = enc->sample_rate;
2593 if(audio_disable)
2594 ic->streams[i]->discard= AVDISCARD_ALL;
2595 break;
2596 case CODEC_TYPE_VIDEO:
2597 for(j=0; j<opt_name_count; j++){
2598 const AVOption *opt;
2599 double d= av_get_double(avctx_opts[CODEC_TYPE_VIDEO], opt_names[j], &opt);
2600 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2601 av_set_double(enc, opt_names[j], d);
2603 frame_height = enc->height;
2604 frame_width = enc->width;
2605 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2606 frame_pix_fmt = enc->pix_fmt;
2607 rfps = ic->streams[i]->r_frame_rate.num;
2608 rfps_base = ic->streams[i]->r_frame_rate.den;
2609 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2610 if(me_threshold)
2611 enc->debug |= FF_DEBUG_MV;
2613 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2615 if (verbose >= 0)
2616 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2617 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2619 (float)rfps / rfps_base, rfps, rfps_base);
2621 /* update the current frame rate to match the stream frame rate */
2622 frame_rate = rfps;
2623 frame_rate_base = rfps_base;
2625 enc->rate_emu = rate_emu;
2626 if(video_disable)
2627 ic->streams[i]->discard= AVDISCARD_ALL;
2628 else if(video_discard)
2629 ic->streams[i]->discard= video_discard;
2630 break;
2631 case CODEC_TYPE_DATA:
2632 break;
2633 case CODEC_TYPE_SUBTITLE:
2634 break;
2635 case CODEC_TYPE_UNKNOWN:
2636 break;
2637 default:
2638 av_abort();
2642 input_files[nb_input_files] = ic;
2643 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2644 /* dump the file content */
2645 if (verbose >= 0)
2646 dump_format(ic, nb_input_files, filename, 0);
2648 nb_input_files++;
2649 file_iformat = NULL;
2650 file_oformat = NULL;
2652 video_channel = 0;
2654 rate_emu = 0;
2657 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
2659 int has_video, has_audio, i, j;
2660 AVFormatContext *ic;
2662 has_video = 0;
2663 has_audio = 0;
2664 for(j=0;j<nb_input_files;j++) {
2665 ic = input_files[j];
2666 for(i=0;i<ic->nb_streams;i++) {
2667 AVCodecContext *enc = ic->streams[i]->codec;
2668 switch(enc->codec_type) {
2669 case CODEC_TYPE_AUDIO:
2670 has_audio = 1;
2671 break;
2672 case CODEC_TYPE_VIDEO:
2673 has_video = 1;
2674 break;
2675 case CODEC_TYPE_DATA:
2676 case CODEC_TYPE_UNKNOWN:
2677 case CODEC_TYPE_SUBTITLE:
2678 break;
2679 default:
2680 av_abort();
2684 *has_video_ptr = has_video;
2685 *has_audio_ptr = has_audio;
2688 static void new_video_stream(AVFormatContext *oc)
2690 AVStream *st;
2691 AVCodecContext *video_enc;
2692 int codec_id;
2694 st = av_new_stream(oc, oc->nb_streams);
2695 if (!st) {
2696 fprintf(stderr, "Could not alloc stream\n");
2697 exit(1);
2699 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
2700 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
2701 video_bitstream_filters= NULL;
2703 if(thread_count>1)
2704 avcodec_thread_init(st->codec, thread_count);
2706 video_enc = st->codec;
2708 if(video_codec_tag)
2709 video_enc->codec_tag= video_codec_tag;
2711 if( (video_global_header&1)
2712 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
2713 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2714 avctx_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
2716 if(video_global_header&2){
2717 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
2718 avctx_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
2721 if (video_stream_copy) {
2722 st->stream_copy = 1;
2723 video_enc->codec_type = CODEC_TYPE_VIDEO;
2724 } else {
2725 char *p;
2726 int i;
2727 AVCodec *codec;
2729 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
2730 if (video_codec_id != CODEC_ID_NONE)
2731 codec_id = video_codec_id;
2733 video_enc->codec_id = codec_id;
2734 codec = avcodec_find_encoder(codec_id);
2736 for(i=0; i<opt_name_count; i++){
2737 const AVOption *opt;
2738 double d= av_get_double(avctx_opts[CODEC_TYPE_VIDEO], opt_names[i], &opt);
2739 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
2740 av_set_double(video_enc, opt_names[i], d);
2743 video_enc->time_base.den = frame_rate;
2744 video_enc->time_base.num = frame_rate_base;
2745 if(codec && codec->supported_framerates){
2746 const AVRational *p= codec->supported_framerates;
2747 AVRational req= (AVRational){frame_rate, frame_rate_base};
2748 const AVRational *best=NULL;
2749 AVRational best_error= (AVRational){INT_MAX, 1};
2750 for(; p->den!=0; p++){
2751 AVRational error= av_sub_q(req, *p);
2752 if(error.num <0) error.num *= -1;
2753 if(av_cmp_q(error, best_error) < 0){
2754 best_error= error;
2755 best= p;
2758 video_enc->time_base.den= best->num;
2759 video_enc->time_base.num= best->den;
2762 video_enc->width = frame_width + frame_padright + frame_padleft;
2763 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2764 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
2765 video_enc->pix_fmt = frame_pix_fmt;
2767 if(codec && codec->pix_fmts){
2768 const enum PixelFormat *p= codec->pix_fmts;
2769 for(; *p!=-1; p++){
2770 if(*p == video_enc->pix_fmt)
2771 break;
2773 if(*p == -1)
2774 video_enc->pix_fmt = codec->pix_fmts[0];
2777 if (intra_only)
2778 video_enc->gop_size = 0;
2779 if (video_qscale || same_quality) {
2780 video_enc->flags |= CODEC_FLAG_QSCALE;
2781 video_enc->global_quality=
2782 st->quality = FF_QP2LAMBDA * video_qscale;
2785 if(intra_matrix)
2786 video_enc->intra_matrix = intra_matrix;
2787 if(inter_matrix)
2788 video_enc->inter_matrix = inter_matrix;
2790 video_enc->max_qdiff = video_qdiff;
2791 video_enc->rc_eq = video_rc_eq;
2792 video_enc->thread_count = thread_count;
2793 p= video_rc_override_string;
2794 for(i=0; p; i++){
2795 int start, end, q;
2796 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
2797 if(e!=3){
2798 fprintf(stderr, "error parsing rc_override\n");
2799 exit(1);
2801 video_enc->rc_override=
2802 av_realloc(video_enc->rc_override,
2803 sizeof(RcOverride)*(i+1));
2804 video_enc->rc_override[i].start_frame= start;
2805 video_enc->rc_override[i].end_frame = end;
2806 if(q>0){
2807 video_enc->rc_override[i].qscale= q;
2808 video_enc->rc_override[i].quality_factor= 1.0;
2810 else{
2811 video_enc->rc_override[i].qscale= 0;
2812 video_enc->rc_override[i].quality_factor= -q/100.0;
2814 p= strchr(p, '/');
2815 if(p) p++;
2817 video_enc->rc_override_count=i;
2818 if (!video_enc->rc_initial_buffer_occupancy)
2819 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
2820 video_enc->me_threshold= me_threshold;
2821 video_enc->intra_dc_precision= intra_dc_precision - 8;
2822 video_enc->strict_std_compliance = strict;
2824 if (do_psnr)
2825 video_enc->flags|= CODEC_FLAG_PSNR;
2827 video_enc->me_method = me_method;
2829 /* two pass mode */
2830 if (do_pass) {
2831 if (do_pass == 1) {
2832 video_enc->flags |= CODEC_FLAG_PASS1;
2833 } else {
2834 video_enc->flags |= CODEC_FLAG_PASS2;
2839 /* reset some key parameters */
2840 video_disable = 0;
2841 video_codec_id = CODEC_ID_NONE;
2842 video_stream_copy = 0;
2845 static void new_audio_stream(AVFormatContext *oc)
2847 AVStream *st;
2848 AVCodecContext *audio_enc;
2849 int codec_id, i;
2851 st = av_new_stream(oc, oc->nb_streams);
2852 if (!st) {
2853 fprintf(stderr, "Could not alloc stream\n");
2854 exit(1);
2856 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
2858 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
2859 audio_bitstream_filters= NULL;
2861 if(thread_count>1)
2862 avcodec_thread_init(st->codec, thread_count);
2864 audio_enc = st->codec;
2865 audio_enc->codec_type = CODEC_TYPE_AUDIO;
2866 audio_enc->strict_std_compliance = strict;
2868 if(audio_codec_tag)
2869 audio_enc->codec_tag= audio_codec_tag;
2871 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
2872 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2873 avctx_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
2875 if (audio_stream_copy) {
2876 st->stream_copy = 1;
2877 audio_enc->channels = audio_channels;
2878 } else {
2879 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
2881 for(i=0; i<opt_name_count; i++){
2882 const AVOption *opt;
2883 double d= av_get_double(avctx_opts[CODEC_TYPE_AUDIO], opt_names[i], &opt);
2884 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
2885 av_set_double(audio_enc, opt_names[i], d);
2888 if (audio_codec_id != CODEC_ID_NONE)
2889 codec_id = audio_codec_id;
2890 audio_enc->codec_id = codec_id;
2892 if (audio_qscale > QSCALE_NONE) {
2893 audio_enc->flags |= CODEC_FLAG_QSCALE;
2894 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
2896 audio_enc->thread_count = thread_count;
2897 audio_enc->channels = audio_channels;
2899 audio_enc->sample_rate = audio_sample_rate;
2900 audio_enc->time_base= (AVRational){1, audio_sample_rate};
2901 if (audio_language) {
2902 pstrcpy(st->language, sizeof(st->language), audio_language);
2903 av_free(audio_language);
2904 audio_language = NULL;
2907 /* reset some key parameters */
2908 audio_disable = 0;
2909 audio_codec_id = CODEC_ID_NONE;
2910 audio_stream_copy = 0;
2913 static void opt_new_subtitle_stream(void)
2915 AVFormatContext *oc;
2916 AVStream *st;
2917 AVCodecContext *subtitle_enc;
2918 int i;
2920 if (nb_output_files <= 0) {
2921 fprintf(stderr, "At least one output file must be specified\n");
2922 exit(1);
2924 oc = output_files[nb_output_files - 1];
2926 st = av_new_stream(oc, oc->nb_streams);
2927 if (!st) {
2928 fprintf(stderr, "Could not alloc stream\n");
2929 exit(1);
2931 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
2933 subtitle_enc = st->codec;
2934 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
2935 if (subtitle_stream_copy) {
2936 st->stream_copy = 1;
2937 } else {
2938 for(i=0; i<opt_name_count; i++){
2939 const AVOption *opt;
2940 double d= av_get_double(avctx_opts[CODEC_TYPE_SUBTITLE], opt_names[i], &opt);
2941 if(d==d && (opt->flags&AV_OPT_FLAG_SUBTITLE_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
2942 av_set_double(subtitle_enc, opt_names[i], d);
2944 subtitle_enc->codec_id = subtitle_codec_id;
2947 if (subtitle_language) {
2948 pstrcpy(st->language, sizeof(st->language), subtitle_language);
2949 av_free(subtitle_language);
2950 subtitle_language = NULL;
2953 subtitle_codec_id = CODEC_ID_NONE;
2954 subtitle_stream_copy = 0;
2957 static void opt_new_audio_stream(void)
2959 AVFormatContext *oc;
2960 if (nb_output_files <= 0) {
2961 fprintf(stderr, "At least one output file must be specified\n");
2962 exit(1);
2964 oc = output_files[nb_output_files - 1];
2965 new_audio_stream(oc);
2968 static void opt_new_video_stream(void)
2970 AVFormatContext *oc;
2971 if (nb_output_files <= 0) {
2972 fprintf(stderr, "At least one output file must be specified\n");
2973 exit(1);
2975 oc = output_files[nb_output_files - 1];
2976 new_video_stream(oc);
2979 static void opt_output_file(const char *filename)
2981 AVFormatContext *oc;
2982 int use_video, use_audio, input_has_video, input_has_audio, i;
2983 AVFormatParameters params, *ap = &params;
2985 if (!strcmp(filename, "-"))
2986 filename = "pipe:";
2988 oc = av_alloc_format_context();
2990 if (!file_oformat) {
2991 file_oformat = guess_format(NULL, filename, NULL);
2992 if (!file_oformat) {
2993 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
2994 filename);
2995 exit(1);
2999 oc->oformat = file_oformat;
3000 pstrcpy(oc->filename, sizeof(oc->filename), filename);
3002 if (!strcmp(file_oformat->name, "ffm") &&
3003 strstart(filename, "http:", NULL)) {
3004 /* special case for files sent to ffserver: we get the stream
3005 parameters from ffserver */
3006 if (read_ffserver_streams(oc, filename) < 0) {
3007 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
3008 exit(1);
3010 } else {
3011 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_id != CODEC_ID_NONE;
3012 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_id != CODEC_ID_NONE;
3014 /* disable if no corresponding type found and at least one
3015 input file */
3016 if (nb_input_files > 0) {
3017 check_audio_video_inputs(&input_has_video, &input_has_audio);
3018 if (!input_has_video)
3019 use_video = 0;
3020 if (!input_has_audio)
3021 use_audio = 0;
3024 /* manual disable */
3025 if (audio_disable) {
3026 use_audio = 0;
3028 if (video_disable) {
3029 use_video = 0;
3032 if (use_video) {
3033 new_video_stream(oc);
3036 if (use_audio) {
3037 new_audio_stream(oc);
3040 oc->timestamp = rec_timestamp;
3042 if (str_title)
3043 pstrcpy(oc->title, sizeof(oc->title), str_title);
3044 if (str_author)
3045 pstrcpy(oc->author, sizeof(oc->author), str_author);
3046 if (str_copyright)
3047 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3048 if (str_comment)
3049 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3050 if (str_album)
3051 pstrcpy(oc->album, sizeof(oc->album), str_album);
3054 output_files[nb_output_files++] = oc;
3056 /* check filename in case of an image number is expected */
3057 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3058 if (!av_filename_number_test(oc->filename)) {
3059 print_error(oc->filename, AVERROR_NUMEXPECTED);
3060 exit(1);
3064 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3065 /* test if it already exists to avoid loosing precious files */
3066 if (!file_overwrite &&
3067 (strchr(filename, ':') == NULL ||
3068 strstart(filename, "file:", NULL))) {
3069 if (url_exist(filename)) {
3070 int c;
3072 if ( !using_stdin ) {
3073 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3074 fflush(stderr);
3075 c = getchar();
3076 if (toupper(c) != 'Y') {
3077 fprintf(stderr, "Not overwriting - exiting\n");
3078 exit(1);
3081 else {
3082 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3083 exit(1);
3088 /* open the file */
3089 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3090 fprintf(stderr, "Could not open '%s'\n", filename);
3091 exit(1);
3095 memset(ap, 0, sizeof(*ap));
3096 if (av_set_parameters(oc, ap) < 0) {
3097 fprintf(stderr, "%s: Invalid encoding parameters\n",
3098 oc->filename);
3099 exit(1);
3102 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3103 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3104 oc->loop_output = loop_output;
3106 for(i=0; i<opt_name_count; i++){
3107 const AVOption *opt;
3108 double d = av_get_double(avformat_opts, opt_names[i], &opt);
3109 if(d==d && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3110 av_set_double(oc, opt_names[i], d);
3113 /* reset some options */
3114 file_oformat = NULL;
3115 file_iformat = NULL;
3118 /* same option as mencoder */
3119 static void opt_pass(const char *pass_str)
3121 int pass;
3122 pass = atoi(pass_str);
3123 if (pass != 1 && pass != 2) {
3124 fprintf(stderr, "pass number can be only 1 or 2\n");
3125 exit(1);
3127 do_pass = pass;
3130 #if defined(__MINGW32__) || defined(CONFIG_OS2)
3131 static int64_t getutime(void)
3133 return av_gettime();
3135 #else
3136 static int64_t getutime(void)
3138 struct rusage rusage;
3140 getrusage(RUSAGE_SELF, &rusage);
3141 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3143 #endif
3145 #if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
3146 extern int ffm_nopts;
3147 #endif
3149 static void show_formats(void)
3151 AVInputFormat *ifmt;
3152 AVOutputFormat *ofmt;
3153 URLProtocol *up;
3154 AVCodec *p, *p2;
3155 const char **pp, *last_name;
3157 printf("File formats:\n");
3158 last_name= "000";
3159 for(;;){
3160 int decode=0;
3161 int encode=0;
3162 const char *name=NULL;
3163 const char *long_name=NULL;
3165 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3166 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3167 strcmp(ofmt->name, last_name)>0){
3168 name= ofmt->name;
3169 long_name= ofmt->long_name;
3170 encode=1;
3173 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3174 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3175 strcmp(ifmt->name, last_name)>0){
3176 name= ifmt->name;
3177 long_name= ifmt->long_name;
3178 encode=0;
3180 if(name && strcmp(ifmt->name, name)==0)
3181 decode=1;
3183 if(name==NULL)
3184 break;
3185 last_name= name;
3187 printf(
3188 " %s%s %-15s %s\n",
3189 decode ? "D":" ",
3190 encode ? "E":" ",
3191 name,
3192 long_name ? long_name:" ");
3194 printf("\n");
3196 printf("Codecs:\n");
3197 last_name= "000";
3198 for(;;){
3199 int decode=0;
3200 int encode=0;
3201 int cap=0;
3202 const char *type_str;
3204 p2=NULL;
3205 for(p = first_avcodec; p != NULL; p = p->next) {
3206 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3207 strcmp(p->name, last_name)>0){
3208 p2= p;
3209 decode= encode= cap=0;
3211 if(p2 && strcmp(p->name, p2->name)==0){
3212 if(p->decode) decode=1;
3213 if(p->encode) encode=1;
3214 cap |= p->capabilities;
3217 if(p2==NULL)
3218 break;
3219 last_name= p2->name;
3221 switch(p2->type) {
3222 case CODEC_TYPE_VIDEO:
3223 type_str = "V";
3224 break;
3225 case CODEC_TYPE_AUDIO:
3226 type_str = "A";
3227 break;
3228 case CODEC_TYPE_SUBTITLE:
3229 type_str = "S";
3230 break;
3231 default:
3232 type_str = "?";
3233 break;
3235 printf(
3236 " %s%s%s%s%s%s %s",
3237 decode ? "D": (/*p2->decoder ? "d":*/" "),
3238 encode ? "E":" ",
3239 type_str,
3240 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3241 cap & CODEC_CAP_DR1 ? "D":" ",
3242 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3243 p2->name);
3244 /* if(p2->decoder && decode==0)
3245 printf(" use %s for decoding", p2->decoder->name);*/
3246 printf("\n");
3248 printf("\n");
3250 printf("Supported file protocols:\n");
3251 for(up = first_protocol; up != NULL; up = up->next)
3252 printf(" %s:", up->name);
3253 printf("\n");
3255 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3256 printf("Motion estimation methods:\n");
3257 pp = motion_str;
3258 while (*pp) {
3259 printf(" %s", *pp);
3260 if ((pp - motion_str + 1) == ME_ZERO)
3261 printf("(fastest)");
3262 else if ((pp - motion_str + 1) == ME_FULL)
3263 printf("(slowest)");
3264 else if ((pp - motion_str + 1) == ME_EPZS)
3265 printf("(default)");
3266 pp++;
3268 printf("\n\n");
3269 printf(
3270 "Note, the names of encoders and decoders dont always match, so there are\n"
3271 "several cases where the above table shows encoder only or decoder only entries\n"
3272 "even though both encoding and decoding are supported for example, the h263\n"
3273 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3274 "worse\n");
3275 exit(1);
3278 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3280 int i;
3281 const char *p = str;
3282 for(i = 0;; i++) {
3283 dest[i] = atoi(p);
3284 if(i == 63)
3285 break;
3286 p = strchr(p, ',');
3287 if(!p) {
3288 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3289 exit(1);
3291 p++;
3295 static void opt_inter_matrix(const char *arg)
3297 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3298 parse_matrix_coeffs(inter_matrix, arg);
3301 static void opt_intra_matrix(const char *arg)
3303 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3304 parse_matrix_coeffs(intra_matrix, arg);
3307 static void opt_target(const char *arg)
3309 int norm = -1;
3310 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3312 if(!strncmp(arg, "pal-", 4)) {
3313 norm = 0;
3314 arg += 4;
3315 } else if(!strncmp(arg, "ntsc-", 5)) {
3316 norm = 1;
3317 arg += 5;
3318 } else if(!strncmp(arg, "film-", 5)) {
3319 norm = 2;
3320 arg += 5;
3321 } else {
3322 int fr;
3323 /* Calculate FR via float to avoid int overflow */
3324 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3325 if(fr == 25000) {
3326 norm = 0;
3327 } else if((fr == 29970) || (fr == 23976)) {
3328 norm = 1;
3329 } else {
3330 /* Try to determine PAL/NTSC by peeking in the input files */
3331 if(nb_input_files) {
3332 int i, j;
3333 for(j = 0; j < nb_input_files; j++) {
3334 for(i = 0; i < input_files[j]->nb_streams; i++) {
3335 AVCodecContext *c = input_files[j]->streams[i]->codec;
3336 if(c->codec_type != CODEC_TYPE_VIDEO)
3337 continue;
3338 fr = c->time_base.den * 1000 / c->time_base.num;
3339 if(fr == 25000) {
3340 norm = 0;
3341 break;
3342 } else if((fr == 29970) || (fr == 23976)) {
3343 norm = 1;
3344 break;
3347 if(norm >= 0)
3348 break;
3352 if(verbose && norm >= 0)
3353 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3356 if(norm < 0) {
3357 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3358 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3359 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3360 exit(1);
3363 if(!strcmp(arg, "vcd")) {
3365 opt_video_codec("mpeg1video");
3366 opt_audio_codec("mp2");
3367 opt_format("vcd");
3369 opt_frame_size(norm ? "352x240" : "352x288");
3370 opt_frame_rate(frame_rates[norm]);
3371 opt_default("gop", norm ? "18" : "15");
3373 opt_default("b", "1150000");
3374 opt_default("maxrate", "1150000");
3375 opt_default("minrate", "1150000");
3376 opt_default("bufsize", "327680"); // 40*1024*8;
3378 opt_default("ab", "224000");
3379 audio_sample_rate = 44100;
3380 audio_channels = 2;
3382 opt_default("packetsize", "2324");
3383 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3385 /* We have to offset the PTS, so that it is consistent with the SCR.
3386 SCR starts at 36000, but the first two packs contain only padding
3387 and the first pack from the other stream, respectively, may also have
3388 been written before.
3389 So the real data starts at SCR 36000+3*1200. */
3390 mux_preload= (36000+3*1200) / 90000.0; //0.44
3391 } else if(!strcmp(arg, "svcd")) {
3393 opt_video_codec("mpeg2video");
3394 opt_audio_codec("mp2");
3395 opt_format("svcd");
3397 opt_frame_size(norm ? "480x480" : "480x576");
3398 opt_frame_rate(frame_rates[norm]);
3399 opt_default("gop", norm ? "18" : "15");
3401 opt_default("b", "2040000");
3402 opt_default("maxrate", "2516000");
3403 opt_default("minrate", "0"); //1145000;
3404 opt_default("bufsize", "1835008"); //224*1024*8;
3405 opt_default("flags", "+SCAN_OFFSET");
3408 opt_default("ab", "224000");
3409 audio_sample_rate = 44100;
3411 opt_default("packetsize", "2324");
3413 } else if(!strcmp(arg, "dvd")) {
3415 opt_video_codec("mpeg2video");
3416 opt_audio_codec("ac3");
3417 opt_format("dvd");
3419 opt_frame_size(norm ? "720x480" : "720x576");
3420 opt_frame_rate(frame_rates[norm]);
3421 opt_default("gop", norm ? "18" : "15");
3423 opt_default("b", "6000000");
3424 opt_default("maxrate", "9000000");
3425 opt_default("minrate", "0"); //1500000;
3426 opt_default("bufsize", "1835008"); //224*1024*8;
3428 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3429 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3431 opt_default("ab", "448000");
3432 audio_sample_rate = 48000;
3434 } else if(!strncmp(arg, "dv", 2)) {
3436 opt_format("dv");
3438 opt_frame_size(norm ? "720x480" : "720x576");
3439 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3440 (norm ? "yuv411p" : "yuv420p"));
3441 opt_frame_rate(frame_rates[norm]);
3443 audio_sample_rate = 48000;
3444 audio_channels = 2;
3446 } else {
3447 fprintf(stderr, "Unknown target: %s\n", arg);
3448 exit(1);
3452 static void opt_video_bsf(const char *arg)
3454 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3455 AVBitStreamFilterContext **bsfp;
3457 if(!bsfc){
3458 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3459 exit(1);
3462 bsfp= &video_bitstream_filters;
3463 while(*bsfp)
3464 bsfp= &(*bsfp)->next;
3466 *bsfp= bsfc;
3469 //FIXME avoid audio - video code duplication
3470 static void opt_audio_bsf(const char *arg)
3472 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3473 AVBitStreamFilterContext **bsfp;
3475 if(!bsfc){
3476 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3477 exit(1);
3480 bsfp= &audio_bitstream_filters;
3481 while(*bsfp)
3482 bsfp= &(*bsfp)->next;
3484 *bsfp= bsfc;
3487 static void show_version(void)
3489 /* TODO: add function interface to avutil and avformat */
3490 fprintf(stderr, "ffmpeg " FFMPEG_VERSION "\n"
3491 "libavutil %d\n"
3492 "libavcodec %d\n"
3493 "libavformat %d\n",
3494 LIBAVUTIL_BUILD, avcodec_build(), LIBAVFORMAT_BUILD);
3495 exit(1);
3498 static int opt_default(const char *opt, const char *arg){
3499 int type;
3500 const AVOption *o= NULL;
3501 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
3503 for(type=0; type<CODEC_TYPE_NB; type++){
3504 const AVOption *o2 = av_find_opt(avctx_opts[0], opt, NULL, opt_types[type], opt_types[type]);
3505 if(o2)
3506 o = av_set_string(avctx_opts[type], opt, arg);
3508 if(!o)
3509 o = av_set_string(avformat_opts, opt, arg);
3510 if(!o){
3511 if(opt[0] == 'a')
3512 o = av_set_string(avctx_opts[CODEC_TYPE_AUDIO], opt+1, arg);
3513 else if(opt[0] == 'v')
3514 o = av_set_string(avctx_opts[CODEC_TYPE_VIDEO], opt+1, arg);
3515 else if(opt[0] == 's')
3516 o = av_set_string(avctx_opts[CODEC_TYPE_SUBTITLE], opt+1, arg);
3518 if(!o)
3519 return -1;
3521 // av_log(NULL, AV_LOG_ERROR, "%s:%s: %f 0x%0X\n", opt, arg, av_get_double(avctx_opts, opt, NULL), (int)av_get_int(avctx_opts, opt, NULL));
3523 //FIXME we should always use avctx_opts, ... for storing options so there wont be any need to keep track of whats set over this
3524 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
3525 opt_names[opt_name_count++]= o->name;
3527 #if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
3528 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3529 if(avctx_opts[0]->flags & CODEC_FLAG_BITEXACT)
3530 ffm_nopts = 1;
3531 #endif
3533 if(avctx_opts[0]->debug)
3534 av_log_level = AV_LOG_DEBUG;
3535 return 0;
3538 const OptionDef options[] = {
3539 /* main options */
3540 { "L", 0, {(void*)show_license}, "show license" },
3541 { "h", 0, {(void*)show_help}, "show help" },
3542 { "version", 0, {(void*)show_version}, "show version" },
3543 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3544 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3545 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3546 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3547 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3548 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3549 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3550 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3551 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3552 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3553 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3554 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3555 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3556 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3557 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3558 { "album", HAS_ARG | OPT_STRING, {(void*)&str_album}, "set the album", "string" },
3559 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3560 "add timings for benchmarking" },
3561 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3562 "dump each input packet" },
3563 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3564 "when dumping packets, also dump the payload" },
3565 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3566 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3567 { "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)", "" },
3568 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3569 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3570 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3571 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3572 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3573 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3574 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)&copy_ts}, "copy timestamps" },
3575 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3576 { "dts_delta_threshold", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "" },
3578 /* video options */
3579 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3580 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3581 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3582 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3583 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3584 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3585 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3586 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3587 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3588 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3589 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3590 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3591 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3592 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3593 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3594 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3595 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3596 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3597 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3598 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantizer scale (VBR)", "q" },
3599 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3600 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3601 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3602 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
3603 "method" },
3604 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
3605 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3606 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3607 "use same video quality as source (implies VBR)" },
3608 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3609 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3610 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3611 "deinterlace pictures" },
3612 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3613 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
3614 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3615 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3616 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3617 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3618 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3619 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3620 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3621 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3623 /* audio options */
3624 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3625 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3626 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3627 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3628 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3629 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3630 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3631 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3632 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3633 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3635 /* subtitle options */
3636 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3637 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
3638 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3640 /* grab options */
3641 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3642 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3643 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3645 /* muxer options */
3646 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
3647 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
3649 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_audio_bsf}, "", "bitstream filter" },
3650 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_video_bsf}, "", "bitstream filter" },
3652 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
3653 { NULL, },
3656 static void show_banner(void)
3658 fprintf(stderr, "FFmpeg version " FFMPEG_VERSION ", Copyright (c) 2000-2007 Fabrice Bellard, et al.\n");
3659 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
3660 fprintf(stderr, " libavutil version: " AV_STRINGIFY(LIBAVUTIL_VERSION) "\n");
3661 fprintf(stderr, " libavcodec version: " AV_STRINGIFY(LIBAVCODEC_VERSION) "\n");
3662 fprintf(stderr, " libavformat version: " AV_STRINGIFY(LIBAVFORMAT_VERSION) "\n");
3663 fprintf(stderr, " built on " __DATE__ " " __TIME__);
3664 #ifdef __GNUC__
3665 fprintf(stderr, ", gcc: " __VERSION__ "\n");
3666 #else
3667 fprintf(stderr, ", using a non-gcc compiler\n");
3668 #endif
3671 static void show_license(void)
3673 show_banner();
3674 #ifdef CONFIG_GPL
3675 printf(
3676 "FFmpeg is free software; you can redistribute it and/or modify\n"
3677 "it under the terms of the GNU General Public License as published by\n"
3678 "the Free Software Foundation; either version 2 of the License, or\n"
3679 "(at your option) any later version.\n"
3680 "\n"
3681 "FFmpeg is distributed in the hope that it will be useful,\n"
3682 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3683 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
3684 "GNU General Public License for more details.\n"
3685 "\n"
3686 "You should have received a copy of the GNU General Public License\n"
3687 "along with FFmpeg; if not, write to the Free Software\n"
3688 "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
3690 #else
3691 printf(
3692 "FFmpeg is free software; you can redistribute it and/or\n"
3693 "modify it under the terms of the GNU Lesser General Public\n"
3694 "License as published by the Free Software Foundation; either\n"
3695 "version 2.1 of the License, or (at your option) any later version.\n"
3696 "\n"
3697 "FFmpeg is distributed in the hope that it will be useful,\n"
3698 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3699 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
3700 "Lesser General Public License for more details.\n"
3701 "\n"
3702 "You should have received a copy of the GNU Lesser General Public\n"
3703 "License along with FFmpeg; if not, write to the Free Software\n"
3704 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
3706 #endif
3707 exit(1);
3710 static void show_help(void)
3712 show_banner();
3713 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3714 "Hyper fast Audio and Video encoder\n");
3715 printf("\n");
3716 show_help_options(options, "Main options:\n",
3717 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
3718 show_help_options(options, "\nVideo options:\n",
3719 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3720 OPT_VIDEO);
3721 show_help_options(options, "\nAdvanced Video options:\n",
3722 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3723 OPT_VIDEO | OPT_EXPERT);
3724 show_help_options(options, "\nAudio options:\n",
3725 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3726 OPT_AUDIO);
3727 show_help_options(options, "\nAdvanced Audio options:\n",
3728 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3729 OPT_AUDIO | OPT_EXPERT);
3730 show_help_options(options, "\nSubtitle options:\n",
3731 OPT_SUBTITLE | OPT_GRAB,
3732 OPT_SUBTITLE);
3733 show_help_options(options, "\nAudio/Video grab options:\n",
3734 OPT_GRAB,
3735 OPT_GRAB);
3736 show_help_options(options, "\nAdvanced options:\n",
3737 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3738 OPT_EXPERT);
3739 av_opt_show(avctx_opts[0], NULL);
3740 av_opt_show(avformat_opts, NULL);
3742 exit(1);
3745 void parse_arg_file(const char *filename)
3747 opt_output_file(filename);
3750 int main(int argc, char **argv)
3752 int i;
3753 int64_t ti;
3755 av_register_all();
3757 for(i=0; i<CODEC_TYPE_NB; i++){
3758 avctx_opts[i]= avcodec_alloc_context2(i);
3760 avformat_opts = av_alloc_format_context();
3762 if (argc <= 1)
3763 show_help();
3764 else
3765 show_banner();
3767 /* parse options */
3768 parse_options(argc, argv, options);
3770 /* file converter / grab */
3771 if (nb_output_files <= 0) {
3772 fprintf(stderr, "Must supply at least one output file\n");
3773 exit(1);
3776 if (nb_input_files == 0) {
3777 fprintf(stderr, "Must supply at least one input file\n");
3778 exit(1);
3781 ti = getutime();
3782 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3783 stream_maps, nb_stream_maps);
3784 ti = getutime() - ti;
3785 if (do_benchmark) {
3786 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3789 /* close files */
3790 for(i=0;i<nb_output_files;i++) {
3791 /* maybe av_close_output_file ??? */
3792 AVFormatContext *s = output_files[i];
3793 int j;
3794 if (!(s->oformat->flags & AVFMT_NOFILE))
3795 url_fclose(&s->pb);
3796 for(j=0;j<s->nb_streams;j++) {
3797 av_free(s->streams[j]->codec);
3798 av_free(s->streams[j]);
3800 av_free(s);
3802 for(i=0;i<nb_input_files;i++)
3803 av_close_input_file(input_files[i]);
3805 av_free_static();
3807 av_free(intra_matrix);
3808 av_free(inter_matrix);
3809 av_free(opt_names);
3811 #ifdef CONFIG_POWERPC_PERF
3812 extern void powerpc_display_perf_report(void);
3813 powerpc_display_perf_report();
3814 #endif /* CONFIG_POWERPC_PERF */
3816 if (received_sigterm) {
3817 fprintf(stderr,
3818 "Received signal %d: terminating.\n",
3819 (int) received_sigterm);
3820 exit (255);
3823 exit(0); /* not all OS-es handle main() return value */
3824 return 0;