3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #define HAVE_AV_CONFIG_H
22 #include "framehook.h"
28 #include <sys/ioctl.h>
31 #include <sys/resource.h>
35 #include <sys/types.h>
36 #include <sys/select.h>
39 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
47 #if !defined(INFINITY) && defined(HUGE_VAL)
48 #define INFINITY HUGE_VAL
51 /* select an input stream for an output stream */
52 typedef struct AVStreamMap
{
57 /** select an input file for an output file */
58 typedef struct AVMetaDataMap
{
63 extern const OptionDef options
[];
65 static void show_help(void);
66 static void show_license(void);
70 static AVFormatContext
*input_files
[MAX_FILES
];
71 static int64_t input_files_ts_offset
[MAX_FILES
];
72 static int nb_input_files
= 0;
74 static AVFormatContext
*output_files
[MAX_FILES
];
75 static int nb_output_files
= 0;
77 static AVStreamMap stream_maps
[MAX_FILES
];
78 static int nb_stream_maps
;
80 static AVMetaDataMap meta_data_maps
[MAX_FILES
];
81 static int nb_meta_data_maps
;
83 static AVInputFormat
*file_iformat
;
84 static AVOutputFormat
*file_oformat
;
85 static AVImageFormat
*image_format
;
86 static int frame_width
= 0;
87 static int frame_height
= 0;
88 static float frame_aspect_ratio
= 0;
89 static enum PixelFormat frame_pix_fmt
= PIX_FMT_NONE
;
90 static int frame_padtop
= 0;
91 static int frame_padbottom
= 0;
92 static int frame_padleft
= 0;
93 static int frame_padright
= 0;
94 static int padcolor
[3] = {16,128,128}; /* default to black */
95 static int frame_topBand
= 0;
96 static int frame_bottomBand
= 0;
97 static int frame_leftBand
= 0;
98 static int frame_rightBand
= 0;
99 static int max_frames
[3] = {INT_MAX
, INT_MAX
, INT_MAX
};
100 static int frame_rate
= 25;
101 static int frame_rate_base
= 1;
102 static int video_bit_rate
= 200*1000;
103 static int video_bit_rate_tolerance
= 4000*1000;
104 static float video_qscale
= 0;
105 static int video_qmin
= 2;
106 static int video_qmax
= 31;
107 static int video_lmin
= 2*FF_QP2LAMBDA
;
108 static int video_lmax
= 31*FF_QP2LAMBDA
;
109 static int video_mb_lmin
= 2*FF_QP2LAMBDA
;
110 static int video_mb_lmax
= 31*FF_QP2LAMBDA
;
111 static int video_qdiff
= 3;
112 static int video_lelim
= 0;
113 static int video_celim
= 0;
114 static float video_qblur
= 0.5;
115 static float video_qsquish
= 0.0;
116 static float video_qcomp
= 0.5;
117 static uint16_t *intra_matrix
= NULL
;
118 static uint16_t *inter_matrix
= NULL
;
119 #if 0 //experimental, (can be removed)
120 static float video_rc_qsquish
=1.0;
121 static float video_rc_qmod_amp
=0;
122 static int video_rc_qmod_freq
=0;
124 static char *video_rc_override_string
=NULL
;
125 static char *video_rc_eq
="tex^qComp";
126 static int video_rc_buffer_size
=0;
127 static float video_rc_buffer_aggressivity
=1.0;
128 static int video_rc_max_rate
=0;
129 static int video_rc_min_rate
=0;
130 static float video_rc_initial_cplx
=0;
131 static float video_b_qfactor
= 1.25;
132 static float video_b_qoffset
= 1.25;
133 static float video_i_qfactor
= -0.8;
134 static float video_i_qoffset
= 0.0;
135 static int video_intra_quant_bias
= FF_DEFAULT_QUANT_BIAS
;
136 static int video_inter_quant_bias
= FF_DEFAULT_QUANT_BIAS
;
137 static int me_method
= ME_EPZS
;
138 static int video_disable
= 0;
139 static int video_discard
= 0;
140 static int video_codec_id
= CODEC_ID_NONE
;
141 static int video_codec_tag
= 0;
142 static int same_quality
= 0;
143 static int b_frames
= 0;
144 static int b_strategy
= 0;
145 static int mb_decision
= FF_MB_DECISION_SIMPLE
;
146 static int ildct_cmp
= FF_CMP_VSAD
;
147 static int mb_cmp
= FF_CMP_SAD
;
148 static int sub_cmp
= FF_CMP_SAD
;
149 static int cmp
= FF_CMP_SAD
;
150 static int pre_cmp
= FF_CMP_SAD
;
151 static int pre_me
= 0;
152 static float lumi_mask
= 0;
153 static float dark_mask
= 0;
154 static float scplx_mask
= 0;
155 static float tcplx_mask
= 0;
156 static float p_mask
= 0;
157 static int use_4mv
= 0;
158 static int use_obmc
= 0;
159 static int use_loop
= 0;
160 static int use_aic
= 0;
161 static int use_aiv
= 0;
162 static int use_umv
= 0;
163 static int use_ss
= 0;
164 static int use_alt_scan
= 0;
165 static int use_trell
= 0;
166 static int use_scan_offset
= 0;
167 static int use_qpel
= 0;
168 static int use_qprd
= 0;
169 static int use_cbprd
= 0;
170 static int use_mv0
= 0;
171 static int do_normalize_aqp
= 0;
173 static int closed_gop
= 0;
174 static int strict_gop
= 0;
175 static int no_output
= 0;
176 static int do_deinterlace
= 0;
177 static int do_interlace_dct
= 0;
178 static int do_interlace_me
= 0;
179 static int workaround_bugs
= FF_BUG_AUTODETECT
;
180 static int error_resilience
= 2;
181 static int error_concealment
= 3;
182 static int dct_algo
= 0;
183 static int idct_algo
= 0;
184 static int use_part
= 0;
185 static int packet_size
= 0;
186 static int error_rate
= 0;
187 static int strict
= 0;
188 static int top_field_first
= -1;
189 static int noise_reduction
= 0;
190 static int sc_threshold
= 0;
191 static int debug
= 0;
192 static int debug_mv
= 0;
193 static int me_threshold
= 0;
194 static int mb_threshold
= 0;
195 static int intra_dc_precision
= 8;
196 static int coder
= 0;
197 static int context
= 0;
198 static int predictor
= 0;
199 static int video_profile
= FF_PROFILE_UNKNOWN
;
200 static int video_level
= FF_LEVEL_UNKNOWN
;
201 static int nsse_weight
= 8;
202 static int subpel_quality
= 8;
203 static int me_penalty_compensation
= 256;
204 static int lowres
= 0;
205 static int frame_skip_threshold
= 0;
206 static int frame_skip_factor
= 0;
207 static int frame_skip_exp
= 0;
208 static int frame_skip_cmp
= FF_CMP_DCTMAX
;
209 extern int loop_input
; /* currently a hack */
211 static int gop_size
= 12;
212 static int intra_only
= 0;
213 static int audio_sample_rate
= 44100;
214 static int audio_bit_rate
= 64000;
215 static int audio_disable
= 0;
216 static int audio_channels
= 1;
217 static int audio_codec_id
= CODEC_ID_NONE
;
218 static int audio_codec_tag
= 0;
220 static int mux_rate
= 0;
221 static int mux_packet_size
= 0;
222 static float mux_preload
= 0.5;
223 static float mux_max_delay
= 0.7;
225 static int64_t recording_time
= 0;
226 static int64_t start_time
= 0;
227 static int64_t rec_timestamp
= 0;
228 static int64_t input_ts_offset
= 0;
229 static int file_overwrite
= 0;
230 static char *str_title
= NULL
;
231 static char *str_author
= NULL
;
232 static char *str_copyright
= NULL
;
233 static char *str_comment
= NULL
;
234 static int do_benchmark
= 0;
235 static int do_hex_dump
= 0;
236 static int do_pkt_dump
= 0;
237 static int do_psnr
= 0;
238 static int do_vstats
= 0;
239 static int do_pass
= 0;
240 static int bitexact
= 0;
241 static char *pass_logfilename
= NULL
;
242 static int audio_stream_copy
= 0;
243 static int video_stream_copy
= 0;
244 static int video_sync_method
= 1;
245 static int audio_sync_method
= 0;
246 static int copy_ts
= 0;
247 static int opt_shortest
= 0; //
249 static int rate_emu
= 0;
251 static char *video_grab_format
= "video4linux";
252 static char *video_device
= NULL
;
253 static char *grab_device
= NULL
;
254 static int video_channel
= 0;
255 static char *video_standard
= "ntsc";
257 static char *audio_grab_format
= "audio_device";
258 static char *audio_device
= NULL
;
259 static int audio_volume
= 256;
261 static int using_stdin
= 0;
262 static int using_vhook
= 0;
263 static int verbose
= 1;
264 static int thread_count
= 1;
265 static int q_pressed
= 0;
266 static int me_range
= 0;
267 static int64_t video_size
= 0;
268 static int64_t audio_size
= 0;
269 static int64_t extra_size
= 0;
270 static int nb_frames_dup
= 0;
271 static int nb_frames_drop
= 0;
272 static int input_sync
;
273 static int limit_filesize
= 0; //
275 static int pgmyuv_compatibility_hack
=0;
278 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
280 typedef struct AVOutputStream
{
281 int file_index
; /* file index */
282 int index
; /* stream index in the output file */
283 int source_index
; /* AVInputStream index */
284 AVStream
*st
; /* stream in the output file */
285 int encoding_needed
; /* true if encoding needed for this stream */
287 /* input pts and corresponding output pts
289 double sync_ipts
; /* dts from the AVPacket of the demuxer in second units */
290 int64_t sync_opts
; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
292 int video_resample
; /* video_resample and video_crop are mutually exclusive */
293 AVFrame pict_tmp
; /* temporary image for resampling */
294 ImgReSampleContext
*img_resample_ctx
; /* for image resampling */
296 int video_crop
; /* video_resample and video_crop are mutually exclusive */
297 int topBand
; /* cropping area sizes */
300 int video_pad
; /* video_resample and video_pad are mutually exclusive */
301 int padtop
; /* padding area sizes */
308 ReSampleContext
*resample
; /* for audio resampling */
309 FifoBuffer fifo
; /* for compression: one audio fifo per codec */
313 typedef struct AVInputStream
{
317 int discard
; /* true if stream data should be discarded */
318 int decoding_needed
; /* true if the packets must be decoded in 'raw_fifo' */
319 int64_t sample_index
; /* current sample */
321 int64_t start
; /* time when read started */
322 unsigned long frame
; /* current frame */
323 int64_t next_pts
; /* synthetic pts for cases where pkt.pts
325 int64_t pts
; /* current pts */
326 int is_start
; /* is 1 at the start and after a discontinuity */
329 typedef struct AVInputFile
{
330 int eof_reached
; /* true if eof reached */
331 int ist_index
; /* index of first stream in ist_table */
332 int buffer_size
; /* current total buffer size */
333 int buffer_size_max
; /* buffer size at which we consider we can stop
335 int nb_streams
; /* nb streams we are aware of */
340 /* init terminal so that we can grab keys */
341 static struct termios oldtty
;
343 static void term_exit(void)
345 tcsetattr (0, TCSANOW
, &oldtty
);
348 static volatile sig_atomic_t received_sigterm
= 0;
351 sigterm_handler(int sig
)
353 received_sigterm
= sig
;
357 static void term_init(void)
364 tty
.c_iflag
&= ~(IGNBRK
|BRKINT
|PARMRK
|ISTRIP
365 |INLCR
|IGNCR
|ICRNL
|IXON
);
366 tty
.c_oflag
|= OPOST
;
367 tty
.c_lflag
&= ~(ECHO
|ECHONL
|ICANON
|IEXTEN
);
368 tty
.c_cflag
&= ~(CSIZE
|PARENB
);
373 tcsetattr (0, TCSANOW
, &tty
);
375 signal(SIGINT
, sigterm_handler
); /* Interrupt (ANSI). */
376 signal(SIGQUIT
, sigterm_handler
); /* Quit (POSIX). */
377 signal(SIGTERM
, sigterm_handler
); /* Termination (ANSI). */
379 register a function to be called at normal program termination
382 #ifdef CONFIG_BEOS_NETSERVER
383 fcntl(0, F_SETFL
, fcntl(0, F_GETFL
) | O_NONBLOCK
);
387 /* read a key without blocking */
388 static int read_key(void)
392 #ifndef CONFIG_BEOS_NETSERVER
400 n
= select(1, &rfds
, NULL
, NULL
, &tv
);
412 static int decode_interrupt_cb(void)
414 return q_pressed
|| (q_pressed
= read_key() == 'q');
419 static volatile int received_sigterm
= 0;
421 /* no interactive support */
422 static void term_exit(void)
426 static void term_init(void)
430 static int read_key(void)
437 static int read_ffserver_streams(AVFormatContext
*s
, const char *filename
)
442 err
= av_open_input_file(&ic
, filename
, NULL
, FFM_PACKET_SIZE
, NULL
);
445 /* copy stream format */
446 s
->nb_streams
= ic
->nb_streams
;
447 for(i
=0;i
<ic
->nb_streams
;i
++) {
450 st
= av_mallocz(sizeof(AVStream
));
451 memcpy(st
, ic
->streams
[i
], sizeof(AVStream
));
455 av_close_input_file(ic
);
459 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
461 static void do_audio_out(AVFormatContext
*s
,
464 unsigned char *buf
, int size
)
467 static uint8_t *audio_buf
= NULL
;
468 static uint8_t *audio_out
= NULL
;
469 const int audio_out_size
= 4*MAX_AUDIO_PACKET_SIZE
;
471 int size_out
, frame_bytes
, ret
;
472 AVCodecContext
*enc
= &ost
->st
->codec
;
474 /* SC: dynamic allocation of buffers */
476 audio_buf
= av_malloc(2*MAX_AUDIO_PACKET_SIZE
);
478 audio_out
= av_malloc(audio_out_size
);
479 if (!audio_buf
|| !audio_out
)
480 return; /* Should signal an error ! */
482 if(audio_sync_method
){
483 double delta
= ost
->sync_ipts
* enc
->sample_rate
- ost
->sync_opts
484 - fifo_size(&ost
->fifo
, ost
->fifo
.rptr
)/(ost
->st
->codec
.channels
* 2);
485 double idelta
= delta
*ist
->st
->codec
.sample_rate
/ enc
->sample_rate
;
486 int byte_delta
= ((int)idelta
)*2*ist
->st
->codec
.channels
;
488 //FIXME resample delay
489 if(fabs(delta
) > 50){
492 byte_delta
= FFMAX(byte_delta
, -size
);
496 fprintf(stderr
, "discarding %d audio samples\n", (int)-delta
);
501 static uint8_t *input_tmp
= NULL
;
502 input_tmp
= av_realloc(input_tmp
, byte_delta
+ size
);
504 if(byte_delta
+ size
<= MAX_AUDIO_PACKET_SIZE
)
507 byte_delta
= MAX_AUDIO_PACKET_SIZE
- size
;
509 memset(input_tmp
, 0, byte_delta
);
510 memcpy(input_tmp
+ byte_delta
, buf
, size
);
514 fprintf(stderr
, "adding %d audio samples of silence\n", (int)delta
);
516 }else if(audio_sync_method
>1){
517 int comp
= clip(delta
, -audio_sync_method
, audio_sync_method
);
518 assert(ost
->audio_resample
);
520 fprintf(stderr
, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta
, comp
, enc
->sample_rate
);
521 // fprintf(stderr, "drift:%f len:%d opts:%lld ipts:%lld fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(ost->sync_ipts * enc->sample_rate), fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2));
522 av_resample_compensate(*(struct AVResampleContext
**)ost
->resample
, comp
, enc
->sample_rate
);
526 ost
->sync_opts
= lrintf(ost
->sync_ipts
* enc
->sample_rate
)
527 - fifo_size(&ost
->fifo
, ost
->fifo
.rptr
)/(ost
->st
->codec
.channels
* 2); //FIXME wrong
529 if (ost
->audio_resample
) {
531 size_out
= audio_resample(ost
->resample
,
532 (short *)buftmp
, (short *)buf
,
533 size
/ (ist
->st
->codec
.channels
* 2));
534 size_out
= size_out
* enc
->channels
* 2;
540 /* now encode as many frames as possible */
541 if (enc
->frame_size
> 1) {
542 /* output resampled raw samples */
543 fifo_write(&ost
->fifo
, buftmp
, size_out
,
546 frame_bytes
= enc
->frame_size
* 2 * enc
->channels
;
548 while (fifo_read(&ost
->fifo
, audio_buf
, frame_bytes
,
549 &ost
->fifo
.rptr
) == 0) {
551 av_init_packet(&pkt
);
553 ret
= avcodec_encode_audio(enc
, audio_out
, audio_out_size
,
556 pkt
.stream_index
= ost
->index
;
560 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
561 pkt
.flags
|= PKT_FLAG_KEY
;
562 av_interleaved_write_frame(s
, &pkt
);
564 ost
->sync_opts
+= enc
->frame_size
;
568 av_init_packet(&pkt
);
570 ost
->sync_opts
+= size_out
/ (2 * enc
->channels
);
572 /* output a pcm frame */
573 /* XXX: change encoding codec API to avoid this ? */
574 switch(enc
->codec
->id
) {
575 case CODEC_ID_PCM_S16LE
:
576 case CODEC_ID_PCM_S16BE
:
577 case CODEC_ID_PCM_U16LE
:
578 case CODEC_ID_PCM_U16BE
:
581 size_out
= size_out
>> 1;
584 ret
= avcodec_encode_audio(enc
, audio_out
, size_out
,
587 pkt
.stream_index
= ost
->index
;
591 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
592 pkt
.flags
|= PKT_FLAG_KEY
;
593 av_interleaved_write_frame(s
, &pkt
);
597 static void pre_process_video_frame(AVInputStream
*ist
, AVPicture
*picture
, void **bufp
)
601 AVPicture picture_tmp
;
604 dec
= &ist
->st
->codec
;
606 /* deinterlace : must be done before any resize */
607 if (do_deinterlace
|| using_vhook
) {
610 /* create temporary picture */
611 size
= avpicture_get_size(dec
->pix_fmt
, dec
->width
, dec
->height
);
612 buf
= av_malloc(size
);
616 picture2
= &picture_tmp
;
617 avpicture_fill(picture2
, buf
, dec
->pix_fmt
, dec
->width
, dec
->height
);
620 if(avpicture_deinterlace(picture2
, picture
,
621 dec
->pix_fmt
, dec
->width
, dec
->height
) < 0) {
622 /* if error, do not deinterlace */
628 if (img_convert(picture2
, dec
->pix_fmt
, picture
,
629 dec
->pix_fmt
, dec
->width
, dec
->height
) < 0) {
630 /* if error, do not copy */
640 frame_hook_process(picture2
, dec
->pix_fmt
, dec
->width
, dec
->height
);
642 if (picture
!= picture2
)
643 *picture
= *picture2
;
647 /* we begin to correct av delay at this threshold */
648 #define AV_DELAY_MAX 0.100
651 /* Expects img to be yuv420 */
652 static void fill_pad_region(AVPicture
* img
, int height
, int width
,
653 int padtop
, int padbottom
, int padleft
, int padright
, int *color
) {
658 for (i
= 0; i
< 3; i
++) {
659 shift
= (i
== 0) ?
0 : 1;
661 if (padtop
|| padleft
) {
662 memset(img
->data
[i
], color
[i
], (((img
->linesize
[i
] * padtop
) +
666 if (padleft
|| padright
) {
667 optr
= img
->data
[i
] + (img
->linesize
[i
] * (padtop
>> shift
)) +
668 (img
->linesize
[i
] - (padright
>> shift
));
670 for (y
= 0; y
< ((height
- (padtop
+ padbottom
) - 1) >> shift
); y
++) {
671 memset(optr
, color
[i
], (padleft
+ padright
) >> shift
);
672 optr
+= img
->linesize
[i
];
676 if (padbottom
|| padright
) {
677 optr
= img
->data
[i
] + (((img
->linesize
[i
] * (height
- padbottom
)) - padright
) >> shift
);
678 memset(optr
, color
[i
], (((img
->linesize
[i
] * padbottom
) + padright
) >> shift
));
683 static int bit_buffer_size
= 1024*256;
684 static uint8_t *bit_buffer
= NULL
;
686 static void do_video_out(AVFormatContext
*s
,
692 int nb_frames
, i
, ret
;
693 AVFrame
*final_picture
, *formatted_picture
;
694 AVFrame picture_format_temp
, picture_crop_temp
;
695 uint8_t *buf
= NULL
, *buf1
= NULL
;
696 AVCodecContext
*enc
, *dec
;
697 enum PixelFormat target_pixfmt
;
699 avcodec_get_frame_defaults(&picture_format_temp
);
700 avcodec_get_frame_defaults(&picture_crop_temp
);
702 enc
= &ost
->st
->codec
;
703 dec
= &ist
->st
->codec
;
705 /* by default, we output a single frame */
710 if(video_sync_method
){
712 vdelta
= ost
->sync_ipts
/ av_q2d(enc
->time_base
) - ost
->sync_opts
;
713 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
716 else if (vdelta
> 1.1)
717 nb_frames
= lrintf(vdelta
);
718 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%lld, ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, ost->sync_ipts, nb_frames);
722 fprintf(stderr
, "*** drop!\n");
723 }else if (nb_frames
> 1) {
724 nb_frames_dup
+= nb_frames
;
726 fprintf(stderr
, "*** %d dup!\n", nb_frames
-1);
729 ost
->sync_opts
= lrintf(ost
->sync_ipts
/ av_q2d(enc
->time_base
));
731 nb_frames
= FFMIN(nb_frames
, max_frames
[CODEC_TYPE_VIDEO
] - ost
->frame_number
);
735 /* convert pixel format if needed */
736 target_pixfmt
= ost
->video_resample
|| ost
->video_pad
737 ? PIX_FMT_YUV420P
: enc
->pix_fmt
;
738 if (dec
->pix_fmt
!= target_pixfmt
) {
741 /* create temporary picture */
742 size
= avpicture_get_size(target_pixfmt
, dec
->width
, dec
->height
);
743 buf
= av_malloc(size
);
746 formatted_picture
= &picture_format_temp
;
747 avpicture_fill((AVPicture
*)formatted_picture
, buf
, target_pixfmt
, dec
->width
, dec
->height
);
749 if (img_convert((AVPicture
*)formatted_picture
, target_pixfmt
,
750 (AVPicture
*)in_picture
, dec
->pix_fmt
,
751 dec
->width
, dec
->height
) < 0) {
754 fprintf(stderr
, "pixel format conversion not handled\n");
759 formatted_picture
= in_picture
;
762 /* XXX: resampling could be done before raw format conversion in
763 some cases to go faster */
764 /* XXX: only works for YUV420P */
765 if (ost
->video_resample
) {
766 final_picture
= &ost
->pict_tmp
;
767 img_resample(ost
->img_resample_ctx
, (AVPicture
*)final_picture
, (AVPicture
*)formatted_picture
);
769 if (ost
->padtop
|| ost
->padbottom
|| ost
->padleft
|| ost
->padright
) {
770 fill_pad_region((AVPicture
*)final_picture
, enc
->height
, enc
->width
,
771 ost
->padtop
, ost
->padbottom
, ost
->padleft
, ost
->padright
,
775 if (enc
->pix_fmt
!= PIX_FMT_YUV420P
) {
779 /* create temporary picture */
780 size
= avpicture_get_size(enc
->pix_fmt
, enc
->width
, enc
->height
);
781 buf
= av_malloc(size
);
784 final_picture
= &picture_format_temp
;
785 avpicture_fill((AVPicture
*)final_picture
, buf
, enc
->pix_fmt
, enc
->width
, enc
->height
);
787 if (img_convert((AVPicture
*)final_picture
, enc
->pix_fmt
,
788 (AVPicture
*)&ost
->pict_tmp
, PIX_FMT_YUV420P
,
789 enc
->width
, enc
->height
) < 0) {
792 fprintf(stderr
, "pixel format conversion not handled\n");
797 } else if (ost
->video_crop
) {
798 picture_crop_temp
.data
[0] = formatted_picture
->data
[0] +
799 (ost
->topBand
* formatted_picture
->linesize
[0]) + ost
->leftBand
;
801 picture_crop_temp
.data
[1] = formatted_picture
->data
[1] +
802 ((ost
->topBand
>> 1) * formatted_picture
->linesize
[1]) +
803 (ost
->leftBand
>> 1);
805 picture_crop_temp
.data
[2] = formatted_picture
->data
[2] +
806 ((ost
->topBand
>> 1) * formatted_picture
->linesize
[2]) +
807 (ost
->leftBand
>> 1);
809 picture_crop_temp
.linesize
[0] = formatted_picture
->linesize
[0];
810 picture_crop_temp
.linesize
[1] = formatted_picture
->linesize
[1];
811 picture_crop_temp
.linesize
[2] = formatted_picture
->linesize
[2];
812 final_picture
= &picture_crop_temp
;
813 } else if (ost
->video_pad
) {
814 final_picture
= &ost
->pict_tmp
;
816 for (i
= 0; i
< 3; i
++) {
817 uint8_t *optr
, *iptr
;
818 int shift
= (i
== 0) ?
0 : 1;
821 /* set offset to start writing image into */
822 optr
= final_picture
->data
[i
] + (((final_picture
->linesize
[i
] *
823 ost
->padtop
) + ost
->padleft
) >> shift
);
824 iptr
= formatted_picture
->data
[i
];
826 yheight
= (enc
->height
- ost
->padtop
- ost
->padbottom
) >> shift
;
827 for (y
= 0; y
< yheight
; y
++) {
828 /* copy unpadded image row into padded image row */
829 memcpy(optr
, iptr
, formatted_picture
->linesize
[i
]);
830 optr
+= final_picture
->linesize
[i
];
831 iptr
+= formatted_picture
->linesize
[i
];
835 fill_pad_region((AVPicture
*)final_picture
, enc
->height
, enc
->width
,
836 ost
->padtop
, ost
->padbottom
, ost
->padleft
, ost
->padright
,
839 if (enc
->pix_fmt
!= PIX_FMT_YUV420P
) {
843 /* create temporary picture */
844 size
= avpicture_get_size(enc
->pix_fmt
, enc
->width
, enc
->height
);
845 buf
= av_malloc(size
);
848 final_picture
= &picture_format_temp
;
849 avpicture_fill((AVPicture
*)final_picture
, buf
, enc
->pix_fmt
, enc
->width
, enc
->height
);
851 if (img_convert((AVPicture
*)final_picture
, enc
->pix_fmt
,
852 (AVPicture
*)&ost
->pict_tmp
, PIX_FMT_YUV420P
,
853 enc
->width
, enc
->height
) < 0) {
856 fprintf(stderr
, "pixel format conversion not handled\n");
862 final_picture
= formatted_picture
;
864 /* duplicates frame if needed */
865 for(i
=0;i
<nb_frames
;i
++) {
867 av_init_packet(&pkt
);
868 pkt
.stream_index
= ost
->index
;
870 if (s
->oformat
->flags
& AVFMT_RAWPICTURE
) {
871 /* raw pictures are written as AVPicture structure to
872 avoid any copies. We support temorarily the older
874 AVFrame
* old_frame
= enc
->coded_frame
;
875 enc
->coded_frame
= dec
->coded_frame
; //FIXME/XXX remove this hack
876 pkt
.data
= (uint8_t *)final_picture
;
877 pkt
.size
= sizeof(AVPicture
);
879 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
880 if(dec
->coded_frame
&& dec
->coded_frame
->key_frame
)
881 pkt
.flags
|= PKT_FLAG_KEY
;
883 av_interleaved_write_frame(s
, &pkt
);
884 enc
->coded_frame
= old_frame
;
888 big_picture
= *final_picture
;
889 /* better than nothing: use input picture interlaced
891 big_picture
.interlaced_frame
= in_picture
->interlaced_frame
;
892 if(do_interlace_me
|| do_interlace_dct
){
893 if(top_field_first
== -1)
894 big_picture
.top_field_first
= in_picture
->top_field_first
;
896 big_picture
.top_field_first
= top_field_first
;
899 /* handles sameq here. This is not correct because it may
900 not be a global option */
902 big_picture
.quality
= ist
->st
->quality
;
904 big_picture
.quality
= ost
->st
->quality
;
906 big_picture
.pict_type
= 0;
907 // big_picture.pts = AV_NOPTS_VALUE;
908 big_picture
.pts
= ost
->sync_opts
;
909 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
910 //av_log(NULL, AV_LOG_DEBUG, "%lld -> encoder\n", ost->sync_opts);
911 ret
= avcodec_encode_video(enc
,
912 bit_buffer
, bit_buffer_size
,
914 //enc->frame_number = enc->real_pict_num;
916 pkt
.data
= bit_buffer
;
919 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
920 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %lld/%lld\n",
921 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
922 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
924 if(enc
->coded_frame
&& enc
->coded_frame
->key_frame
)
925 pkt
.flags
|= PKT_FLAG_KEY
;
926 av_interleaved_write_frame(s
, &pkt
);
928 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
929 // enc->frame_number-1, enc->real_pict_num, ret,
931 /* if two pass, output log */
932 if (ost
->logfile
&& enc
->stats_out
) {
933 fprintf(ost
->logfile
, "%s", enc
->stats_out
);
945 static double psnr(double d
){
946 if(d
==0) return INFINITY
;
947 return -10.0*log(d
)/log(10.0);
950 static void do_video_stats(AVFormatContext
*os
, AVOutputStream
*ost
,
953 static FILE *fvstats
=NULL
;
960 double ti1
, bitrate
, avg_bitrate
;
964 today
= localtime(&today2
);
965 snprintf(filename
, sizeof(filename
), "vstats_%02d%02d%02d.log", today
->tm_hour
,
968 fvstats
= fopen(filename
,"w");
976 enc
= &ost
->st
->codec
;
977 if (enc
->codec_type
== CODEC_TYPE_VIDEO
) {
978 frame_number
= ost
->frame_number
;
979 fprintf(fvstats
, "frame= %5d q= %2.1f ", frame_number
, enc
->coded_frame
->quality
/(float)FF_QP2LAMBDA
);
980 if (enc
->flags
&CODEC_FLAG_PSNR
)
981 fprintf(fvstats
, "PSNR= %6.2f ", psnr(enc
->coded_frame
->error
[0]/(enc
->width
*enc
->height
*255.0*255.0)));
983 fprintf(fvstats
,"f_size= %6d ", frame_size
);
984 /* compute pts value */
985 ti1
= ost
->sync_opts
* av_q2d(enc
->time_base
);
989 bitrate
= (frame_size
* 8) / av_q2d(enc
->time_base
) / 1000.0;
990 avg_bitrate
= (double)(video_size
* 8) / ti1
/ 1000.0;
991 fprintf(fvstats
, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
992 (double)video_size
/ 1024, ti1
, bitrate
, avg_bitrate
);
993 fprintf(fvstats
,"type= %c\n", av_get_pict_type_char(enc
->coded_frame
->pict_type
));
997 static void print_report(AVFormatContext
**output_files
,
998 AVOutputStream
**ost_table
, int nb_ostreams
,
1002 AVOutputStream
*ost
;
1003 AVFormatContext
*oc
, *os
;
1005 AVCodecContext
*enc
;
1006 int frame_number
, vid
, i
;
1007 double bitrate
, ti1
, pts
;
1008 static int64_t last_time
= -1;
1010 if (!is_last_report
) {
1012 /* display the report every 0.5 seconds */
1013 cur_time
= av_gettime();
1014 if (last_time
== -1) {
1015 last_time
= cur_time
;
1018 if ((cur_time
- last_time
) < 500000)
1020 last_time
= cur_time
;
1024 oc
= output_files
[0];
1026 total_size
= url_ftell(&oc
->pb
);
1031 for(i
=0;i
<nb_ostreams
;i
++) {
1033 os
= output_files
[ost
->file_index
];
1034 enc
= &ost
->st
->codec
;
1035 if (vid
&& enc
->codec_type
== CODEC_TYPE_VIDEO
) {
1036 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "q=%2.1f ",
1037 enc
->coded_frame
->quality
/(float)FF_QP2LAMBDA
);
1039 if (!vid
&& enc
->codec_type
== CODEC_TYPE_VIDEO
) {
1040 frame_number
= ost
->frame_number
;
1041 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "frame=%5d q=%2.1f ",
1042 frame_number
, enc
->coded_frame ? enc
->coded_frame
->quality
/(float)FF_QP2LAMBDA
: 0);
1044 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "L");
1045 if (enc
->flags
&CODEC_FLAG_PSNR
){
1047 double error
, error_sum
=0;
1048 double scale
, scale_sum
=0;
1049 char type
[3]= {'Y','U','V'};
1050 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "PSNR=");
1053 error
= enc
->error
[j
];
1054 scale
= enc
->width
*enc
->height
*255.0*255.0*frame_number
;
1056 error
= enc
->coded_frame
->error
[j
];
1057 scale
= enc
->width
*enc
->height
*255.0*255.0;
1062 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "%c:%2.2f ", type
[j
], psnr(error
/scale
));
1064 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "*:%2.2f ", psnr(error_sum
/scale_sum
));
1068 /* compute min output value */
1069 pts
= (double)ost
->st
->pts
.val
* ost
->st
->time_base
.num
/ ost
->st
->time_base
.den
;
1070 if ((pts
< ti1
) && (pts
> 0))
1076 if (verbose
|| is_last_report
) {
1077 bitrate
= (double)(total_size
* 8) / ti1
/ 1000.0;
1079 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
),
1080 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
1081 (double)total_size
/ 1024, ti1
, bitrate
);
1084 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), " dup=%d drop=%d",
1085 nb_frames_dup
, nb_frames_drop
);
1088 fprintf(stderr
, "%s \r", buf
);
1093 if (is_last_report
&& verbose
>= 0){
1094 int64_t raw
= audio_size
+ video_size
+ extra_size
;
1095 fprintf(stderr
, "\n");
1096 fprintf(stderr
, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1100 100.0*(total_size
- raw
)/raw
1105 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1106 static int output_packet(AVInputStream
*ist
, int ist_index
,
1107 AVOutputStream
**ost_table
, int nb_ostreams
,
1108 const AVPacket
*pkt
)
1110 AVFormatContext
*os
;
1111 AVOutputStream
*ost
;
1115 int data_size
, got_picture
;
1117 void *buffer_to_free
;
1118 static int samples_size
= 0;
1119 static short *samples
= NULL
;
1122 ist
->pts
= ist
->next_pts
; // needed for last packet if vsync=0
1123 } else if (pkt
->dts
!= AV_NOPTS_VALUE
) { //FIXME seems redundant, as libavformat does this too
1124 ist
->next_pts
= ist
->pts
= av_rescale_q(pkt
->dts
, ist
->st
->time_base
, AV_TIME_BASE_Q
);
1126 // assert(ist->pts == ist->next_pts);
1140 /* decode the packet if needed */
1141 data_buf
= NULL
; /* fail safe */
1143 if (ist
->decoding_needed
) {
1144 switch(ist
->st
->codec
.codec_type
) {
1145 case CODEC_TYPE_AUDIO
:{
1147 samples
= av_fast_realloc(samples
, &samples_size
, FFMAX(pkt
->size
, AVCODEC_MAX_AUDIO_FRAME_SIZE
));
1148 /* XXX: could avoid copy if PCM 16 bits with same
1149 endianness as CPU */
1150 ret
= avcodec_decode_audio(&ist
->st
->codec
, samples
, &data_size
,
1156 /* Some bug in mpeg audio decoder gives */
1157 /* data_size < 0, it seems they are overflows */
1158 if (data_size
<= 0) {
1159 /* no audio frame */
1162 data_buf
= (uint8_t *)samples
;
1163 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
/2 * data_size
) /
1164 (ist
->st
->codec
.sample_rate
* ist
->st
->codec
.channels
);
1166 case CODEC_TYPE_VIDEO
:
1167 data_size
= (ist
->st
->codec
.width
* ist
->st
->codec
.height
* 3) / 2;
1168 /* XXX: allocate picture correctly */
1169 avcodec_get_frame_defaults(&picture
);
1171 ret
= avcodec_decode_video(&ist
->st
->codec
,
1172 &picture
, &got_picture
, ptr
, len
);
1173 ist
->st
->quality
= picture
.quality
;
1177 /* no picture yet */
1178 goto discard_packet
;
1180 if (ist
->st
->codec
.time_base
.num
!= 0) {
1181 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
*
1182 ist
->st
->codec
.time_base
.num
) /
1183 ist
->st
->codec
.time_base
.den
;
1191 switch(ist
->st
->codec
.codec_type
) {
1192 case CODEC_TYPE_AUDIO
:
1193 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
* ist
->st
->codec
.frame_size
) /
1194 (ist
->st
->codec
.sample_rate
* ist
->st
->codec
.channels
);
1196 case CODEC_TYPE_VIDEO
:
1197 if (ist
->st
->codec
.time_base
.num
!= 0) {
1198 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
*
1199 ist
->st
->codec
.time_base
.num
) /
1200 ist
->st
->codec
.time_base
.den
;
1210 buffer_to_free
= NULL
;
1211 if (ist
->st
->codec
.codec_type
== CODEC_TYPE_VIDEO
) {
1212 pre_process_video_frame(ist
, (AVPicture
*)&picture
,
1216 // preprocess audio (volume)
1217 if (ist
->st
->codec
.codec_type
== CODEC_TYPE_AUDIO
) {
1218 if (audio_volume
!= 256) {
1221 for(i
=0;i
<(data_size
/ sizeof(short));i
++) {
1222 int v
= ((*volp
) * audio_volume
+ 128) >> 8;
1223 if (v
< -32768) v
= -32768;
1224 if (v
> 32767) v
= 32767;
1230 /* frame rate emulation */
1231 if (ist
->st
->codec
.rate_emu
) {
1232 int64_t pts
= av_rescale((int64_t) ist
->frame
* ist
->st
->codec
.time_base
.num
, 1000000, ist
->st
->codec
.time_base
.den
);
1233 int64_t now
= av_gettime() - ist
->start
;
1241 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1242 is the one of the next displayed one */
1243 /* XXX: add mpeg4 too ? */
1244 if (ist
->st
->codec
.codec_id
== CODEC_ID_MPEG1VIDEO
) {
1245 if (ist
->st
->codec
.pict_type
!= B_TYPE
) {
1247 tmp
= ist
->last_ip_pts
;
1248 ist
->last_ip_pts
= ist
->frac_pts
.val
;
1249 ist
->frac_pts
.val
= tmp
;
1253 /* if output time reached then transcode raw format,
1254 encode packets and output them */
1255 if (start_time
== 0 || ist
->pts
>= start_time
)
1256 for(i
=0;i
<nb_ostreams
;i
++) {
1260 if (ost
->source_index
== ist_index
) {
1261 os
= output_files
[ost
->file_index
];
1264 printf("%d: got pts=%0.3f %0.3f\n", i
,
1265 (double)pkt
->pts
/ AV_TIME_BASE
,
1266 ((double)ist
->pts
/ AV_TIME_BASE
) -
1267 ((double)ost
->st
->pts
.val
* ost
->st
->time_base
.num
/ ost
->st
->time_base
.den
));
1269 /* set the input output pts pairs */
1270 ost
->sync_ipts
= (double)(ist
->pts
+ input_files_ts_offset
[ist
->file_index
] - start_time
)/ AV_TIME_BASE
;
1272 if (ost
->encoding_needed
) {
1273 switch(ost
->st
->codec
.codec_type
) {
1274 case CODEC_TYPE_AUDIO
:
1275 do_audio_out(os
, ost
, ist
, data_buf
, data_size
);
1277 case CODEC_TYPE_VIDEO
:
1278 do_video_out(os
, ost
, ist
, &picture
, &frame_size
);
1279 video_size
+= frame_size
;
1280 if (do_vstats
&& frame_size
)
1281 do_video_stats(os
, ost
, frame_size
);
1287 AVFrame avframe
; //FIXME/XXX remove this
1289 av_init_packet(&opkt
);
1291 /* no reencoding needed : output the packet directly */
1292 /* force the input stream PTS */
1294 avcodec_get_frame_defaults(&avframe
);
1295 ost
->st
->codec
.coded_frame
= &avframe
;
1296 avframe
.key_frame
= pkt
->flags
& PKT_FLAG_KEY
;
1298 if(ost
->st
->codec
.codec_type
== CODEC_TYPE_AUDIO
)
1299 audio_size
+= data_size
;
1300 else if (ost
->st
->codec
.codec_type
== CODEC_TYPE_VIDEO
) {
1301 video_size
+= data_size
;
1305 opkt
.stream_index
= ost
->index
;
1306 opkt
.data
= data_buf
;
1307 opkt
.size
= data_size
;
1308 if(pkt
->pts
!= AV_NOPTS_VALUE
)
1309 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
);
1311 opkt
.pts
= AV_NOPTS_VALUE
;
1312 opkt
.dts
= av_rescale_q(av_rescale_q(pkt
->dts
, ist
->st
->time_base
, AV_TIME_BASE_Q
) + input_files_ts_offset
[ist
->file_index
], AV_TIME_BASE_Q
, ost
->st
->time_base
);
1313 opkt
.flags
= pkt
->flags
;
1315 av_interleaved_write_frame(os
, &opkt
);
1316 ost
->st
->codec
.frame_number
++;
1317 ost
->frame_number
++;
1321 av_free(buffer_to_free
);
1327 for(i
=0;i
<nb_ostreams
;i
++) {
1329 if (ost
->source_index
== ist_index
) {
1330 AVCodecContext
*enc
= &ost
->st
->codec
;
1331 os
= output_files
[ost
->file_index
];
1333 if(ost
->st
->codec
.codec_type
== CODEC_TYPE_AUDIO
&& enc
->frame_size
<=1)
1335 if(ost
->st
->codec
.codec_type
== CODEC_TYPE_VIDEO
&& (os
->oformat
->flags
& AVFMT_RAWPICTURE
))
1338 if (ost
->encoding_needed
) {
1341 av_init_packet(&pkt
);
1342 pkt
.stream_index
= ost
->index
;
1344 switch(ost
->st
->codec
.codec_type
) {
1345 case CODEC_TYPE_AUDIO
:
1346 ret
= avcodec_encode_audio(enc
, bit_buffer
, bit_buffer_size
, NULL
);
1348 pkt
.flags
|= PKT_FLAG_KEY
;
1350 case CODEC_TYPE_VIDEO
:
1351 ret
= avcodec_encode_video(enc
, bit_buffer
, bit_buffer_size
, NULL
);
1353 if(enc
->coded_frame
&& enc
->coded_frame
->key_frame
)
1354 pkt
.flags
|= PKT_FLAG_KEY
;
1355 if (ost
->logfile
&& enc
->stats_out
) {
1356 fprintf(ost
->logfile
, "%s", enc
->stats_out
);
1365 pkt
.data
= bit_buffer
;
1367 if(enc
->coded_frame
)
1368 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
1369 av_interleaved_write_frame(os
, &pkt
);
1383 * The following code is the main loop of the file converter
1385 static int av_encode(AVFormatContext
**output_files
,
1386 int nb_output_files
,
1387 AVFormatContext
**input_files
,
1389 AVStreamMap
*stream_maps
, int nb_stream_maps
)
1391 int ret
, i
, j
, k
, n
, nb_istreams
= 0, nb_ostreams
= 0;
1392 AVFormatContext
*is
, *os
;
1393 AVCodecContext
*codec
, *icodec
;
1394 AVOutputStream
*ost
, **ost_table
= NULL
;
1395 AVInputStream
*ist
, **ist_table
= NULL
;
1396 AVInputFile
*file_table
;
1397 AVFormatContext
*stream_no_data
;
1400 file_table
= (AVInputFile
*) av_mallocz(nb_input_files
* sizeof(AVInputFile
));
1404 /* input stream init */
1406 for(i
=0;i
<nb_input_files
;i
++) {
1407 is
= input_files
[i
];
1408 file_table
[i
].ist_index
= j
;
1409 file_table
[i
].nb_streams
= is
->nb_streams
;
1410 j
+= is
->nb_streams
;
1414 ist_table
= av_mallocz(nb_istreams
* sizeof(AVInputStream
*));
1418 for(i
=0;i
<nb_istreams
;i
++) {
1419 ist
= av_mallocz(sizeof(AVInputStream
));
1425 for(i
=0;i
<nb_input_files
;i
++) {
1426 is
= input_files
[i
];
1427 for(k
=0;k
<is
->nb_streams
;k
++) {
1428 ist
= ist_table
[j
++];
1429 ist
->st
= is
->streams
[k
];
1430 ist
->file_index
= i
;
1432 ist
->discard
= 1; /* the stream is discarded by default
1435 if (ist
->st
->codec
.rate_emu
) {
1436 ist
->start
= av_gettime();
1442 /* output stream init */
1444 for(i
=0;i
<nb_output_files
;i
++) {
1445 os
= output_files
[i
];
1446 nb_ostreams
+= os
->nb_streams
;
1448 if (nb_stream_maps
> 0 && nb_stream_maps
!= nb_ostreams
) {
1449 fprintf(stderr
, "Number of stream maps must match number of output streams\n");
1453 /* Sanity check the mapping args -- do the input files & streams exist? */
1454 for(i
=0;i
<nb_stream_maps
;i
++) {
1455 int fi
= stream_maps
[i
].file_index
;
1456 int si
= stream_maps
[i
].stream_index
;
1458 if (fi
< 0 || fi
> nb_input_files
- 1 ||
1459 si
< 0 || si
> file_table
[fi
].nb_streams
- 1) {
1460 fprintf(stderr
,"Could not find input stream #%d.%d\n", fi
, si
);
1465 ost_table
= av_mallocz(sizeof(AVOutputStream
*) * nb_ostreams
);
1468 for(i
=0;i
<nb_ostreams
;i
++) {
1469 ost
= av_mallocz(sizeof(AVOutputStream
));
1476 for(k
=0;k
<nb_output_files
;k
++) {
1477 os
= output_files
[k
];
1478 for(i
=0;i
<os
->nb_streams
;i
++) {
1480 ost
= ost_table
[n
++];
1481 ost
->file_index
= k
;
1483 ost
->st
= os
->streams
[i
];
1484 if (nb_stream_maps
> 0) {
1485 ost
->source_index
= file_table
[stream_maps
[n
-1].file_index
].ist_index
+
1486 stream_maps
[n
-1].stream_index
;
1488 /* Sanity check that the stream types match */
1489 if (ist_table
[ost
->source_index
]->st
->codec
.codec_type
!= ost
->st
->codec
.codec_type
) {
1490 fprintf(stderr
, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1491 stream_maps
[n
-1].file_index
, stream_maps
[n
-1].stream_index
,
1492 ost
->file_index
, ost
->index
);
1497 /* get corresponding input stream index : we select the first one with the right type */
1499 for(j
=0;j
<nb_istreams
;j
++) {
1502 ist
->st
->codec
.codec_type
== ost
->st
->codec
.codec_type
) {
1503 ost
->source_index
= j
;
1510 /* try again and reuse existing stream */
1511 for(j
=0;j
<nb_istreams
;j
++) {
1513 if (ist
->st
->codec
.codec_type
== ost
->st
->codec
.codec_type
) {
1514 ost
->source_index
= j
;
1519 fprintf(stderr
, "Could not find input stream matching output stream #%d.%d\n",
1520 ost
->file_index
, ost
->index
);
1525 ist
= ist_table
[ost
->source_index
];
1530 /* for each output stream, we compute the right encoding parameters */
1531 for(i
=0;i
<nb_ostreams
;i
++) {
1533 ist
= ist_table
[ost
->source_index
];
1535 codec
= &ost
->st
->codec
;
1536 icodec
= &ist
->st
->codec
;
1538 if (ost
->st
->stream_copy
) {
1539 /* if stream_copy is selected, no need to decode or encode */
1540 codec
->codec_id
= icodec
->codec_id
;
1541 codec
->codec_type
= icodec
->codec_type
;
1542 if(!codec
->codec_tag
) codec
->codec_tag
= icodec
->codec_tag
;
1543 codec
->bit_rate
= icodec
->bit_rate
;
1544 codec
->extradata
= icodec
->extradata
;
1545 codec
->extradata_size
= icodec
->extradata_size
;
1546 switch(codec
->codec_type
) {
1547 case CODEC_TYPE_AUDIO
:
1548 codec
->sample_rate
= icodec
->sample_rate
;
1549 codec
->channels
= icodec
->channels
;
1550 codec
->frame_size
= icodec
->frame_size
;
1551 codec
->block_align
= icodec
->block_align
;
1553 case CODEC_TYPE_VIDEO
:
1554 codec
->time_base
= icodec
->time_base
;
1555 codec
->width
= icodec
->width
;
1556 codec
->height
= icodec
->height
;
1557 codec
->has_b_frames
= icodec
->has_b_frames
;
1563 switch(codec
->codec_type
) {
1564 case CODEC_TYPE_AUDIO
:
1565 if (fifo_init(&ost
->fifo
, 2 * MAX_AUDIO_PACKET_SIZE
))
1568 if (codec
->channels
== icodec
->channels
&&
1569 codec
->sample_rate
== icodec
->sample_rate
) {
1570 ost
->audio_resample
= 0;
1572 if (codec
->channels
!= icodec
->channels
&&
1573 (icodec
->codec_id
== CODEC_ID_AC3
||
1574 icodec
->codec_id
== CODEC_ID_DTS
)) {
1575 /* Special case for 5:1 AC3 and DTS input */
1576 /* and mono or stereo output */
1577 /* Request specific number of channels */
1578 icodec
->channels
= codec
->channels
;
1579 if (codec
->sample_rate
== icodec
->sample_rate
)
1580 ost
->audio_resample
= 0;
1582 ost
->audio_resample
= 1;
1585 ost
->audio_resample
= 1;
1588 if(audio_sync_method
>1)
1589 ost
->audio_resample
= 1;
1591 if(ost
->audio_resample
){
1592 ost
->resample
= audio_resample_init(codec
->channels
, icodec
->channels
,
1593 codec
->sample_rate
, icodec
->sample_rate
);
1595 printf("Can't resample. Aborting.\n");
1599 ist
->decoding_needed
= 1;
1600 ost
->encoding_needed
= 1;
1602 case CODEC_TYPE_VIDEO
:
1603 if (codec
->width
== icodec
->width
&&
1604 codec
->height
== icodec
->height
&&
1605 frame_topBand
== 0 &&
1606 frame_bottomBand
== 0 &&
1607 frame_leftBand
== 0 &&
1608 frame_rightBand
== 0 &&
1609 frame_padtop
== 0 &&
1610 frame_padbottom
== 0 &&
1611 frame_padleft
== 0 &&
1612 frame_padright
== 0)
1614 ost
->video_resample
= 0;
1615 ost
->video_crop
= 0;
1617 } else if ((codec
->width
== icodec
->width
-
1618 (frame_leftBand
+ frame_rightBand
)) &&
1619 (codec
->height
== icodec
->height
-
1620 (frame_topBand
+ frame_bottomBand
)))
1622 ost
->video_resample
= 0;
1623 ost
->video_crop
= 1;
1624 ost
->topBand
= frame_topBand
;
1625 ost
->leftBand
= frame_leftBand
;
1626 } else if ((codec
->width
== icodec
->width
+
1627 (frame_padleft
+ frame_padright
)) &&
1628 (codec
->height
== icodec
->height
+
1629 (frame_padtop
+ frame_padbottom
))) {
1630 ost
->video_resample
= 0;
1631 ost
->video_crop
= 0;
1633 ost
->padtop
= frame_padtop
;
1634 ost
->padleft
= frame_padleft
;
1635 ost
->padbottom
= frame_padbottom
;
1636 ost
->padright
= frame_padright
;
1637 avcodec_get_frame_defaults(&ost
->pict_tmp
);
1638 if( avpicture_alloc( (AVPicture
*)&ost
->pict_tmp
, PIX_FMT_YUV420P
,
1639 codec
->width
, codec
->height
) )
1642 ost
->video_resample
= 1;
1643 ost
->video_crop
= 0; // cropping is handled as part of resample
1644 avcodec_get_frame_defaults(&ost
->pict_tmp
);
1645 if( avpicture_alloc( (AVPicture
*)&ost
->pict_tmp
, PIX_FMT_YUV420P
,
1646 codec
->width
, codec
->height
) )
1649 ost
->img_resample_ctx
= img_resample_full_init(
1650 ost
->st
->codec
.width
, ost
->st
->codec
.height
,
1651 ist
->st
->codec
.width
, ist
->st
->codec
.height
,
1652 frame_topBand
, frame_bottomBand
,
1653 frame_leftBand
, frame_rightBand
,
1654 frame_padtop
, frame_padbottom
,
1655 frame_padleft
, frame_padright
);
1657 ost
->padtop
= frame_padtop
;
1658 ost
->padleft
= frame_padleft
;
1659 ost
->padbottom
= frame_padbottom
;
1660 ost
->padright
= frame_padright
;
1663 ost
->encoding_needed
= 1;
1664 ist
->decoding_needed
= 1;
1670 if (ost
->encoding_needed
&&
1671 (codec
->flags
& (CODEC_FLAG_PASS1
| CODEC_FLAG_PASS2
))) {
1672 char logfilename
[1024];
1677 snprintf(logfilename
, sizeof(logfilename
), "%s-%d.log",
1679 pass_logfilename
: DEFAULT_PASS_LOGFILENAME
, i
);
1680 if (codec
->flags
& CODEC_FLAG_PASS1
) {
1681 f
= fopen(logfilename
, "w");
1683 perror(logfilename
);
1688 /* read the log file */
1689 f
= fopen(logfilename
, "r");
1691 perror(logfilename
);
1694 fseek(f
, 0, SEEK_END
);
1696 fseek(f
, 0, SEEK_SET
);
1697 logbuffer
= av_malloc(size
+ 1);
1699 fprintf(stderr
, "Could not allocate log buffer\n");
1702 size
= fread(logbuffer
, 1, size
, f
);
1704 logbuffer
[size
] = '\0';
1705 codec
->stats_in
= logbuffer
;
1709 if(codec
->codec_type
== CODEC_TYPE_VIDEO
){
1710 int size
= codec
->width
* codec
->height
;
1711 bit_buffer_size
= FFMAX(bit_buffer_size
, 4*size
);
1716 bit_buffer
= av_malloc(bit_buffer_size
);
1720 /* dump the file output parameters - cannot be done before in case
1722 for(i
=0;i
<nb_output_files
;i
++) {
1723 dump_format(output_files
[i
], i
, output_files
[i
]->filename
, 1);
1726 /* dump the stream mapping */
1728 fprintf(stderr
, "Stream mapping:\n");
1729 for(i
=0;i
<nb_ostreams
;i
++) {
1731 fprintf(stderr
, " Stream #%d.%d -> #%d.%d\n",
1732 ist_table
[ost
->source_index
]->file_index
,
1733 ist_table
[ost
->source_index
]->index
,
1739 /* open each encoder */
1740 for(i
=0;i
<nb_ostreams
;i
++) {
1742 if (ost
->encoding_needed
) {
1744 codec
= avcodec_find_encoder(ost
->st
->codec
.codec_id
);
1746 fprintf(stderr
, "Unsupported codec for output stream #%d.%d\n",
1747 ost
->file_index
, ost
->index
);
1750 if (avcodec_open(&ost
->st
->codec
, codec
) < 0) {
1751 fprintf(stderr
, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1752 ost
->file_index
, ost
->index
);
1755 extra_size
+= ost
->st
->codec
.extradata_size
;
1759 /* open each decoder */
1760 for(i
=0;i
<nb_istreams
;i
++) {
1762 if (ist
->decoding_needed
) {
1764 codec
= avcodec_find_decoder(ist
->st
->codec
.codec_id
);
1766 fprintf(stderr
, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1767 ist
->st
->codec
.codec_id
, ist
->file_index
, ist
->index
);
1770 if (avcodec_open(&ist
->st
->codec
, codec
) < 0) {
1771 fprintf(stderr
, "Error while opening codec for input stream #%d.%d\n",
1772 ist
->file_index
, ist
->index
);
1775 //if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO)
1776 // ist->st->codec.flags |= CODEC_FLAG_REPEAT_FIELD;
1781 for(i
=0;i
<nb_istreams
;i
++) {
1783 is
= input_files
[ist
->file_index
];
1785 ist
->next_pts
= av_rescale_q(ist
->st
->start_time
, ist
->st
->time_base
, AV_TIME_BASE_Q
);
1786 if(ist
->st
->start_time
== AV_NOPTS_VALUE
)
1788 if(input_files_ts_offset
[ist
->file_index
])
1789 ist
->next_pts
= AV_NOPTS_VALUE
;
1793 /* compute buffer size max (should use a complete heuristic) */
1794 for(i
=0;i
<nb_input_files
;i
++) {
1795 file_table
[i
].buffer_size_max
= 2048;
1798 /* set meta data information from input file if required */
1799 for (i
=0;i
<nb_meta_data_maps
;i
++) {
1800 AVFormatContext
*out_file
;
1801 AVFormatContext
*in_file
;
1803 int out_file_index
= meta_data_maps
[i
].out_file
;
1804 int in_file_index
= meta_data_maps
[i
].in_file
;
1805 if ( out_file_index
< 0 || out_file_index
>= nb_output_files
) {
1806 fprintf(stderr
, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index
, out_file_index
, in_file_index
);
1810 if ( in_file_index
< 0 || in_file_index
>= nb_input_files
) {
1811 fprintf(stderr
, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index
, out_file_index
, in_file_index
);
1816 out_file
= output_files
[out_file_index
];
1817 in_file
= input_files
[in_file_index
];
1819 strcpy(out_file
->title
, in_file
->title
);
1820 strcpy(out_file
->author
, in_file
->author
);
1821 strcpy(out_file
->copyright
, in_file
->copyright
);
1822 strcpy(out_file
->comment
, in_file
->comment
);
1823 strcpy(out_file
->album
, in_file
->album
);
1824 out_file
->year
= in_file
->year
;
1825 out_file
->track
= in_file
->track
;
1826 strcpy(out_file
->genre
, in_file
->genre
);
1829 /* open files and write file headers */
1830 for(i
=0;i
<nb_output_files
;i
++) {
1831 os
= output_files
[i
];
1832 if (av_write_header(os
) < 0) {
1833 fprintf(stderr
, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i
);
1839 #ifndef CONFIG_WIN32
1840 if ( !using_stdin
&& verbose
>= 0) {
1841 fprintf(stderr
, "Press [q] to stop encoding\n");
1842 url_set_interrupt_cb(decode_interrupt_cb
);
1850 for(; received_sigterm
== 0;) {
1851 int file_index
, ist_index
;
1859 /* if 'q' pressed, exits */
1863 /* read_key() returns 0 on EOF */
1869 /* select the stream that we must read now by looking at the
1870 smallest output pts */
1872 for(i
=0;i
<nb_ostreams
;i
++) {
1875 os
= output_files
[ost
->file_index
];
1876 ist
= ist_table
[ost
->source_index
];
1877 if(ost
->st
->codec
.codec_type
== CODEC_TYPE_VIDEO
)
1878 opts
= ost
->sync_opts
* av_q2d(ost
->st
->codec
.time_base
);
1880 opts
= ost
->st
->pts
.val
* av_q2d(ost
->st
->time_base
);
1881 ipts
= (double)ist
->pts
;
1882 if (!file_table
[ist
->file_index
].eof_reached
){
1883 if(ipts
< ipts_min
) {
1885 if(input_sync
) file_index
= ist
->file_index
;
1887 if(opts
< opts_min
) {
1889 if(!input_sync
) file_index
= ist
->file_index
;
1892 if(ost
->frame_number
>= max_frames
[ost
->st
->codec
.codec_type
]){
1897 /* if none, if is finished */
1898 if (file_index
< 0) {
1902 /* finish if recording time exhausted */
1903 if (recording_time
> 0 && opts_min
>= (recording_time
/ 1000000.0))
1906 /* finish if limit size exhausted */
1907 if (limit_filesize
!= 0 && (limit_filesize
* 1024) < url_ftell(&output_files
[0]->pb
))
1910 /* read a frame from it and output it in the fifo */
1911 is
= input_files
[file_index
];
1912 if (av_read_frame(is
, &pkt
) < 0) {
1913 file_table
[file_index
].eof_reached
= 1;
1914 if (opt_shortest
) break; else continue; //
1918 stream_no_data
= is
;
1923 av_pkt_dump(stdout
, &pkt
, do_hex_dump
);
1925 /* the following test is needed in case new streams appear
1926 dynamically in stream : we ignore them */
1927 if (pkt
.stream_index
>= file_table
[file_index
].nb_streams
)
1928 goto discard_packet
;
1929 ist_index
= file_table
[file_index
].ist_index
+ pkt
.stream_index
;
1930 ist
= ist_table
[ist_index
];
1932 goto discard_packet
;
1934 // fprintf(stderr, "next:%lld dts:%lld off:%lld %d\n", ist->next_pts, pkt.dts, input_files_ts_offset[ist->file_index], ist->st->codec.codec_type);
1935 if (pkt
.dts
!= AV_NOPTS_VALUE
&& ist
->next_pts
!= AV_NOPTS_VALUE
) {
1936 int64_t delta
= av_rescale_q(pkt
.dts
, ist
->st
->time_base
, AV_TIME_BASE_Q
) - ist
->next_pts
;
1937 if(ABS(delta
) > 10LL*AV_TIME_BASE
&& !copy_ts
){
1938 input_files_ts_offset
[ist
->file_index
]-= delta
;
1940 fprintf(stderr
, "timestamp discontinuity %lld, new offset= %lld\n", delta
, input_files_ts_offset
[ist
->file_index
]);
1941 for(i
=0; i
<file_table
[file_index
].nb_streams
; i
++){
1942 int index
= file_table
[file_index
].ist_index
+ i
;
1943 ist_table
[index
]->next_pts
+= delta
;
1944 ist_table
[index
]->is_start
=1;
1949 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1950 if (output_packet(ist
, ist_index
, ost_table
, nb_ostreams
, &pkt
) < 0) {
1953 fprintf(stderr
, "Error while decoding stream #%d.%d\n",
1954 ist
->file_index
, ist
->index
);
1956 av_free_packet(&pkt
);
1961 av_free_packet(&pkt
);
1963 /* dump report by using the output first video and audio streams */
1964 print_report(output_files
, ost_table
, nb_ostreams
, 0);
1967 /* at the end of stream, we must flush the decoder buffers */
1968 for(i
=0;i
<nb_istreams
;i
++) {
1970 if (ist
->decoding_needed
) {
1971 output_packet(ist
, i
, ost_table
, nb_ostreams
, NULL
);
1977 /* write the trailer if needed and close file */
1978 for(i
=0;i
<nb_output_files
;i
++) {
1979 os
= output_files
[i
];
1980 av_write_trailer(os
);
1983 /* dump report by using the first video and audio streams */
1984 print_report(output_files
, ost_table
, nb_ostreams
, 1);
1986 /* close each encoder */
1987 for(i
=0;i
<nb_ostreams
;i
++) {
1989 if (ost
->encoding_needed
) {
1990 av_freep(&ost
->st
->codec
.stats_in
);
1991 avcodec_close(&ost
->st
->codec
);
1995 /* close each decoder */
1996 for(i
=0;i
<nb_istreams
;i
++) {
1998 if (ist
->decoding_needed
) {
1999 avcodec_close(&ist
->st
->codec
);
2007 av_freep(&bit_buffer
);
2008 av_free(file_table
);
2011 for(i
=0;i
<nb_istreams
;i
++) {
2018 for(i
=0;i
<nb_ostreams
;i
++) {
2022 fclose(ost
->logfile
);
2023 ost
->logfile
= NULL
;
2025 fifo_free(&ost
->fifo
); /* works even if fifo is not
2026 initialized but set to zero */
2027 av_free(ost
->pict_tmp
.data
[0]);
2028 if (ost
->video_resample
)
2029 img_resample_close(ost
->img_resample_ctx
);
2030 if (ost
->audio_resample
)
2031 audio_resample_close(ost
->resample
);
2044 int file_read(const char *filename
)
2047 unsigned char buffer
[1024];
2050 if (url_open(&h
, filename
, O_RDONLY
) < 0) {
2051 printf("could not open '%s'\n", filename
);
2055 len
= url_read(h
, buffer
, sizeof(buffer
));
2058 for(i
=0;i
<len
;i
++) putchar(buffer
[i
]);
2065 static void opt_image_format(const char *arg
)
2069 for(f
= first_image_format
; f
!= NULL
; f
= f
->next
) {
2070 if (!strcmp(arg
, f
->name
))
2074 fprintf(stderr
, "Unknown image format: '%s'\n", arg
);
2080 static void opt_format(const char *arg
)
2082 /* compatibility stuff for pgmyuv */
2083 if (!strcmp(arg
, "pgmyuv")) {
2084 pgmyuv_compatibility_hack
=1;
2085 // opt_image_format(arg);
2089 file_iformat
= av_find_input_format(arg
);
2090 file_oformat
= guess_format(arg
, NULL
, NULL
);
2091 if (!file_iformat
&& !file_oformat
) {
2092 fprintf(stderr
, "Unknown input or output format: %s\n", arg
);
2097 static void opt_video_bitrate(const char *arg
)
2099 video_bit_rate
= atoi(arg
) * 1000;
2102 static void opt_video_bitrate_tolerance(const char *arg
)
2104 video_bit_rate_tolerance
= atoi(arg
) * 1000;
2107 static void opt_video_bitrate_max(const char *arg
)
2109 video_rc_max_rate
= atoi(arg
) * 1000;
2112 static void opt_video_bitrate_min(const char *arg
)
2114 video_rc_min_rate
= atoi(arg
) * 1000;
2117 static void opt_video_buffer_size(const char *arg
)
2119 video_rc_buffer_size
= atoi(arg
) * 8*1024;
2122 static void opt_video_rc_eq(char *arg
)
2127 static void opt_video_rc_override_string(char *arg
)
2129 video_rc_override_string
= arg
;
2133 static void opt_workaround_bugs(const char *arg
)
2135 workaround_bugs
= atoi(arg
);
2138 static void opt_dct_algo(const char *arg
)
2140 dct_algo
= atoi(arg
);
2143 static void opt_idct_algo(const char *arg
)
2145 idct_algo
= atoi(arg
);
2148 static void opt_me_threshold(const char *arg
)
2150 me_threshold
= atoi(arg
);
2153 static void opt_mb_threshold(const char *arg
)
2155 mb_threshold
= atoi(arg
);
2158 static void opt_error_resilience(const char *arg
)
2160 error_resilience
= atoi(arg
);
2163 static void opt_error_concealment(const char *arg
)
2165 error_concealment
= atoi(arg
);
2168 static void opt_debug(const char *arg
)
2173 static void opt_vismv(const char *arg
)
2175 debug_mv
= atoi(arg
);
2178 static void opt_verbose(const char *arg
)
2180 verbose
= atoi(arg
);
2181 av_log_set_level(atoi(arg
));
2184 static void opt_frame_rate(const char *arg
)
2186 if (parse_frame_rate(&frame_rate
, &frame_rate_base
, arg
) < 0) {
2187 fprintf(stderr
, "Incorrect frame rate\n");
2192 static void opt_frame_crop_top(const char *arg
)
2194 frame_topBand
= atoi(arg
);
2195 if (frame_topBand
< 0) {
2196 fprintf(stderr
, "Incorrect top crop size\n");
2199 if ((frame_topBand
% 2) != 0) {
2200 fprintf(stderr
, "Top crop size must be a multiple of 2\n");
2203 if ((frame_topBand
) >= frame_height
){
2204 fprintf(stderr
, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2207 frame_height
-= frame_topBand
;
2210 static void opt_frame_crop_bottom(const char *arg
)
2212 frame_bottomBand
= atoi(arg
);
2213 if (frame_bottomBand
< 0) {
2214 fprintf(stderr
, "Incorrect bottom crop size\n");
2217 if ((frame_bottomBand
% 2) != 0) {
2218 fprintf(stderr
, "Bottom crop size must be a multiple of 2\n");
2221 if ((frame_bottomBand
) >= frame_height
){
2222 fprintf(stderr
, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2225 frame_height
-= frame_bottomBand
;
2228 static void opt_frame_crop_left(const char *arg
)
2230 frame_leftBand
= atoi(arg
);
2231 if (frame_leftBand
< 0) {
2232 fprintf(stderr
, "Incorrect left crop size\n");
2235 if ((frame_leftBand
% 2) != 0) {
2236 fprintf(stderr
, "Left crop size must be a multiple of 2\n");
2239 if ((frame_leftBand
) >= frame_width
){
2240 fprintf(stderr
, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2243 frame_width
-= frame_leftBand
;
2246 static void opt_frame_crop_right(const char *arg
)
2248 frame_rightBand
= atoi(arg
);
2249 if (frame_rightBand
< 0) {
2250 fprintf(stderr
, "Incorrect right crop size\n");
2253 if ((frame_rightBand
% 2) != 0) {
2254 fprintf(stderr
, "Right crop size must be a multiple of 2\n");
2257 if ((frame_rightBand
) >= frame_width
){
2258 fprintf(stderr
, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2261 frame_width
-= frame_rightBand
;
2264 static void opt_frame_size(const char *arg
)
2266 if (parse_image_size(&frame_width
, &frame_height
, arg
) < 0) {
2267 fprintf(stderr
, "Incorrect frame size\n");
2270 if ((frame_width
% 2) != 0 || (frame_height
% 2) != 0) {
2271 fprintf(stderr
, "Frame size must be a multiple of 2\n");
2277 #define SCALEBITS 10
2278 #define ONE_HALF (1 << (SCALEBITS - 1))
2279 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2281 #define RGB_TO_Y(r, g, b) \
2282 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2283 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2285 #define RGB_TO_U(r1, g1, b1, shift)\
2286 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2287 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2289 #define RGB_TO_V(r1, g1, b1, shift)\
2290 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2291 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2293 static void opt_pad_color(const char *arg
) {
2294 /* Input is expected to be six hex digits similar to
2295 how colors are expressed in html tags (but without the #) */
2296 int rgb
= strtol(arg
, NULL
, 16);
2300 g
= ((rgb
>> 8) & 255);
2303 padcolor
[0] = RGB_TO_Y(r
,g
,b
);
2304 padcolor
[1] = RGB_TO_U(r
,g
,b
,0);
2305 padcolor
[2] = RGB_TO_V(r
,g
,b
,0);
2308 static void opt_frame_pad_top(const char *arg
)
2310 frame_padtop
= atoi(arg
);
2311 if (frame_padtop
< 0) {
2312 fprintf(stderr
, "Incorrect top pad size\n");
2315 if ((frame_padtop
% 2) != 0) {
2316 fprintf(stderr
, "Top pad size must be a multiple of 2\n");
2321 static void opt_frame_pad_bottom(const char *arg
)
2323 frame_padbottom
= atoi(arg
);
2324 if (frame_padbottom
< 0) {
2325 fprintf(stderr
, "Incorrect bottom pad size\n");
2328 if ((frame_padbottom
% 2) != 0) {
2329 fprintf(stderr
, "Bottom pad size must be a multiple of 2\n");
2335 static void opt_frame_pad_left(const char *arg
)
2337 frame_padleft
= atoi(arg
);
2338 if (frame_padleft
< 0) {
2339 fprintf(stderr
, "Incorrect left pad size\n");
2342 if ((frame_padleft
% 2) != 0) {
2343 fprintf(stderr
, "Left pad size must be a multiple of 2\n");
2349 static void opt_frame_pad_right(const char *arg
)
2351 frame_padright
= atoi(arg
);
2352 if (frame_padright
< 0) {
2353 fprintf(stderr
, "Incorrect right pad size\n");
2356 if ((frame_padright
% 2) != 0) {
2357 fprintf(stderr
, "Right pad size must be a multiple of 2\n");
2363 static void opt_frame_pix_fmt(const char *arg
)
2365 frame_pix_fmt
= avcodec_get_pix_fmt(arg
);
2368 static void opt_frame_aspect_ratio(const char *arg
)
2374 p
= strchr(arg
, ':');
2376 x
= strtol(arg
, (char **)&arg
, 10);
2378 y
= strtol(arg
+1, (char **)&arg
, 10);
2380 ar
= (double)x
/ (double)y
;
2382 ar
= strtod(arg
, (char **)&arg
);
2385 fprintf(stderr
, "Incorrect aspect ratio specification.\n");
2388 frame_aspect_ratio
= ar
;
2391 static void opt_gop_size(const char *arg
)
2393 gop_size
= atoi(arg
);
2396 static void opt_b_frames(const char *arg
)
2398 b_frames
= atoi(arg
);
2399 if (b_frames
> FF_MAX_B_FRAMES
) {
2400 fprintf(stderr
, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES
);
2402 } else if (b_frames
< 1) {
2403 fprintf(stderr
, "\nNumber of B frames must be higher than 0\n");
2408 static void opt_mb_decision(const char *arg
)
2410 mb_decision
= atoi(arg
);
2413 static void opt_mb_cmp(const char *arg
)
2418 static void opt_ildct_cmp(const char *arg
)
2420 ildct_cmp
= atoi(arg
);
2423 static void opt_sub_cmp(const char *arg
)
2425 sub_cmp
= atoi(arg
);
2428 static void opt_cmp(const char *arg
)
2433 static void opt_pre_cmp(const char *arg
)
2435 pre_cmp
= atoi(arg
);
2438 static void opt_pre_me(const char *arg
)
2443 static void opt_lumi_mask(const char *arg
)
2445 lumi_mask
= atof(arg
);
2448 static void opt_dark_mask(const char *arg
)
2450 dark_mask
= atof(arg
);
2453 static void opt_scplx_mask(const char *arg
)
2455 scplx_mask
= atof(arg
);
2458 static void opt_tcplx_mask(const char *arg
)
2460 tcplx_mask
= atof(arg
);
2463 static void opt_p_mask(const char *arg
)
2468 static void opt_qscale(const char *arg
)
2470 video_qscale
= atof(arg
);
2471 if (video_qscale
< 0.01 ||
2472 video_qscale
> 255) {
2473 fprintf(stderr
, "qscale must be >= 0.01 and <= 255\n");
2478 static void opt_qsquish(const char *arg
)
2480 video_qsquish
= atof(arg
);
2481 if (video_qsquish
< 0.0 ||
2482 video_qsquish
> 99.0) {
2483 fprintf(stderr
, "qsquish must be >= 0.0 and <= 99.0\n");
2488 static void opt_lelim(const char *arg
)
2490 video_lelim
= atoi(arg
);
2491 if (video_lelim
< -99 ||
2493 fprintf(stderr
, "lelim must be >= -99 and <= 99\n");
2498 static void opt_celim(const char *arg
)
2500 video_celim
= atoi(arg
);
2501 if (video_celim
< -99 ||
2503 fprintf(stderr
, "celim must be >= -99 and <= 99\n");
2508 static void opt_lmax(const char *arg
)
2510 video_lmax
= atof(arg
)*FF_QP2LAMBDA
;
2513 static void opt_lmin(const char *arg
)
2515 video_lmin
= atof(arg
)*FF_QP2LAMBDA
;
2518 static void opt_qmin(const char *arg
)
2520 video_qmin
= atoi(arg
);
2521 if (video_qmin
< 1 ||
2523 fprintf(stderr
, "qmin must be >= 1 and <= 31\n");
2528 static void opt_qmax(const char *arg
)
2530 video_qmax
= atoi(arg
);
2531 if (video_qmax
< 1 ||
2533 fprintf(stderr
, "qmax must be >= 1 and <= 31\n");
2538 static void opt_mb_lmin(const char *arg
)
2540 video_mb_lmin
= atof(arg
)*FF_QP2LAMBDA
;
2541 if (video_mb_lmin
< 1 ||
2542 video_mb_lmin
> FF_LAMBDA_MAX
) {
2543 fprintf(stderr
, "mblmin must be >= 1 and <= %d\n", FF_LAMBDA_MAX
/ FF_QP2LAMBDA
);
2548 static void opt_mb_lmax(const char *arg
)
2550 video_mb_lmax
= atof(arg
)*FF_QP2LAMBDA
;
2551 if (video_mb_lmax
< 1 ||
2552 video_mb_lmax
> FF_LAMBDA_MAX
) {
2553 fprintf(stderr
, "mblmax must be >= 1 and <= %d\n", FF_LAMBDA_MAX
/ FF_QP2LAMBDA
);
2558 static void opt_qdiff(const char *arg
)
2560 video_qdiff
= atoi(arg
);
2561 if (video_qdiff
< 0 ||
2563 fprintf(stderr
, "qdiff must be >= 1 and <= 31\n");
2568 static void opt_qblur(const char *arg
)
2570 video_qblur
= atof(arg
);
2573 static void opt_qcomp(const char *arg
)
2575 video_qcomp
= atof(arg
);
2578 static void opt_rc_initial_cplx(const char *arg
)
2580 video_rc_initial_cplx
= atof(arg
);
2582 static void opt_b_qfactor(const char *arg
)
2584 video_b_qfactor
= atof(arg
);
2586 static void opt_i_qfactor(const char *arg
)
2588 video_i_qfactor
= atof(arg
);
2590 static void opt_b_qoffset(const char *arg
)
2592 video_b_qoffset
= atof(arg
);
2594 static void opt_i_qoffset(const char *arg
)
2596 video_i_qoffset
= atof(arg
);
2599 static void opt_ibias(const char *arg
)
2601 video_intra_quant_bias
= atoi(arg
);
2603 static void opt_pbias(const char *arg
)
2605 video_inter_quant_bias
= atoi(arg
);
2608 static void opt_packet_size(const char *arg
)
2610 packet_size
= atoi(arg
);
2613 static void opt_error_rate(const char *arg
)
2615 error_rate
= atoi(arg
);
2618 static void opt_strict(const char *arg
)
2623 static void opt_top_field_first(const char *arg
)
2625 top_field_first
= atoi(arg
);
2628 static void opt_noise_reduction(const char *arg
)
2630 noise_reduction
= atoi(arg
);
2633 static void opt_qns(const char *arg
)
2638 static void opt_sc_threshold(const char *arg
)
2640 sc_threshold
= atoi(arg
);
2643 static void opt_me_range(const char *arg
)
2645 me_range
= atoi(arg
);
2648 static void opt_thread_count(const char *arg
)
2650 thread_count
= atoi(arg
);
2651 #if !defined(HAVE_THREADS)
2653 fprintf(stderr
, "Warning: not compiled with thread support, using thread emulation\n");
2657 static void opt_audio_bitrate(const char *arg
)
2659 audio_bit_rate
= atoi(arg
) * 1000;
2662 static void opt_audio_rate(const char *arg
)
2664 audio_sample_rate
= atoi(arg
);
2667 static void opt_audio_channels(const char *arg
)
2669 audio_channels
= atoi(arg
);
2672 static void opt_video_device(const char *arg
)
2674 video_device
= av_strdup(arg
);
2677 static void opt_grab_device(const char *arg
)
2679 grab_device
= av_strdup(arg
);
2682 static void opt_video_channel(const char *arg
)
2684 video_channel
= strtol(arg
, NULL
, 0);
2687 static void opt_video_standard(const char *arg
)
2689 video_standard
= av_strdup(arg
);
2692 static void opt_audio_device(const char *arg
)
2694 audio_device
= av_strdup(arg
);
2697 static void opt_audio_codec(const char *arg
)
2701 if (!strcmp(arg
, "copy")) {
2702 audio_stream_copy
= 1;
2706 if (!strcmp(p
->name
, arg
) && p
->type
== CODEC_TYPE_AUDIO
)
2711 fprintf(stderr
, "Unknown audio codec '%s'\n", arg
);
2714 audio_codec_id
= p
->id
;
2719 static void opt_audio_tag(const char *arg
)
2722 audio_codec_tag
= strtol(arg
, &tail
, 0);
2725 audio_codec_tag
= arg
[0] + (arg
[1]<<8) + (arg
[2]<<16) + (arg
[3]<<24);
2728 static void opt_video_tag(const char *arg
)
2731 video_codec_tag
= strtol(arg
, &tail
, 0);
2734 video_codec_tag
= arg
[0] + (arg
[1]<<8) + (arg
[2]<<16) + (arg
[3]<<24);
2737 static void add_frame_hooker(const char *arg
)
2742 char *args
= av_strdup(arg
);
2746 argv
[0] = strtok(args
, " ");
2747 while (argc
< 62 && (argv
[++argc
] = strtok(NULL
, " "))) {
2750 i
= frame_hook_add(argc
, argv
);
2753 fprintf(stderr
, "Failed to add video hook function: %s\n", arg
);
2758 const char *motion_str
[] = {
2768 static void opt_motion_estimation(const char *arg
)
2774 fprintf(stderr
, "Unknown motion estimation method '%s'\n", arg
);
2777 if (!strcmp(*p
, arg
))
2781 me_method
= (p
- motion_str
) + 1;
2784 static void opt_video_codec(const char *arg
)
2788 if (!strcmp(arg
, "copy")) {
2789 video_stream_copy
= 1;
2793 if (!strcmp(p
->name
, arg
) && p
->type
== CODEC_TYPE_VIDEO
)
2798 fprintf(stderr
, "Unknown video codec '%s'\n", arg
);
2801 video_codec_id
= p
->id
;
2806 static void opt_map(const char *arg
)
2812 m
= &stream_maps
[nb_stream_maps
++];
2814 m
->file_index
= strtol(arg
, (char **)&p
, 0);
2818 m
->stream_index
= strtol(p
, (char **)&p
, 0);
2821 static void opt_map_meta_data(const char *arg
)
2827 m
= &meta_data_maps
[nb_meta_data_maps
++];
2829 m
->out_file
= strtol(arg
, (char **)&p
, 0);
2833 m
->in_file
= strtol(p
, (char **)&p
, 0);
2836 static void opt_recording_time(const char *arg
)
2838 recording_time
= parse_date(arg
, 1);
2841 static void opt_start_time(const char *arg
)
2843 start_time
= parse_date(arg
, 1);
2846 static void opt_rec_timestamp(const char *arg
)
2848 rec_timestamp
= parse_date(arg
, 0) / 1000000;
2851 static void opt_input_ts_offset(const char *arg
)
2853 input_ts_offset
= parse_date(arg
, 1);
2856 static void opt_input_file(const char *filename
)
2858 AVFormatContext
*ic
;
2859 AVFormatParameters params
, *ap
= ¶ms
;
2860 int err
, i
, ret
, rfps
, rfps_base
;
2863 if (!strcmp(filename
, "-"))
2866 using_stdin
|= !strncmp(filename
, "pipe:", 5) ||
2867 !strcmp( filename
, "/dev/stdin" );
2869 /* get default parameters from command line */
2870 memset(ap
, 0, sizeof(*ap
));
2871 ap
->sample_rate
= audio_sample_rate
;
2872 ap
->channels
= audio_channels
;
2873 ap
->time_base
.den
= frame_rate
;
2874 ap
->time_base
.num
= frame_rate_base
;
2875 ap
->width
= frame_width
+ frame_padleft
+ frame_padright
;
2876 ap
->height
= frame_height
+ frame_padtop
+ frame_padbottom
;
2877 ap
->image_format
= image_format
;
2878 ap
->pix_fmt
= frame_pix_fmt
;
2879 ap
->device
= grab_device
;
2880 ap
->channel
= video_channel
;
2881 ap
->standard
= video_standard
;
2882 ap
->video_codec_id
= video_codec_id
;
2883 ap
->audio_codec_id
= audio_codec_id
;
2884 if(pgmyuv_compatibility_hack
)
2885 ap
->video_codec_id
= CODEC_ID_PGMYUV
;
2887 /* open the input file with generic libav function */
2888 err
= av_open_input_file(&ic
, filename
, file_iformat
, 0, ap
);
2890 print_error(filename
, err
);
2894 /* If not enough info to get the stream parameters, we decode the
2895 first frames to get it. (used in mpeg case for example) */
2896 ret
= av_find_stream_info(ic
);
2897 if (ret
< 0 && verbose
>= 0) {
2898 fprintf(stderr
, "%s: could not find codec parameters\n", filename
);
2902 timestamp
= start_time
;
2903 /* add the stream start time */
2904 if (ic
->start_time
!= AV_NOPTS_VALUE
)
2905 timestamp
+= ic
->start_time
;
2907 /* if seeking requested, we execute it */
2908 if (start_time
!= 0) {
2909 ret
= av_seek_frame(ic
, -1, timestamp
, AVSEEK_FLAG_BACKWARD
);
2911 fprintf(stderr
, "%s: could not seek to position %0.3f\n",
2912 filename
, (double)timestamp
/ AV_TIME_BASE
);
2914 /* reset seek info */
2918 /* update the current parameters so that they match the one of the input stream */
2919 for(i
=0;i
<ic
->nb_streams
;i
++) {
2920 AVCodecContext
*enc
= &ic
->streams
[i
]->codec
;
2921 #if defined(HAVE_THREADS)
2923 avcodec_thread_init(enc
, thread_count
);
2925 enc
->thread_count
= thread_count
;
2926 switch(enc
->codec_type
) {
2927 case CODEC_TYPE_AUDIO
:
2928 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2929 audio_channels
= enc
->channels
;
2930 audio_sample_rate
= enc
->sample_rate
;
2932 ic
->streams
[i
]->discard
= AVDISCARD_ALL
;
2934 case CODEC_TYPE_VIDEO
:
2935 frame_height
= enc
->height
;
2936 frame_width
= enc
->width
;
2937 frame_aspect_ratio
= av_q2d(enc
->sample_aspect_ratio
) * enc
->width
/ enc
->height
;
2938 frame_pix_fmt
= enc
->pix_fmt
;
2939 rfps
= ic
->streams
[i
]->r_frame_rate
.num
;
2940 rfps_base
= ic
->streams
[i
]->r_frame_rate
.den
;
2941 enc
->workaround_bugs
= workaround_bugs
;
2942 enc
->error_resilience
= error_resilience
;
2943 enc
->error_concealment
= error_concealment
;
2944 enc
->idct_algo
= idct_algo
;
2946 enc
->debug_mv
= debug_mv
;
2947 enc
->lowres
= lowres
;
2948 if(lowres
) enc
->flags
|= CODEC_FLAG_EMU_EDGE
;
2950 enc
->flags
|= CODEC_FLAG_BITEXACT
;
2952 enc
->debug
|= FF_DEBUG_MV
;
2954 if (enc
->time_base
.den
!= rfps
|| enc
->time_base
.num
!= rfps_base
) {
2957 fprintf(stderr
,"\nSeems that stream %d comes from film source: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2958 i
, (float)enc
->time_base
.den
/ enc
->time_base
.num
, enc
->time_base
.den
, enc
->time_base
.num
,
2960 (float)rfps
/ rfps_base
, rfps
, rfps_base
);
2962 /* update the current frame rate to match the stream frame rate */
2964 frame_rate_base
= rfps_base
;
2966 enc
->rate_emu
= rate_emu
;
2968 ic
->streams
[i
]->discard
= AVDISCARD_ALL
;
2969 else if(video_discard
)
2970 ic
->streams
[i
]->discard
= video_discard
;
2972 case CODEC_TYPE_DATA
:
2979 input_files
[nb_input_files
] = ic
;
2980 input_files_ts_offset
[nb_input_files
] = input_ts_offset
- (copy_ts ?
0 : timestamp
);
2981 /* dump the file content */
2983 dump_format(ic
, nb_input_files
, filename
, 0);
2986 file_iformat
= NULL
;
2987 file_oformat
= NULL
;
2988 image_format
= NULL
;
2996 static void opt_grab(const char *arg
)
2998 file_iformat
= av_find_input_format(arg
);
3002 static void check_audio_video_inputs(int *has_video_ptr
, int *has_audio_ptr
)
3004 int has_video
, has_audio
, i
, j
;
3005 AVFormatContext
*ic
;
3009 for(j
=0;j
<nb_input_files
;j
++) {
3010 ic
= input_files
[j
];
3011 for(i
=0;i
<ic
->nb_streams
;i
++) {
3012 AVCodecContext
*enc
= &ic
->streams
[i
]->codec
;
3013 switch(enc
->codec_type
) {
3014 case CODEC_TYPE_AUDIO
:
3017 case CODEC_TYPE_VIDEO
:
3020 case CODEC_TYPE_DATA
:
3027 *has_video_ptr
= has_video
;
3028 *has_audio_ptr
= has_audio
;
3031 static void opt_output_file(const char *filename
)
3034 AVFormatContext
*oc
;
3035 int use_video
, use_audio
, nb_streams
, input_has_video
, input_has_audio
;
3037 AVFormatParameters params
, *ap
= ¶ms
;
3039 if (!strcmp(filename
, "-"))
3042 oc
= av_alloc_format_context();
3044 if (!file_oformat
) {
3045 file_oformat
= guess_format(NULL
, filename
, NULL
);
3046 if (!file_oformat
) {
3047 fprintf(stderr
, "Unable for find a suitable output format for '%s'\n",
3053 oc
->oformat
= file_oformat
;
3055 if (!strcmp(file_oformat
->name
, "ffm") &&
3056 strstart(filename
, "http:", NULL
)) {
3057 /* special case for files sent to ffserver: we get the stream
3058 parameters from ffserver */
3059 if (read_ffserver_streams(oc
, filename
) < 0) {
3060 fprintf(stderr
, "Could not read stream parameters from '%s'\n", filename
);
3064 use_video
= file_oformat
->video_codec
!= CODEC_ID_NONE
|| video_stream_copy
;
3065 use_audio
= file_oformat
->audio_codec
!= CODEC_ID_NONE
|| audio_stream_copy
;
3067 /* disable if no corresponding type found and at least one
3069 if (nb_input_files
> 0) {
3070 check_audio_video_inputs(&input_has_video
, &input_has_audio
);
3071 if (!input_has_video
)
3073 if (!input_has_audio
)
3077 /* manual disable */
3078 if (audio_disable
) {
3081 if (video_disable
) {
3087 AVCodecContext
*video_enc
;
3089 st
= av_new_stream(oc
, nb_streams
++);
3091 fprintf(stderr
, "Could not alloc stream\n");
3094 #if defined(HAVE_THREADS)
3096 avcodec_thread_init(&st
->codec
, thread_count
);
3099 video_enc
= &st
->codec
;
3102 video_enc
->codec_tag
= video_codec_tag
;
3104 if (file_oformat
->flags
& AVFMT_GLOBALHEADER
)
3105 video_enc
->flags
|= CODEC_FLAG_GLOBAL_HEADER
;
3106 if (video_stream_copy
) {
3107 st
->stream_copy
= 1;
3108 video_enc
->codec_type
= CODEC_TYPE_VIDEO
;
3114 codec_id
= av_guess_codec(file_oformat
, NULL
, filename
, NULL
, CODEC_TYPE_VIDEO
);
3115 if (video_codec_id
!= CODEC_ID_NONE
)
3116 codec_id
= video_codec_id
;
3118 video_enc
->codec_id
= codec_id
;
3119 codec
= avcodec_find_encoder(codec_id
);
3121 video_enc
->bit_rate
= video_bit_rate
;
3122 video_enc
->bit_rate_tolerance
= video_bit_rate_tolerance
;
3123 video_enc
->time_base
.den
= frame_rate
;
3124 video_enc
->time_base
.num
= frame_rate_base
;
3125 if(codec
&& codec
->supported_framerates
){
3126 const AVRational
*p
= codec
->supported_framerates
;
3127 AVRational req
= (AVRational
){frame_rate
, frame_rate_base
};
3128 const AVRational
*best
=NULL
;
3129 AVRational best_error
= (AVRational
){INT_MAX
, 1};
3130 for(; p
->den
!=0; p
++){
3131 AVRational error
= av_sub_q(req
, *p
);
3132 if(error
.num
<0) error
.num
*= -1;
3133 if(av_cmp_q(error
, best_error
) < 0){
3138 video_enc
->time_base
.den
= best
->num
;
3139 video_enc
->time_base
.num
= best
->den
;
3142 video_enc
->width
= frame_width
+ frame_padright
+ frame_padleft
;
3143 video_enc
->height
= frame_height
+ frame_padtop
+ frame_padbottom
;
3144 video_enc
->sample_aspect_ratio
= av_d2q(frame_aspect_ratio
*frame_height
/frame_width
, 255);
3145 video_enc
->pix_fmt
= frame_pix_fmt
;
3147 if(codec
&& codec
->pix_fmts
){
3148 const enum PixelFormat
*p
= codec
->pix_fmts
;
3150 if(*p
== video_enc
->pix_fmt
)
3154 video_enc
->pix_fmt
= codec
->pix_fmts
[0];
3158 video_enc
->gop_size
= gop_size
;
3160 video_enc
->gop_size
= 0;
3161 if (video_qscale
|| same_quality
) {
3162 video_enc
->flags
|= CODEC_FLAG_QSCALE
;
3163 video_enc
->global_quality
=
3164 st
->quality
= FF_QP2LAMBDA
* video_qscale
;
3168 video_enc
->intra_matrix
= intra_matrix
;
3170 video_enc
->inter_matrix
= inter_matrix
;
3173 video_enc
->flags
|= CODEC_FLAG_BITEXACT
;
3175 video_enc
->mb_decision
= mb_decision
;
3176 video_enc
->mb_cmp
= mb_cmp
;
3177 video_enc
->ildct_cmp
= ildct_cmp
;
3178 video_enc
->me_sub_cmp
= sub_cmp
;
3179 video_enc
->me_cmp
= cmp
;
3180 video_enc
->me_pre_cmp
= pre_cmp
;
3181 video_enc
->pre_me
= pre_me
;
3182 video_enc
->lumi_masking
= lumi_mask
;
3183 video_enc
->dark_masking
= dark_mask
;
3184 video_enc
->spatial_cplx_masking
= scplx_mask
;
3185 video_enc
->temporal_cplx_masking
= tcplx_mask
;
3186 video_enc
->p_masking
= p_mask
;
3187 video_enc
->quantizer_noise_shaping
= qns
;
3190 video_enc
->flags
|= CODEC_FLAG_H263P_UMV
;
3193 video_enc
->flags
|= CODEC_FLAG_H263P_SLICE_STRUCT
;
3196 video_enc
->flags
|= CODEC_FLAG_H263P_AIC
;
3199 video_enc
->flags
|= CODEC_FLAG_H263P_AIV
;
3202 video_enc
->flags
|= CODEC_FLAG_4MV
;
3205 video_enc
->flags
|= CODEC_FLAG_OBMC
;
3208 video_enc
->flags
|= CODEC_FLAG_LOOP_FILTER
;
3212 video_enc
->flags
|= CODEC_FLAG_PART
;
3215 video_enc
->flags
|= CODEC_FLAG_ALT_SCAN
;
3218 video_enc
->flags
|= CODEC_FLAG_TRELLIS_QUANT
;
3221 video_enc
->flags
|= CODEC_FLAG_MV0
;
3223 if (do_normalize_aqp
) {
3224 video_enc
->flags
|= CODEC_FLAG_NORMALIZE_AQP
;
3226 if (use_scan_offset
) {
3227 video_enc
->flags
|= CODEC_FLAG_SVCD_SCAN_OFFSET
;
3230 video_enc
->flags
|= CODEC_FLAG_CLOSED_GOP
;
3233 video_enc
->flags2
|= CODEC_FLAG2_STRICT_GOP
;
3236 video_enc
->flags
|= CODEC_FLAG_QPEL
;
3239 video_enc
->flags
|= CODEC_FLAG_QP_RD
;
3242 video_enc
->flags
|= CODEC_FLAG_CBP_RD
;
3245 video_enc
->max_b_frames
= b_frames
;
3246 video_enc
->b_frame_strategy
= b_strategy
;
3247 video_enc
->b_quant_factor
= 2.0;
3249 if (do_interlace_dct
) {
3250 video_enc
->flags
|= CODEC_FLAG_INTERLACED_DCT
;
3252 if (do_interlace_me
) {
3253 video_enc
->flags
|= CODEC_FLAG_INTERLACED_ME
;
3256 video_enc
->flags2
|= CODEC_FLAG2_NO_OUTPUT
;
3258 video_enc
->qmin
= video_qmin
;
3259 video_enc
->qmax
= video_qmax
;
3260 video_enc
->lmin
= video_lmin
;
3261 video_enc
->lmax
= video_lmax
;
3262 video_enc
->rc_qsquish
= video_qsquish
;
3263 video_enc
->luma_elim_threshold
= video_lelim
;
3264 video_enc
->chroma_elim_threshold
= video_celim
;
3265 video_enc
->mb_lmin
= video_mb_lmin
;
3266 video_enc
->mb_lmax
= video_mb_lmax
;
3267 video_enc
->max_qdiff
= video_qdiff
;
3268 video_enc
->qblur
= video_qblur
;
3269 video_enc
->qcompress
= video_qcomp
;
3270 video_enc
->rc_eq
= video_rc_eq
;
3271 video_enc
->debug
= debug
;
3272 video_enc
->debug_mv
= debug_mv
;
3273 video_enc
->workaround_bugs
= workaround_bugs
;
3274 video_enc
->thread_count
= thread_count
;
3275 p
= video_rc_override_string
;
3278 int e
=sscanf(p
, "%d,%d,%d", &start
, &end
, &q
);
3280 fprintf(stderr
, "error parsing rc_override\n");
3283 video_enc
->rc_override
=
3284 av_realloc(video_enc
->rc_override
,
3285 sizeof(RcOverride
)*(i
+1));
3286 video_enc
->rc_override
[i
].start_frame
= start
;
3287 video_enc
->rc_override
[i
].end_frame
= end
;
3289 video_enc
->rc_override
[i
].qscale
= q
;
3290 video_enc
->rc_override
[i
].quality_factor
= 1.0;
3293 video_enc
->rc_override
[i
].qscale
= 0;
3294 video_enc
->rc_override
[i
].quality_factor
= -q
/100.0;
3299 video_enc
->rc_override_count
=i
;
3301 video_enc
->rc_max_rate
= video_rc_max_rate
;
3302 video_enc
->rc_min_rate
= video_rc_min_rate
;
3303 video_enc
->rc_buffer_size
= video_rc_buffer_size
;
3304 video_enc
->rc_initial_buffer_occupancy
= video_rc_buffer_size
*3/4;
3305 video_enc
->rc_buffer_aggressivity
= video_rc_buffer_aggressivity
;
3306 video_enc
->rc_initial_cplx
= video_rc_initial_cplx
;
3307 video_enc
->i_quant_factor
= video_i_qfactor
;
3308 video_enc
->b_quant_factor
= video_b_qfactor
;
3309 video_enc
->i_quant_offset
= video_i_qoffset
;
3310 video_enc
->b_quant_offset
= video_b_qoffset
;
3311 video_enc
->intra_quant_bias
= video_intra_quant_bias
;
3312 video_enc
->inter_quant_bias
= video_inter_quant_bias
;
3313 video_enc
->dct_algo
= dct_algo
;
3314 video_enc
->idct_algo
= idct_algo
;
3315 video_enc
->me_threshold
= me_threshold
;
3316 video_enc
->mb_threshold
= mb_threshold
;
3317 video_enc
->intra_dc_precision
= intra_dc_precision
- 8;
3318 video_enc
->strict_std_compliance
= strict
;
3319 video_enc
->error_rate
= error_rate
;
3320 video_enc
->noise_reduction
= noise_reduction
;
3321 video_enc
->scenechange_threshold
= sc_threshold
;
3322 video_enc
->me_range
= me_range
;
3323 video_enc
->coder_type
= coder
;
3324 video_enc
->context_model
= context
;
3325 video_enc
->prediction_method
= predictor
;
3326 video_enc
->profile
= video_profile
;
3327 video_enc
->level
= video_level
;
3328 video_enc
->nsse_weight
= nsse_weight
;
3329 video_enc
->me_subpel_quality
= subpel_quality
;
3330 video_enc
->me_penalty_compensation
= me_penalty_compensation
;
3331 video_enc
->frame_skip_threshold
= frame_skip_threshold
;
3332 video_enc
->frame_skip_factor
= frame_skip_factor
;
3333 video_enc
->frame_skip_exp
= frame_skip_exp
;
3334 video_enc
->frame_skip_cmp
= frame_skip_cmp
;
3337 video_enc
->rtp_mode
= 1;
3338 video_enc
->rtp_payload_size
= packet_size
;
3342 video_enc
->flags
|= CODEC_FLAG_PSNR
;
3344 video_enc
->me_method
= me_method
;
3349 video_enc
->flags
|= CODEC_FLAG_PASS1
;
3351 video_enc
->flags
|= CODEC_FLAG_PASS2
;
3358 AVCodecContext
*audio_enc
;
3360 st
= av_new_stream(oc
, nb_streams
++);
3362 fprintf(stderr
, "Could not alloc stream\n");
3365 #if defined(HAVE_THREADS)
3367 avcodec_thread_init(&st
->codec
, thread_count
);
3370 audio_enc
= &st
->codec
;
3371 audio_enc
->codec_type
= CODEC_TYPE_AUDIO
;
3374 audio_enc
->codec_tag
= audio_codec_tag
;
3376 if (file_oformat
->flags
& AVFMT_GLOBALHEADER
)
3377 audio_enc
->flags
|= CODEC_FLAG_GLOBAL_HEADER
;
3378 if (audio_stream_copy
) {
3379 st
->stream_copy
= 1;
3380 audio_enc
->channels
= audio_channels
;
3382 codec_id
= av_guess_codec(file_oformat
, NULL
, filename
, NULL
, CODEC_TYPE_AUDIO
);
3383 if (audio_codec_id
!= CODEC_ID_NONE
)
3384 codec_id
= audio_codec_id
;
3385 audio_enc
->codec_id
= codec_id
;
3387 audio_enc
->bit_rate
= audio_bit_rate
;
3388 audio_enc
->strict_std_compliance
= strict
;
3389 audio_enc
->thread_count
= thread_count
;
3390 /* For audio codecs other than AC3 or DTS we limit */
3391 /* the number of coded channels to stereo */
3392 if (audio_channels
> 2 && codec_id
!= CODEC_ID_AC3
3393 && codec_id
!= CODEC_ID_DTS
) {
3394 audio_enc
->channels
= 2;
3396 audio_enc
->channels
= audio_channels
;
3398 audio_enc
->sample_rate
= audio_sample_rate
;
3401 oc
->nb_streams
= nb_streams
;
3404 fprintf(stderr
, "No audio or video streams available\n");
3408 oc
->timestamp
= rec_timestamp
;
3411 pstrcpy(oc
->title
, sizeof(oc
->title
), str_title
);
3413 pstrcpy(oc
->author
, sizeof(oc
->author
), str_author
);
3415 pstrcpy(oc
->copyright
, sizeof(oc
->copyright
), str_copyright
);
3417 pstrcpy(oc
->comment
, sizeof(oc
->comment
), str_comment
);
3420 output_files
[nb_output_files
++] = oc
;
3422 pstrcpy(oc
->filename
, sizeof(oc
->filename
), filename
);
3424 /* check filename in case of an image number is expected */
3425 if (oc
->oformat
->flags
& AVFMT_NEEDNUMBER
) {
3426 if (filename_number_test(oc
->filename
) < 0) {
3427 print_error(oc
->filename
, AVERROR_NUMEXPECTED
);
3432 if (!(oc
->oformat
->flags
& AVFMT_NOFILE
)) {
3433 /* test if it already exists to avoid loosing precious files */
3434 if (!file_overwrite
&&
3435 (strchr(filename
, ':') == NULL
||
3436 strstart(filename
, "file:", NULL
))) {
3437 if (url_exist(filename
)) {
3440 if ( !using_stdin
) {
3441 fprintf(stderr
,"File '%s' already exists. Overwrite ? [y/N] ", filename
);
3444 if (toupper(c
) != 'Y') {
3445 fprintf(stderr
, "Not overwriting - exiting\n");
3450 fprintf(stderr
,"File '%s' already exists. Exiting.\n", filename
);
3457 if (url_fopen(&oc
->pb
, filename
, URL_WRONLY
) < 0) {
3458 fprintf(stderr
, "Could not open '%s'\n", filename
);
3463 memset(ap
, 0, sizeof(*ap
));
3464 ap
->image_format
= image_format
;
3465 if (av_set_parameters(oc
, ap
) < 0) {
3466 fprintf(stderr
, "%s: Invalid encoding parameters\n",
3471 oc
->packet_size
= mux_packet_size
;
3472 oc
->mux_rate
= mux_rate
;
3473 oc
->preload
= (int)(mux_preload
*AV_TIME_BASE
);
3474 oc
->max_delay
= (int)(mux_max_delay
*AV_TIME_BASE
);
3476 /* reset some options */
3477 file_oformat
= NULL
;
3478 file_iformat
= NULL
;
3479 image_format
= NULL
;
3482 audio_codec_id
= CODEC_ID_NONE
;
3483 video_codec_id
= CODEC_ID_NONE
;
3484 audio_stream_copy
= 0;
3485 video_stream_copy
= 0;
3488 /* prepare dummy protocols for grab */
3489 static void prepare_grab(void)
3491 int has_video
, has_audio
, i
, j
;
3492 AVFormatContext
*oc
;
3493 AVFormatContext
*ic
;
3494 AVFormatParameters vp1
, *vp
= &vp1
;
3495 AVFormatParameters ap1
, *ap
= &ap1
;
3497 /* see if audio/video inputs are needed */
3500 memset(ap
, 0, sizeof(*ap
));
3501 memset(vp
, 0, sizeof(*vp
));
3502 vp
->time_base
.num
= 1;
3503 for(j
=0;j
<nb_output_files
;j
++) {
3504 oc
= output_files
[j
];
3505 for(i
=0;i
<oc
->nb_streams
;i
++) {
3506 AVCodecContext
*enc
= &oc
->streams
[i
]->codec
;
3507 switch(enc
->codec_type
) {
3508 case CODEC_TYPE_AUDIO
:
3509 if (enc
->sample_rate
> ap
->sample_rate
)
3510 ap
->sample_rate
= enc
->sample_rate
;
3511 if (enc
->channels
> ap
->channels
)
3512 ap
->channels
= enc
->channels
;
3515 case CODEC_TYPE_VIDEO
:
3516 if (enc
->width
> vp
->width
)
3517 vp
->width
= enc
->width
;
3518 if (enc
->height
> vp
->height
)
3519 vp
->height
= enc
->height
;
3521 if (vp
->time_base
.num
*(int64_t)enc
->time_base
.den
> enc
->time_base
.num
*(int64_t)vp
->time_base
.den
){
3522 vp
->time_base
= enc
->time_base
;
3532 if (has_video
== 0 && has_audio
== 0) {
3533 fprintf(stderr
, "Output file must have at least one audio or video stream\n");
3538 AVInputFormat
*fmt1
;
3539 fmt1
= av_find_input_format(video_grab_format
);
3540 vp
->device
= video_device
;
3541 vp
->channel
= video_channel
;
3542 vp
->standard
= video_standard
;
3543 if (av_open_input_file(&ic
, "", fmt1
, 0, vp
) < 0) {
3544 fprintf(stderr
, "Could not find video grab device\n");
3547 /* If not enough info to get the stream parameters, we decode the
3548 first frames to get it. */
3549 if ((ic
->ctx_flags
& AVFMTCTX_NOHEADER
) && av_find_stream_info(ic
) < 0) {
3550 fprintf(stderr
, "Could not find video grab parameters\n");
3553 /* by now video grab has one stream */
3554 ic
->streams
[0]->r_frame_rate
.num
= vp
->time_base
.den
;
3555 ic
->streams
[0]->r_frame_rate
.den
= vp
->time_base
.num
;
3556 input_files
[nb_input_files
] = ic
;
3559 dump_format(ic
, nb_input_files
, "", 0);
3563 if (has_audio
&& audio_grab_format
) {
3564 AVInputFormat
*fmt1
;
3565 fmt1
= av_find_input_format(audio_grab_format
);
3566 ap
->device
= audio_device
;
3567 if (av_open_input_file(&ic
, "", fmt1
, 0, ap
) < 0) {
3568 fprintf(stderr
, "Could not find audio grab device\n");
3571 input_files
[nb_input_files
] = ic
;
3574 dump_format(ic
, nb_input_files
, "", 0);
3580 /* same option as mencoder */
3581 static void opt_pass(const char *pass_str
)
3584 pass
= atoi(pass_str
);
3585 if (pass
!= 1 && pass
!= 2) {
3586 fprintf(stderr
, "pass number can be only 1 or 2\n");
3592 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3593 static int64_t getutime(void)
3595 return av_gettime();
3598 static int64_t getutime(void)
3600 struct rusage rusage
;
3602 getrusage(RUSAGE_SELF
, &rusage
);
3603 return (rusage
.ru_utime
.tv_sec
* 1000000LL) + rusage
.ru_utime
.tv_usec
;
3607 extern int ffm_nopts
;
3609 static void opt_bitexact(void)
3612 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3616 static void show_formats(void)
3618 AVInputFormat
*ifmt
;
3619 AVOutputFormat
*ofmt
;
3620 AVImageFormat
*image_fmt
;
3623 const char **pp
, *last_name
;
3625 printf("File formats:\n");
3630 const char *name
=NULL
;
3631 const char *long_name
=NULL
;
3633 for(ofmt
= first_oformat
; ofmt
!= NULL
; ofmt
= ofmt
->next
) {
3634 if((name
== NULL
|| strcmp(ofmt
->name
, name
)<0) &&
3635 strcmp(ofmt
->name
, last_name
)>0){
3637 long_name
= ofmt
->long_name
;
3641 for(ifmt
= first_iformat
; ifmt
!= NULL
; ifmt
= ifmt
->next
) {
3642 if((name
== NULL
|| strcmp(ifmt
->name
, name
)<0) &&
3643 strcmp(ifmt
->name
, last_name
)>0){
3645 long_name
= ifmt
->long_name
;
3648 if(name
&& strcmp(ifmt
->name
, name
)==0)
3660 long_name ? long_name
:" ");
3664 printf("Image formats (filename extensions, if any, follow):\n");
3665 for(image_fmt
= first_image_format
; image_fmt
!= NULL
;
3666 image_fmt
= image_fmt
->next
) {
3669 image_fmt
->img_read ?
"D":" ",
3670 image_fmt
->img_write ?
"E":" ",
3672 image_fmt
->extensions ? image_fmt
->extensions
:" ");
3676 printf("Codecs:\n");
3684 for(p
= first_avcodec
; p
!= NULL
; p
= p
->next
) {
3685 if((p2
==NULL
|| strcmp(p
->name
, p2
->name
)<0) &&
3686 strcmp(p
->name
, last_name
)>0){
3688 decode
= encode
= cap
=0;
3690 if(p2
&& strcmp(p
->name
, p2
->name
)==0){
3691 if(p
->decode
) decode
=1;
3692 if(p
->encode
) encode
=1;
3693 cap
|= p
->capabilities
;
3698 last_name
= p2
->name
;
3702 decode ?
"D": (/*p2->decoder ? "d":*/" "),
3704 p2
->type
== CODEC_TYPE_AUDIO ?
"A":"V",
3705 cap
& CODEC_CAP_DRAW_HORIZ_BAND ?
"S":" ",
3706 cap
& CODEC_CAP_DR1 ?
"D":" ",
3707 cap
& CODEC_CAP_TRUNCATED ?
"T":" ",
3709 /* if(p2->decoder && decode==0)
3710 printf(" use %s for decoding", p2->decoder->name);*/
3715 printf("Supported file protocols:\n");
3716 for(up
= first_protocol
; up
!= NULL
; up
= up
->next
)
3717 printf(" %s:", up
->name
);
3720 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3721 printf("Motion estimation methods:\n");
3725 if ((pp
- motion_str
+ 1) == ME_ZERO
)
3726 printf("(fastest)");
3727 else if ((pp
- motion_str
+ 1) == ME_FULL
)
3728 printf("(slowest)");
3729 else if ((pp
- motion_str
+ 1) == ME_EPZS
)
3730 printf("(default)");
3735 "Note, the names of encoders and decoders dont always match, so there are\n"
3736 "several cases where the above table shows encoder only or decoder only entries\n"
3737 "even though both encoding and decoding are supported for example, the h263\n"
3738 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3743 void parse_matrix_coeffs(uint16_t *dest
, const char *str
)
3746 const char *p
= str
;
3753 fprintf(stderr
, "Syntax error in matrix \"%s\" at coeff %d\n", str
, i
);
3760 void opt_inter_matrix(const char *arg
)
3762 inter_matrix
= av_mallocz(sizeof(uint16_t) * 64);
3763 parse_matrix_coeffs(inter_matrix
, arg
);
3766 void opt_intra_matrix(const char *arg
)
3768 intra_matrix
= av_mallocz(sizeof(uint16_t) * 64);
3769 parse_matrix_coeffs(intra_matrix
, arg
);
3772 static void opt_target(const char *arg
)
3775 static const char *const frame_rates
[] = {"25", "30000/1001", "24000/1001"};
3777 if(!strncmp(arg
, "pal-", 4)) {
3780 } else if(!strncmp(arg
, "ntsc-", 5)) {
3783 } else if(!strncmp(arg
, "film-", 5)) {
3788 /* Calculate FR via float to avoid int overflow */
3789 fr
= (int)(frame_rate
* 1000.0 / frame_rate_base
);
3792 } else if((fr
== 29970) || (fr
== 23976)) {
3795 /* Try to determine PAL/NTSC by peeking in the input files */
3796 if(nb_input_files
) {
3798 for(j
= 0; j
< nb_input_files
; j
++) {
3799 for(i
= 0; i
< input_files
[j
]->nb_streams
; i
++) {
3800 AVCodecContext
*c
= &input_files
[j
]->streams
[i
]->codec
;
3801 if(c
->codec_type
!= CODEC_TYPE_VIDEO
)
3803 fr
= c
->time_base
.den
* 1000 / c
->time_base
.num
;
3807 } else if((fr
== 29970) || (fr
== 23976)) {