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
26 #include "framehook.h"
36 #include <sys/ioctl.h>
39 #include <sys/resource.h>
42 #include <sys/types.h>
43 #include <sys/select.h>
46 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
55 #if !defined(INFINITY) && defined(HUGE_VAL)
56 #define INFINITY HUGE_VAL
59 /* select an input stream for an output stream */
60 typedef struct AVStreamMap
{
64 int sync_stream_index
;
67 /** select an input file for an output file */
68 typedef struct AVMetaDataMap
{
73 extern const OptionDef options
[];
75 static void show_help(void);
76 static void show_license(void);
77 static int opt_default(const char *opt
, const char *arg
);
81 static AVFormatContext
*input_files
[MAX_FILES
];
82 static int64_t input_files_ts_offset
[MAX_FILES
];
83 static int nb_input_files
= 0;
85 static AVFormatContext
*output_files
[MAX_FILES
];
86 static int nb_output_files
= 0;
88 static AVStreamMap stream_maps
[MAX_FILES
];
89 static int nb_stream_maps
;
91 static AVMetaDataMap meta_data_maps
[MAX_FILES
];
92 static int nb_meta_data_maps
;
94 static AVInputFormat
*file_iformat
;
95 static AVOutputFormat
*file_oformat
;
96 static int frame_width
= 0;
97 static int frame_height
= 0;
98 static float frame_aspect_ratio
= 0;
99 static enum PixelFormat frame_pix_fmt
= PIX_FMT_NONE
;
100 static int frame_padtop
= 0;
101 static int frame_padbottom
= 0;
102 static int frame_padleft
= 0;
103 static int frame_padright
= 0;
104 static int padcolor
[3] = {16,128,128}; /* default to black */
105 static int frame_topBand
= 0;
106 static int frame_bottomBand
= 0;
107 static int frame_leftBand
= 0;
108 static int frame_rightBand
= 0;
109 static int max_frames
[4] = {INT_MAX
, INT_MAX
, INT_MAX
, INT_MAX
};
110 static int frame_rate
= 25;
111 static int frame_rate_base
= 1;
112 static float video_qscale
= 0;
113 static int video_qdiff
= 3;
114 static uint16_t *intra_matrix
= NULL
;
115 static uint16_t *inter_matrix
= NULL
;
116 #if 0 //experimental, (can be removed)
117 static float video_rc_qsquish
=1.0;
118 static float video_rc_qmod_amp
=0;
119 static int video_rc_qmod_freq
=0;
121 static char *video_rc_override_string
=NULL
;
122 static char *video_rc_eq
="tex^qComp";
123 static int me_method
= ME_EPZS
;
124 static int video_disable
= 0;
125 static int video_discard
= 0;
126 static int video_codec_id
= CODEC_ID_NONE
;
127 static int video_codec_tag
= 0;
128 static int same_quality
= 0;
129 static int do_deinterlace
= 0;
130 static int packet_size
= 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 static int audio_bit_rate
= 64000;
142 #define QSCALE_NONE -99999
143 static float audio_qscale
= QSCALE_NONE
;
144 static int audio_disable
= 0;
145 static int audio_channels
= 1;
146 static int audio_codec_id
= CODEC_ID_NONE
;
147 static int audio_codec_tag
= 0;
148 static char *audio_language
= NULL
;
150 static int subtitle_codec_id
= CODEC_ID_NONE
;
151 static char *subtitle_language
= NULL
;
153 static float mux_preload
= 0.5;
154 static float mux_max_delay
= 0.7;
156 static int64_t recording_time
= 0;
157 static int64_t start_time
= 0;
158 static int64_t rec_timestamp
= 0;
159 static int64_t input_ts_offset
= 0;
160 static int file_overwrite
= 0;
161 static char *str_title
= NULL
;
162 static char *str_author
= NULL
;
163 static char *str_copyright
= NULL
;
164 static char *str_comment
= NULL
;
165 static char *str_album
= NULL
;
166 static int do_benchmark
= 0;
167 static int do_hex_dump
= 0;
168 static int do_pkt_dump
= 0;
169 static int do_psnr
= 0;
170 static int do_vstats
= 0;
171 static int do_pass
= 0;
172 static char *pass_logfilename
= NULL
;
173 static int audio_stream_copy
= 0;
174 static int video_stream_copy
= 0;
175 static int subtitle_stream_copy
= 0;
176 static int video_sync_method
= 1;
177 static int audio_sync_method
= 0;
178 static int copy_ts
= 0;
179 static int opt_shortest
= 0; //
180 static int video_global_header
= 0;
182 static int rate_emu
= 0;
185 static const char *video_grab_format
= "bktr";
187 #ifdef CONFIG_VIDEO4LINUX2
188 static const char *video_grab_format
= "video4linux2";
190 static const char *video_grab_format
= "video4linux";
193 static char *video_device
= NULL
;
194 static char *grab_device
= NULL
;
195 static int video_channel
= 0;
196 static char *video_standard
= "ntsc";
198 static const char *audio_grab_format
= "audio_device";
199 static char *audio_device
= NULL
;
200 static int audio_volume
= 256;
202 static int using_stdin
= 0;
203 static int using_vhook
= 0;
204 static int verbose
= 1;
205 static int thread_count
= 1;
206 static int q_pressed
= 0;
207 static int64_t video_size
= 0;
208 static int64_t audio_size
= 0;
209 static int64_t extra_size
= 0;
210 static int nb_frames_dup
= 0;
211 static int nb_frames_drop
= 0;
212 static int input_sync
;
213 static int limit_filesize
= 0; //
215 static int pgmyuv_compatibility_hack
=0;
216 static int dts_delta_threshold
= 10;
218 static int sws_flags
= SWS_BICUBIC
;
220 const char **opt_names
=NULL
;
221 int opt_name_count
=0;
222 AVCodecContext
*avctx_opts
;
223 AVFormatContext
*avformat_opts
;
225 static AVBitStreamFilterContext
*video_bitstream_filters
=NULL
;
226 static AVBitStreamFilterContext
*audio_bitstream_filters
=NULL
;
227 static AVBitStreamFilterContext
*bitstream_filters
[MAX_FILES
][MAX_STREAMS
];
229 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
231 struct AVInputStream
;
233 typedef struct AVOutputStream
{
234 int file_index
; /* file index */
235 int index
; /* stream index in the output file */
236 int source_index
; /* AVInputStream index */
237 AVStream
*st
; /* stream in the output file */
238 int encoding_needed
; /* true if encoding needed for this stream */
240 /* input pts and corresponding output pts
242 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
243 struct AVInputStream
*sync_ist
; /* input stream to sync against */
244 int64_t sync_opts
; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
247 AVFrame pict_tmp
; /* temporary image for resampling */
248 struct SwsContext
*img_resample_ctx
; /* for image resampling */
252 int topBand
; /* cropping area sizes */
256 int padtop
; /* padding area sizes */
263 ReSampleContext
*resample
; /* for audio resampling */
264 AVFifoBuffer fifo
; /* for compression: one audio fifo per codec */
268 typedef struct AVInputStream
{
272 int discard
; /* true if stream data should be discarded */
273 int decoding_needed
; /* true if the packets must be decoded in 'raw_fifo' */
274 int64_t sample_index
; /* current sample */
276 int64_t start
; /* time when read started */
277 unsigned long frame
; /* current frame */
278 int64_t next_pts
; /* synthetic pts for cases where pkt.pts
280 int64_t pts
; /* current pts */
281 int is_start
; /* is 1 at the start and after a discontinuity */
284 typedef struct AVInputFile
{
285 int eof_reached
; /* true if eof reached */
286 int ist_index
; /* index of first stream in ist_table */
287 int buffer_size
; /* current total buffer size */
288 int buffer_size_max
; /* buffer size at which we consider we can stop
290 int nb_streams
; /* nb streams we are aware of */
295 /* init terminal so that we can grab keys */
296 static struct termios oldtty
;
299 static void term_exit(void)
302 tcsetattr (0, TCSANOW
, &oldtty
);
306 static volatile sig_atomic_t received_sigterm
= 0;
309 sigterm_handler(int sig
)
311 received_sigterm
= sig
;
315 static void term_init(void)
323 tty
.c_iflag
&= ~(IGNBRK
|BRKINT
|PARMRK
|ISTRIP
324 |INLCR
|IGNCR
|ICRNL
|IXON
);
325 tty
.c_oflag
|= OPOST
;
326 tty
.c_lflag
&= ~(ECHO
|ECHONL
|ICANON
|IEXTEN
);
327 tty
.c_cflag
&= ~(CSIZE
|PARENB
);
332 tcsetattr (0, TCSANOW
, &tty
);
333 signal(SIGQUIT
, sigterm_handler
); /* Quit (POSIX). */
336 signal(SIGINT
, sigterm_handler
); /* Interrupt (ANSI). */
337 signal(SIGTERM
, sigterm_handler
); /* Termination (ANSI). */
339 register a function to be called at normal program termination
342 #ifdef CONFIG_BEOS_NETSERVER
343 fcntl(0, F_SETFL
, fcntl(0, F_GETFL
) | O_NONBLOCK
);
347 /* read a key without blocking */
348 static int read_key(void)
356 #ifndef CONFIG_BEOS_NETSERVER
364 n
= select(1, &rfds
, NULL
, NULL
, &tv
);
377 static int decode_interrupt_cb(void)
379 return q_pressed
|| (q_pressed
= read_key() == 'q');
382 static int read_ffserver_streams(AVFormatContext
*s
, const char *filename
)
387 err
= av_open_input_file(&ic
, filename
, NULL
, FFM_PACKET_SIZE
, NULL
);
390 /* copy stream format */
391 s
->nb_streams
= ic
->nb_streams
;
392 for(i
=0;i
<ic
->nb_streams
;i
++) {
395 // FIXME: a more elegant solution is needed
396 st
= av_mallocz(sizeof(AVStream
));
397 memcpy(st
, ic
->streams
[i
], sizeof(AVStream
));
398 st
->codec
= avcodec_alloc_context();
399 memcpy(st
->codec
, ic
->streams
[i
]->codec
, sizeof(AVCodecContext
));
403 av_close_input_file(ic
);
408 get_sync_ipts(const AVOutputStream
*ost
)
410 const AVInputStream
*ist
= ost
->sync_ist
;
411 return (double)(ist
->pts
+ input_files_ts_offset
[ist
->file_index
] - start_time
)/AV_TIME_BASE
;
414 static void write_frame(AVFormatContext
*s
, AVPacket
*pkt
, AVCodecContext
*avctx
, AVBitStreamFilterContext
*bsfc
){
416 AVPacket new_pkt
= *pkt
;
417 int a
= av_bitstream_filter_filter(bsfc
, avctx
, NULL
,
418 &new_pkt
.data
, &new_pkt
.size
,
419 pkt
->data
, pkt
->size
,
420 pkt
->flags
& PKT_FLAG_KEY
);
423 new_pkt
.destruct
= av_destruct_packet
;
430 av_interleaved_write_frame(s
, pkt
);
433 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
435 static void do_audio_out(AVFormatContext
*s
,
438 unsigned char *buf
, int size
)
441 static uint8_t *audio_buf
= NULL
;
442 static uint8_t *audio_out
= NULL
;
443 const int audio_out_size
= 4*MAX_AUDIO_PACKET_SIZE
;
445 int size_out
, frame_bytes
, ret
;
446 AVCodecContext
*enc
= ost
->st
->codec
;
448 /* SC: dynamic allocation of buffers */
450 audio_buf
= av_malloc(2*MAX_AUDIO_PACKET_SIZE
);
452 audio_out
= av_malloc(audio_out_size
);
453 if (!audio_buf
|| !audio_out
)
454 return; /* Should signal an error ! */
456 if(audio_sync_method
){
457 double delta
= get_sync_ipts(ost
) * enc
->sample_rate
- ost
->sync_opts
458 - av_fifo_size(&ost
->fifo
)/(ost
->st
->codec
->channels
* 2);
459 double idelta
= delta
*ist
->st
->codec
->sample_rate
/ enc
->sample_rate
;
460 int byte_delta
= ((int)idelta
)*2*ist
->st
->codec
->channels
;
462 //FIXME resample delay
463 if(fabs(delta
) > 50){
466 byte_delta
= FFMAX(byte_delta
, -size
);
470 fprintf(stderr
, "discarding %d audio samples\n", (int)-delta
);
475 static uint8_t *input_tmp
= NULL
;
476 input_tmp
= av_realloc(input_tmp
, byte_delta
+ size
);
478 if(byte_delta
+ size
<= MAX_AUDIO_PACKET_SIZE
)
481 byte_delta
= MAX_AUDIO_PACKET_SIZE
- size
;
483 memset(input_tmp
, 0, byte_delta
);
484 memcpy(input_tmp
+ byte_delta
, buf
, size
);
488 fprintf(stderr
, "adding %d audio samples of silence\n", (int)delta
);
490 }else if(audio_sync_method
>1){
491 int comp
= clip(delta
, -audio_sync_method
, audio_sync_method
);
492 assert(ost
->audio_resample
);
494 fprintf(stderr
, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta
, comp
, enc
->sample_rate
);
495 // 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));
496 av_resample_compensate(*(struct AVResampleContext
**)ost
->resample
, comp
, enc
->sample_rate
);
500 ost
->sync_opts
= lrintf(get_sync_ipts(ost
) * enc
->sample_rate
)
501 - av_fifo_size(&ost
->fifo
)/(ost
->st
->codec
->channels
* 2); //FIXME wrong
503 if (ost
->audio_resample
) {
505 size_out
= audio_resample(ost
->resample
,
506 (short *)buftmp
, (short *)buf
,
507 size
/ (ist
->st
->codec
->channels
* 2));
508 size_out
= size_out
* enc
->channels
* 2;
514 /* now encode as many frames as possible */
515 if (enc
->frame_size
> 1) {
516 /* output resampled raw samples */
517 av_fifo_write(&ost
->fifo
, buftmp
, size_out
);
519 frame_bytes
= enc
->frame_size
* 2 * enc
->channels
;
521 while (av_fifo_read(&ost
->fifo
, audio_buf
, frame_bytes
) == 0) {
523 av_init_packet(&pkt
);
525 ret
= avcodec_encode_audio(enc
, audio_out
, audio_out_size
,
528 pkt
.stream_index
= ost
->index
;
531 if(enc
->coded_frame
&& enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
532 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
533 pkt
.flags
|= PKT_FLAG_KEY
;
534 write_frame(s
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
536 ost
->sync_opts
+= enc
->frame_size
;
540 av_init_packet(&pkt
);
542 ost
->sync_opts
+= size_out
/ (2 * enc
->channels
);
544 /* output a pcm frame */
545 /* XXX: change encoding codec API to avoid this ? */
546 switch(enc
->codec
->id
) {
547 case CODEC_ID_PCM_S32LE
:
548 case CODEC_ID_PCM_S32BE
:
549 case CODEC_ID_PCM_U32LE
:
550 case CODEC_ID_PCM_U32BE
:
551 size_out
= size_out
<< 1;
553 case CODEC_ID_PCM_S24LE
:
554 case CODEC_ID_PCM_S24BE
:
555 case CODEC_ID_PCM_U24LE
:
556 case CODEC_ID_PCM_U24BE
:
557 case CODEC_ID_PCM_S24DAUD
:
558 size_out
= size_out
/ 2 * 3;
560 case CODEC_ID_PCM_S16LE
:
561 case CODEC_ID_PCM_S16BE
:
562 case CODEC_ID_PCM_U16LE
:
563 case CODEC_ID_PCM_U16BE
:
566 size_out
= size_out
>> 1;
569 ret
= avcodec_encode_audio(enc
, audio_out
, size_out
,
572 pkt
.stream_index
= ost
->index
;
575 if(enc
->coded_frame
&& enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
576 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
577 pkt
.flags
|= PKT_FLAG_KEY
;
578 write_frame(s
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
582 static void pre_process_video_frame(AVInputStream
*ist
, AVPicture
*picture
, void **bufp
)
586 AVPicture picture_tmp
;
589 dec
= ist
->st
->codec
;
591 /* deinterlace : must be done before any resize */
592 if (do_deinterlace
|| using_vhook
) {
595 /* create temporary picture */
596 size
= avpicture_get_size(dec
->pix_fmt
, dec
->width
, dec
->height
);
597 buf
= av_malloc(size
);
601 picture2
= &picture_tmp
;
602 avpicture_fill(picture2
, buf
, dec
->pix_fmt
, dec
->width
, dec
->height
);
605 if(avpicture_deinterlace(picture2
, picture
,
606 dec
->pix_fmt
, dec
->width
, dec
->height
) < 0) {
607 /* if error, do not deinterlace */
613 img_copy(picture2
, picture
, dec
->pix_fmt
, dec
->width
, dec
->height
);
619 frame_hook_process(picture2
, dec
->pix_fmt
, dec
->width
, dec
->height
);
621 if (picture
!= picture2
)
622 *picture
= *picture2
;
626 /* we begin to correct av delay at this threshold */
627 #define AV_DELAY_MAX 0.100
629 static void do_subtitle_out(AVFormatContext
*s
,
635 static uint8_t *subtitle_out
= NULL
;
636 int subtitle_out_max_size
= 65536;
637 int subtitle_out_size
, nb
, i
;
641 if (pts
== AV_NOPTS_VALUE
) {
642 fprintf(stderr
, "Subtitle packets must have a pts\n");
646 enc
= ost
->st
->codec
;
649 subtitle_out
= av_malloc(subtitle_out_max_size
);
652 /* Note: DVB subtitle need one packet to draw them and one other
653 packet to clear them */
654 /* XXX: signal it in the codec context ? */
655 if (enc
->codec_id
== CODEC_ID_DVB_SUBTITLE
)
660 for(i
= 0; i
< nb
; i
++) {
661 subtitle_out_size
= avcodec_encode_subtitle(enc
, subtitle_out
,
662 subtitle_out_max_size
, sub
);
664 av_init_packet(&pkt
);
665 pkt
.stream_index
= ost
->index
;
666 pkt
.data
= subtitle_out
;
667 pkt
.size
= subtitle_out_size
;
668 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
);
669 if (enc
->codec_id
== CODEC_ID_DVB_SUBTITLE
) {
670 /* XXX: the pts correction is handled here. Maybe handling
671 it in the codec would be better */
673 pkt
.pts
+= 90 * sub
->start_display_time
;
675 pkt
.pts
+= 90 * sub
->end_display_time
;
677 write_frame(s
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
681 static int bit_buffer_size
= 1024*256;
682 static uint8_t *bit_buffer
= NULL
;
684 static void do_video_out(AVFormatContext
*s
,
690 int nb_frames
, i
, ret
;
691 AVFrame
*final_picture
, *formatted_picture
, *resampling_dst
, *padding_src
;
692 AVFrame picture_crop_temp
, picture_pad_temp
;
693 uint8_t *buf
= NULL
, *buf1
= NULL
;
694 AVCodecContext
*enc
, *dec
;
696 avcodec_get_frame_defaults(&picture_crop_temp
);
697 avcodec_get_frame_defaults(&picture_pad_temp
);
699 enc
= ost
->st
->codec
;
700 dec
= ist
->st
->codec
;
702 /* by default, we output a single frame */
707 if(video_sync_method
){
709 vdelta
= get_sync_ipts(ost
) / av_q2d(enc
->time_base
) - ost
->sync_opts
;
710 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
713 else if (vdelta
> 1.1)
714 nb_frames
= lrintf(vdelta
);
715 //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);
719 fprintf(stderr
, "*** drop!\n");
720 }else if (nb_frames
> 1) {
721 nb_frames_dup
+= nb_frames
;
723 fprintf(stderr
, "*** %d dup!\n", nb_frames
-1);
726 ost
->sync_opts
= lrintf(get_sync_ipts(ost
) / av_q2d(enc
->time_base
));
728 nb_frames
= FFMIN(nb_frames
, max_frames
[CODEC_TYPE_VIDEO
] - ost
->frame_number
);
732 if (ost
->video_crop
) {
733 if (img_crop((AVPicture
*)&picture_crop_temp
, (AVPicture
*)in_picture
, dec
->pix_fmt
, ost
->topBand
, ost
->leftBand
) < 0) {
734 av_log(NULL
, AV_LOG_ERROR
, "error cropping picture\n");
737 formatted_picture
= &picture_crop_temp
;
739 formatted_picture
= in_picture
;
742 final_picture
= formatted_picture
;
743 padding_src
= formatted_picture
;
744 resampling_dst
= &ost
->pict_tmp
;
745 if (ost
->video_pad
) {
746 final_picture
= &ost
->pict_tmp
;
747 if (ost
->video_resample
) {
748 if (img_crop((AVPicture
*)&picture_pad_temp
, (AVPicture
*)final_picture
, enc
->pix_fmt
, ost
->padtop
, ost
->padleft
) < 0) {
749 av_log(NULL
, AV_LOG_ERROR
, "error padding picture\n");
752 resampling_dst
= &picture_pad_temp
;
756 if (ost
->video_resample
) {
758 final_picture
= &ost
->pict_tmp
;
759 sws_scale(ost
->img_resample_ctx
, formatted_picture
->data
, formatted_picture
->linesize
,
760 0, ost
->resample_height
, resampling_dst
->data
, resampling_dst
->linesize
);
763 if (ost
->video_pad
) {
764 img_pad((AVPicture
*)final_picture
, (AVPicture
*)padding_src
,
765 enc
->height
, enc
->width
, enc
->pix_fmt
,
766 ost
->padtop
, ost
->padbottom
, ost
->padleft
, ost
->padright
, padcolor
);
769 /* duplicates frame if needed */
770 for(i
=0;i
<nb_frames
;i
++) {
772 av_init_packet(&pkt
);
773 pkt
.stream_index
= ost
->index
;
775 if (s
->oformat
->flags
& AVFMT_RAWPICTURE
) {
776 /* raw pictures are written as AVPicture structure to
777 avoid any copies. We support temorarily the older
779 AVFrame
* old_frame
= enc
->coded_frame
;
780 enc
->coded_frame
= dec
->coded_frame
; //FIXME/XXX remove this hack
781 pkt
.data
= (uint8_t *)final_picture
;
782 pkt
.size
= sizeof(AVPicture
);
783 if(dec
->coded_frame
&& enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
784 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
785 if(dec
->coded_frame
&& dec
->coded_frame
->key_frame
)
786 pkt
.flags
|= PKT_FLAG_KEY
;
788 write_frame(s
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
789 enc
->coded_frame
= old_frame
;
793 big_picture
= *final_picture
;
794 /* better than nothing: use input picture interlaced
796 big_picture
.interlaced_frame
= in_picture
->interlaced_frame
;
797 if(avctx_opts
->flags
& (CODEC_FLAG_INTERLACED_DCT
|CODEC_FLAG_INTERLACED_ME
)){
798 if(top_field_first
== -1)
799 big_picture
.top_field_first
= in_picture
->top_field_first
;
801 big_picture
.top_field_first
= top_field_first
;
804 /* handles sameq here. This is not correct because it may
805 not be a global option */
807 big_picture
.quality
= ist
->st
->quality
;
809 big_picture
.quality
= ost
->st
->quality
;
811 big_picture
.pict_type
= 0;
812 // big_picture.pts = AV_NOPTS_VALUE;
813 big_picture
.pts
= ost
->sync_opts
;
814 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
815 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
816 ret
= avcodec_encode_video(enc
,
817 bit_buffer
, bit_buffer_size
,
820 fprintf(stderr
, "Video encoding failed\n");
823 //enc->frame_number = enc->real_pict_num;
825 pkt
.data
= bit_buffer
;
827 if(enc
->coded_frame
&& enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
828 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
829 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
830 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
831 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
833 if(enc
->coded_frame
&& enc
->coded_frame
->key_frame
)
834 pkt
.flags
|= PKT_FLAG_KEY
;
835 write_frame(s
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
837 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
838 // enc->frame_number-1, enc->real_pict_num, ret,
840 /* if two pass, output log */
841 if (ost
->logfile
&& enc
->stats_out
) {
842 fprintf(ost
->logfile
, "%s", enc
->stats_out
);
854 static double psnr(double d
){
855 if(d
==0) return INFINITY
;
856 return -10.0*log(d
)/log(10.0);
859 static void do_video_stats(AVFormatContext
*os
, AVOutputStream
*ost
,
862 static FILE *fvstats
=NULL
;
869 double ti1
, bitrate
, avg_bitrate
;
873 today
= localtime(&today2
);
874 snprintf(filename
, sizeof(filename
), "vstats_%02d%02d%02d.log", today
->tm_hour
,
877 fvstats
= fopen(filename
,"w");
885 enc
= ost
->st
->codec
;
886 if (enc
->codec_type
== CODEC_TYPE_VIDEO
) {
887 frame_number
= ost
->frame_number
;
888 fprintf(fvstats
, "frame= %5d q= %2.1f ", frame_number
, enc
->coded_frame
->quality
/(float)FF_QP2LAMBDA
);
889 if (enc
->flags
&CODEC_FLAG_PSNR
)
890 fprintf(fvstats
, "PSNR= %6.2f ", psnr(enc
->coded_frame
->error
[0]/(enc
->width
*enc
->height
*255.0*255.0)));
892 fprintf(fvstats
,"f_size= %6d ", frame_size
);
893 /* compute pts value */
894 ti1
= ost
->sync_opts
* av_q2d(enc
->time_base
);
898 bitrate
= (frame_size
* 8) / av_q2d(enc
->time_base
) / 1000.0;
899 avg_bitrate
= (double)(video_size
* 8) / ti1
/ 1000.0;
900 fprintf(fvstats
, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
901 (double)video_size
/ 1024, ti1
, bitrate
, avg_bitrate
);
902 fprintf(fvstats
,"type= %c\n", av_get_pict_type_char(enc
->coded_frame
->pict_type
));
906 static void print_report(AVFormatContext
**output_files
,
907 AVOutputStream
**ost_table
, int nb_ostreams
,
912 AVFormatContext
*oc
, *os
;
915 int frame_number
, vid
, i
;
916 double bitrate
, ti1
, pts
;
917 static int64_t last_time
= -1;
918 static int qp_histogram
[52];
920 if (!is_last_report
) {
922 /* display the report every 0.5 seconds */
923 cur_time
= av_gettime();
924 if (last_time
== -1) {
925 last_time
= cur_time
;
928 if ((cur_time
- last_time
) < 500000)
930 last_time
= cur_time
;
934 oc
= output_files
[0];
936 total_size
= url_ftell(&oc
->pb
);
941 for(i
=0;i
<nb_ostreams
;i
++) {
943 os
= output_files
[ost
->file_index
];
944 enc
= ost
->st
->codec
;
945 if (vid
&& enc
->codec_type
== CODEC_TYPE_VIDEO
) {
946 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "q=%2.1f ",
947 enc
->coded_frame
->quality
/(float)FF_QP2LAMBDA
);
949 if (!vid
&& enc
->codec_type
== CODEC_TYPE_VIDEO
) {
950 frame_number
= ost
->frame_number
;
951 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "frame=%5d q=%3.1f ",
952 frame_number
, enc
->coded_frame
? enc
->coded_frame
->quality
/(float)FF_QP2LAMBDA
: -1);
954 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "L");
955 if(qp_hist
&& enc
->coded_frame
){
957 int qp
= lrintf(enc
->coded_frame
->quality
/(float)FF_QP2LAMBDA
);
958 if(qp
>=0 && qp
<sizeof(qp_histogram
)/sizeof(int))
961 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "%X", (int)lrintf(log(qp_histogram
[j
]+1)/log(2)));
963 if (enc
->flags
&CODEC_FLAG_PSNR
){
965 double error
, error_sum
=0;
966 double scale
, scale_sum
=0;
967 char type
[3]= {'Y','U','V'};
968 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "PSNR=");
971 error
= enc
->error
[j
];
972 scale
= enc
->width
*enc
->height
*255.0*255.0*frame_number
;
974 error
= enc
->coded_frame
->error
[j
];
975 scale
= enc
->width
*enc
->height
*255.0*255.0;
980 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "%c:%2.2f ", type
[j
], psnr(error
/scale
));
982 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "*:%2.2f ", psnr(error_sum
/scale_sum
));
986 /* compute min output value */
987 pts
= (double)ost
->st
->pts
.val
* ost
->st
->time_base
.num
/ ost
->st
->time_base
.den
;
988 if ((pts
< ti1
) && (pts
> 0))
994 if (verbose
|| is_last_report
) {
995 bitrate
= (double)(total_size
* 8) / ti1
/ 1000.0;
997 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
),
998 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
999 (double)total_size
/ 1024, ti1
, bitrate
);
1002 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), " dup=%d drop=%d",
1003 nb_frames_dup
, nb_frames_drop
);
1006 fprintf(stderr
, "%s \r", buf
);
1011 if (is_last_report
&& verbose
>= 0){
1012 int64_t raw
= audio_size
+ video_size
+ extra_size
;
1013 fprintf(stderr
, "\n");
1014 fprintf(stderr
, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1018 100.0*(total_size
- raw
)/raw
1023 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1024 static int output_packet(AVInputStream
*ist
, int ist_index
,
1025 AVOutputStream
**ost_table
, int nb_ostreams
,
1026 const AVPacket
*pkt
)
1028 AVFormatContext
*os
;
1029 AVOutputStream
*ost
;
1033 int data_size
, got_picture
;
1035 void *buffer_to_free
;
1036 static unsigned int samples_size
= 0;
1037 static short *samples
= NULL
;
1038 AVSubtitle subtitle
, *subtitle_to_free
;
1042 ist
->pts
= ist
->next_pts
; // needed for last packet if vsync=0
1043 } else if (pkt
->dts
!= AV_NOPTS_VALUE
) { //FIXME seems redundant, as libavformat does this too
1044 ist
->next_pts
= ist
->pts
= av_rescale_q(pkt
->dts
, ist
->st
->time_base
, AV_TIME_BASE_Q
);
1046 // assert(ist->pts == ist->next_pts);
1060 /* decode the packet if needed */
1061 data_buf
= NULL
; /* fail safe */
1063 subtitle_to_free
= NULL
;
1064 if (ist
->decoding_needed
) {
1065 switch(ist
->st
->codec
->codec_type
) {
1066 case CODEC_TYPE_AUDIO
:{
1068 samples
= av_fast_realloc(samples
, &samples_size
, FFMAX(pkt
->size
, AVCODEC_MAX_AUDIO_FRAME_SIZE
));
1069 /* XXX: could avoid copy if PCM 16 bits with same
1070 endianness as CPU */
1071 ret
= avcodec_decode_audio(ist
->st
->codec
, samples
, &data_size
,
1077 /* Some bug in mpeg audio decoder gives */
1078 /* data_size < 0, it seems they are overflows */
1079 if (data_size
<= 0) {
1080 /* no audio frame */
1083 data_buf
= (uint8_t *)samples
;
1084 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
/2 * data_size
) /
1085 (ist
->st
->codec
->sample_rate
* ist
->st
->codec
->channels
);
1087 case CODEC_TYPE_VIDEO
:
1088 data_size
= (ist
->st
->codec
->width
* ist
->st
->codec
->height
* 3) / 2;
1089 /* XXX: allocate picture correctly */
1090 avcodec_get_frame_defaults(&picture
);
1092 ret
= avcodec_decode_video(ist
->st
->codec
,
1093 &picture
, &got_picture
, ptr
, len
);
1094 ist
->st
->quality
= picture
.quality
;
1098 /* no picture yet */
1099 goto discard_packet
;
1101 if (ist
->st
->codec
->time_base
.num
!= 0) {
1102 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
*
1103 ist
->st
->codec
->time_base
.num
) /
1104 ist
->st
->codec
->time_base
.den
;
1108 case CODEC_TYPE_SUBTITLE
:
1109 ret
= avcodec_decode_subtitle(ist
->st
->codec
,
1110 &subtitle
, &got_subtitle
, ptr
, len
);
1113 if (!got_subtitle
) {
1114 goto discard_packet
;
1116 subtitle_to_free
= &subtitle
;
1123 switch(ist
->st
->codec
->codec_type
) {
1124 case CODEC_TYPE_AUDIO
:
1125 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
* ist
->st
->codec
->frame_size
) /
1126 (ist
->st
->codec
->sample_rate
* ist
->st
->codec
->channels
);
1128 case CODEC_TYPE_VIDEO
:
1129 if (ist
->st
->codec
->time_base
.num
!= 0) {
1130 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
*
1131 ist
->st
->codec
->time_base
.num
) /
1132 ist
->st
->codec
->time_base
.den
;
1142 buffer_to_free
= NULL
;
1143 if (ist
->st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
1144 pre_process_video_frame(ist
, (AVPicture
*)&picture
,
1148 // preprocess audio (volume)
1149 if (ist
->st
->codec
->codec_type
== CODEC_TYPE_AUDIO
) {
1150 if (audio_volume
!= 256) {
1153 for(i
=0;i
<(data_size
/ sizeof(short));i
++) {
1154 int v
= ((*volp
) * audio_volume
+ 128) >> 8;
1155 if (v
< -32768) v
= -32768;
1156 if (v
> 32767) v
= 32767;
1162 /* frame rate emulation */
1163 if (ist
->st
->codec
->rate_emu
) {
1164 int64_t pts
= av_rescale((int64_t) ist
->frame
* ist
->st
->codec
->time_base
.num
, 1000000, ist
->st
->codec
->time_base
.den
);
1165 int64_t now
= av_gettime() - ist
->start
;
1173 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1174 is the one of the next displayed one */
1175 /* XXX: add mpeg4 too ? */
1176 if (ist
->st
->codec
->codec_id
== CODEC_ID_MPEG1VIDEO
) {
1177 if (ist
->st
->codec
->pict_type
!= B_TYPE
) {
1179 tmp
= ist
->last_ip_pts
;
1180 ist
->last_ip_pts
= ist
->frac_pts
.val
;
1181 ist
->frac_pts
.val
= tmp
;
1185 /* if output time reached then transcode raw format,
1186 encode packets and output them */
1187 if (start_time
== 0 || ist
->pts
>= start_time
)
1188 for(i
=0;i
<nb_ostreams
;i
++) {
1192 if (ost
->source_index
== ist_index
) {
1193 os
= output_files
[ost
->file_index
];
1196 printf("%d: got pts=%0.3f %0.3f\n", i
,
1197 (double)pkt
->pts
/ AV_TIME_BASE
,
1198 ((double)ist
->pts
/ AV_TIME_BASE
) -
1199 ((double)ost
->st
->pts
.val
* ost
->st
->time_base
.num
/ ost
->st
->time_base
.den
));
1201 /* set the input output pts pairs */
1202 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1204 if (ost
->encoding_needed
) {
1205 switch(ost
->st
->codec
->codec_type
) {
1206 case CODEC_TYPE_AUDIO
:
1207 do_audio_out(os
, ost
, ist
, data_buf
, data_size
);
1209 case CODEC_TYPE_VIDEO
:
1210 do_video_out(os
, ost
, ist
, &picture
, &frame_size
);
1211 video_size
+= frame_size
;
1212 if (do_vstats
&& frame_size
)
1213 do_video_stats(os
, ost
, frame_size
);
1215 case CODEC_TYPE_SUBTITLE
:
1216 do_subtitle_out(os
, ost
, ist
, &subtitle
,
1223 AVFrame avframe
; //FIXME/XXX remove this
1225 av_init_packet(&opkt
);
1227 /* no reencoding needed : output the packet directly */
1228 /* force the input stream PTS */
1230 avcodec_get_frame_defaults(&avframe
);
1231 ost
->st
->codec
->coded_frame
= &avframe
;
1232 avframe
.key_frame
= pkt
->flags
& PKT_FLAG_KEY
;
1234 if(ost
->st
->codec
->codec_type
== CODEC_TYPE_AUDIO
)
1235 audio_size
+= data_size
;
1236 else if (ost
->st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
1237 video_size
+= data_size
;
1241 opkt
.stream_index
= ost
->index
;
1242 if(pkt
->pts
!= AV_NOPTS_VALUE
)
1243 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
);
1245 opkt
.pts
= AV_NOPTS_VALUE
;
1249 if (pkt
->dts
== AV_NOPTS_VALUE
)
1250 dts
= ist
->next_pts
;
1252 dts
= av_rescale_q(pkt
->dts
, ist
->st
->time_base
, AV_TIME_BASE_Q
);
1253 opkt
.dts
= av_rescale_q(dts
+ input_files_ts_offset
[ist
->file_index
], AV_TIME_BASE_Q
, ost
->st
->time_base
);
1255 opkt
.flags
= pkt
->flags
;
1257 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1258 if(av_parser_change(ist
->st
->parser
, ost
->st
->codec
, &opkt
.data
, &opkt
.size
, data_buf
, data_size
, pkt
->flags
& PKT_FLAG_KEY
))
1259 opkt
.destruct
= av_destruct_packet
;
1261 write_frame(os
, &opkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
->stream_index
]);
1262 ost
->st
->codec
->frame_number
++;
1263 ost
->frame_number
++;
1264 av_free_packet(&opkt
);
1268 av_free(buffer_to_free
);
1269 /* XXX: allocate the subtitles in the codec ? */
1270 if (subtitle_to_free
) {
1271 if (subtitle_to_free
->rects
!= NULL
) {
1272 for (i
= 0; i
< subtitle_to_free
->num_rects
; i
++) {
1273 av_free(subtitle_to_free
->rects
[i
].bitmap
);
1274 av_free(subtitle_to_free
->rects
[i
].rgba_palette
);
1276 av_freep(&subtitle_to_free
->rects
);
1278 subtitle_to_free
->num_rects
= 0;
1279 subtitle_to_free
= NULL
;
1286 for(i
=0;i
<nb_ostreams
;i
++) {
1288 if (ost
->source_index
== ist_index
) {
1289 AVCodecContext
*enc
= ost
->st
->codec
;
1290 os
= output_files
[ost
->file_index
];
1292 if(ost
->st
->codec
->codec_type
== CODEC_TYPE_AUDIO
&& enc
->frame_size
<=1)
1294 if(ost
->st
->codec
->codec_type
== CODEC_TYPE_VIDEO
&& (os
->oformat
->flags
& AVFMT_RAWPICTURE
))
1297 if (ost
->encoding_needed
) {
1301 av_init_packet(&pkt
);
1302 pkt
.stream_index
= ost
->index
;
1304 switch(ost
->st
->codec
->codec_type
) {
1305 case CODEC_TYPE_AUDIO
:
1306 fifo_bytes
= av_fifo_size(&ost
->fifo
);
1308 /* encode any samples remaining in fifo */
1309 if(fifo_bytes
> 0 && enc
->codec
->capabilities
& CODEC_CAP_SMALL_LAST_FRAME
) {
1310 int fs_tmp
= enc
->frame_size
;
1311 enc
->frame_size
= fifo_bytes
/ (2 * enc
->channels
);
1312 if(av_fifo_read(&ost
->fifo
, (uint8_t *)samples
, fifo_bytes
) == 0) {
1313 ret
= avcodec_encode_audio(enc
, bit_buffer
, bit_buffer_size
, samples
);
1315 enc
->frame_size
= fs_tmp
;
1318 ret
= avcodec_encode_audio(enc
, bit_buffer
, bit_buffer_size
, NULL
);
1321 pkt
.flags
|= PKT_FLAG_KEY
;
1323 case CODEC_TYPE_VIDEO
:
1324 ret
= avcodec_encode_video(enc
, bit_buffer
, bit_buffer_size
, NULL
);
1326 if(enc
->coded_frame
&& enc
->coded_frame
->key_frame
)
1327 pkt
.flags
|= PKT_FLAG_KEY
;
1328 if (ost
->logfile
&& enc
->stats_out
) {
1329 fprintf(ost
->logfile
, "%s", enc
->stats_out
);
1338 pkt
.data
= bit_buffer
;
1340 if(enc
->coded_frame
&& enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
1341 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
1342 write_frame(os
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
1356 * The following code is the main loop of the file converter
1358 static int av_encode(AVFormatContext
**output_files
,
1359 int nb_output_files
,
1360 AVFormatContext
**input_files
,
1362 AVStreamMap
*stream_maps
, int nb_stream_maps
)
1364 int ret
, i
, j
, k
, n
, nb_istreams
= 0, nb_ostreams
= 0;
1365 AVFormatContext
*is
, *os
;
1366 AVCodecContext
*codec
, *icodec
;
1367 AVOutputStream
*ost
, **ost_table
= NULL
;
1368 AVInputStream
*ist
, **ist_table
= NULL
;
1369 AVInputFile
*file_table
;
1370 AVFormatContext
*stream_no_data
;
1373 file_table
= (AVInputFile
*) av_mallocz(nb_input_files
* sizeof(AVInputFile
));
1377 /* input stream init */
1379 for(i
=0;i
<nb_input_files
;i
++) {
1380 is
= input_files
[i
];
1381 file_table
[i
].ist_index
= j
;
1382 file_table
[i
].nb_streams
= is
->nb_streams
;
1383 j
+= is
->nb_streams
;
1387 ist_table
= av_mallocz(nb_istreams
* sizeof(AVInputStream
*));
1391 for(i
=0;i
<nb_istreams
;i
++) {
1392 ist
= av_mallocz(sizeof(AVInputStream
));
1398 for(i
=0;i
<nb_input_files
;i
++) {
1399 is
= input_files
[i
];
1400 for(k
=0;k
<is
->nb_streams
;k
++) {
1401 ist
= ist_table
[j
++];
1402 ist
->st
= is
->streams
[k
];
1403 ist
->file_index
= i
;
1405 ist
->discard
= 1; /* the stream is discarded by default
1408 if (ist
->st
->codec
->rate_emu
) {
1409 ist
->start
= av_gettime();
1415 /* output stream init */
1417 for(i
=0;i
<nb_output_files
;i
++) {
1418 os
= output_files
[i
];
1419 if (!os
->nb_streams
) {
1420 fprintf(stderr
, "Output file does not contain any stream\n");
1423 nb_ostreams
+= os
->nb_streams
;
1425 if (nb_stream_maps
> 0 && nb_stream_maps
!= nb_ostreams
) {
1426 fprintf(stderr
, "Number of stream maps must match number of output streams\n");
1430 /* Sanity check the mapping args -- do the input files & streams exist? */
1431 for(i
=0;i
<nb_stream_maps
;i
++) {
1432 int fi
= stream_maps
[i
].file_index
;
1433 int si
= stream_maps
[i
].stream_index
;
1435 if (fi
< 0 || fi
> nb_input_files
- 1 ||
1436 si
< 0 || si
> file_table
[fi
].nb_streams
- 1) {
1437 fprintf(stderr
,"Could not find input stream #%d.%d\n", fi
, si
);
1440 fi
= stream_maps
[i
].sync_file_index
;
1441 si
= stream_maps
[i
].sync_stream_index
;
1442 if (fi
< 0 || fi
> nb_input_files
- 1 ||
1443 si
< 0 || si
> file_table
[fi
].nb_streams
- 1) {
1444 fprintf(stderr
,"Could not find sync stream #%d.%d\n", fi
, si
);
1449 ost_table
= av_mallocz(sizeof(AVOutputStream
*) * nb_ostreams
);
1452 for(i
=0;i
<nb_ostreams
;i
++) {
1453 ost
= av_mallocz(sizeof(AVOutputStream
));
1460 for(k
=0;k
<nb_output_files
;k
++) {
1461 os
= output_files
[k
];
1462 for(i
=0;i
<os
->nb_streams
;i
++) {
1464 ost
= ost_table
[n
++];
1465 ost
->file_index
= k
;
1467 ost
->st
= os
->streams
[i
];
1468 if (nb_stream_maps
> 0) {
1469 ost
->source_index
= file_table
[stream_maps
[n
-1].file_index
].ist_index
+
1470 stream_maps
[n
-1].stream_index
;
1472 /* Sanity check that the stream types match */
1473 if (ist_table
[ost
->source_index
]->st
->codec
->codec_type
!= ost
->st
->codec
->codec_type
) {
1474 fprintf(stderr
, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1475 stream_maps
[n
-1].file_index
, stream_maps
[n
-1].stream_index
,
1476 ost
->file_index
, ost
->index
);
1481 /* get corresponding input stream index : we select the first one with the right type */
1483 for(j
=0;j
<nb_istreams
;j
++) {
1486 ist
->st
->codec
->codec_type
== ost
->st
->codec
->codec_type
) {
1487 ost
->source_index
= j
;
1494 /* try again and reuse existing stream */
1495 for(j
=0;j
<nb_istreams
;j
++) {
1497 if (ist
->st
->codec
->codec_type
== ost
->st
->codec
->codec_type
) {
1498 ost
->source_index
= j
;
1503 fprintf(stderr
, "Could not find input stream matching output stream #%d.%d\n",
1504 ost
->file_index
, ost
->index
);
1509 ist
= ist_table
[ost
->source_index
];
1511 ost
->sync_ist
= (nb_stream_maps
> 0) ?
1512 ist_table
[file_table
[stream_maps
[n
-1].sync_file_index
].ist_index
+
1513 stream_maps
[n
-1].sync_stream_index
] : ist
;
1517 /* for each output stream, we compute the right encoding parameters */
1518 for(i
=0;i
<nb_ostreams
;i
++) {
1520 ist
= ist_table
[ost
->source_index
];
1522 codec
= ost
->st
->codec
;
1523 icodec
= ist
->st
->codec
;
1525 if (ost
->st
->stream_copy
) {
1526 /* if stream_copy is selected, no need to decode or encode */
1527 codec
->codec_id
= icodec
->codec_id
;
1528 codec
->codec_type
= icodec
->codec_type
;
1529 if(!codec
->codec_tag
) codec
->codec_tag
= icodec
->codec_tag
;
1530 codec
->bit_rate
= icodec
->bit_rate
;
1531 codec
->extradata
= icodec
->extradata
;
1532 codec
->extradata_size
= icodec
->extradata_size
;
1533 if(av_q2d(icodec
->time_base
) > av_q2d(ist
->st
->time_base
) && av_q2d(ist
->st
->time_base
) < 1.0/1000)
1534 codec
->time_base
= icodec
->time_base
;
1536 codec
->time_base
= ist
->st
->time_base
;
1537 switch(codec
->codec_type
) {
1538 case CODEC_TYPE_AUDIO
:
1539 codec
->sample_rate
= icodec
->sample_rate
;
1540 codec
->channels
= icodec
->channels
;
1541 codec
->frame_size
= icodec
->frame_size
;
1542 codec
->block_align
= icodec
->block_align
;
1544 case CODEC_TYPE_VIDEO
:
1545 codec
->pix_fmt
= icodec
->pix_fmt
;
1546 codec
->width
= icodec
->width
;
1547 codec
->height
= icodec
->height
;
1548 codec
->has_b_frames
= icodec
->has_b_frames
;
1550 case CODEC_TYPE_SUBTITLE
:
1556 switch(codec
->codec_type
) {
1557 case CODEC_TYPE_AUDIO
:
1558 if (av_fifo_init(&ost
->fifo
, 2 * MAX_AUDIO_PACKET_SIZE
))
1561 if (codec
->channels
== icodec
->channels
&&
1562 codec
->sample_rate
== icodec
->sample_rate
) {
1563 ost
->audio_resample
= 0;
1565 if (codec
->channels
!= icodec
->channels
&&
1566 (icodec
->codec_id
== CODEC_ID_AC3
||
1567 icodec
->codec_id
== CODEC_ID_DTS
)) {
1568 /* Special case for 5:1 AC3 and DTS input */
1569 /* and mono or stereo output */
1570 /* Request specific number of channels */
1571 icodec
->channels
= codec
->channels
;
1572 if (codec
->sample_rate
== icodec
->sample_rate
)
1573 ost
->audio_resample
= 0;
1575 ost
->audio_resample
= 1;
1578 ost
->audio_resample
= 1;
1581 if(audio_sync_method
>1)
1582 ost
->audio_resample
= 1;
1584 if(ost
->audio_resample
){
1585 ost
->resample
= audio_resample_init(codec
->channels
, icodec
->channels
,
1586 codec
->sample_rate
, icodec
->sample_rate
);
1588 printf("Can't resample. Aborting.\n");
1592 ist
->decoding_needed
= 1;
1593 ost
->encoding_needed
= 1;
1595 case CODEC_TYPE_VIDEO
:
1596 ost
->video_crop
= ((frame_leftBand
+ frame_rightBand
+ frame_topBand
+ frame_bottomBand
) != 0);
1597 ost
->video_pad
= ((frame_padleft
+ frame_padright
+ frame_padtop
+ frame_padbottom
) != 0);
1598 ost
->video_resample
= ((codec
->width
!= icodec
->width
-
1599 (frame_leftBand
+ frame_rightBand
) +
1600 (frame_padleft
+ frame_padright
)) ||
1601 (codec
->height
!= icodec
->height
-
1602 (frame_topBand
+ frame_bottomBand
) +
1603 (frame_padtop
+ frame_padbottom
)) ||
1604 (codec
->pix_fmt
!= icodec
->pix_fmt
));
1605 if (ost
->video_crop
) {
1606 ost
->topBand
= frame_topBand
;
1607 ost
->leftBand
= frame_leftBand
;
1609 if (ost
->video_pad
) {
1610 ost
->padtop
= frame_padtop
;
1611 ost
->padleft
= frame_padleft
;
1612 ost
->padbottom
= frame_padbottom
;
1613 ost
->padright
= frame_padright
;
1614 if (!ost
->video_resample
) {
1615 avcodec_get_frame_defaults(&ost
->pict_tmp
);
1616 if( avpicture_alloc( (AVPicture
*)&ost
->pict_tmp
, codec
->pix_fmt
,
1617 codec
->width
, codec
->height
) )
1621 if (ost
->video_resample
) {
1622 avcodec_get_frame_defaults(&ost
->pict_tmp
);
1623 if( avpicture_alloc( (AVPicture
*)&ost
->pict_tmp
, codec
->pix_fmt
,
1624 codec
->width
, codec
->height
) )
1627 ost
->img_resample_ctx
= sws_getContext(
1628 icodec
->width
- (frame_leftBand
+ frame_rightBand
),
1629 icodec
->height
- (frame_topBand
+ frame_bottomBand
),
1631 codec
->width
- (frame_padleft
+ frame_padright
),
1632 codec
->height
- (frame_padtop
+ frame_padbottom
),
1634 sws_flags
, NULL
, NULL
, NULL
);
1635 if (ost
->img_resample_ctx
== NULL
) {
1636 fprintf(stderr
, "Cannot get resampling context\n");
1639 ost
->resample_height
= icodec
->height
- (frame_topBand
+ frame_bottomBand
);
1641 ost
->encoding_needed
= 1;
1642 ist
->decoding_needed
= 1;
1644 case CODEC_TYPE_SUBTITLE
:
1645 ost
->encoding_needed
= 1;
1646 ist
->decoding_needed
= 1;
1653 if (ost
->encoding_needed
&&
1654 (codec
->flags
& (CODEC_FLAG_PASS1
| CODEC_FLAG_PASS2
))) {
1655 char logfilename
[1024];
1660 snprintf(logfilename
, sizeof(logfilename
), "%s-%d.log",
1662 pass_logfilename
: DEFAULT_PASS_LOGFILENAME
, i
);
1663 if (codec
->flags
& CODEC_FLAG_PASS1
) {
1664 f
= fopen(logfilename
, "w");
1666 perror(logfilename
);
1671 /* read the log file */
1672 f
= fopen(logfilename
, "r");
1674 perror(logfilename
);
1677 fseek(f
, 0, SEEK_END
);
1679 fseek(f
, 0, SEEK_SET
);
1680 logbuffer
= av_malloc(size
+ 1);
1682 fprintf(stderr
, "Could not allocate log buffer\n");
1685 size
= fread(logbuffer
, 1, size
, f
);
1687 logbuffer
[size
] = '\0';
1688 codec
->stats_in
= logbuffer
;
1692 if(codec
->codec_type
== CODEC_TYPE_VIDEO
){
1693 int size
= codec
->width
* codec
->height
;
1694 bit_buffer_size
= FFMAX(bit_buffer_size
, 4*size
);
1699 bit_buffer
= av_malloc(bit_buffer_size
);
1703 /* dump the file output parameters - cannot be done before in case
1705 for(i
=0;i
<nb_output_files
;i
++) {
1706 dump_format(output_files
[i
], i
, output_files
[i
]->filename
, 1);
1709 /* dump the stream mapping */
1711 fprintf(stderr
, "Stream mapping:\n");
1712 for(i
=0;i
<nb_ostreams
;i
++) {
1714 fprintf(stderr
, " Stream #%d.%d -> #%d.%d",
1715 ist_table
[ost
->source_index
]->file_index
,
1716 ist_table
[ost
->source_index
]->index
,
1719 if (ost
->sync_ist
!= ist_table
[ost
->source_index
])
1720 fprintf(stderr
, " [sync #%d.%d]",
1721 ost
->sync_ist
->file_index
,
1722 ost
->sync_ist
->index
);
1723 fprintf(stderr
, "\n");
1727 /* open each encoder */
1728 for(i
=0;i
<nb_ostreams
;i
++) {
1730 if (ost
->encoding_needed
) {
1732 codec
= avcodec_find_encoder(ost
->st
->codec
->codec_id
);
1734 fprintf(stderr
, "Unsupported codec for output stream #%d.%d\n",
1735 ost
->file_index
, ost
->index
);
1738 if (avcodec_open(ost
->st
->codec
, codec
) < 0) {
1739 fprintf(stderr
, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1740 ost
->file_index
, ost
->index
);
1743 extra_size
+= ost
->st
->codec
->extradata_size
;
1747 /* open each decoder */
1748 for(i
=0;i
<nb_istreams
;i
++) {
1750 if (ist
->decoding_needed
) {
1752 codec
= avcodec_find_decoder(ist
->st
->codec
->codec_id
);
1754 fprintf(stderr
, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1755 ist
->st
->codec
->codec_id
, ist
->file_index
, ist
->index
);
1758 if (avcodec_open(ist
->st
->codec
, codec
) < 0) {
1759 fprintf(stderr
, "Error while opening codec for input stream #%d.%d\n",
1760 ist
->file_index
, ist
->index
);
1763 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1764 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1769 for(i
=0;i
<nb_istreams
;i
++) {
1771 is
= input_files
[ist
->file_index
];
1773 ist
->next_pts
= av_rescale_q(ist
->st
->start_time
, ist
->st
->time_base
, AV_TIME_BASE_Q
);
1774 if(ist
->st
->start_time
== AV_NOPTS_VALUE
)
1776 if(input_files_ts_offset
[ist
->file_index
])
1777 ist
->next_pts
= AV_NOPTS_VALUE
;
1781 /* compute buffer size max (should use a complete heuristic) */
1782 for(i
=0;i
<nb_input_files
;i
++) {
1783 file_table
[i
].buffer_size_max
= 2048;
1786 /* set meta data information from input file if required */
1787 for (i
=0;i
<nb_meta_data_maps
;i
++) {
1788 AVFormatContext
*out_file
;
1789 AVFormatContext
*in_file
;
1791 int out_file_index
= meta_data_maps
[i
].out_file
;
1792 int in_file_index
= meta_data_maps
[i
].in_file
;
1793 if ( out_file_index
< 0 || out_file_index
>= nb_output_files
) {
1794 fprintf(stderr
, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index
, out_file_index
, in_file_index
);
1798 if ( in_file_index
< 0 || in_file_index
>= nb_input_files
) {
1799 fprintf(stderr
, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index
, out_file_index
, in_file_index
);
1804 out_file
= output_files
[out_file_index
];
1805 in_file
= input_files
[in_file_index
];
1807 strcpy(out_file
->title
, in_file
->title
);
1808 strcpy(out_file
->author
, in_file
->author
);
1809 strcpy(out_file
->copyright
, in_file
->copyright
);
1810 strcpy(out_file
->comment
, in_file
->comment
);
1811 strcpy(out_file
->album
, in_file
->album
);
1812 out_file
->year
= in_file
->year
;
1813 out_file
->track
= in_file
->track
;
1814 strcpy(out_file
->genre
, in_file
->genre
);
1817 /* open files and write file headers */
1818 for(i
=0;i
<nb_output_files
;i
++) {
1819 os
= output_files
[i
];
1820 if (av_write_header(os
) < 0) {
1821 fprintf(stderr
, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i
);
1827 if ( !using_stdin
&& verbose
>= 0) {
1828 fprintf(stderr
, "Press [q] to stop encoding\n");
1829 url_set_interrupt_cb(decode_interrupt_cb
);
1836 for(; received_sigterm
== 0;) {
1837 int file_index
, ist_index
;
1845 /* if 'q' pressed, exits */
1849 /* read_key() returns 0 on EOF */
1855 /* select the stream that we must read now by looking at the
1856 smallest output pts */
1858 for(i
=0;i
<nb_ostreams
;i
++) {
1861 os
= output_files
[ost
->file_index
];
1862 ist
= ist_table
[ost
->source_index
];
1863 if(ost
->st
->codec
->codec_type
== CODEC_TYPE_VIDEO
)
1864 opts
= ost
->sync_opts
* av_q2d(ost
->st
->codec
->time_base
);
1866 opts
= ost
->st
->pts
.val
* av_q2d(ost
->st
->time_base
);
1867 ipts
= (double)ist
->pts
;
1868 if (!file_table
[ist
->file_index
].eof_reached
){
1869 if(ipts
< ipts_min
) {
1871 if(input_sync
) file_index
= ist
->file_index
;
1873 if(opts
< opts_min
) {
1875 if(!input_sync
) file_index
= ist
->file_index
;
1878 if(ost
->frame_number
>= max_frames
[ost
->st
->codec
->codec_type
]){
1883 /* if none, if is finished */
1884 if (file_index
< 0) {
1888 /* finish if recording time exhausted */
1889 if (recording_time
> 0 && opts_min
>= (recording_time
/ 1000000.0))
1892 /* finish if limit size exhausted */
1893 if (limit_filesize
!= 0 && (limit_filesize
* 1024) < url_ftell(&output_files
[0]->pb
))
1896 /* read a frame from it and output it in the fifo */
1897 is
= input_files
[file_index
];
1898 if (av_read_frame(is
, &pkt
) < 0) {
1899 file_table
[file_index
].eof_reached
= 1;
1900 if (opt_shortest
) break; else continue; //
1904 stream_no_data
= is
;
1909 av_pkt_dump(stdout
, &pkt
, do_hex_dump
);
1911 /* the following test is needed in case new streams appear
1912 dynamically in stream : we ignore them */
1913 if (pkt
.stream_index
>= file_table
[file_index
].nb_streams
)
1914 goto discard_packet
;
1915 ist_index
= file_table
[file_index
].ist_index
+ pkt
.stream_index
;
1916 ist
= ist_table
[ist_index
];
1918 goto discard_packet
;
1920 // 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);
1921 if (pkt
.dts
!= AV_NOPTS_VALUE
&& ist
->next_pts
!= AV_NOPTS_VALUE
) {
1922 int64_t delta
= av_rescale_q(pkt
.dts
, ist
->st
->time_base
, AV_TIME_BASE_Q
) - ist
->next_pts
;
1923 if(FFABS(delta
) > 1LL*dts_delta_threshold
*AV_TIME_BASE
&& !copy_ts
){
1924 input_files_ts_offset
[ist
->file_index
]-= delta
;
1926 fprintf(stderr
, "timestamp discontinuity %"PRId64
", new offset= %"PRId64
"\n", delta
, input_files_ts_offset
[ist
->file_index
]);
1927 for(i
=0; i
<file_table
[file_index
].nb_streams
; i
++){
1928 int index
= file_table
[file_index
].ist_index
+ i
;
1929 ist_table
[index
]->next_pts
+= delta
;
1930 ist_table
[index
]->is_start
=1;
1935 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1936 if (output_packet(ist
, ist_index
, ost_table
, nb_ostreams
, &pkt
) < 0) {
1939 fprintf(stderr
, "Error while decoding stream #%d.%d\n",
1940 ist
->file_index
, ist
->index
);
1942 av_free_packet(&pkt
);
1947 av_free_packet(&pkt
);
1949 /* dump report by using the output first video and audio streams */
1950 print_report(output_files
, ost_table
, nb_ostreams
, 0);
1953 /* at the end of stream, we must flush the decoder buffers */
1954 for(i
=0;i
<nb_istreams
;i
++) {
1956 if (ist
->decoding_needed
) {
1957 output_packet(ist
, i
, ost_table
, nb_ostreams
, NULL
);
1963 /* write the trailer if needed and close file */
1964 for(i
=0;i
<nb_output_files
;i
++) {
1965 os
= output_files
[i
];
1966 av_write_trailer(os
);
1969 /* dump report by using the first video and audio streams */
1970 print_report(output_files
, ost_table
, nb_ostreams
, 1);
1972 /* close each encoder */
1973 for(i
=0;i
<nb_ostreams
;i
++) {
1975 if (ost
->encoding_needed
) {
1976 av_freep(&ost
->st
->codec
->stats_in
);
1977 avcodec_close(ost
->st
->codec
);
1981 /* close each decoder */
1982 for(i
=0;i
<nb_istreams
;i
++) {
1984 if (ist
->decoding_needed
) {
1985 avcodec_close(ist
->st
->codec
);
1993 av_freep(&bit_buffer
);
1994 av_free(file_table
);
1997 for(i
=0;i
<nb_istreams
;i
++) {
2004 for(i
=0;i
<nb_ostreams
;i
++) {
2008 fclose(ost
->logfile
);
2009 ost
->logfile
= NULL
;
2011 av_fifo_free(&ost
->fifo
); /* works even if fifo is not
2012 initialized but set to zero */
2013 av_free(ost
->pict_tmp
.data
[0]);
2014 if (ost
->video_resample
)
2015 sws_freeContext(ost
->img_resample_ctx
);
2016 if (ost
->audio_resample
)
2017 audio_resample_close(ost
->resample
);
2030 int file_read(const char *filename
)
2033 unsigned char buffer
[1024];
2036 if (url_open(&h
, filename
, O_RDONLY
) < 0) {
2037 printf("could not open '%s'\n", filename
);
2041 len
= url_read(h
, buffer
, sizeof(buffer
));
2044 for(i
=0;i
<len
;i
++) putchar(buffer
[i
]);
2051 static void opt_format(const char *arg
)
2053 /* compatibility stuff for pgmyuv */
2054 if (!strcmp(arg
, "pgmyuv")) {
2055 pgmyuv_compatibility_hack
=1;
2056 // opt_image_format(arg);
2060 file_iformat
= av_find_input_format(arg
);
2061 file_oformat
= guess_format(arg
, NULL
, NULL
);
2062 if (!file_iformat
&& !file_oformat
) {
2063 fprintf(stderr
, "Unknown input or output format: %s\n", arg
);
2068 static void opt_video_rc_eq(char *arg
)
2073 static void opt_video_rc_override_string(char *arg
)
2075 video_rc_override_string
= arg
;
2078 static void opt_me_threshold(const char *arg
)
2080 me_threshold
= atoi(arg
);
2083 static void opt_verbose(const char *arg
)
2085 verbose
= atoi(arg
);
2086 av_log_set_level(atoi(arg
));
2089 static void opt_frame_rate(const char *arg
)
2091 if (parse_frame_rate(&frame_rate
, &frame_rate_base
, arg
) < 0) {
2092 fprintf(stderr
, "Incorrect frame rate\n");
2097 static void opt_frame_crop_top(const char *arg
)
2099 frame_topBand
= atoi(arg
);
2100 if (frame_topBand
< 0) {
2101 fprintf(stderr
, "Incorrect top crop size\n");
2104 if ((frame_topBand
% 2) != 0) {
2105 fprintf(stderr
, "Top crop size must be a multiple of 2\n");
2108 if ((frame_topBand
) >= frame_height
){
2109 fprintf(stderr
, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2112 frame_height
-= frame_topBand
;
2115 static void opt_frame_crop_bottom(const char *arg
)
2117 frame_bottomBand
= atoi(arg
);
2118 if (frame_bottomBand
< 0) {
2119 fprintf(stderr
, "Incorrect bottom crop size\n");
2122 if ((frame_bottomBand
% 2) != 0) {
2123 fprintf(stderr
, "Bottom crop size must be a multiple of 2\n");
2126 if ((frame_bottomBand
) >= frame_height
){
2127 fprintf(stderr
, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2130 frame_height
-= frame_bottomBand
;
2133 static void opt_frame_crop_left(const char *arg
)
2135 frame_leftBand
= atoi(arg
);
2136 if (frame_leftBand
< 0) {
2137 fprintf(stderr
, "Incorrect left crop size\n");
2140 if ((frame_leftBand
% 2) != 0) {
2141 fprintf(stderr
, "Left crop size must be a multiple of 2\n");
2144 if ((frame_leftBand
) >= frame_width
){
2145 fprintf(stderr
, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2148 frame_width
-= frame_leftBand
;
2151 static void opt_frame_crop_right(const char *arg
)
2153 frame_rightBand
= atoi(arg
);
2154 if (frame_rightBand
< 0) {
2155 fprintf(stderr
, "Incorrect right crop size\n");
2158 if ((frame_rightBand
% 2) != 0) {
2159 fprintf(stderr
, "Right crop size must be a multiple of 2\n");
2162 if ((frame_rightBand
) >= frame_width
){
2163 fprintf(stderr
, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2166 frame_width
-= frame_rightBand
;
2169 static void opt_frame_size(const char *arg
)
2171 if (parse_image_size(&frame_width
, &frame_height
, arg
) < 0) {
2172 fprintf(stderr
, "Incorrect frame size\n");
2175 if ((frame_width
% 2) != 0 || (frame_height
% 2) != 0) {
2176 fprintf(stderr
, "Frame size must be a multiple of 2\n");
2182 #define SCALEBITS 10
2183 #define ONE_HALF (1 << (SCALEBITS - 1))
2184 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2186 #define RGB_TO_Y(r, g, b) \
2187 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2188 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2190 #define RGB_TO_U(r1, g1, b1, shift)\
2191 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2192 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2194 #define RGB_TO_V(r1, g1, b1, shift)\
2195 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2196 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2198 static void opt_pad_color(const char *arg
) {
2199 /* Input is expected to be six hex digits similar to
2200 how colors are expressed in html tags (but without the #) */
2201 int rgb
= strtol(arg
, NULL
, 16);
2205 g
= ((rgb
>> 8) & 255);
2208 padcolor
[0] = RGB_TO_Y(r
,g
,b
);
2209 padcolor
[1] = RGB_TO_U(r
,g
,b
,0);
2210 padcolor
[2] = RGB_TO_V(r
,g
,b
,0);
2213 static void opt_frame_pad_top(const char *arg
)
2215 frame_padtop
= atoi(arg
);
2216 if (frame_padtop
< 0) {
2217 fprintf(stderr
, "Incorrect top pad size\n");
2220 if ((frame_padtop
% 2) != 0) {
2221 fprintf(stderr
, "Top pad size must be a multiple of 2\n");
2226 static void opt_frame_pad_bottom(const char *arg
)
2228 frame_padbottom
= atoi(arg
);
2229 if (frame_padbottom
< 0) {
2230 fprintf(stderr
, "Incorrect bottom pad size\n");
2233 if ((frame_padbottom
% 2) != 0) {
2234 fprintf(stderr
, "Bottom pad size must be a multiple of 2\n");
2240 static void opt_frame_pad_left(const char *arg
)
2242 frame_padleft
= atoi(arg
);
2243 if (frame_padleft
< 0) {
2244 fprintf(stderr
, "Incorrect left pad size\n");
2247 if ((frame_padleft
% 2) != 0) {
2248 fprintf(stderr
, "Left pad size must be a multiple of 2\n");
2254 static void opt_frame_pad_right(const char *arg
)
2256 frame_padright
= atoi(arg
);
2257 if (frame_padright
< 0) {
2258 fprintf(stderr
, "Incorrect right pad size\n");
2261 if ((frame_padright
% 2) != 0) {
2262 fprintf(stderr
, "Right pad size must be a multiple of 2\n");
2268 static void opt_frame_pix_fmt(const char *arg
)
2270 frame_pix_fmt
= avcodec_get_pix_fmt(arg
);
2273 static void opt_frame_aspect_ratio(const char *arg
)
2279 p
= strchr(arg
, ':');
2281 x
= strtol(arg
, (char **)&arg
, 10);
2283 y
= strtol(arg
+1, (char **)&arg
, 10);
2285 ar
= (double)x
/ (double)y
;
2287 ar
= strtod(arg
, (char **)&arg
);
2290 fprintf(stderr
, "Incorrect aspect ratio specification.\n");
2293 frame_aspect_ratio
= ar
;
2296 static void opt_qscale(const char *arg
)
2298 video_qscale
= atof(arg
);
2299 if (video_qscale
<= 0 ||
2300 video_qscale
> 255) {
2301 fprintf(stderr
, "qscale must be > 0.0 and <= 255\n");
2306 static void opt_qdiff(const char *arg
)
2308 video_qdiff
= atoi(arg
);
2309 if (video_qdiff
< 0 ||
2311 fprintf(stderr
, "qdiff must be >= 1 and <= 31\n");
2316 static void opt_packet_size(const char *arg
)
2318 packet_size
= atoi(arg
);
2321 static void opt_strict(const char *arg
)
2326 static void opt_top_field_first(const char *arg
)
2328 top_field_first
= atoi(arg
);
2331 static void opt_thread_count(const char *arg
)
2333 thread_count
= atoi(arg
);
2334 #if !defined(HAVE_THREADS)
2336 fprintf(stderr
, "Warning: not compiled with thread support, using thread emulation\n");
2340 static void opt_audio_bitrate(const char *arg
)
2342 audio_bit_rate
= atoi(arg
) * 1000;
2345 static void opt_audio_rate(const char *arg
)
2347 audio_sample_rate
= atoi(arg
);
2350 static void opt_audio_channels(const char *arg
)
2352 audio_channels
= atoi(arg
);
2355 static void opt_video_device(const char *arg
)
2357 video_device
= av_strdup(arg
);
2360 static void opt_grab_device(const char *arg
)
2362 grab_device
= av_strdup(arg
);
2365 static void opt_video_channel(const char *arg
)
2367 video_channel
= strtol(arg
, NULL
, 0);
2370 static void opt_video_standard(const char *arg
)
2372 video_standard
= av_strdup(arg
);
2375 static void opt_audio_device(const char *arg
)
2377 audio_device
= av_strdup(arg
);
2380 static void opt_codec(int *pstream_copy
, int *pcodec_id
,
2381 int codec_type
, const char *arg
)
2385 if (!strcmp(arg
, "copy")) {
2390 if (!strcmp(p
->name
, arg
) && p
->type
== codec_type
)
2395 fprintf(stderr
, "Unknown codec '%s'\n", arg
);
2403 static void opt_audio_codec(const char *arg
)
2405 opt_codec(&audio_stream_copy
, &audio_codec_id
, CODEC_TYPE_AUDIO
, arg
);
2408 static void opt_audio_tag(const char *arg
)
2411 audio_codec_tag
= strtol(arg
, &tail
, 0);
2414 audio_codec_tag
= arg
[0] + (arg
[1]<<8) + (arg
[2]<<16) + (arg
[3]<<24);
2417 static void opt_video_tag(const char *arg
)
2420 video_codec_tag
= strtol(arg
, &tail
, 0);
2423 video_codec_tag
= arg
[0] + (arg
[1]<<8) + (arg
[2]<<16) + (arg
[3]<<24);
2426 static void add_frame_hooker(const char *arg
)
2431 char *args
= av_strdup(arg
);
2435 argv
[0] = strtok(args
, " ");
2436 while (argc
< 62 && (argv
[++argc
] = strtok(NULL
, " "))) {
2439 i
= frame_hook_add(argc
, argv
);
2442 fprintf(stderr
, "Failed to add video hook function: %s\n", arg
);
2447 const char *motion_str
[] = {
2460 static void opt_motion_estimation(const char *arg
)
2466 fprintf(stderr
, "Unknown motion estimation method '%s'\n", arg
);
2469 if (!strcmp(*p
, arg
))
2473 me_method
= (p
- motion_str
) + 1;
2476 static void opt_video_codec(const char *arg
)
2478 opt_codec(&video_stream_copy
, &video_codec_id
, CODEC_TYPE_VIDEO
, arg
);
2481 static void opt_subtitle_codec(const char *arg
)
2483 opt_codec(&subtitle_stream_copy
, &subtitle_codec_id
, CODEC_TYPE_SUBTITLE
, arg
);
2486 static void opt_map(const char *arg
)
2492 m
= &stream_maps
[nb_stream_maps
++];
2494 m
->file_index
= strtol(arg
, (char **)&p
, 0);
2498 m
->stream_index
= strtol(p
, (char **)&p
, 0);
2501 m
->sync_file_index
= strtol(p
, (char **)&p
, 0);
2504 m
->sync_stream_index
= strtol(p
, (char **)&p
, 0);
2506 m
->sync_file_index
= m
->file_index
;
2507 m
->sync_stream_index
= m
->stream_index
;
2511 static void opt_map_meta_data(const char *arg
)
2517 m
= &meta_data_maps
[nb_meta_data_maps
++];
2519 m
->out_file
= strtol(arg
, (char **)&p
, 0);
2523 m
->in_file
= strtol(p
, (char **)&p
, 0);
2526 static void opt_recording_time(const char *arg
)
2528 recording_time
= parse_date(arg
, 1);
2531 static void opt_start_time(const char *arg
)
2533 start_time
= parse_date(arg
, 1);
2536 static void opt_rec_timestamp(const char *arg
)
2538 rec_timestamp
= parse_date(arg
, 0) / 1000000;
2541 static void opt_input_ts_offset(const char *arg
)
2543 input_ts_offset
= parse_date(arg
, 1);
2546 static void opt_input_file(const char *filename
)
2548 AVFormatContext
*ic
;
2549 AVFormatParameters params
, *ap
= ¶ms
;
2550 int err
, i
, ret
, rfps
, rfps_base
;
2553 if (!strcmp(filename
, "-"))
2556 using_stdin
|= !strncmp(filename
, "pipe:", 5) ||
2557 !strcmp( filename
, "/dev/stdin" );
2559 /* get default parameters from command line */
2560 ic
= av_alloc_format_context();
2562 memset(ap
, 0, sizeof(*ap
));
2563 ap
->prealloced_context
= 1;
2564 ap
->sample_rate
= audio_sample_rate
;
2565 ap
->channels
= audio_channels
;
2566 ap
->time_base
.den
= frame_rate
;
2567 ap
->time_base
.num
= frame_rate_base
;
2568 ap
->width
= frame_width
+ frame_padleft
+ frame_padright
;
2569 ap
->height
= frame_height
+ frame_padtop
+ frame_padbottom
;
2570 ap
->pix_fmt
= frame_pix_fmt
;
2571 ap
->device
= grab_device
;
2572 ap
->channel
= video_channel
;
2573 ap
->standard
= video_standard
;
2574 ap
->video_codec_id
= video_codec_id
;
2575 ap
->audio_codec_id
= audio_codec_id
;
2576 if(pgmyuv_compatibility_hack
)
2577 ap
->video_codec_id
= CODEC_ID_PGMYUV
;
2579 for(i
=0; i
<opt_name_count
; i
++){
2581 double d
= av_get_double(avformat_opts
, opt_names
[i
], &opt
);
2582 if(d
==d
&& (opt
->flags
&AV_OPT_FLAG_DECODING_PARAM
))
2583 av_set_double(ic
, opt_names
[i
], d
);
2585 /* open the input file with generic libav function */
2586 err
= av_open_input_file(&ic
, filename
, file_iformat
, 0, ap
);
2588 print_error(filename
, err
);
2592 ic
->loop_input
= loop_input
;
2594 /* If not enough info to get the stream parameters, we decode the
2595 first frames to get it. (used in mpeg case for example) */
2596 ret
= av_find_stream_info(ic
);
2597 if (ret
< 0 && verbose
>= 0) {
2598 fprintf(stderr
, "%s: could not find codec parameters\n", filename
);
2602 timestamp
= start_time
;
2603 /* add the stream start time */
2604 if (ic
->start_time
!= AV_NOPTS_VALUE
)
2605 timestamp
+= ic
->start_time
;
2607 /* if seeking requested, we execute it */
2608 if (start_time
!= 0) {
2609 ret
= av_seek_frame(ic
, -1, timestamp
, AVSEEK_FLAG_BACKWARD
);
2611 fprintf(stderr
, "%s: could not seek to position %0.3f\n",
2612 filename
, (double)timestamp
/ AV_TIME_BASE
);
2614 /* reset seek info */
2618 /* update the current parameters so that they match the one of the input stream */
2619 for(i
=0;i
<ic
->nb_streams
;i
++) {
2621 AVCodecContext
*enc
= ic
->streams
[i
]->codec
;
2622 #if defined(HAVE_THREADS)
2624 avcodec_thread_init(enc
, thread_count
);
2626 enc
->thread_count
= thread_count
;
2627 switch(enc
->codec_type
) {
2628 case CODEC_TYPE_AUDIO
:
2629 for(j
=0; j
<opt_name_count
; j
++){
2631 double d
= av_get_double(avctx_opts
, opt_names
[j
], &opt
);
2632 if(d
==d
&& (opt
->flags
&AV_OPT_FLAG_AUDIO_PARAM
) && (opt
->flags
&AV_OPT_FLAG_DECODING_PARAM
))
2633 av_set_double(enc
, opt_names
[j
], d
);
2635 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2636 audio_channels
= enc
->channels
;
2637 audio_sample_rate
= enc
->sample_rate
;
2639 ic
->streams
[i
]->discard
= AVDISCARD_ALL
;
2641 case CODEC_TYPE_VIDEO
:
2642 for(j
=0; j
<opt_name_count
; j
++){
2644 double d
= av_get_double(avctx_opts
, opt_names
[j
], &opt
);
2645 if(d
==d
&& (opt
->flags
&AV_OPT_FLAG_VIDEO_PARAM
) && (opt
->flags
&AV_OPT_FLAG_DECODING_PARAM
))
2646 av_set_double(enc
, opt_names
[j
], d
);
2648 frame_height
= enc
->height
;
2649 frame_width
= enc
->width
;
2650 frame_aspect_ratio
= av_q2d(enc
->sample_aspect_ratio
) * enc
->width
/ enc
->height
;
2651 frame_pix_fmt
= enc
->pix_fmt
;
2652 rfps
= ic
->streams
[i
]->r_frame_rate
.num
;
2653 rfps_base
= ic
->streams
[i
]->r_frame_rate
.den
;
2654 if(enc
->lowres
) enc
->flags
|= CODEC_FLAG_EMU_EDGE
;
2656 enc
->debug
|= FF_DEBUG_MV
;
2658 if (enc
->time_base
.den
!= rfps
|| enc
->time_base
.num
!= rfps_base
) {
2661 fprintf(stderr
,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2662 i
, (float)enc
->time_base
.den
/ enc
->time_base
.num
, enc
->time_base
.den
, enc
->time_base
.num
,
2664 (float)rfps
/ rfps_base
, rfps
, rfps_base
);
2666 /* update the current frame rate to match the stream frame rate */
2668 frame_rate_base
= rfps_base
;
2670 enc
->rate_emu
= rate_emu
;
2672 ic
->streams
[i
]->discard
= AVDISCARD_ALL
;
2673 else if(video_discard
)
2674 ic
->streams
[i
]->discard
= video_discard
;
2676 case CODEC_TYPE_DATA
:
2678 case CODEC_TYPE_SUBTITLE
:
2680 case CODEC_TYPE_UNKNOWN
:
2687 input_files
[nb_input_files
] = ic
;
2688 input_files_ts_offset
[nb_input_files
] = input_ts_offset
- (copy_ts
? 0 : timestamp
);
2689 /* dump the file content */
2691 dump_format(ic
, nb_input_files
, filename
, 0);
2694 file_iformat
= NULL
;
2695 file_oformat
= NULL
;
2703 static void opt_grab(const char *arg
)
2705 file_iformat
= av_find_input_format(arg
);
2709 static void check_audio_video_inputs(int *has_video_ptr
, int *has_audio_ptr
)
2711 int has_video
, has_audio
, i
, j
;
2712 AVFormatContext
*ic
;
2716 for(j
=0;j
<nb_input_files
;j
++) {
2717 ic
= input_files
[j
];
2718 for(i
=0;i
<ic
->nb_streams
;i
++) {
2719 AVCodecContext
*enc
= ic
->streams
[i
]->codec
;
2720 switch(enc
->codec_type
) {
2721 case CODEC_TYPE_AUDIO
:
2724 case CODEC_TYPE_VIDEO
:
2727 case CODEC_TYPE_DATA
:
2728 case CODEC_TYPE_UNKNOWN
:
2729 case CODEC_TYPE_SUBTITLE
:
2736 *has_video_ptr
= has_video
;
2737 *has_audio_ptr
= has_audio
;
2740 static void new_video_stream(AVFormatContext
*oc
)
2743 AVCodecContext
*video_enc
;
2746 st
= av_new_stream(oc
, oc
->nb_streams
);
2748 fprintf(stderr
, "Could not alloc stream\n");
2751 bitstream_filters
[nb_output_files
][oc
->nb_streams
- 1]= video_bitstream_filters
;
2752 video_bitstream_filters
= NULL
;
2754 #if defined(HAVE_THREADS)
2756 avcodec_thread_init(st
->codec
, thread_count
);
2759 video_enc
= st
->codec
;
2762 video_enc
->codec_tag
= video_codec_tag
;
2764 if( (video_global_header
&1)
2765 || (video_global_header
==0 && (oc
->oformat
->flags
& AVFMT_GLOBALHEADER
))){
2766 video_enc
->flags
|= CODEC_FLAG_GLOBAL_HEADER
;
2767 avctx_opts
->flags
|= CODEC_FLAG_GLOBAL_HEADER
;
2769 if(video_global_header
&2){
2770 video_enc
->flags2
|= CODEC_FLAG2_LOCAL_HEADER
;
2771 avctx_opts
->flags2
|= CODEC_FLAG2_LOCAL_HEADER
;
2774 if (video_stream_copy
) {
2775 st
->stream_copy
= 1;
2776 video_enc
->codec_type
= CODEC_TYPE_VIDEO
;
2782 codec_id
= av_guess_codec(oc
->oformat
, NULL
, oc
->filename
, NULL
, CODEC_TYPE_VIDEO
);
2783 if (video_codec_id
!= CODEC_ID_NONE
)
2784 codec_id
= video_codec_id
;
2786 video_enc
->codec_id
= codec_id
;
2787 codec
= avcodec_find_encoder(codec_id
);
2789 for(i
=0; i
<opt_name_count
; i
++){
2791 double d
= av_get_double(avctx_opts
, opt_names
[i
], &opt
);
2792 if(d
==d
&& (opt
->flags
&AV_OPT_FLAG_VIDEO_PARAM
) && (opt
->flags
&AV_OPT_FLAG_ENCODING_PARAM
))
2793 av_set_double(video_enc
, opt_names
[i
], d
);
2796 video_enc
->time_base
.den
= frame_rate
;
2797 video_enc
->time_base
.num
= frame_rate_base
;
2798 if(codec
&& codec
->supported_framerates
){
2799 const AVRational
*p
= codec
->supported_framerates
;
2800 AVRational req
= (AVRational
){frame_rate
, frame_rate_base
};
2801 const AVRational
*best
=NULL
;
2802 AVRational best_error
= (AVRational
){INT_MAX
, 1};
2803 for(; p
->den
!=0; p
++){
2804 AVRational error
= av_sub_q(req
, *p
);
2805 if(error
.num
<0) error
.num
*= -1;
2806 if(av_cmp_q(error
, best_error
) < 0){
2811 video_enc
->time_base
.den
= best
->num
;
2812 video_enc
->time_base
.num
= best
->den
;
2815 video_enc
->width
= frame_width
+ frame_padright
+ frame_padleft
;
2816 video_enc
->height
= frame_height
+ frame_padtop
+ frame_padbottom
;
2817 video_enc
->sample_aspect_ratio
= av_d2q(frame_aspect_ratio
*video_enc
->height
/video_enc
->width
, 255);
2818 video_enc
->pix_fmt
= frame_pix_fmt
;
2820 if(codec
&& codec
->pix_fmts
){
2821 const enum PixelFormat
*p
= codec
->pix_fmts
;
2823 if(*p
== video_enc
->pix_fmt
)
2827 video_enc
->pix_fmt
= codec
->pix_fmts
[0];
2831 video_enc
->gop_size
= 0;
2832 if (video_qscale
|| same_quality
) {
2833 video_enc
->flags
|= CODEC_FLAG_QSCALE
;
2834 video_enc
->global_quality
=
2835 st
->quality
= FF_QP2LAMBDA
* video_qscale
;
2839 video_enc
->intra_matrix
= intra_matrix
;
2841 video_enc
->inter_matrix
= inter_matrix
;
2843 video_enc
->max_qdiff
= video_qdiff
;
2844 video_enc
->rc_eq
= video_rc_eq
;
2845 video_enc
->thread_count
= thread_count
;
2846 p
= video_rc_override_string
;
2849 int e
=sscanf(p
, "%d,%d,%d", &start
, &end
, &q
);
2851 fprintf(stderr
, "error parsing rc_override\n");
2854 video_enc
->rc_override
=
2855 av_realloc(video_enc
->rc_override
,
2856 sizeof(RcOverride
)*(i
+1));
2857 video_enc
->rc_override
[i
].start_frame
= start
;
2858 video_enc
->rc_override
[i
].end_frame
= end
;
2860 video_enc
->rc_override
[i
].qscale
= q
;
2861 video_enc
->rc_override
[i
].quality_factor
= 1.0;
2864 video_enc
->rc_override
[i
].qscale
= 0;
2865 video_enc
->rc_override
[i
].quality_factor
= -q
/100.0;
2870 video_enc
->rc_override_count
=i
;
2871 video_enc
->rc_initial_buffer_occupancy
= video_enc
->rc_buffer_size
*3/4;
2872 video_enc
->me_threshold
= me_threshold
;
2873 video_enc
->intra_dc_precision
= intra_dc_precision
- 8;
2874 video_enc
->strict_std_compliance
= strict
;
2877 video_enc
->rtp_mode
= 1;
2878 video_enc
->rtp_payload_size
= packet_size
;
2882 video_enc
->flags
|= CODEC_FLAG_PSNR
;
2884 video_enc
->me_method
= me_method
;
2889 video_enc
->flags
|= CODEC_FLAG_PASS1
;
2891 video_enc
->flags
|= CODEC_FLAG_PASS2
;
2896 /* reset some key parameters */
2898 video_codec_id
= CODEC_ID_NONE
;
2899 video_stream_copy
= 0;
2902 static void new_audio_stream(AVFormatContext
*oc
)
2905 AVCodecContext
*audio_enc
;
2908 st
= av_new_stream(oc
, oc
->nb_streams
);
2910 fprintf(stderr
, "Could not alloc stream\n");
2914 bitstream_filters
[nb_output_files
][oc
->nb_streams
- 1]= audio_bitstream_filters
;
2915 audio_bitstream_filters
= NULL
;
2917 #if defined(HAVE_THREADS)
2919 avcodec_thread_init(st
->codec
, thread_count
);
2922 audio_enc
= st
->codec
;
2923 audio_enc
->codec_type
= CODEC_TYPE_AUDIO
;
2924 audio_enc
->strict_std_compliance
= strict
;
2927 audio_enc
->codec_tag
= audio_codec_tag
;
2929 if (oc
->oformat
->flags
& AVFMT_GLOBALHEADER
) {
2930 audio_enc
->flags
|= CODEC_FLAG_GLOBAL_HEADER
;
2931 avctx_opts
->flags
|= CODEC_FLAG_GLOBAL_HEADER
;
2933 if (audio_stream_copy
) {
2934 st
->stream_copy
= 1;
2935 audio_enc
->channels
= audio_channels
;
2937 codec_id
= av_guess_codec(oc
->oformat
, NULL
, oc
->filename
, NULL
, CODEC_TYPE_AUDIO
);
2939 for(i
=0; i
<opt_name_count
; i
++){
2941 double d
= av_get_double(avctx_opts
, opt_names
[i
], &opt
);
2942 if(d
==d
&& (opt
->flags
&AV_OPT_FLAG_AUDIO_PARAM
) && (opt
->flags
&AV_OPT_FLAG_ENCODING_PARAM
))
2943 av_set_double(audio_enc
, opt_names
[i
], d
);
2946 if (audio_codec_id
!= CODEC_ID_NONE
)
2947 codec_id
= audio_codec_id
;
2948 audio_enc
->codec_id
= codec_id
;
2950 audio_enc
->bit_rate
= audio_bit_rate
;
2951 if (audio_qscale
> QSCALE_NONE
) {
2952 audio_enc
->flags
|= CODEC_FLAG_QSCALE
;
2953 audio_enc
->global_quality
= st
->quality
= FF_QP2LAMBDA
* audio_qscale
;
2955 audio_enc
->thread_count
= thread_count
;
2956 /* For audio codecs other than AC3 or DTS we limit */
2957 /* the number of coded channels to stereo */
2958 if (audio_channels
> 2 && codec_id
!= CODEC_ID_AC3
2959 && codec_id
!= CODEC_ID_DTS
) {
2960 audio_enc
->channels
= 2;
2962 audio_enc
->channels
= audio_channels
;
2964 audio_enc
->sample_rate
= audio_sample_rate
;
2965 audio_enc
->time_base
= (AVRational
){1, audio_sample_rate
};
2966 if (audio_language
) {
2967 pstrcpy(st
->language
, sizeof(st
->language
), audio_language
);
2968 av_free(audio_language
);
2969 audio_language
= NULL
;
2972 /* reset some key parameters */
2974 audio_codec_id
= CODEC_ID_NONE
;
2975 audio_stream_copy
= 0;
2978 static void opt_new_subtitle_stream(void)
2980 AVFormatContext
*oc
;
2982 AVCodecContext
*subtitle_enc
;
2985 if (nb_output_files
<= 0) {
2986 fprintf(stderr
, "At least one output file must be specified\n");
2989 oc
= output_files
[nb_output_files
- 1];
2991 st
= av_new_stream(oc
, oc
->nb_streams
);
2993 fprintf(stderr
, "Could not alloc stream\n");
2997 subtitle_enc
= st
->codec
;
2998 subtitle_enc
->codec_type
= CODEC_TYPE_SUBTITLE
;
2999 if (subtitle_stream_copy
) {
3000 st
->stream_copy
= 1;
3002 for(i
=0; i
<opt_name_count
; i
++){
3004 double d
= av_get_double(avctx_opts
, opt_names
[i
], &opt
);
3005 if(d
==d
&& (opt
->flags
&AV_OPT_FLAG_SUBTITLE_PARAM
) && (opt
->flags
&AV_OPT_FLAG_ENCODING_PARAM
))
3006 av_set_double(subtitle_enc
, opt_names
[i
], d
);
3008 subtitle_enc
->codec_id
= subtitle_codec_id
;
3011 if (subtitle_language
) {
3012 pstrcpy(st
->language
, sizeof(st
->language
), subtitle_language
);
3013 av_free(subtitle_language
);
3014 subtitle_language
= NULL
;
3017 subtitle_codec_id
= CODEC_ID_NONE
;
3018 subtitle_stream_copy
= 0;
3021 static void opt_new_audio_stream(void)
3023 AVFormatContext
*oc
;
3024 if (nb_output_files
<= 0) {
3025 fprintf(stderr
, "At least one output file must be specified\n");
3028 oc
= output_files
[nb_output_files
- 1];
3029 new_audio_stream(oc
);
3032 static void opt_new_video_stream(void)
3034 AVFormatContext
*oc
;
3035 if (nb_output_files
<= 0) {
3036 fprintf(stderr
, "At least one output file must be specified\n");
3039 oc
= output_files
[nb_output_files
- 1];
3040 new_video_stream(oc
);
3043 static void opt_output_file(const char *filename
)
3045 AVFormatContext
*oc
;
3046 int use_video
, use_audio
, input_has_video
, input_has_audio
, i
;
3047 AVFormatParameters params
, *ap
= ¶ms
;
3049 if (!strcmp(filename
, "-"))
3052 oc
= av_alloc_format_context();
3054 if (!file_oformat
) {
3055 file_oformat
= guess_format(NULL
, filename
, NULL
);
3056 if (!file_oformat
) {
3057 fprintf(stderr
, "Unable for find a suitable output format for '%s'\n",
3063 oc
->oformat
= file_oformat
;
3064 pstrcpy(oc
->filename
, sizeof(oc
->filename
), filename
);
3066 if (!strcmp(file_oformat
->name
, "ffm") &&
3067 strstart(filename
, "http:", NULL
)) {
3068 /* special case for files sent to ffserver: we get the stream
3069 parameters from ffserver */
3070 if (read_ffserver_streams(oc
, filename
) < 0) {
3071 fprintf(stderr
, "Could not read stream parameters from '%s'\n", filename
);
3075 use_video
= file_oformat
->video_codec
!= CODEC_ID_NONE
|| video_stream_copy
|| video_codec_id
!= CODEC_ID_NONE
;
3076 use_audio
= file_oformat
->audio_codec
!= CODEC_ID_NONE
|| audio_stream_copy
|| audio_codec_id
!= CODEC_ID_NONE
;
3078 /* disable if no corresponding type found and at least one
3080 if (nb_input_files
> 0) {
3081 check_audio_video_inputs(&input_has_video
, &input_has_audio
);
3082 if (!input_has_video
)
3084 if (!input_has_audio
)
3088 /* manual disable */
3089 if (audio_disable
) {
3092 if (video_disable
) {
3097 new_video_stream(oc
);
3101 new_audio_stream(oc
);
3104 oc
->timestamp
= rec_timestamp
;
3107 pstrcpy(oc
->title
, sizeof(oc
->title
), str_title
);
3109 pstrcpy(oc
->author
, sizeof(oc
->author
), str_author
);
3111 pstrcpy(oc
->copyright
, sizeof(oc
->copyright
), str_copyright
);
3113 pstrcpy(oc
->comment
, sizeof(oc
->comment
), str_comment
);
3115 pstrcpy(oc
->album
, sizeof(oc
->album
), str_album
);
3118 output_files
[nb_output_files
++] = oc
;
3120 /* check filename in case of an image number is expected */
3121 if (oc
->oformat
->flags
& AVFMT_NEEDNUMBER
) {
3122 if (!av_filename_number_test(oc
->filename
)) {
3123 print_error(oc
->filename
, AVERROR_NUMEXPECTED
);
3128 if (!(oc
->oformat
->flags
& AVFMT_NOFILE
)) {
3129 /* test if it already exists to avoid loosing precious files */
3130 if (!file_overwrite
&&
3131 (strchr(filename
, ':') == NULL
||
3132 strstart(filename
, "file:", NULL
))) {
3133 if (url_exist(filename
)) {
3136 if ( !using_stdin
) {
3137 fprintf(stderr
,"File '%s' already exists. Overwrite ? [y/N] ", filename
);
3140 if (toupper(c
) != 'Y') {
3141 fprintf(stderr
, "Not overwriting - exiting\n");
3146 fprintf(stderr
,"File '%s' already exists. Exiting.\n", filename
);
3153 if (url_fopen(&oc
->pb
, filename
, URL_WRONLY
) < 0) {
3154 fprintf(stderr
, "Could not open '%s'\n", filename
);
3159 memset(ap
, 0, sizeof(*ap
));
3160 if (av_set_parameters(oc
, ap
) < 0) {
3161 fprintf(stderr
, "%s: Invalid encoding parameters\n",
3166 oc
->preload
= (int)(mux_preload
*AV_TIME_BASE
);
3167 oc
->max_delay
= (int)(mux_max_delay
*AV_TIME_BASE
);
3168 oc
->loop_output
= loop_output
;
3170 for(i
=0; i
<opt_name_count
; i
++){
3172 double d
= av_get_double(avformat_opts
, opt_names
[i
], &opt
);
3173 if(d
==d
&& (opt
->flags
&AV_OPT_FLAG_ENCODING_PARAM
))
3174 av_set_double(oc
, opt_names
[i
], d
);
3177 /* reset some options */
3178 file_oformat
= NULL
;
3179 file_iformat
= NULL
;
3182 /* prepare dummy protocols for grab */
3183 static void prepare_grab(void)
3185 int has_video
, has_audio
, i
, j
;
3186 AVFormatContext
*oc
;
3187 AVFormatContext
*ic
;
3188 AVFormatParameters vp1
, *vp
= &vp1
;
3189 AVFormatParameters ap1
, *ap
= &ap1
;
3191 /* see if audio/video inputs are needed */
3194 memset(ap
, 0, sizeof(*ap
));
3195 memset(vp
, 0, sizeof(*vp
));
3196 vp
->time_base
.num
= 1;
3197 for(j
=0;j
<nb_output_files
;j
++) {
3198 oc
= output_files
[j
];
3199 for(i
=0;i
<oc
->nb_streams
;i
++) {
3200 AVCodecContext
*enc
= oc
->streams
[i
]->codec
;
3201 switch(enc
->codec_type
) {
3202 case CODEC_TYPE_AUDIO
:
3203 if (enc
->sample_rate
> ap
->sample_rate
)
3204 ap
->sample_rate
= enc
->sample_rate
;
3205 if (enc
->channels
> ap
->channels
)
3206 ap
->channels
= enc
->channels
;
3209 case CODEC_TYPE_VIDEO
:
3210 if (enc
->width
> vp
->width
)
3211 vp
->width
= enc
->width
;
3212 if (enc
->height
> vp
->height
)
3213 vp
->height
= enc
->height
;
3215 if (vp
->time_base
.num
*(int64_t)enc
->time_base
.den
> enc
->time_base
.num
*(int64_t)vp
->time_base
.den
){
3216 vp
->time_base
= enc
->time_base
;
3217 vp
->width
+= frame_leftBand
+ frame_rightBand
;
3218 vp
->width
-= (frame_padleft
+ frame_padright
);
3219 vp
->height
+= frame_topBand
+ frame_bottomBand
;
3220 vp
->height
-= (frame_padtop
+ frame_padbottom
);
3230 if (has_video
== 0 && has_audio
== 0) {
3231 fprintf(stderr
, "Output file must have at least one audio or video stream\n");
3236 AVInputFormat
*fmt1
;
3237 #warning FIXME: find a better interface
3238 if(video_device
&&!strncmp(video_device
,"x11:",4)) {
3239 video_grab_format
="x11grab";
3241 fmt1
= av_find_input_format(video_grab_format
);
3242 vp
->device
= video_device
;
3243 vp
->channel
= video_channel
;
3244 vp
->standard
= video_standard
;
3245 vp
->pix_fmt
= frame_pix_fmt
;
3246 if (av_open_input_file(&ic
, "", fmt1
, 0, vp
) < 0) {
3247 fprintf(stderr
, "Could not find video grab device\n");
3250 /* If not enough info to get the stream parameters, we decode the
3251 first frames to get it. */
3252 if ((ic
->ctx_flags
& AVFMTCTX_NOHEADER
) && av_find_stream_info(ic
) < 0) {
3253 fprintf(stderr
, "Could not find video grab parameters\n");
3256 /* by now video grab has one stream */
3257 ic
->streams
[0]->r_frame_rate
.num
= vp
->time_base
.den
;
3258 ic
->streams
[0]->r_frame_rate
.den
= vp
->time_base
.num
;
3259 input_files
[nb_input_files
] = ic
;
3262 dump_format(ic
, nb_input_files
, "", 0);
3266 if (has_audio
&& audio_grab_format
) {
3267 AVInputFormat
*fmt1
;
3268 fmt1
= av_find_input_format(audio_grab_format
);
3269 ap
->device
= audio_device
;
3270 if (av_open_input_file(&ic
, "", fmt1
, 0, ap
) < 0) {
3271 fprintf(stderr
, "Could not find audio grab device\n");
3274 input_files
[nb_input_files
] = ic
;
3277 dump_format(ic
, nb_input_files
, "", 0);
3283 /* same option as mencoder */
3284 static void opt_pass(const char *pass_str
)
3287 pass
= atoi(pass_str
);
3288 if (pass
!= 1 && pass
!= 2) {
3289 fprintf(stderr
, "pass number can be only 1 or 2\n");
3295 #if defined(__MINGW32__) || defined(CONFIG_OS2)
3296 static int64_t getutime(void)
3298 return av_gettime();
3301 static int64_t getutime(void)
3303 struct rusage rusage
;
3305 getrusage(RUSAGE_SELF
, &rusage
);
3306 return (rusage
.ru_utime
.tv_sec
* 1000000LL) + rusage
.ru_utime
.tv_usec
;
3310 #if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
3311 extern int ffm_nopts
;
3314 static void show_formats(void)
3316 AVInputFormat
*ifmt
;
3317 AVOutputFormat
*ofmt
;
3320 const char **pp
, *last_name
;
3322 printf("File formats:\n");
3327 const char *name
=NULL
;
3328 const char *long_name
=NULL
;
3330 for(ofmt
= first_oformat
; ofmt
!= NULL
; ofmt
= ofmt
->next
) {
3331 if((name
== NULL
|| strcmp(ofmt
->name
, name
)<0) &&
3332 strcmp(ofmt
->name
, last_name
)>0){
3334 long_name
= ofmt
->long_name
;
3338 for(ifmt
= first_iformat
; ifmt
!= NULL
; ifmt
= ifmt
->next
) {
3339 if((name
== NULL
|| strcmp(ifmt
->name
, name
)<0) &&
3340 strcmp(ifmt
->name
, last_name
)>0){
3342 long_name
= ifmt
->long_name
;
3345 if(name
&& strcmp(ifmt
->name
, name
)==0)
3357 long_name
? long_name
:" ");
3361 printf("Codecs:\n");
3367 const char *type_str
;
3370 for(p
= first_avcodec
; p
!= NULL
; p
= p
->next
) {
3371 if((p2
==NULL
|| strcmp(p
->name
, p2
->name
)<0) &&
3372 strcmp(p
->name
, last_name
)>0){
3374 decode
= encode
= cap
=0;
3376 if(p2
&& strcmp(p
->name
, p2
->name
)==0){
3377 if(p
->decode
) decode
=1;
3378 if(p
->encode
) encode
=1;
3379 cap
|= p
->capabilities
;
3384 last_name
= p2
->name
;
3387 case CODEC_TYPE_VIDEO
:
3390 case CODEC_TYPE_AUDIO
:
3393 case CODEC_TYPE_SUBTITLE
:
3402 decode
? "D": (/*p2->decoder ? "d":*/" "),
3405 cap
& CODEC_CAP_DRAW_HORIZ_BAND
? "S":" ",
3406 cap
& CODEC_CAP_DR1
? "D":" ",
3407 cap
& CODEC_CAP_TRUNCATED
? "T":" ",
3409 /* if(p2->decoder && decode==0)
3410 printf(" use %s for decoding", p2->decoder->name);*/
3415 printf("Supported file protocols:\n");
3416 for(up
= first_protocol
; up
!= NULL
; up
= up
->next
)
3417 printf(" %s:", up
->name
);
3420 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3421 printf("Motion estimation methods:\n");
3425 if ((pp
- motion_str
+ 1) == ME_ZERO
)
3426 printf("(fastest)");
3427 else if ((pp
- motion_str
+ 1) == ME_FULL
)
3428 printf("(slowest)");
3429 else if ((pp
- motion_str
+ 1) == ME_EPZS
)
3430 printf("(default)");
3435 "Note, the names of encoders and decoders dont always match, so there are\n"
3436 "several cases where the above table shows encoder only or decoder only entries\n"
3437 "even though both encoding and decoding are supported for example, the h263\n"
3438 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3443 static void parse_matrix_coeffs(uint16_t *dest
, const char *str
)
3446 const char *p
= str
;
3453 fprintf(stderr
, "Syntax error in matrix \"%s\" at coeff %d\n", str
, i
);
3460 static void opt_inter_matrix(const char *arg
)
3462 inter_matrix
= av_mallocz(sizeof(uint16_t) * 64);
3463 parse_matrix_coeffs(inter_matrix
, arg
);
3466 static void opt_intra_matrix(const char *arg
)
3468 intra_matrix
= av_mallocz(sizeof(uint16_t) * 64);
3469 parse_matrix_coeffs(intra_matrix
, arg
);
3472 static void opt_target(const char *arg
)
3475 static const char *const frame_rates
[] = {"25", "30000/1001", "24000/1001"};
3477 if(!strncmp(arg
, "pal-", 4)) {
3480 } else if(!strncmp(arg
, "ntsc-", 5)) {
3483 } else if(!strncmp(arg
, "film-", 5)) {
3488 /* Calculate FR via float to avoid int overflow */
3489 fr
= (int)(frame_rate
* 1000.0 / frame_rate_base
);
3492 } else if((fr
== 29970) || (fr
== 23976)) {
3495 /* Try to determine PAL/NTSC by peeking in the input files */
3496 if(nb_input_files
) {
3498 for(j
= 0; j
< nb_input_files
; j
++) {
3499 for(i
= 0; i
< input_files
[j
]->nb_streams
; i
++) {
3500 AVCodecContext
*c
= input_files
[j
]->streams
[i
]->codec
;
3501 if(c
->codec_type
!= CODEC_TYPE_VIDEO
)
3503 fr
= c
->time_base
.den
* 1000 / c
->time_base
.num
;
3507 } else if((fr
== 29970) || (fr
== 23976)) {
3517 if(verbose
&& norm
>= 0)
3518 fprintf(stderr
, "Assuming %s for target.\n", norm
? "NTSC" : "PAL");
3522 fprintf(stderr
, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3523 fprintf(stderr
, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3524 fprintf(stderr
, "or set a framerate with \"-r xxx\".\n");
3528 if(!strcmp(arg
, "vcd")) {
3530 opt_video_codec("mpeg1video");
3531 opt_audio_codec("mp2");
3534 opt_frame_size(norm
? "352x240" : "352x288");
3535 opt_frame_rate(frame_rates
[norm
]);
3536 opt_default("gop", norm
? "18" : "15");
3538 opt_default("b", "1150000");
3539 opt_default("maxrate", "1150000");
3540 opt_default("minrate", "1150000");
3541 opt_default("bufsize", "327680"); // 40*1024*8;
3543 audio_bit_rate
= 224000;
3544 audio_sample_rate
= 44100;
3546 opt_default("packetsize", "2324");
3547 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3549 /* We have to offset the PTS, so that it is consistent with the SCR.
3550 SCR starts at 36000, but the first two packs contain only padding
3551 and the first pack from the other stream, respectively, may also have
3552 been written before.
3553 So the real data starts at SCR 36000+3*1200. */
3554 mux_preload
= (36000+3*1200) / 90000.0; //0.44
3555 } else if(!strcmp(arg
, "svcd")) {
3557 opt_video_codec("mpeg2video");
3558 opt_audio_codec("mp2");
3561 opt_frame_size(norm
? "480x480" : "480x576");
3562 opt_frame_rate(frame_rates
[norm
]);
3563 opt_default("gop", norm
? "18" : "15");
3565 opt_default("b", "2040000");
3566 opt_default("maxrate", "2516000");
3567 opt_default("minrate", "0"); //1145000;
3568 opt_default("bufsize", "1835008"); //224*1024*8;
3569 opt_default("flags", "+SCAN_OFFSET");
3572 audio_bit_rate
= 224000;
3573 audio_sample_rate
= 44100;
3575 opt_default("packetsize", "2324");
3577 } else if(!strcmp(arg
, "dvd")) {
3579 opt_video_codec("mpeg2video");
3580 opt_audio_codec("ac3");
3583 opt_frame_size(norm
? "720x480" : "720x576");
3584 opt_frame_rate(frame_rates
[norm
]);
3585 opt_default("gop", norm
? "18" : "15");
3587 opt_default("b", "6000000");
3588 opt_default("maxrate", "9000000");
3589 opt_default("minrate", "0"); //1500000;
3590 opt_default("bufsize", "1835008"); //224*1024*8;
3592 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3593 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3595 audio_bit_rate
= 448000;
3596 audio_sample_rate
= 48000;
3598 } else if(!strncmp(arg
, "dv", 2)) {
3602 opt_frame_size(norm
? "720x480" : "720x576");
3603 opt_frame_pix_fmt(!strncmp(arg
, "dv50", 4) ? "yuv422p" :
3604 (norm
? "yuv411p" : "yuv420p"));
3605 opt_frame_rate(frame_rates
[norm
]);
3607 audio_sample_rate
= 48000;
3611 fprintf(stderr
, "Unknown target: %s\n", arg
);
3616 static void opt_video_bsf(const char *arg
)
3618 AVBitStreamFilterContext
*bsfc
= av_bitstream_filter_init(arg
); //FIXME split name and args for filter at '='
3619 AVBitStreamFilterContext
**bsfp
;
3622 fprintf(stderr
, "Unkown bitstream filter %s\n", arg
);
3626 bsfp
= &video_bitstream_filters
;
3628 bsfp
= &(*bsfp
)->next
;
3633 //FIXME avoid audio - video code duplication
3634 static void opt_audio_bsf(const char *arg
)
3636 AVBitStreamFilterContext
*bsfc
= av_bitstream_filter_init(arg
); //FIXME split name and args for filter at '='
3637 AVBitStreamFilterContext
**bsfp
;
3640 fprintf(stderr
, "Unkown bitstream filter %s\n", arg
);
3644 bsfp
= &audio_bitstream_filters
;
3646 bsfp
= &(*bsfp
)->next
;
3651 static void show_version(void)
3653 /* TODO: add function interface to avutil and avformat */
3654 fprintf(stderr
, "ffmpeg " FFMPEG_VERSION
"\n"
3658 LIBAVUTIL_BUILD
, avcodec_build(), LIBAVFORMAT_BUILD
);
3662 static int opt_default(const char *opt
, const char *arg
){
3663 AVOption
*o
= av_set_string(avctx_opts
, opt
, arg
);
3665 o
= av_set_string(avformat_opts
, opt
, arg
);
3669 // 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));
3671 //FIXME we should always use avctx_opts, ... for storing options so there wont be any need to keep track of whats set over this
3672 opt_names
= av_realloc(opt_names
, sizeof(void*)*(opt_name_count
+1));
3673 opt_names
[opt_name_count
++]= o
->name
;
3675 #if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
3676 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3677 if(avctx_opts
->flags
& CODEC_FLAG_BITEXACT
)
3681 if(avctx_opts
->debug
)
3682 av_log_set_level(AV_LOG_DEBUG
);
3686 const OptionDef options
[] = {
3688 { "L", 0, {(void*)show_license
}, "show license" },
3689 { "h", 0, {(void*)show_help
}, "show help" },
3690 { "version", 0, {(void*)show_version
}, "show version" },
3691 { "formats", 0, {(void*)show_formats
}, "show available formats, codecs, protocols, ..." },
3692 { "f", HAS_ARG
, {(void*)opt_format
}, "force format", "fmt" },
3693 { "i", HAS_ARG
, {(void*)opt_input_file
}, "input file name", "filename" },
3694 { "y", OPT_BOOL
, {(void*)&file_overwrite
}, "overwrite output files" },
3695 { "map", HAS_ARG
| OPT_EXPERT
, {(void*)opt_map
}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3696 { "map_meta_data", HAS_ARG
| OPT_EXPERT
, {(void*)opt_map_meta_data
}, "set meta data information of outfile from infile", "outfile:infile" },
3697 { "t", HAS_ARG
, {(void*)opt_recording_time
}, "set the recording time", "duration" },
3698 { "fs", HAS_ARG
| OPT_INT
, {(void*)&limit_filesize
}, "set the limit file size", "limit_size" }, //
3699 { "ss", HAS_ARG
, {(void*)opt_start_time
}, "set the start time offset", "time_off" },
3700 { "itsoffset", HAS_ARG
, {(void*)opt_input_ts_offset
}, "set the input ts offset", "time_off" },
3701 { "title", HAS_ARG
| OPT_STRING
, {(void*)&str_title
}, "set the title", "string" },
3702 { "timestamp", HAS_ARG
, {(void*)&opt_rec_timestamp
}, "set the timestamp", "time" },
3703 { "author", HAS_ARG
| OPT_STRING
, {(void*)&str_author
}, "set the author", "string" },
3704 { "copyright", HAS_ARG
| OPT_STRING
, {(void*)&str_copyright
}, "set the copyright", "string" },
3705 { "comment", HAS_ARG
| OPT_STRING
, {(void*)&str_comment
}, "set the comment", "string" },
3706 { "album", HAS_ARG
| OPT_STRING
, {(void*)&str_album
}, "set the album", "string" },
3707 { "benchmark", OPT_BOOL
| OPT_EXPERT
, {(void*)&do_benchmark
},
3708 "add timings for benchmarking" },
3709 { "dump", OPT_BOOL
| OPT_EXPERT
, {(void*)&do_pkt_dump
},
3710 "dump each input packet" },
3711 { "hex", OPT_BOOL
| OPT_EXPERT
, {(void*)&do_hex_dump
},
3712 "when dumping packets, also dump the payload" },
3713 { "re", OPT_BOOL
| OPT_EXPERT
, {(void*)&rate_emu
}, "read input at native frame rate", "" },
3714 { "loop_input", OPT_BOOL
| OPT_EXPERT
, {(void*)&loop_input
}, "loop (current only works with images)" },
3715 { "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)", "" },
3716 { "v", HAS_ARG
, {(void*)opt_verbose
}, "control amount of logging", "verbose" },
3717 { "target", HAS_ARG
, {(void*)opt_target
}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3718 { "threads", HAS_ARG
| OPT_EXPERT
, {(void*)opt_thread_count
}, "thread count", "count" },
3719 { "vsync", HAS_ARG
| OPT_INT
| OPT_EXPERT
, {(void*)&video_sync_method
}, "video sync method", "" },
3720 { "async", HAS_ARG
| OPT_INT
| OPT_EXPERT
, {(void*)&audio_sync_method
}, "audio sync method", "" },
3721 { "vglobal", HAS_ARG
| OPT_INT
| OPT_EXPERT
, {(void*)&video_global_header
}, "video global header storage type", "" },
3722 { "copyts", OPT_BOOL
| OPT_EXPERT
, {(void*)©_ts
}, "copy timestamps" },
3723 { "shortest", OPT_BOOL
| OPT_EXPERT
, {(void*)&opt_shortest
}, "finish encoding within shortest input" }, //
3724 { "dts_delta_threshold", HAS_ARG
| OPT_INT
| OPT_EXPERT
, {(void*)&dts_delta_threshold
}, "timestamp discontinuity delta threshold", "" },
3727 { "vframes", OPT_INT
| HAS_ARG
| OPT_VIDEO
, {(void*)&max_frames
[CODEC_TYPE_VIDEO
]}, "set the number of video frames to record", "number" },
3728 { "aframes", OPT_INT
| HAS_ARG
| OPT_AUDIO
, {(void*)&max_frames
[CODEC_TYPE_AUDIO
]}, "set the number of audio frames to record", "number" },
3729 { "dframes", OPT_INT
| HAS_ARG
, {(void*)&max_frames
[CODEC_TYPE_DATA
]}, "set the number of data frames to record", "number" },
3730 { "r", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_rate
}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3731 { "s", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_size
}, "set frame size (WxH or abbreviation)", "size" },
3732 { "aspect", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_aspect_ratio
}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3733 { "pix_fmt", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_frame_pix_fmt
}, "set pixel format", "format" },
3734 { "croptop", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_crop_top
}, "set top crop band size (in pixels)", "size" },
3735 { "cropbottom", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_crop_bottom
}, "set bottom crop band size (in pixels)", "size" },
3736 { "cropleft", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_crop_left
}, "set left crop band size (in pixels)", "size" },
3737 { "cropright", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_crop_right
}, "set right crop band size (in pixels)", "size" },
3738 { "padtop", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_pad_top
}, "set top pad band size (in pixels)", "size" },
3739 { "padbottom", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_pad_bottom
}, "set bottom pad band size (in pixels)", "size" },
3740 { "padleft", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_pad_left
}, "set left pad band size (in pixels)", "size" },
3741 { "padright", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_pad_right
}, "set right pad band size (in pixels)", "size" },
3742 { "padcolor", HAS_ARG
| OPT_VIDEO
, {(void*)opt_pad_color
}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3743 { "intra", OPT_BOOL
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&intra_only
}, "use only intra frames"},
3744 { "vn", OPT_BOOL
| OPT_VIDEO
, {(void*)&video_disable
}, "disable video" },
3745 { "vdt", OPT_INT
| HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&video_discard
}, "discard threshold", "n" },
3746 { "qscale", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_qscale
}, "use fixed video quantizer scale (VBR)", "q" },
3747 { "qdiff", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_qdiff
}, "max difference between the quantizer scale (VBR)", "q" },
3748 { "rc_eq", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_video_rc_eq
}, "set rate control equation", "equation" },
3749 { "rc_override", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_video_rc_override_string
}, "rate control override for specific intervals", "override" },
3750 { "vcodec", HAS_ARG
| OPT_VIDEO
, {(void*)opt_video_codec
}, "force video codec ('copy' to copy stream)", "codec" },
3751 { "me", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_motion_estimation
}, "set motion estimation method",
3753 { "me_threshold", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_me_threshold
}, "motion estimaton threshold", "" },
3754 { "ps", HAS_ARG
| OPT_EXPERT
, {(void*)opt_packet_size
}, "set packet size in bits", "size" },
3755 { "strict", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_strict
}, "how strictly to follow the standards", "strictness" },
3756 { "sameq", OPT_BOOL
| OPT_VIDEO
, {(void*)&same_quality
},
3757 "use same video quality as source (implies VBR)" },
3758 { "pass", HAS_ARG
| OPT_VIDEO
, {(void*)&opt_pass
}, "select the pass number (1 or 2)", "n" },
3759 { "passlogfile", HAS_ARG
| OPT_STRING
| OPT_VIDEO
, {(void*)&pass_logfilename
}, "select two pass log file name", "file" },
3760 { "deinterlace", OPT_BOOL
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&do_deinterlace
},
3761 "deinterlace pictures" },
3762 { "psnr", OPT_BOOL
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&do_psnr
}, "calculate PSNR of compressed frames" },
3763 { "vstats", OPT_BOOL
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&do_vstats
}, "dump video coding statistics to file" },
3764 { "vhook", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)add_frame_hooker
}, "insert video processing module", "module" },
3765 { "intra_matrix", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_intra_matrix
}, "specify intra matrix coeffs", "matrix" },
3766 { "inter_matrix", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_inter_matrix
}, "specify inter matrix coeffs", "matrix" },
3767 { "top", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_top_field_first
}, "top=1/bottom=0/auto=-1 field first", "" },
3768 { "dc", OPT_INT
| HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&intra_dc_precision
}, "intra_dc_precision", "precision" },
3769 { "vtag", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_video_tag
}, "force video tag/fourcc", "fourcc/tag" },
3770 { "newvideo", OPT_VIDEO
, {(void*)opt_new_video_stream
}, "add a new video stream to the current output stream" },
3771 { "qphist", OPT_BOOL
| OPT_EXPERT
| OPT_VIDEO
, { (void *)&qp_hist
}, "show QP histogram" },
3774 { "ab", HAS_ARG
| OPT_AUDIO
, {(void*)opt_audio_bitrate
}, "set audio bitrate (in kbit/s)", "bitrate", },
3775 { "aq", OPT_FLOAT
| HAS_ARG
| OPT_AUDIO
, {(void*)&audio_qscale
}, "set audio quality (codec-specific)", "quality", },
3776 { "ar", HAS_ARG
| OPT_AUDIO
, {(void*)opt_audio_rate
}, "set audio sampling rate (in Hz)", "rate" },
3777 { "ac", HAS_ARG
| OPT_AUDIO
, {(void*)opt_audio_channels
}, "set number of audio channels", "channels" },
3778 { "an", OPT_BOOL
| OPT_AUDIO
, {(void*)&audio_disable
}, "disable audio" },
3779 { "acodec", HAS_ARG
| OPT_AUDIO
, {(void*)opt_audio_codec
}, "force audio codec ('copy' to copy stream)", "codec" },
3780 { "atag", HAS_ARG
| OPT_EXPERT
| OPT_AUDIO
, {(void*)opt_audio_tag
}, "force audio tag/fourcc", "fourcc/tag" },
3781 { "vol", OPT_INT
| HAS_ARG
| OPT_AUDIO
, {(void*)&audio_volume
}, "change audio volume (256=normal)" , "volume" }, //
3782 { "newaudio", OPT_AUDIO
, {(void*)opt_new_audio_stream
}, "add a new audio stream to the current output stream" },
3783 { "alang", HAS_ARG
| OPT_STRING
| OPT_AUDIO
, {(void *)&audio_language
}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3785 /* subtitle options */
3786 { "scodec", HAS_ARG
| OPT_SUBTITLE
, {(void*)opt_subtitle_codec
}, "force subtitle codec ('copy' to copy stream)", "codec" },
3787 { "newsubtitle", OPT_SUBTITLE
, {(void*)opt_new_subtitle_stream
}, "add a new subtitle stream to the current output stream" },
3788 { "slang", HAS_ARG
| OPT_STRING
| OPT_SUBTITLE
, {(void *)&subtitle_language
}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3791 { "vd", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
| OPT_GRAB
, {(void*)opt_video_device
}, "set video grab device", "device" },
3792 { "vc", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
| OPT_GRAB
, {(void*)opt_video_channel
}, "set video grab channel (DV1394 only)", "channel" },
3793 { "tvstd", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
| OPT_GRAB
, {(void*)opt_video_standard
}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3794 { "ad", HAS_ARG
| OPT_EXPERT
| OPT_AUDIO
| OPT_GRAB
, {(void*)opt_audio_device
}, "set audio device", "device" },
3796 /* G.2 grab options */
3797 { "grab", HAS_ARG
| OPT_EXPERT
| OPT_GRAB
, {(void*)opt_grab
}, "request grabbing using", "format" },
3798 { "gd", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
| OPT_GRAB
, {(void*)opt_grab_device
}, "set grab device", "device" },
3801 { "muxdelay", OPT_FLOAT
| HAS_ARG
| OPT_EXPERT
, {(void*)&mux_max_delay
}, "set the maximum demux-decode delay", "seconds" },
3802 { "muxpreload", OPT_FLOAT
| HAS_ARG
| OPT_EXPERT
, {(void*)&mux_preload
}, "set the initial demux-decode delay", "seconds" },
3804 { "absf", HAS_ARG
| OPT_AUDIO
| OPT_EXPERT
, {(void*)opt_audio_bsf
}, "", "bitstream filter" },
3805 { "vbsf", HAS_ARG
| OPT_VIDEO
| OPT_EXPERT
, {(void*)opt_video_bsf
}, "", "bitstream filter" },
3807 { "default", OPT_FUNC2
| HAS_ARG
| OPT_AUDIO
| OPT_VIDEO
| OPT_EXPERT
, {(void*)opt_default
}, "generic catch all option", "" },
3811 static void show_banner(void)
3813 fprintf(stderr
, "FFmpeg version " FFMPEG_VERSION
", Copyright (c) 2000-2006 Fabrice Bellard, et al.\n");
3814 fprintf(stderr
, " configuration: " FFMPEG_CONFIGURATION
"\n");
3815 fprintf(stderr
, " libavutil version: " AV_STRINGIFY(LIBAVUTIL_VERSION
) "\n");
3816 fprintf(stderr
, " libavcodec version: " AV_STRINGIFY(LIBAVCODEC_VERSION
) "\n");
3817 fprintf(stderr
, " libavformat version: " AV_STRINGIFY(LIBAVFORMAT_VERSION
) "\n");
3818 fprintf(stderr
, " built on " __DATE__
" " __TIME__
);
3820 fprintf(stderr
, ", gcc: " __VERSION__
"\n");
3822 fprintf(stderr
, ", using a non-gcc compiler\n");
3826 static void show_license(void)
3831 "FFmpeg is free software; you can redistribute it and/or modify\n"
3832 "it under the terms of the GNU General Public License as published by\n"
3833 "the Free Software Foundation; either version 2 of the License, or\n"
3834 "(at your option) any later version.\n"
3836 "FFmpeg is distributed in the hope that it will be useful,\n"
3837 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3838 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
3839 "GNU General Public License for more details.\n"
3841 "You should have received a copy of the GNU General Public License\n"
3842 "along with FFmpeg; if not, write to the Free Software\n"
3843 "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
3847 "FFmpeg is free software; you can redistribute it and/or\n"
3848 "modify it under the terms of the GNU Lesser General Public\n"
3849 "License as published by the Free Software Foundation; either\n"
3850 "version 2.1 of the License, or (at your option) any later version.\n"
3852 "FFmpeg is distributed in the hope that it will be useful,\n"
3853 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3854 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
3855 "Lesser General Public License for more details.\n"
3857 "You should have received a copy of the GNU Lesser General Public\n"
3858 "License along with FFmpeg; if not, write to the Free Software\n"
3859 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
3865 static void show_help(void)
3868 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3869 "Hyper fast Audio and Video encoder\n");
3871 show_help_options(options
, "Main options:\n",
3872 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
, 0);
3873 show_help_options(options
, "\nVideo options:\n",
3874 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_GRAB
,
3876 show_help_options(options
, "\nAdvanced Video options:\n",
3877 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_GRAB
,
3878 OPT_VIDEO
| OPT_EXPERT
);
3879 show_help_options(options
, "\nAudio options:\n",
3880 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_GRAB
,
3882 show_help_options(options
, "\nAdvanced Audio options:\n",
3883 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_GRAB
,
3884 OPT_AUDIO
| OPT_EXPERT
);
3885 show_help_options(options
, "\nSubtitle options:\n",
3886 OPT_SUBTITLE
| OPT_GRAB
,
3888 show_help_options(options
, "\nAudio/Video grab options:\n",
3891 show_help_options(options
, "\nAdvanced options:\n",
3892 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_GRAB
,
3894 av_opt_show(avctx_opts
, NULL
);
3895 av_opt_show(avformat_opts
, NULL
);
3900 void parse_arg_file(const char *filename
)
3902 opt_output_file(filename
);
3905 int main(int argc
, char **argv
)
3912 avctx_opts
= avcodec_alloc_context();
3913 avformat_opts
= av_alloc_format_context();
3921 parse_options(argc
, argv
, options
);
3923 /* file converter / grab */
3924 if (nb_output_files
<= 0) {
3925 fprintf(stderr
, "Must supply at least one output file\n");
3929 if (nb_input_files
== 0) {
3935 av_encode(output_files
, nb_output_files
, input_files
, nb_input_files
,
3936 stream_maps
, nb_stream_maps
);
3937 ti
= getutime() - ti
;
3939 printf("bench: utime=%0.3fs\n", ti
/ 1000000.0);
3943 for(i
=0;i
<nb_output_files
;i
++) {
3944 /* maybe av_close_output_file ??? */
3945 AVFormatContext
*s
= output_files
[i
];
3947 if (!(s
->oformat
->flags
& AVFMT_NOFILE
))
3949 for(j
=0;j
<s
->nb_streams
;j
++) {
3950 av_free(s
->streams
[j
]->codec
);
3951 av_free(s
->streams
[j
]);
3955 for(i
=0;i
<nb_input_files
;i
++)
3956 av_close_input_file(input_files
[i
]);
3961 av_free(intra_matrix
);
3963 av_free(inter_matrix
);
3965 #ifdef POWERPC_PERFORMANCE_REPORT
3966 extern void powerpc_display_perf_report(void);
3967 powerpc_display_perf_report();
3968 #endif /* POWERPC_PERFORMANCE_REPORT */
3970 if (received_sigterm
) {
3972 "Received signal %d: terminating.\n",
3973 (int) received_sigterm
);
3977 exit(0); /* not all OS-es handle main() return value */