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
30 #include "libavformat/avformat.h"
31 #include "libavdevice/avdevice.h"
32 #include "libswscale/swscale.h"
33 #include "libavformat/framehook.h"
34 #include "libavcodec/opt.h"
35 #include "libavutil/fifo.h"
36 #include "libavutil/avstring.h"
37 #include "libavformat/os_support.h"
39 #ifdef HAVE_SYS_RESOURCE_H
40 #include <sys/types.h>
41 #include <sys/resource.h>
42 #elif defined(HAVE_GETPROCESSTIMES)
46 #if defined(HAVE_TERMIOS_H)
49 #include <sys/ioctl.h>
52 #elif defined(HAVE_CONIO_H)
55 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
65 const char program_name
[] = "FFmpeg";
66 const int program_birth_year
= 2000;
68 /* select an input stream for an output stream */
69 typedef struct AVStreamMap
{
73 int sync_stream_index
;
76 /** select an input file for an output file */
77 typedef struct AVMetaDataMap
{
82 static const OptionDef options
[];
86 static AVFormatContext
*input_files
[MAX_FILES
];
87 static int64_t input_files_ts_offset
[MAX_FILES
];
88 static int nb_input_files
= 0;
90 static AVFormatContext
*output_files
[MAX_FILES
];
91 static int nb_output_files
= 0;
93 static AVStreamMap stream_maps
[MAX_FILES
];
94 static int nb_stream_maps
;
96 static AVMetaDataMap meta_data_maps
[MAX_FILES
];
97 static int nb_meta_data_maps
;
99 static AVInputFormat
*file_iformat
;
100 static AVOutputFormat
*file_oformat
;
101 static int frame_width
= 0;
102 static int frame_height
= 0;
103 static float frame_aspect_ratio
= 0;
104 static enum PixelFormat frame_pix_fmt
= PIX_FMT_NONE
;
105 static int frame_padtop
= 0;
106 static int frame_padbottom
= 0;
107 static int frame_padleft
= 0;
108 static int frame_padright
= 0;
109 static int padcolor
[3] = {16,128,128}; /* default to black */
110 static int frame_topBand
= 0;
111 static int frame_bottomBand
= 0;
112 static int frame_leftBand
= 0;
113 static int frame_rightBand
= 0;
114 static int max_frames
[4] = {INT_MAX
, INT_MAX
, INT_MAX
, INT_MAX
};
115 static AVRational frame_rate
= (AVRational
) {0,0};
116 static float video_qscale
= 0;
117 static int video_qdiff
= 3;
118 static uint16_t *intra_matrix
= NULL
;
119 static uint16_t *inter_matrix
= NULL
;
120 #if 0 //experimental, (can be removed)
121 static float video_rc_qsquish
=1.0;
122 static float video_rc_qmod_amp
=0;
123 static int video_rc_qmod_freq
=0;
125 static const char *video_rc_override_string
=NULL
;
126 static int video_disable
= 0;
127 static int video_discard
= 0;
128 static char *video_codec_name
= NULL
;
129 static int video_codec_tag
= 0;
130 static int same_quality
= 0;
131 static int do_deinterlace
= 0;
132 static int strict
= 0;
133 static int top_field_first
= -1;
134 static int me_threshold
= 0;
135 static int intra_dc_precision
= 8;
136 static int loop_input
= 0;
137 static int loop_output
= AVFMT_NOOUTPUTLOOP
;
138 static int qp_hist
= 0;
140 static int intra_only
= 0;
141 static int audio_sample_rate
= 44100;
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 char *audio_codec_name
= NULL
;
147 static int audio_codec_tag
= 0;
148 static char *audio_language
= NULL
;
150 static int subtitle_disable
= 0;
151 static char *subtitle_codec_name
= NULL
;
152 static char *subtitle_language
= NULL
;
154 static float mux_preload
= 0.5;
155 static float mux_max_delay
= 0.7;
157 static int64_t recording_time
= 0;
158 static int64_t start_time
= 0;
159 static int64_t rec_timestamp
= 0;
160 static int64_t input_ts_offset
= 0;
161 static int file_overwrite
= 0;
162 static char *str_title
= NULL
;
163 static char *str_author
= NULL
;
164 static char *str_copyright
= NULL
;
165 static char *str_comment
= NULL
;
166 static char *str_genre
= NULL
;
167 static char *str_album
= NULL
;
168 static int do_benchmark
= 0;
169 static int do_hex_dump
= 0;
170 static int do_pkt_dump
= 0;
171 static int do_psnr
= 0;
172 static int do_pass
= 0;
173 static char *pass_logfilename
= NULL
;
174 static int audio_stream_copy
= 0;
175 static int video_stream_copy
= 0;
176 static int subtitle_stream_copy
= 0;
177 static int video_sync_method
= 1;
178 static int audio_sync_method
= 0;
179 static float audio_drift_threshold
= 0.1;
180 static int copy_ts
= 0;
181 static int opt_shortest
= 0; //
182 static int video_global_header
= 0;
183 static char *vstats_filename
;
184 static FILE *vstats_file
;
185 static int opt_programid
= 0;
187 static int rate_emu
= 0;
189 static int video_channel
= 0;
190 static char *video_standard
;
192 static int audio_volume
= 256;
194 static int using_stdin
= 0;
195 static int using_vhook
= 0;
196 static int verbose
= 1;
197 static int thread_count
= 1;
198 static int q_pressed
= 0;
199 static int64_t video_size
= 0;
200 static int64_t audio_size
= 0;
201 static int64_t extra_size
= 0;
202 static int nb_frames_dup
= 0;
203 static int nb_frames_drop
= 0;
204 static int input_sync
;
205 static uint64_t limit_filesize
= 0; //
207 static int pgmyuv_compatibility_hack
=0;
208 static float dts_delta_threshold
= 10;
210 static unsigned int sws_flags
= SWS_BICUBIC
;
212 static const char **opt_names
;
213 static int opt_name_count
;
214 static AVCodecContext
*avctx_opts
[CODEC_TYPE_NB
];
215 static AVFormatContext
*avformat_opts
;
216 static struct SwsContext
*sws_opts
;
217 static int64_t timer_start
;
219 static AVBitStreamFilterContext
*video_bitstream_filters
=NULL
;
220 static AVBitStreamFilterContext
*audio_bitstream_filters
=NULL
;
221 static AVBitStreamFilterContext
*subtitle_bitstream_filters
=NULL
;
222 static AVBitStreamFilterContext
*bitstream_filters
[MAX_FILES
][MAX_STREAMS
];
224 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
226 struct AVInputStream
;
228 typedef struct AVOutputStream
{
229 int file_index
; /* file index */
230 int index
; /* stream index in the output file */
231 int source_index
; /* AVInputStream index */
232 AVStream
*st
; /* stream in the output file */
233 int encoding_needed
; /* true if encoding needed for this stream */
235 /* input pts and corresponding output pts
237 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
238 struct AVInputStream
*sync_ist
; /* input stream to sync against */
239 int64_t sync_opts
; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
242 AVFrame pict_tmp
; /* temporary image for resampling */
243 struct SwsContext
*img_resample_ctx
; /* for image resampling */
247 int topBand
; /* cropping area sizes */
251 int padtop
; /* padding area sizes */
258 ReSampleContext
*resample
; /* for audio resampling */
259 AVFifoBuffer fifo
; /* for compression: one audio fifo per codec */
263 typedef struct AVInputStream
{
267 int discard
; /* true if stream data should be discarded */
268 int decoding_needed
; /* true if the packets must be decoded in 'raw_fifo' */
269 int64_t sample_index
; /* current sample */
271 int64_t start
; /* time when read started */
272 unsigned long frame
; /* current frame */
273 int64_t next_pts
; /* synthetic pts for cases where pkt.pts
275 int64_t pts
; /* current pts */
276 int is_start
; /* is 1 at the start and after a discontinuity */
279 typedef struct AVInputFile
{
280 int eof_reached
; /* true if eof reached */
281 int ist_index
; /* index of first stream in ist_table */
282 int buffer_size
; /* current total buffer size */
283 int nb_streams
; /* nb streams we are aware of */
286 #ifdef HAVE_TERMIOS_H
288 /* init terminal so that we can grab keys */
289 static struct termios oldtty
;
292 static void term_exit(void)
294 #ifdef HAVE_TERMIOS_H
295 tcsetattr (0, TCSANOW
, &oldtty
);
299 static volatile sig_atomic_t received_sigterm
= 0;
302 sigterm_handler(int sig
)
304 received_sigterm
= sig
;
308 static void term_init(void)
310 #ifdef HAVE_TERMIOS_H
316 tty
.c_iflag
&= ~(IGNBRK
|BRKINT
|PARMRK
|ISTRIP
317 |INLCR
|IGNCR
|ICRNL
|IXON
);
318 tty
.c_oflag
|= OPOST
;
319 tty
.c_lflag
&= ~(ECHO
|ECHONL
|ICANON
|IEXTEN
);
320 tty
.c_cflag
&= ~(CSIZE
|PARENB
);
325 tcsetattr (0, TCSANOW
, &tty
);
326 signal(SIGQUIT
, sigterm_handler
); /* Quit (POSIX). */
329 signal(SIGINT
, sigterm_handler
); /* Interrupt (ANSI). */
330 signal(SIGTERM
, sigterm_handler
); /* Termination (ANSI). */
332 register a function to be called at normal program termination
335 #ifdef CONFIG_BEOS_NETSERVER
336 fcntl(0, F_SETFL
, fcntl(0, F_GETFL
) | O_NONBLOCK
);
340 /* read a key without blocking */
341 static int read_key(void)
343 #if defined(HAVE_TERMIOS_H)
346 #ifndef CONFIG_BEOS_NETSERVER
354 n
= select(1, &rfds
, NULL
, NULL
, &tv
);
363 #elif defined(HAVE_CONIO_H)
370 static int decode_interrupt_cb(void)
372 return q_pressed
|| (q_pressed
= read_key() == 'q');
375 static int av_exit(int ret
)
380 for(i
=0;i
<nb_output_files
;i
++) {
381 /* maybe av_close_output_file ??? */
382 AVFormatContext
*s
= output_files
[i
];
384 if (!(s
->oformat
->flags
& AVFMT_NOFILE
) && s
->pb
)
386 for(j
=0;j
<s
->nb_streams
;j
++) {
387 av_free(s
->streams
[j
]->codec
);
388 av_free(s
->streams
[j
]);
392 for(i
=0;i
<nb_input_files
;i
++)
393 av_close_input_file(input_files
[i
]);
395 av_free(intra_matrix
);
396 av_free(inter_matrix
);
400 av_free(vstats_filename
);
404 av_free(video_codec_name
);
405 av_free(audio_codec_name
);
406 av_free(subtitle_codec_name
);
408 av_free(video_standard
);
410 #ifdef CONFIG_POWERPC_PERF
411 extern void powerpc_display_perf_report(void);
412 powerpc_display_perf_report();
413 #endif /* CONFIG_POWERPC_PERF */
415 if (received_sigterm
) {
417 "Received signal %d: terminating.\n",
418 (int) received_sigterm
);
422 exit(ret
); /* not all OS-es handle main() return value */
426 static int read_ffserver_streams(AVFormatContext
*s
, const char *filename
)
432 err
= av_open_input_file(&ic
, filename
, NULL
, FFM_PACKET_SIZE
, NULL
);
435 /* copy stream format */
436 s
->nb_streams
= ic
->nb_streams
;
437 for(i
=0;i
<ic
->nb_streams
;i
++) {
440 // FIXME: a more elegant solution is needed
441 st
= av_mallocz(sizeof(AVStream
));
442 memcpy(st
, ic
->streams
[i
], sizeof(AVStream
));
443 st
->codec
= avcodec_alloc_context();
444 memcpy(st
->codec
, ic
->streams
[i
]->codec
, sizeof(AVCodecContext
));
447 if (st
->codec
->codec_type
== CODEC_TYPE_AUDIO
&& audio_stream_copy
)
449 else if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
&& video_stream_copy
)
452 if(!st
->codec
->thread_count
)
453 st
->codec
->thread_count
= 1;
454 if(st
->codec
->thread_count
>1)
455 avcodec_thread_init(st
->codec
, st
->codec
->thread_count
);
457 if(st
->codec
->flags
& CODEC_FLAG_BITEXACT
)
462 s
->timestamp
= av_gettime();
464 av_close_input_file(ic
);
469 get_sync_ipts(const AVOutputStream
*ost
)
471 const AVInputStream
*ist
= ost
->sync_ist
;
472 return (double)(ist
->pts
- start_time
)/AV_TIME_BASE
;
475 static void write_frame(AVFormatContext
*s
, AVPacket
*pkt
, AVCodecContext
*avctx
, AVBitStreamFilterContext
*bsfc
){
479 AVPacket new_pkt
= *pkt
;
480 int a
= av_bitstream_filter_filter(bsfc
, avctx
, NULL
,
481 &new_pkt
.data
, &new_pkt
.size
,
482 pkt
->data
, pkt
->size
,
483 pkt
->flags
& PKT_FLAG_KEY
);
486 new_pkt
.destruct
= av_destruct_packet
;
488 fprintf(stderr
, "%s failed for stream %d, codec %s",
489 bsfc
->filter
->name
, pkt
->stream_index
,
490 avctx
->codec
? avctx
->codec
->name
: "copy");
498 ret
= av_interleaved_write_frame(s
, pkt
);
500 print_error("av_interleaved_write_frame()", ret
);
505 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
507 static void do_audio_out(AVFormatContext
*s
,
510 unsigned char *buf
, int size
)
513 static uint8_t *audio_buf
= NULL
;
514 static uint8_t *audio_out
= NULL
;
515 const int audio_out_size
= 4*MAX_AUDIO_PACKET_SIZE
;
517 int size_out
, frame_bytes
, ret
;
518 AVCodecContext
*enc
= ost
->st
->codec
;
519 AVCodecContext
*dec
= ist
->st
->codec
;
521 /* SC: dynamic allocation of buffers */
523 audio_buf
= av_malloc(2*MAX_AUDIO_PACKET_SIZE
);
525 audio_out
= av_malloc(audio_out_size
);
526 if (!audio_buf
|| !audio_out
)
527 return; /* Should signal an error ! */
529 if (enc
->channels
!= dec
->channels
)
530 ost
->audio_resample
= 1;
532 if (ost
->audio_resample
&& !ost
->resample
) {
533 ost
->resample
= audio_resample_init(enc
->channels
, dec
->channels
,
534 enc
->sample_rate
, dec
->sample_rate
);
535 if (!ost
->resample
) {
536 fprintf(stderr
, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
537 dec
->channels
, dec
->sample_rate
,
538 enc
->channels
, enc
->sample_rate
);
543 if(audio_sync_method
){
544 double delta
= get_sync_ipts(ost
) * enc
->sample_rate
- ost
->sync_opts
545 - av_fifo_size(&ost
->fifo
)/(ost
->st
->codec
->channels
* 2);
546 double idelta
= delta
*ist
->st
->codec
->sample_rate
/ enc
->sample_rate
;
547 int byte_delta
= ((int)idelta
)*2*ist
->st
->codec
->channels
;
549 //FIXME resample delay
550 if(fabs(delta
) > 50){
551 if(ist
->is_start
|| fabs(delta
) > audio_drift_threshold
*enc
->sample_rate
){
553 byte_delta
= FFMAX(byte_delta
, -size
);
557 fprintf(stderr
, "discarding %d audio samples\n", (int)-delta
);
562 static uint8_t *input_tmp
= NULL
;
563 input_tmp
= av_realloc(input_tmp
, byte_delta
+ size
);
565 if(byte_delta
+ size
<= MAX_AUDIO_PACKET_SIZE
)
568 byte_delta
= MAX_AUDIO_PACKET_SIZE
- size
;
570 memset(input_tmp
, 0, byte_delta
);
571 memcpy(input_tmp
+ byte_delta
, buf
, size
);
575 fprintf(stderr
, "adding %d audio samples of silence\n", (int)delta
);
577 }else if(audio_sync_method
>1){
578 int comp
= av_clip(delta
, -audio_sync_method
, audio_sync_method
);
579 assert(ost
->audio_resample
);
581 fprintf(stderr
, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta
, comp
, enc
->sample_rate
);
582 // 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));
583 av_resample_compensate(*(struct AVResampleContext
**)ost
->resample
, comp
, enc
->sample_rate
);
587 ost
->sync_opts
= lrintf(get_sync_ipts(ost
) * enc
->sample_rate
)
588 - av_fifo_size(&ost
->fifo
)/(ost
->st
->codec
->channels
* 2); //FIXME wrong
590 if (ost
->audio_resample
) {
592 size_out
= audio_resample(ost
->resample
,
593 (short *)buftmp
, (short *)buf
,
594 size
/ (ist
->st
->codec
->channels
* 2));
595 size_out
= size_out
* enc
->channels
* 2;
601 /* now encode as many frames as possible */
602 if (enc
->frame_size
> 1) {
603 /* output resampled raw samples */
604 av_fifo_realloc(&ost
->fifo
, av_fifo_size(&ost
->fifo
) + size_out
);
605 av_fifo_generic_write(&ost
->fifo
, buftmp
, size_out
, NULL
);
607 frame_bytes
= enc
->frame_size
* 2 * enc
->channels
;
609 while (av_fifo_size(&ost
->fifo
) >= frame_bytes
) {
611 av_init_packet(&pkt
);
613 av_fifo_read(&ost
->fifo
, audio_buf
, frame_bytes
);
615 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
617 ret
= avcodec_encode_audio(enc
, audio_out
, audio_out_size
,
620 pkt
.stream_index
= ost
->index
;
623 if(enc
->coded_frame
&& enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
624 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
625 pkt
.flags
|= PKT_FLAG_KEY
;
626 write_frame(s
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
628 ost
->sync_opts
+= enc
->frame_size
;
632 av_init_packet(&pkt
);
634 ost
->sync_opts
+= size_out
/ (2 * enc
->channels
);
636 /* output a pcm frame */
637 /* XXX: change encoding codec API to avoid this ? */
638 switch(enc
->codec
->id
) {
639 case CODEC_ID_PCM_S32LE
:
640 case CODEC_ID_PCM_S32BE
:
641 case CODEC_ID_PCM_U32LE
:
642 case CODEC_ID_PCM_U32BE
:
643 size_out
= size_out
<< 1;
645 case CODEC_ID_PCM_S24LE
:
646 case CODEC_ID_PCM_S24BE
:
647 case CODEC_ID_PCM_U24LE
:
648 case CODEC_ID_PCM_U24BE
:
649 case CODEC_ID_PCM_S24DAUD
:
650 size_out
= size_out
/ 2 * 3;
652 case CODEC_ID_PCM_S16LE
:
653 case CODEC_ID_PCM_S16BE
:
654 case CODEC_ID_PCM_U16LE
:
655 case CODEC_ID_PCM_U16BE
:
658 size_out
= size_out
>> 1;
661 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
662 ret
= avcodec_encode_audio(enc
, audio_out
, size_out
,
665 pkt
.stream_index
= ost
->index
;
668 if(enc
->coded_frame
&& enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
669 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
670 pkt
.flags
|= PKT_FLAG_KEY
;
671 write_frame(s
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
675 static void pre_process_video_frame(AVInputStream
*ist
, AVPicture
*picture
, void **bufp
)
679 AVPicture picture_tmp
;
682 dec
= ist
->st
->codec
;
684 /* deinterlace : must be done before any resize */
685 if (do_deinterlace
|| using_vhook
) {
688 /* create temporary picture */
689 size
= avpicture_get_size(dec
->pix_fmt
, dec
->width
, dec
->height
);
690 buf
= av_malloc(size
);
694 picture2
= &picture_tmp
;
695 avpicture_fill(picture2
, buf
, dec
->pix_fmt
, dec
->width
, dec
->height
);
698 if(avpicture_deinterlace(picture2
, picture
,
699 dec
->pix_fmt
, dec
->width
, dec
->height
) < 0) {
700 /* if error, do not deinterlace */
706 av_picture_copy(picture2
, picture
, dec
->pix_fmt
, dec
->width
, dec
->height
);
713 frame_hook_process(picture2
, dec
->pix_fmt
, dec
->width
, dec
->height
,
714 1000000 * ist
->pts
/ AV_TIME_BASE
);
716 if (picture
!= picture2
)
717 *picture
= *picture2
;
721 /* we begin to correct av delay at this threshold */
722 #define AV_DELAY_MAX 0.100
724 static void do_subtitle_out(AVFormatContext
*s
,
730 static uint8_t *subtitle_out
= NULL
;
731 int subtitle_out_max_size
= 65536;
732 int subtitle_out_size
, nb
, i
;
736 if (pts
== AV_NOPTS_VALUE
) {
737 fprintf(stderr
, "Subtitle packets must have a pts\n");
741 enc
= ost
->st
->codec
;
744 subtitle_out
= av_malloc(subtitle_out_max_size
);
747 /* Note: DVB subtitle need one packet to draw them and one other
748 packet to clear them */
749 /* XXX: signal it in the codec context ? */
750 if (enc
->codec_id
== CODEC_ID_DVB_SUBTITLE
)
755 for(i
= 0; i
< nb
; i
++) {
756 subtitle_out_size
= avcodec_encode_subtitle(enc
, subtitle_out
,
757 subtitle_out_max_size
, sub
);
759 av_init_packet(&pkt
);
760 pkt
.stream_index
= ost
->index
;
761 pkt
.data
= subtitle_out
;
762 pkt
.size
= subtitle_out_size
;
763 pkt
.pts
= av_rescale_q(pts
, ist
->st
->time_base
, ost
->st
->time_base
);
764 if (enc
->codec_id
== CODEC_ID_DVB_SUBTITLE
) {
765 /* XXX: the pts correction is handled here. Maybe handling
766 it in the codec would be better */
768 pkt
.pts
+= 90 * sub
->start_display_time
;
770 pkt
.pts
+= 90 * sub
->end_display_time
;
772 write_frame(s
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
776 static int bit_buffer_size
= 1024*256;
777 static uint8_t *bit_buffer
= NULL
;
779 static void do_video_out(AVFormatContext
*s
,
785 int nb_frames
, i
, ret
;
786 AVFrame
*final_picture
, *formatted_picture
, *resampling_dst
, *padding_src
;
787 AVFrame picture_crop_temp
, picture_pad_temp
;
788 AVCodecContext
*enc
, *dec
;
790 avcodec_get_frame_defaults(&picture_crop_temp
);
791 avcodec_get_frame_defaults(&picture_pad_temp
);
793 enc
= ost
->st
->codec
;
794 dec
= ist
->st
->codec
;
796 /* by default, we output a single frame */
801 if(video_sync_method
){
803 vdelta
= get_sync_ipts(ost
) / av_q2d(enc
->time_base
) - ost
->sync_opts
;
804 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
807 else if (video_sync_method
== 2)
808 ost
->sync_opts
= lrintf(get_sync_ipts(ost
) / av_q2d(enc
->time_base
));
809 else if (vdelta
> 1.1)
810 nb_frames
= lrintf(vdelta
);
811 //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);
815 fprintf(stderr
, "*** drop!\n");
816 }else if (nb_frames
> 1) {
817 nb_frames_dup
+= nb_frames
;
819 fprintf(stderr
, "*** %d dup!\n", nb_frames
-1);
822 ost
->sync_opts
= lrintf(get_sync_ipts(ost
) / av_q2d(enc
->time_base
));
824 nb_frames
= FFMIN(nb_frames
, max_frames
[CODEC_TYPE_VIDEO
] - ost
->frame_number
);
828 if (ost
->video_crop
) {
829 if (av_picture_crop((AVPicture
*)&picture_crop_temp
, (AVPicture
*)in_picture
, dec
->pix_fmt
, ost
->topBand
, ost
->leftBand
) < 0) {
830 av_log(NULL
, AV_LOG_ERROR
, "error cropping picture\n");
833 formatted_picture
= &picture_crop_temp
;
835 formatted_picture
= in_picture
;
838 final_picture
= formatted_picture
;
839 padding_src
= formatted_picture
;
840 resampling_dst
= &ost
->pict_tmp
;
841 if (ost
->video_pad
) {
842 final_picture
= &ost
->pict_tmp
;
843 if (ost
->video_resample
) {
844 if (av_picture_crop((AVPicture
*)&picture_pad_temp
, (AVPicture
*)final_picture
, enc
->pix_fmt
, ost
->padtop
, ost
->padleft
) < 0) {
845 av_log(NULL
, AV_LOG_ERROR
, "error padding picture\n");
848 resampling_dst
= &picture_pad_temp
;
852 if (ost
->video_resample
) {
854 final_picture
= &ost
->pict_tmp
;
855 sws_scale(ost
->img_resample_ctx
, formatted_picture
->data
, formatted_picture
->linesize
,
856 0, ost
->resample_height
, resampling_dst
->data
, resampling_dst
->linesize
);
859 if (ost
->video_pad
) {
860 av_picture_pad((AVPicture
*)final_picture
, (AVPicture
*)padding_src
,
861 enc
->height
, enc
->width
, enc
->pix_fmt
,
862 ost
->padtop
, ost
->padbottom
, ost
->padleft
, ost
->padright
, padcolor
);
865 /* duplicates frame if needed */
866 for(i
=0;i
<nb_frames
;i
++) {
868 av_init_packet(&pkt
);
869 pkt
.stream_index
= ost
->index
;
871 if (s
->oformat
->flags
& AVFMT_RAWPICTURE
) {
872 /* raw pictures are written as AVPicture structure to
873 avoid any copies. We support temorarily the older
875 AVFrame
* old_frame
= enc
->coded_frame
;
876 enc
->coded_frame
= dec
->coded_frame
; //FIXME/XXX remove this hack
877 pkt
.data
= (uint8_t *)final_picture
;
878 pkt
.size
= sizeof(AVPicture
);
879 pkt
.pts
= av_rescale_q(ost
->sync_opts
, enc
->time_base
, ost
->st
->time_base
);
880 pkt
.flags
|= PKT_FLAG_KEY
;
882 write_frame(s
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
883 enc
->coded_frame
= old_frame
;
887 big_picture
= *final_picture
;
888 /* better than nothing: use input picture interlaced
890 big_picture
.interlaced_frame
= in_picture
->interlaced_frame
;
891 if(avctx_opts
[CODEC_TYPE_VIDEO
]->flags
& (CODEC_FLAG_INTERLACED_DCT
|CODEC_FLAG_INTERLACED_ME
)){
892 if(top_field_first
== -1)
893 big_picture
.top_field_first
= in_picture
->top_field_first
;
895 big_picture
.top_field_first
= top_field_first
;
898 /* handles sameq here. This is not correct because it may
899 not be a global option */
901 big_picture
.quality
= ist
->st
->quality
;
903 big_picture
.quality
= ost
->st
->quality
;
905 big_picture
.pict_type
= 0;
906 // big_picture.pts = AV_NOPTS_VALUE;
907 big_picture
.pts
= ost
->sync_opts
;
908 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
909 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
910 ret
= avcodec_encode_video(enc
,
911 bit_buffer
, bit_buffer_size
,
914 fprintf(stderr
, "Video encoding failed\n");
917 //enc->frame_number = enc->real_pict_num;
919 pkt
.data
= bit_buffer
;
921 if(enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
922 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
923 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
924 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
925 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
927 if(enc
->coded_frame
->key_frame
)
928 pkt
.flags
|= PKT_FLAG_KEY
;
929 write_frame(s
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
931 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
932 // enc->frame_number-1, enc->real_pict_num, ret,
934 /* if two pass, output log */
935 if (ost
->logfile
&& enc
->stats_out
) {
936 fprintf(ost
->logfile
, "%s", enc
->stats_out
);
945 static double psnr(double d
){
946 return -10.0*log(d
)/log(10.0);
949 static void do_video_stats(AVFormatContext
*os
, AVOutputStream
*ost
,
954 double ti1
, bitrate
, avg_bitrate
;
956 /* this is executed just the first time do_video_stats is called */
958 vstats_file
= fopen(vstats_filename
, "w");
965 enc
= ost
->st
->codec
;
966 if (enc
->codec_type
== CODEC_TYPE_VIDEO
) {
967 frame_number
= ost
->frame_number
;
968 fprintf(vstats_file
, "frame= %5d q= %2.1f ", frame_number
, enc
->coded_frame
->quality
/(float)FF_QP2LAMBDA
);
969 if (enc
->flags
&CODEC_FLAG_PSNR
)
970 fprintf(vstats_file
, "PSNR= %6.2f ", psnr(enc
->coded_frame
->error
[0]/(enc
->width
*enc
->height
*255.0*255.0)));
972 fprintf(vstats_file
,"f_size= %6d ", frame_size
);
973 /* compute pts value */
974 ti1
= ost
->sync_opts
* av_q2d(enc
->time_base
);
978 bitrate
= (frame_size
* 8) / av_q2d(enc
->time_base
) / 1000.0;
979 avg_bitrate
= (double)(video_size
* 8) / ti1
/ 1000.0;
980 fprintf(vstats_file
, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
981 (double)video_size
/ 1024, ti1
, bitrate
, avg_bitrate
);
982 fprintf(vstats_file
,"type= %c\n", av_get_pict_type_char(enc
->coded_frame
->pict_type
));
986 static void print_report(AVFormatContext
**output_files
,
987 AVOutputStream
**ost_table
, int nb_ostreams
,
992 AVFormatContext
*oc
, *os
;
995 int frame_number
, vid
, i
;
996 double bitrate
, ti1
, pts
;
997 static int64_t last_time
= -1;
998 static int qp_histogram
[52];
1000 if (!is_last_report
) {
1002 /* display the report every 0.5 seconds */
1003 cur_time
= av_gettime();
1004 if (last_time
== -1) {
1005 last_time
= cur_time
;
1008 if ((cur_time
- last_time
) < 500000)
1010 last_time
= cur_time
;
1014 oc
= output_files
[0];
1016 total_size
= url_fsize(oc
->pb
);
1017 if(total_size
<0) // FIXME improve url_fsize() so it works with non seekable output too
1018 total_size
= url_ftell(oc
->pb
);
1023 for(i
=0;i
<nb_ostreams
;i
++) {
1025 os
= output_files
[ost
->file_index
];
1026 enc
= ost
->st
->codec
;
1027 if (vid
&& enc
->codec_type
== CODEC_TYPE_VIDEO
) {
1028 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "q=%2.1f ",
1029 !ost
->st
->stream_copy
?
1030 enc
->coded_frame
->quality
/(float)FF_QP2LAMBDA
: -1);
1032 if (!vid
&& enc
->codec_type
== CODEC_TYPE_VIDEO
) {
1033 float t
= (av_gettime()-timer_start
) / 1000000.0;
1035 frame_number
= ost
->frame_number
;
1036 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "frame=%5d fps=%3d q=%3.1f ",
1037 frame_number
, (t
>1)?(int)(frame_number
/t
+0.5) : 0,
1038 !ost
->st
->stream_copy
?
1039 enc
->coded_frame
->quality
/(float)FF_QP2LAMBDA
: -1);
1041 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "L");
1044 int qp
= lrintf(enc
->coded_frame
->quality
/(float)FF_QP2LAMBDA
);
1045 if(qp
>=0 && qp
<sizeof(qp_histogram
)/sizeof(int))
1048 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "%X", (int)lrintf(log(qp_histogram
[j
]+1)/log(2)));
1050 if (enc
->flags
&CODEC_FLAG_PSNR
){
1052 double error
, error_sum
=0;
1053 double scale
, scale_sum
=0;
1054 char type
[3]= {'Y','U','V'};
1055 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "PSNR=");
1058 error
= enc
->error
[j
];
1059 scale
= enc
->width
*enc
->height
*255.0*255.0*frame_number
;
1061 error
= enc
->coded_frame
->error
[j
];
1062 scale
= enc
->width
*enc
->height
*255.0*255.0;
1067 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "%c:%2.2f ", type
[j
], psnr(error
/scale
));
1069 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "*:%2.2f ", psnr(error_sum
/scale_sum
));
1073 /* compute min output value */
1074 pts
= (double)ost
->st
->pts
.val
* av_q2d(ost
->st
->time_base
);
1075 if ((pts
< ti1
) && (pts
> 0))
1081 if (verbose
|| is_last_report
) {
1082 bitrate
= (double)(total_size
* 8) / ti1
/ 1000.0;
1084 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
),
1085 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1086 (double)total_size
/ 1024, ti1
, bitrate
);
1089 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), " dup=%d drop=%d",
1090 nb_frames_dup
, nb_frames_drop
);
1093 fprintf(stderr
, "%s \r", buf
);
1098 if (is_last_report
&& verbose
>= 0){
1099 int64_t raw
= audio_size
+ video_size
+ extra_size
;
1100 fprintf(stderr
, "\n");
1101 fprintf(stderr
, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1105 100.0*(total_size
- raw
)/raw
1110 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1111 static int output_packet(AVInputStream
*ist
, int ist_index
,
1112 AVOutputStream
**ost_table
, int nb_ostreams
,
1113 const AVPacket
*pkt
)
1115 AVFormatContext
*os
;
1116 AVOutputStream
*ost
;
1120 int data_size
, got_picture
;
1122 void *buffer_to_free
;
1123 static unsigned int samples_size
= 0;
1124 static short *samples
= NULL
;
1125 AVSubtitle subtitle
, *subtitle_to_free
;
1128 if(ist
->next_pts
== AV_NOPTS_VALUE
)
1129 ist
->next_pts
= ist
->pts
;
1138 if(pkt
->dts
!= AV_NOPTS_VALUE
)
1139 ist
->next_pts
= ist
->pts
= av_rescale_q(pkt
->dts
, ist
->st
->time_base
, AV_TIME_BASE_Q
);
1145 ist
->pts
= ist
->next_pts
;
1147 if(len
&& len
!= pkt
->size
&& verbose
>0)
1148 fprintf(stderr
, "Multiple frames in a packet from stream %d\n", pkt
->stream_index
);
1150 /* decode the packet if needed */
1151 data_buf
= NULL
; /* fail safe */
1153 subtitle_to_free
= NULL
;
1154 if (ist
->decoding_needed
) {
1155 switch(ist
->st
->codec
->codec_type
) {
1156 case CODEC_TYPE_AUDIO
:{
1158 samples
= av_fast_realloc(samples
, &samples_size
, FFMAX(pkt
->size
*sizeof(*samples
), AVCODEC_MAX_AUDIO_FRAME_SIZE
));
1159 data_size
= samples_size
;
1160 /* XXX: could avoid copy if PCM 16 bits with same
1161 endianness as CPU */
1162 ret
= avcodec_decode_audio2(ist
->st
->codec
, samples
, &data_size
,
1168 /* Some bug in mpeg audio decoder gives */
1169 /* data_size < 0, it seems they are overflows */
1170 if (data_size
<= 0) {
1171 /* no audio frame */
1174 data_buf
= (uint8_t *)samples
;
1175 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
/2 * data_size
) /
1176 (ist
->st
->codec
->sample_rate
* ist
->st
->codec
->channels
);
1178 case CODEC_TYPE_VIDEO
:
1179 data_size
= (ist
->st
->codec
->width
* ist
->st
->codec
->height
* 3) / 2;
1180 /* XXX: allocate picture correctly */
1181 avcodec_get_frame_defaults(&picture
);
1183 ret
= avcodec_decode_video(ist
->st
->codec
,
1184 &picture
, &got_picture
, ptr
, len
);
1185 ist
->st
->quality
= picture
.quality
;
1189 /* no picture yet */
1190 goto discard_packet
;
1192 if (ist
->st
->codec
->time_base
.num
!= 0) {
1193 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
*
1194 ist
->st
->codec
->time_base
.num
) /
1195 ist
->st
->codec
->time_base
.den
;
1199 case CODEC_TYPE_SUBTITLE
:
1200 ret
= avcodec_decode_subtitle(ist
->st
->codec
,
1201 &subtitle
, &got_subtitle
, ptr
, len
);
1204 if (!got_subtitle
) {
1205 goto discard_packet
;
1207 subtitle_to_free
= &subtitle
;
1214 switch(ist
->st
->codec
->codec_type
) {
1215 case CODEC_TYPE_AUDIO
:
1216 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
* ist
->st
->codec
->frame_size
) /
1217 ist
->st
->codec
->sample_rate
;
1219 case CODEC_TYPE_VIDEO
:
1220 if (ist
->st
->codec
->time_base
.num
!= 0) {
1221 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
*
1222 ist
->st
->codec
->time_base
.num
) /
1223 ist
->st
->codec
->time_base
.den
;
1233 buffer_to_free
= NULL
;
1234 if (ist
->st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
1235 pre_process_video_frame(ist
, (AVPicture
*)&picture
,
1239 // preprocess audio (volume)
1240 if (ist
->st
->codec
->codec_type
== CODEC_TYPE_AUDIO
) {
1241 if (audio_volume
!= 256) {
1244 for(i
=0;i
<(data_size
/ sizeof(short));i
++) {
1245 int v
= ((*volp
) * audio_volume
+ 128) >> 8;
1246 if (v
< -32768) v
= -32768;
1247 if (v
> 32767) v
= 32767;
1253 /* frame rate emulation */
1254 if (ist
->st
->codec
->rate_emu
) {
1255 int64_t pts
= av_rescale((int64_t) ist
->frame
* ist
->st
->codec
->time_base
.num
, 1000000, ist
->st
->codec
->time_base
.den
);
1256 int64_t now
= av_gettime() - ist
->start
;
1264 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1265 is the one of the next displayed one */
1266 /* XXX: add mpeg4 too ? */
1267 if (ist
->st
->codec
->codec_id
== CODEC_ID_MPEG1VIDEO
) {
1268 if (ist
->st
->codec
->pict_type
!= B_TYPE
) {
1270 tmp
= ist
->last_ip_pts
;
1271 ist
->last_ip_pts
= ist
->frac_pts
.val
;
1272 ist
->frac_pts
.val
= tmp
;
1276 /* if output time reached then transcode raw format,
1277 encode packets and output them */
1278 if (start_time
== 0 || ist
->pts
>= start_time
)
1279 for(i
=0;i
<nb_ostreams
;i
++) {
1283 if (ost
->source_index
== ist_index
) {
1284 os
= output_files
[ost
->file_index
];
1287 printf("%d: got pts=%0.3f %0.3f\n", i
,
1288 (double)pkt
->pts
/ AV_TIME_BASE
,
1289 ((double)ist
->pts
/ AV_TIME_BASE
) -
1290 ((double)ost
->st
->pts
.val
* ost
->st
->time_base
.num
/ ost
->st
->time_base
.den
));
1292 /* set the input output pts pairs */
1293 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1295 if (ost
->encoding_needed
) {
1296 switch(ost
->st
->codec
->codec_type
) {
1297 case CODEC_TYPE_AUDIO
:
1298 do_audio_out(os
, ost
, ist
, data_buf
, data_size
);
1300 case CODEC_TYPE_VIDEO
:
1301 do_video_out(os
, ost
, ist
, &picture
, &frame_size
);
1302 video_size
+= frame_size
;
1303 if (vstats_filename
&& frame_size
)
1304 do_video_stats(os
, ost
, frame_size
);
1306 case CODEC_TYPE_SUBTITLE
:
1307 do_subtitle_out(os
, ost
, ist
, &subtitle
,
1314 AVFrame avframe
; //FIXME/XXX remove this
1316 av_init_packet(&opkt
);
1318 if (!ost
->frame_number
&& !(pkt
->flags
& PKT_FLAG_KEY
))
1321 /* no reencoding needed : output the packet directly */
1322 /* force the input stream PTS */
1324 avcodec_get_frame_defaults(&avframe
);
1325 ost
->st
->codec
->coded_frame
= &avframe
;
1326 avframe
.key_frame
= pkt
->flags
& PKT_FLAG_KEY
;
1328 if(ost
->st
->codec
->codec_type
== CODEC_TYPE_AUDIO
)
1329 audio_size
+= data_size
;
1330 else if (ost
->st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
1331 video_size
+= data_size
;
1335 opkt
.stream_index
= ost
->index
;
1336 if(pkt
->pts
!= AV_NOPTS_VALUE
)
1337 opkt
.pts
= av_rescale_q(pkt
->pts
, ist
->st
->time_base
, ost
->st
->time_base
);
1339 opkt
.pts
= AV_NOPTS_VALUE
;
1341 if (pkt
->dts
== AV_NOPTS_VALUE
)
1342 opkt
.dts
= av_rescale_q(ist
->next_pts
, AV_TIME_BASE_Q
, ost
->st
->time_base
);
1344 opkt
.dts
= av_rescale_q(pkt
->dts
, ist
->st
->time_base
, ost
->st
->time_base
);
1346 opkt
.duration
= av_rescale_q(pkt
->duration
, ist
->st
->time_base
, ost
->st
->time_base
);
1347 opkt
.flags
= pkt
->flags
;
1349 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1350 if(av_parser_change(ist
->st
->parser
, ost
->st
->codec
, &opkt
.data
, &opkt
.size
, data_buf
, data_size
, pkt
->flags
& PKT_FLAG_KEY
))
1351 opkt
.destruct
= av_destruct_packet
;
1353 write_frame(os
, &opkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][opkt
.stream_index
]);
1354 ost
->st
->codec
->frame_number
++;
1355 ost
->frame_number
++;
1356 av_free_packet(&opkt
);
1360 av_free(buffer_to_free
);
1361 /* XXX: allocate the subtitles in the codec ? */
1362 if (subtitle_to_free
) {
1363 if (subtitle_to_free
->rects
!= NULL
) {
1364 for (i
= 0; i
< subtitle_to_free
->num_rects
; i
++) {
1365 av_free(subtitle_to_free
->rects
[i
].bitmap
);
1366 av_free(subtitle_to_free
->rects
[i
].rgba_palette
);
1368 av_freep(&subtitle_to_free
->rects
);
1370 subtitle_to_free
->num_rects
= 0;
1371 subtitle_to_free
= NULL
;
1378 for(i
=0;i
<nb_ostreams
;i
++) {
1380 if (ost
->source_index
== ist_index
) {
1381 AVCodecContext
*enc
= ost
->st
->codec
;
1382 os
= output_files
[ost
->file_index
];
1384 if(ost
->st
->codec
->codec_type
== CODEC_TYPE_AUDIO
&& enc
->frame_size
<=1)
1386 if(ost
->st
->codec
->codec_type
== CODEC_TYPE_VIDEO
&& (os
->oformat
->flags
& AVFMT_RAWPICTURE
))
1389 if (ost
->encoding_needed
) {
1393 av_init_packet(&pkt
);
1394 pkt
.stream_index
= ost
->index
;
1396 switch(ost
->st
->codec
->codec_type
) {
1397 case CODEC_TYPE_AUDIO
:
1398 fifo_bytes
= av_fifo_size(&ost
->fifo
);
1400 /* encode any samples remaining in fifo */
1401 if(fifo_bytes
> 0 && enc
->codec
->capabilities
& CODEC_CAP_SMALL_LAST_FRAME
) {
1402 int fs_tmp
= enc
->frame_size
;
1403 enc
->frame_size
= fifo_bytes
/ (2 * enc
->channels
);
1404 av_fifo_read(&ost
->fifo
, (uint8_t *)samples
, fifo_bytes
);
1405 ret
= avcodec_encode_audio(enc
, bit_buffer
, bit_buffer_size
, samples
);
1406 enc
->frame_size
= fs_tmp
;
1409 ret
= avcodec_encode_audio(enc
, bit_buffer
, bit_buffer_size
, NULL
);
1412 pkt
.flags
|= PKT_FLAG_KEY
;
1414 case CODEC_TYPE_VIDEO
:
1415 ret
= avcodec_encode_video(enc
, bit_buffer
, bit_buffer_size
, NULL
);
1417 if(enc
->coded_frame
&& enc
->coded_frame
->key_frame
)
1418 pkt
.flags
|= PKT_FLAG_KEY
;
1419 if (ost
->logfile
&& enc
->stats_out
) {
1420 fprintf(ost
->logfile
, "%s", enc
->stats_out
);
1429 pkt
.data
= bit_buffer
;
1431 if(enc
->coded_frame
&& enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
1432 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
1433 write_frame(os
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
1445 static void print_sdp(AVFormatContext
**avc
, int n
)
1449 avf_sdp_create(avc
, n
, sdp
, sizeof(sdp
));
1450 printf("SDP:\n%s\n", sdp
);
1453 static int stream_index_from_inputs(AVFormatContext
**input_files
,
1455 AVInputFile
*file_table
,
1456 AVInputStream
**ist_table
,
1457 enum CodecType type
,
1461 for(z
=0; z
<nb_input_files
; z
++) {
1462 AVFormatContext
*ic
= input_files
[z
];
1463 for(p
=0; p
<ic
->nb_programs
; p
++) {
1464 AVProgram
*program
= ic
->programs
[p
];
1465 if(program
->id
!= programid
)
1467 for(q
=0; q
<program
->nb_stream_indexes
; q
++) {
1468 int sidx
= program
->stream_index
[q
];
1469 int ris
= file_table
[z
].ist_index
+ sidx
;
1470 if(ist_table
[ris
]->discard
&& ic
->streams
[sidx
]->codec
->codec_type
== type
)
1480 * The following code is the main loop of the file converter
1482 static int av_encode(AVFormatContext
**output_files
,
1483 int nb_output_files
,
1484 AVFormatContext
**input_files
,
1486 AVStreamMap
*stream_maps
, int nb_stream_maps
)
1488 int ret
, i
, j
, k
, n
, nb_istreams
= 0, nb_ostreams
= 0;
1489 AVFormatContext
*is
, *os
;
1490 AVCodecContext
*codec
, *icodec
;
1491 AVOutputStream
*ost
, **ost_table
= NULL
;
1492 AVInputStream
*ist
, **ist_table
= NULL
;
1493 AVInputFile
*file_table
;
1497 file_table
= av_mallocz(nb_input_files
* sizeof(AVInputFile
));
1501 /* input stream init */
1503 for(i
=0;i
<nb_input_files
;i
++) {
1504 is
= input_files
[i
];
1505 file_table
[i
].ist_index
= j
;
1506 file_table
[i
].nb_streams
= is
->nb_streams
;
1507 j
+= is
->nb_streams
;
1511 ist_table
= av_mallocz(nb_istreams
* sizeof(AVInputStream
*));
1515 for(i
=0;i
<nb_istreams
;i
++) {
1516 ist
= av_mallocz(sizeof(AVInputStream
));
1522 for(i
=0;i
<nb_input_files
;i
++) {
1523 is
= input_files
[i
];
1524 for(k
=0;k
<is
->nb_streams
;k
++) {
1525 ist
= ist_table
[j
++];
1526 ist
->st
= is
->streams
[k
];
1527 ist
->file_index
= i
;
1529 ist
->discard
= 1; /* the stream is discarded by default
1532 if (ist
->st
->codec
->rate_emu
) {
1533 ist
->start
= av_gettime();
1539 /* output stream init */
1541 for(i
=0;i
<nb_output_files
;i
++) {
1542 os
= output_files
[i
];
1543 if (!os
->nb_streams
) {
1544 fprintf(stderr
, "Output file does not contain any stream\n");
1547 nb_ostreams
+= os
->nb_streams
;
1549 if (nb_stream_maps
> 0 && nb_stream_maps
!= nb_ostreams
) {
1550 fprintf(stderr
, "Number of stream maps must match number of output streams\n");
1554 /* Sanity check the mapping args -- do the input files & streams exist? */
1555 for(i
=0;i
<nb_stream_maps
;i
++) {
1556 int fi
= stream_maps
[i
].file_index
;
1557 int si
= stream_maps
[i
].stream_index
;
1559 if (fi
< 0 || fi
> nb_input_files
- 1 ||
1560 si
< 0 || si
> file_table
[fi
].nb_streams
- 1) {
1561 fprintf(stderr
,"Could not find input stream #%d.%d\n", fi
, si
);
1564 fi
= stream_maps
[i
].sync_file_index
;
1565 si
= stream_maps
[i
].sync_stream_index
;
1566 if (fi
< 0 || fi
> nb_input_files
- 1 ||
1567 si
< 0 || si
> file_table
[fi
].nb_streams
- 1) {
1568 fprintf(stderr
,"Could not find sync stream #%d.%d\n", fi
, si
);
1573 ost_table
= av_mallocz(sizeof(AVOutputStream
*) * nb_ostreams
);
1576 for(i
=0;i
<nb_ostreams
;i
++) {
1577 ost
= av_mallocz(sizeof(AVOutputStream
));
1584 for(k
=0;k
<nb_output_files
;k
++) {
1585 os
= output_files
[k
];
1586 for(i
=0;i
<os
->nb_streams
;i
++) {
1588 ost
= ost_table
[n
++];
1589 ost
->file_index
= k
;
1591 ost
->st
= os
->streams
[i
];
1592 if (nb_stream_maps
> 0) {
1593 ost
->source_index
= file_table
[stream_maps
[n
-1].file_index
].ist_index
+
1594 stream_maps
[n
-1].stream_index
;
1596 /* Sanity check that the stream types match */
1597 if (ist_table
[ost
->source_index
]->st
->codec
->codec_type
!= ost
->st
->codec
->codec_type
) {
1598 fprintf(stderr
, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1599 stream_maps
[n
-1].file_index
, stream_maps
[n
-1].stream_index
,
1600 ost
->file_index
, ost
->index
);
1607 j
= stream_index_from_inputs(input_files
, nb_input_files
, file_table
, ist_table
, ost
->st
->codec
->codec_type
, opt_programid
);
1609 ost
->source_index
= j
;
1613 /* get corresponding input stream index : we select the first one with the right type */
1615 for(j
=0;j
<nb_istreams
;j
++) {
1618 ist
->st
->codec
->codec_type
== ost
->st
->codec
->codec_type
) {
1619 ost
->source_index
= j
;
1627 if(! opt_programid
) {
1628 /* try again and reuse existing stream */
1629 for(j
=0;j
<nb_istreams
;j
++) {
1631 if (ist
->st
->codec
->codec_type
== ost
->st
->codec
->codec_type
) {
1632 ost
->source_index
= j
;
1638 int i
= ost
->file_index
;
1639 dump_format(output_files
[i
], i
, output_files
[i
]->filename
, 1);
1640 fprintf(stderr
, "Could not find input stream matching output stream #%d.%d\n",
1641 ost
->file_index
, ost
->index
);
1646 ist
= ist_table
[ost
->source_index
];
1648 ost
->sync_ist
= (nb_stream_maps
> 0) ?
1649 ist_table
[file_table
[stream_maps
[n
-1].sync_file_index
].ist_index
+
1650 stream_maps
[n
-1].sync_stream_index
] : ist
;
1654 /* for each output stream, we compute the right encoding parameters */
1655 for(i
=0;i
<nb_ostreams
;i
++) {
1657 os
= output_files
[ost
->file_index
];
1658 ist
= ist_table
[ost
->source_index
];
1660 codec
= ost
->st
->codec
;
1661 icodec
= ist
->st
->codec
;
1663 if (!ost
->st
->language
[0])
1664 av_strlcpy(ost
->st
->language
, ist
->st
->language
,
1665 sizeof(ost
->st
->language
));
1667 ost
->st
->disposition
= ist
->st
->disposition
;
1669 if (ost
->st
->stream_copy
) {
1670 /* if stream_copy is selected, no need to decode or encode */
1671 codec
->codec_id
= icodec
->codec_id
;
1672 codec
->codec_type
= icodec
->codec_type
;
1674 if(!codec
->codec_tag
){
1675 if( !os
->oformat
->codec_tag
1676 || av_codec_get_id (os
->oformat
->codec_tag
, icodec
->codec_tag
) > 0
1677 || av_codec_get_tag(os
->oformat
->codec_tag
, icodec
->codec_id
) <= 0)
1678 codec
->codec_tag
= icodec
->codec_tag
;
1681 codec
->bit_rate
= icodec
->bit_rate
;
1682 codec
->extradata
= icodec
->extradata
;
1683 codec
->extradata_size
= icodec
->extradata_size
;
1684 if(av_q2d(icodec
->time_base
) > av_q2d(ist
->st
->time_base
) && av_q2d(ist
->st
->time_base
) < 1.0/1000)
1685 codec
->time_base
= icodec
->time_base
;
1687 codec
->time_base
= ist
->st
->time_base
;
1688 switch(codec
->codec_type
) {
1689 case CODEC_TYPE_AUDIO
:
1690 codec
->sample_rate
= icodec
->sample_rate
;
1691 codec
->channels
= icodec
->channels
;
1692 codec
->frame_size
= icodec
->frame_size
;
1693 codec
->block_align
= icodec
->block_align
;
1694 if(codec
->block_align
== 1 && codec
->codec_id
== CODEC_ID_MP3
)
1695 codec
->block_align
= 0;
1696 if(codec
->codec_id
== CODEC_ID_AC3
)
1697 codec
->block_align
= 0;
1699 case CODEC_TYPE_VIDEO
:
1701 fprintf(stderr
,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");
1704 codec
->pix_fmt
= icodec
->pix_fmt
;
1705 codec
->width
= icodec
->width
;
1706 codec
->height
= icodec
->height
;
1707 codec
->has_b_frames
= icodec
->has_b_frames
;
1709 case CODEC_TYPE_SUBTITLE
:
1715 switch(codec
->codec_type
) {
1716 case CODEC_TYPE_AUDIO
:
1717 if (av_fifo_init(&ost
->fifo
, 1024))
1719 ost
->audio_resample
= codec
->sample_rate
!= icodec
->sample_rate
|| audio_sync_method
> 1;
1720 icodec
->request_channels
= codec
->channels
;
1721 ist
->decoding_needed
= 1;
1722 ost
->encoding_needed
= 1;
1724 case CODEC_TYPE_VIDEO
:
1725 ost
->video_crop
= ((frame_leftBand
+ frame_rightBand
+ frame_topBand
+ frame_bottomBand
) != 0);
1726 ost
->video_pad
= ((frame_padleft
+ frame_padright
+ frame_padtop
+ frame_padbottom
) != 0);
1727 ost
->video_resample
= ((codec
->width
!= icodec
->width
-
1728 (frame_leftBand
+ frame_rightBand
) +
1729 (frame_padleft
+ frame_padright
)) ||
1730 (codec
->height
!= icodec
->height
-
1731 (frame_topBand
+ frame_bottomBand
) +
1732 (frame_padtop
+ frame_padbottom
)) ||
1733 (codec
->pix_fmt
!= icodec
->pix_fmt
));
1734 if (ost
->video_crop
) {
1735 ost
->topBand
= frame_topBand
;
1736 ost
->leftBand
= frame_leftBand
;
1738 if (ost
->video_pad
) {
1739 ost
->padtop
= frame_padtop
;
1740 ost
->padleft
= frame_padleft
;
1741 ost
->padbottom
= frame_padbottom
;
1742 ost
->padright
= frame_padright
;
1743 if (!ost
->video_resample
) {
1744 avcodec_get_frame_defaults(&ost
->pict_tmp
);
1745 if(avpicture_alloc((AVPicture
*)&ost
->pict_tmp
, codec
->pix_fmt
,
1746 codec
->width
, codec
->height
))
1750 if (ost
->video_resample
) {
1751 avcodec_get_frame_defaults(&ost
->pict_tmp
);
1752 if(avpicture_alloc((AVPicture
*)&ost
->pict_tmp
, codec
->pix_fmt
,
1753 codec
->width
, codec
->height
)) {
1754 fprintf(stderr
, "Cannot allocate temp picture, check pix fmt\n");
1757 sws_flags
= av_get_int(sws_opts
, "sws_flags", NULL
);
1758 ost
->img_resample_ctx
= sws_getContext(
1759 icodec
->width
- (frame_leftBand
+ frame_rightBand
),
1760 icodec
->height
- (frame_topBand
+ frame_bottomBand
),
1762 codec
->width
- (frame_padleft
+ frame_padright
),
1763 codec
->height
- (frame_padtop
+ frame_padbottom
),
1765 sws_flags
, NULL
, NULL
, NULL
);
1766 if (ost
->img_resample_ctx
== NULL
) {
1767 fprintf(stderr
, "Cannot get resampling context\n");
1770 ost
->resample_height
= icodec
->height
- (frame_topBand
+ frame_bottomBand
);
1772 ost
->encoding_needed
= 1;
1773 ist
->decoding_needed
= 1;
1775 case CODEC_TYPE_SUBTITLE
:
1776 ost
->encoding_needed
= 1;
1777 ist
->decoding_needed
= 1;
1784 if (ost
->encoding_needed
&&
1785 (codec
->flags
& (CODEC_FLAG_PASS1
| CODEC_FLAG_PASS2
))) {
1786 char logfilename
[1024];
1791 snprintf(logfilename
, sizeof(logfilename
), "%s-%d.log",
1793 pass_logfilename
: DEFAULT_PASS_LOGFILENAME
, i
);
1794 if (codec
->flags
& CODEC_FLAG_PASS1
) {
1795 f
= fopen(logfilename
, "w");
1797 perror(logfilename
);
1802 /* read the log file */
1803 f
= fopen(logfilename
, "r");
1805 perror(logfilename
);
1808 fseek(f
, 0, SEEK_END
);
1810 fseek(f
, 0, SEEK_SET
);
1811 logbuffer
= av_malloc(size
+ 1);
1813 fprintf(stderr
, "Could not allocate log buffer\n");
1816 size
= fread(logbuffer
, 1, size
, f
);
1818 logbuffer
[size
] = '\0';
1819 codec
->stats_in
= logbuffer
;
1823 if(codec
->codec_type
== CODEC_TYPE_VIDEO
){
1824 int size
= codec
->width
* codec
->height
;
1825 bit_buffer_size
= FFMAX(bit_buffer_size
, 4*size
);
1830 bit_buffer
= av_malloc(bit_buffer_size
);
1834 /* dump the file output parameters - cannot be done before in case
1836 for(i
=0;i
<nb_output_files
;i
++) {
1837 dump_format(output_files
[i
], i
, output_files
[i
]->filename
, 1);
1840 /* dump the stream mapping */
1842 fprintf(stderr
, "Stream mapping:\n");
1843 for(i
=0;i
<nb_ostreams
;i
++) {
1845 fprintf(stderr
, " Stream #%d.%d -> #%d.%d",
1846 ist_table
[ost
->source_index
]->file_index
,
1847 ist_table
[ost
->source_index
]->index
,
1850 if (ost
->sync_ist
!= ist_table
[ost
->source_index
])
1851 fprintf(stderr
, " [sync #%d.%d]",
1852 ost
->sync_ist
->file_index
,
1853 ost
->sync_ist
->index
);
1854 fprintf(stderr
, "\n");
1858 /* open each encoder */
1859 for(i
=0;i
<nb_ostreams
;i
++) {
1861 if (ost
->encoding_needed
) {
1863 codec
= avcodec_find_encoder(ost
->st
->codec
->codec_id
);
1865 fprintf(stderr
, "Unsupported codec for output stream #%d.%d\n",
1866 ost
->file_index
, ost
->index
);
1869 if (avcodec_open(ost
->st
->codec
, codec
) < 0) {
1870 fprintf(stderr
, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1871 ost
->file_index
, ost
->index
);
1874 extra_size
+= ost
->st
->codec
->extradata_size
;
1878 /* open each decoder */
1879 for(i
=0;i
<nb_istreams
;i
++) {
1881 if (ist
->decoding_needed
) {
1883 codec
= avcodec_find_decoder(ist
->st
->codec
->codec_id
);
1885 fprintf(stderr
, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1886 ist
->st
->codec
->codec_id
, ist
->file_index
, ist
->index
);
1889 if (avcodec_open(ist
->st
->codec
, codec
) < 0) {
1890 fprintf(stderr
, "Error while opening codec for input stream #%d.%d\n",
1891 ist
->file_index
, ist
->index
);
1894 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1895 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1900 for(i
=0;i
<nb_istreams
;i
++) {
1902 is
= input_files
[ist
->file_index
];
1904 ist
->next_pts
= AV_NOPTS_VALUE
;
1908 /* set meta data information from input file if required */
1909 for (i
=0;i
<nb_meta_data_maps
;i
++) {
1910 AVFormatContext
*out_file
;
1911 AVFormatContext
*in_file
;
1913 int out_file_index
= meta_data_maps
[i
].out_file
;
1914 int in_file_index
= meta_data_maps
[i
].in_file
;
1915 if (out_file_index
< 0 || out_file_index
>= nb_output_files
) {
1916 fprintf(stderr
, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index
, out_file_index
, in_file_index
);
1917 ret
= AVERROR(EINVAL
);
1920 if (in_file_index
< 0 || in_file_index
>= nb_input_files
) {
1921 fprintf(stderr
, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index
, out_file_index
, in_file_index
);
1922 ret
= AVERROR(EINVAL
);
1926 out_file
= output_files
[out_file_index
];
1927 in_file
= input_files
[in_file_index
];
1929 strcpy(out_file
->title
, in_file
->title
);
1930 strcpy(out_file
->author
, in_file
->author
);
1931 strcpy(out_file
->copyright
, in_file
->copyright
);
1932 strcpy(out_file
->comment
, in_file
->comment
);
1933 strcpy(out_file
->album
, in_file
->album
);
1934 out_file
->year
= in_file
->year
;
1935 out_file
->track
= in_file
->track
;
1936 strcpy(out_file
->genre
, in_file
->genre
);
1939 /* open files and write file headers */
1940 for(i
=0;i
<nb_output_files
;i
++) {
1941 os
= output_files
[i
];
1942 if (av_write_header(os
) < 0) {
1943 fprintf(stderr
, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i
);
1944 ret
= AVERROR(EINVAL
);
1947 if (strcmp(output_files
[i
]->oformat
->name
, "rtp")) {
1952 print_sdp(output_files
, nb_output_files
);
1955 if (!using_stdin
&& verbose
>= 0) {
1956 fprintf(stderr
, "Press [q] to stop encoding\n");
1957 url_set_interrupt_cb(decode_interrupt_cb
);
1962 timer_start
= av_gettime();
1964 for(; received_sigterm
== 0;) {
1965 int file_index
, ist_index
;
1973 /* if 'q' pressed, exits */
1977 /* read_key() returns 0 on EOF */
1983 /* select the stream that we must read now by looking at the
1984 smallest output pts */
1986 for(i
=0;i
<nb_ostreams
;i
++) {
1989 os
= output_files
[ost
->file_index
];
1990 ist
= ist_table
[ost
->source_index
];
1991 if(ost
->st
->codec
->codec_type
== CODEC_TYPE_VIDEO
)
1992 opts
= ost
->sync_opts
* av_q2d(ost
->st
->codec
->time_base
);
1994 opts
= ost
->st
->pts
.val
* av_q2d(ost
->st
->time_base
);
1995 ipts
= (double)ist
->pts
;
1996 if (!file_table
[ist
->file_index
].eof_reached
){
1997 if(ipts
< ipts_min
) {
1999 if(input_sync
) file_index
= ist
->file_index
;
2001 if(opts
< opts_min
) {
2003 if(!input_sync
) file_index
= ist
->file_index
;
2006 if(ost
->frame_number
>= max_frames
[ost
->st
->codec
->codec_type
]){
2011 /* if none, if is finished */
2012 if (file_index
< 0) {
2016 /* finish if recording time exhausted */
2017 if (recording_time
> 0 && opts_min
>= (recording_time
/ 1000000.0))
2020 /* finish if limit size exhausted */
2021 if (limit_filesize
!= 0 && limit_filesize
< url_ftell(output_files
[0]->pb
))
2024 /* read a frame from it and output it in the fifo */
2025 is
= input_files
[file_index
];
2026 if (av_read_frame(is
, &pkt
) < 0) {
2027 file_table
[file_index
].eof_reached
= 1;
2035 av_pkt_dump_log(NULL
, AV_LOG_DEBUG
, &pkt
, do_hex_dump
);
2037 /* the following test is needed in case new streams appear
2038 dynamically in stream : we ignore them */
2039 if (pkt
.stream_index
>= file_table
[file_index
].nb_streams
)
2040 goto discard_packet
;
2041 ist_index
= file_table
[file_index
].ist_index
+ pkt
.stream_index
;
2042 ist
= ist_table
[ist_index
];
2044 goto discard_packet
;
2046 if (pkt
.dts
!= AV_NOPTS_VALUE
)
2047 pkt
.dts
+= av_rescale_q(input_files_ts_offset
[ist
->file_index
], AV_TIME_BASE_Q
, ist
->st
->time_base
);
2048 if (pkt
.pts
!= AV_NOPTS_VALUE
)
2049 pkt
.pts
+= av_rescale_q(input_files_ts_offset
[ist
->file_index
], AV_TIME_BASE_Q
, ist
->st
->time_base
);
2051 // 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);
2052 if (pkt
.dts
!= AV_NOPTS_VALUE
&& ist
->next_pts
!= AV_NOPTS_VALUE
) {
2053 int64_t pkt_dts
= av_rescale_q(pkt
.dts
, ist
->st
->time_base
, AV_TIME_BASE_Q
);
2054 int64_t delta
= pkt_dts
- ist
->next_pts
;
2055 if((FFABS(delta
) > 1LL*dts_delta_threshold
*AV_TIME_BASE
|| pkt_dts
+1<ist
->pts
)&& !copy_ts
){
2056 input_files_ts_offset
[ist
->file_index
]-= delta
;
2058 fprintf(stderr
, "timestamp discontinuity %"PRId64
", new offset= %"PRId64
"\n", delta
, input_files_ts_offset
[ist
->file_index
]);
2059 pkt
.dts
-= av_rescale_q(delta
, AV_TIME_BASE_Q
, ist
->st
->time_base
);
2060 if(pkt
.pts
!= AV_NOPTS_VALUE
)
2061 pkt
.pts
-= av_rescale_q(delta
, AV_TIME_BASE_Q
, ist
->st
->time_base
);
2065 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2066 if (output_packet(ist
, ist_index
, ost_table
, nb_ostreams
, &pkt
) < 0) {
2069 fprintf(stderr
, "Error while decoding stream #%d.%d\n",
2070 ist
->file_index
, ist
->index
);
2072 av_free_packet(&pkt
);
2077 av_free_packet(&pkt
);
2079 /* dump report by using the output first video and audio streams */
2080 print_report(output_files
, ost_table
, nb_ostreams
, 0);
2083 /* at the end of stream, we must flush the decoder buffers */
2084 for(i
=0;i
<nb_istreams
;i
++) {
2086 if (ist
->decoding_needed
) {
2087 output_packet(ist
, i
, ost_table
, nb_ostreams
, NULL
);
2093 /* write the trailer if needed and close file */
2094 for(i
=0;i
<nb_output_files
;i
++) {
2095 os
= output_files
[i
];
2096 av_write_trailer(os
);
2099 /* dump report by using the first video and audio streams */
2100 print_report(output_files
, ost_table
, nb_ostreams
, 1);
2102 /* close each encoder */
2103 for(i
=0;i
<nb_ostreams
;i
++) {
2105 if (ost
->encoding_needed
) {
2106 av_freep(&ost
->st
->codec
->stats_in
);
2107 avcodec_close(ost
->st
->codec
);
2111 /* close each decoder */
2112 for(i
=0;i
<nb_istreams
;i
++) {
2114 if (ist
->decoding_needed
) {
2115 avcodec_close(ist
->st
->codec
);
2123 av_freep(&bit_buffer
);
2124 av_free(file_table
);
2127 for(i
=0;i
<nb_istreams
;i
++) {
2134 for(i
=0;i
<nb_ostreams
;i
++) {
2138 fclose(ost
->logfile
);
2139 ost
->logfile
= NULL
;
2141 av_fifo_free(&ost
->fifo
); /* works even if fifo is not
2142 initialized but set to zero */
2143 av_free(ost
->pict_tmp
.data
[0]);
2144 if (ost
->video_resample
)
2145 sws_freeContext(ost
->img_resample_ctx
);
2147 audio_resample_close(ost
->resample
);
2155 ret
= AVERROR(ENOMEM
);
2160 int file_read(const char *filename
)
2163 unsigned char buffer
[1024];
2166 if (url_open(&h
, filename
, O_RDONLY
) < 0) {
2167 printf("could not open '%s'\n", filename
);
2171 len
= url_read(h
, buffer
, sizeof(buffer
));
2174 for(i
=0;i
<len
;i
++) putchar(buffer
[i
]);
2181 static void opt_format(const char *arg
)
2183 /* compatibility stuff for pgmyuv */
2184 if (!strcmp(arg
, "pgmyuv")) {
2185 pgmyuv_compatibility_hack
=1;
2186 // opt_image_format(arg);
2188 fprintf(stderr
, "pgmyuv format is deprecated, use image2\n");
2191 file_iformat
= av_find_input_format(arg
);
2192 file_oformat
= guess_format(arg
, NULL
, NULL
);
2193 if (!file_iformat
&& !file_oformat
) {
2194 fprintf(stderr
, "Unknown input or output format: %s\n", arg
);
2199 static int opt_default(const char *opt
, const char *arg
){
2201 const AVOption
*o
= NULL
;
2202 int opt_types
[]={AV_OPT_FLAG_VIDEO_PARAM
, AV_OPT_FLAG_AUDIO_PARAM
, 0, AV_OPT_FLAG_SUBTITLE_PARAM
, 0};
2204 for(type
=0; type
<CODEC_TYPE_NB
; type
++){
2205 const AVOption
*o2
= av_find_opt(avctx_opts
[0], opt
, NULL
, opt_types
[type
], opt_types
[type
]);
2207 o
= av_set_string(avctx_opts
[type
], opt
, arg
);
2210 o
= av_set_string(avformat_opts
, opt
, arg
);
2212 o
= av_set_string(sws_opts
, opt
, arg
);
2215 o
= av_set_string(avctx_opts
[CODEC_TYPE_AUDIO
], opt
+1, arg
);
2216 else if(opt
[0] == 'v')
2217 o
= av_set_string(avctx_opts
[CODEC_TYPE_VIDEO
], opt
+1, arg
);
2218 else if(opt
[0] == 's')
2219 o
= av_set_string(avctx_opts
[CODEC_TYPE_SUBTITLE
], opt
+1, arg
);
2224 // 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));
2226 //FIXME we should always use avctx_opts, ... for storing options so there wont be any need to keep track of whats set over this
2227 opt_names
= av_realloc(opt_names
, sizeof(void*)*(opt_name_count
+1));
2228 opt_names
[opt_name_count
++]= o
->name
;
2230 if(avctx_opts
[0]->debug
|| avformat_opts
->debug
)
2231 av_log_set_level(AV_LOG_DEBUG
);
2235 static void opt_video_rc_override_string(const char *arg
)
2237 video_rc_override_string
= arg
;
2240 static int opt_me_threshold(const char *opt
, const char *arg
)
2242 me_threshold
= parse_number_or_die(opt
, arg
, OPT_INT64
, INT_MIN
, INT_MAX
);
2246 static int opt_verbose(const char *opt
, const char *arg
)
2248 verbose
= parse_number_or_die(opt
, arg
, OPT_INT64
, -10, 10);
2249 av_log_set_level(verbose
);
2253 static void opt_frame_rate(const char *arg
)
2255 if (av_parse_video_frame_rate(&frame_rate
, arg
) < 0) {
2256 fprintf(stderr
, "Incorrect frame rate\n");
2261 static int opt_bitrate(const char *opt
, const char *arg
)
2263 int codec_type
= opt
[0]=='a' ? CODEC_TYPE_AUDIO
: CODEC_TYPE_VIDEO
;
2265 opt_default(opt
, arg
);
2267 if (av_get_int(avctx_opts
[codec_type
], "b", NULL
) < 1000)
2268 fprintf(stderr
, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2273 static void opt_frame_crop_top(const char *arg
)
2275 frame_topBand
= atoi(arg
);
2276 if (frame_topBand
< 0) {
2277 fprintf(stderr
, "Incorrect top crop size\n");
2280 if ((frame_topBand
% 2) != 0) {
2281 fprintf(stderr
, "Top crop size must be a multiple of 2\n");
2284 if ((frame_topBand
) >= frame_height
){
2285 fprintf(stderr
, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2288 frame_height
-= frame_topBand
;
2291 static void opt_frame_crop_bottom(const char *arg
)
2293 frame_bottomBand
= atoi(arg
);
2294 if (frame_bottomBand
< 0) {
2295 fprintf(stderr
, "Incorrect bottom crop size\n");
2298 if ((frame_bottomBand
% 2) != 0) {
2299 fprintf(stderr
, "Bottom crop size must be a multiple of 2\n");
2302 if ((frame_bottomBand
) >= frame_height
){
2303 fprintf(stderr
, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2306 frame_height
-= frame_bottomBand
;
2309 static void opt_frame_crop_left(const char *arg
)
2311 frame_leftBand
= atoi(arg
);
2312 if (frame_leftBand
< 0) {
2313 fprintf(stderr
, "Incorrect left crop size\n");
2316 if ((frame_leftBand
% 2) != 0) {
2317 fprintf(stderr
, "Left crop size must be a multiple of 2\n");
2320 if ((frame_leftBand
) >= frame_width
){
2321 fprintf(stderr
, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2324 frame_width
-= frame_leftBand
;
2327 static void opt_frame_crop_right(const char *arg
)
2329 frame_rightBand
= atoi(arg
);
2330 if (frame_rightBand
< 0) {
2331 fprintf(stderr
, "Incorrect right crop size\n");
2334 if ((frame_rightBand
% 2) != 0) {
2335 fprintf(stderr
, "Right crop size must be a multiple of 2\n");
2338 if ((frame_rightBand
) >= frame_width
){
2339 fprintf(stderr
, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2342 frame_width
-= frame_rightBand
;
2345 static void opt_frame_size(const char *arg
)
2347 if (av_parse_video_frame_size(&frame_width
, &frame_height
, arg
) < 0) {
2348 fprintf(stderr
, "Incorrect frame size\n");
2351 if ((frame_width
% 2) != 0 || (frame_height
% 2) != 0) {
2352 fprintf(stderr
, "Frame size must be a multiple of 2\n");
2358 #define SCALEBITS 10
2359 #define ONE_HALF (1 << (SCALEBITS - 1))
2360 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2362 #define RGB_TO_Y(r, g, b) \
2363 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2364 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2366 #define RGB_TO_U(r1, g1, b1, shift)\
2367 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2368 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2370 #define RGB_TO_V(r1, g1, b1, shift)\
2371 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2372 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2374 static void opt_pad_color(const char *arg
) {
2375 /* Input is expected to be six hex digits similar to
2376 how colors are expressed in html tags (but without the #) */
2377 int rgb
= strtol(arg
, NULL
, 16);
2381 g
= ((rgb
>> 8) & 255);
2384 padcolor
[0] = RGB_TO_Y(r
,g
,b
);
2385 padcolor
[1] = RGB_TO_U(r
,g
,b
,0);
2386 padcolor
[2] = RGB_TO_V(r
,g
,b
,0);
2389 static void opt_frame_pad_top(const char *arg
)
2391 frame_padtop
= atoi(arg
);
2392 if (frame_padtop
< 0) {
2393 fprintf(stderr
, "Incorrect top pad size\n");
2396 if ((frame_padtop
% 2) != 0) {
2397 fprintf(stderr
, "Top pad size must be a multiple of 2\n");
2402 static void opt_frame_pad_bottom(const char *arg
)
2404 frame_padbottom
= atoi(arg
);
2405 if (frame_padbottom
< 0) {
2406 fprintf(stderr
, "Incorrect bottom pad size\n");
2409 if ((frame_padbottom
% 2) != 0) {
2410 fprintf(stderr
, "Bottom pad size must be a multiple of 2\n");
2416 static void opt_frame_pad_left(const char *arg
)
2418 frame_padleft
= atoi(arg
);
2419 if (frame_padleft
< 0) {
2420 fprintf(stderr
, "Incorrect left pad size\n");
2423 if ((frame_padleft
% 2) != 0) {
2424 fprintf(stderr
, "Left pad size must be a multiple of 2\n");
2430 static void opt_frame_pad_right(const char *arg
)
2432 frame_padright
= atoi(arg
);
2433 if (frame_padright
< 0) {
2434 fprintf(stderr
, "Incorrect right pad size\n");
2437 if ((frame_padright
% 2) != 0) {
2438 fprintf(stderr
, "Right pad size must be a multiple of 2\n");
2443 static void list_pix_fmts(void)
2446 char pix_fmt_str
[128];
2447 for (i
=-1; i
< PIX_FMT_NB
; i
++) {
2448 avcodec_pix_fmt_string (pix_fmt_str
, sizeof(pix_fmt_str
), i
);
2449 fprintf(stdout
, "%s\n", pix_fmt_str
);
2453 static void opt_frame_pix_fmt(const char *arg
)
2455 if (strcmp(arg
, "list"))
2456 frame_pix_fmt
= avcodec_get_pix_fmt(arg
);
2463 static void opt_frame_aspect_ratio(const char *arg
)
2470 p
= strchr(arg
, ':');
2472 x
= strtol(arg
, &end
, 10);
2474 y
= strtol(end
+1, &end
, 10);
2476 ar
= (double)x
/ (double)y
;
2478 ar
= strtod(arg
, NULL
);
2481 fprintf(stderr
, "Incorrect aspect ratio specification.\n");
2484 frame_aspect_ratio
= ar
;
2487 static void opt_qscale(const char *arg
)
2489 video_qscale
= atof(arg
);
2490 if (video_qscale
<= 0 ||
2491 video_qscale
> 255) {
2492 fprintf(stderr
, "qscale must be > 0.0 and <= 255\n");
2497 static void opt_qdiff(const char *arg
)
2499 video_qdiff
= atoi(arg
);
2500 if (video_qdiff
< 0 ||
2502 fprintf(stderr
, "qdiff must be >= 1 and <= 31\n");
2507 static void opt_strict(const char *arg
)
2512 static void opt_top_field_first(const char *arg
)
2514 top_field_first
= atoi(arg
);
2517 static int opt_thread_count(const char *opt
, const char *arg
)
2519 thread_count
= parse_number_or_die(opt
, arg
, OPT_INT64
, 0, INT_MAX
);
2520 #if !defined(HAVE_THREADS)
2522 fprintf(stderr
, "Warning: not compiled with thread support, using thread emulation\n");
2527 static int opt_audio_rate(const char *opt
, const char *arg
)
2529 audio_sample_rate
= parse_number_or_die(opt
, arg
, OPT_INT64
, 0, INT_MAX
);
2533 static int opt_audio_channels(const char *opt
, const char *arg
)
2535 audio_channels
= parse_number_or_die(opt
, arg
, OPT_INT64
, 0, INT_MAX
);
2539 static void opt_video_channel(const char *arg
)
2541 video_channel
= strtol(arg
, NULL
, 0);
2544 static void opt_video_standard(const char *arg
)
2546 video_standard
= av_strdup(arg
);
2549 static void opt_codec(int *pstream_copy
, char **pcodec_name
,
2550 int codec_type
, const char *arg
)
2552 av_freep(pcodec_name
);
2553 if (!strcmp(arg
, "copy")) {
2556 *pcodec_name
= av_strdup(arg
);
2560 static void opt_audio_codec(const char *arg
)
2562 opt_codec(&audio_stream_copy
, &audio_codec_name
, CODEC_TYPE_AUDIO
, arg
);
2565 static void opt_audio_tag(const char *arg
)
2568 audio_codec_tag
= strtol(arg
, &tail
, 0);
2571 audio_codec_tag
= arg
[0] + (arg
[1]<<8) + (arg
[2]<<16) + (arg
[3]<<24);
2574 static void opt_video_tag(const char *arg
)
2577 video_codec_tag
= strtol(arg
, &tail
, 0);
2580 video_codec_tag
= arg
[0] + (arg
[1]<<8) + (arg
[2]<<16) + (arg
[3]<<24);
2584 static void add_frame_hooker(const char *arg
)
2589 char *args
= av_strdup(arg
);
2593 argv
[0] = strtok(args
, " ");
2594 while (argc
< 62 && (argv
[++argc
] = strtok(NULL
, " "))) {
2597 i
= frame_hook_add(argc
, argv
);
2600 fprintf(stderr
, "Failed to add video hook function: %s\n", arg
);
2606 static void opt_video_codec(const char *arg
)
2608 opt_codec(&video_stream_copy
, &video_codec_name
, CODEC_TYPE_VIDEO
, arg
);
2611 static void opt_subtitle_codec(const char *arg
)
2613 opt_codec(&subtitle_stream_copy
, &subtitle_codec_name
, CODEC_TYPE_SUBTITLE
, arg
);
2616 static void opt_map(const char *arg
)
2621 m
= &stream_maps
[nb_stream_maps
++];
2623 m
->file_index
= strtol(arg
, &p
, 0);
2627 m
->stream_index
= strtol(p
, &p
, 0);
2630 m
->sync_file_index
= strtol(p
, &p
, 0);
2633 m
->sync_stream_index
= strtol(p
, &p
, 0);
2635 m
->sync_file_index
= m
->file_index
;
2636 m
->sync_stream_index
= m
->stream_index
;
2640 static void opt_map_meta_data(const char *arg
)
2645 m
= &meta_data_maps
[nb_meta_data_maps
++];
2647 m
->out_file
= strtol(arg
, &p
, 0);
2651 m
->in_file
= strtol(p
, &p
, 0);
2654 static int opt_recording_time(const char *opt
, const char *arg
)
2656 recording_time
= parse_time_or_die(opt
, arg
, 1);
2660 static int opt_start_time(const char *opt
, const char *arg
)
2662 start_time
= parse_time_or_die(opt
, arg
, 1);
2666 static int opt_rec_timestamp(const char *opt
, const char *arg
)
2668 rec_timestamp
= parse_time_or_die(opt
, arg
, 0) / 1000000;
2672 static int opt_input_ts_offset(const char *opt
, const char *arg
)
2674 input_ts_offset
= parse_time_or_die(opt
, arg
, 1);
2678 static enum CodecID
find_codec_or_die(const char *name
, int type
, int encoder
)
2680 const char *codec_string
= encoder
? "encoder" : "decoder";
2684 return CODEC_ID_NONE
;
2686 avcodec_find_encoder_by_name(name
) :
2687 avcodec_find_decoder_by_name(name
);
2689 av_log(NULL
, AV_LOG_ERROR
, "Unknown %s '%s'\n", codec_string
, name
);
2692 if(codec
->type
!= type
) {
2693 av_log(NULL
, AV_LOG_ERROR
, "Invalid %s type '%s'\n", codec_string
, name
);
2699 static void set_context_opts(void *ctx
, void *opts_ctx
, int flags
)
2702 for(i
=0; i
<opt_name_count
; i
++){
2704 const AVOption
*opt
;
2705 const char *str
= av_get_string(opts_ctx
, opt_names
[i
], &opt
, buf
, sizeof(buf
));
2706 /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
2707 if(str
&& ((opt
->flags
& flags
) == flags
))
2708 av_set_string(ctx
, opt_names
[i
], str
);
2712 static void opt_input_file(const char *filename
)
2714 AVFormatContext
*ic
;
2715 AVFormatParameters params
, *ap
= ¶ms
;
2716 int err
, i
, ret
, rfps
, rfps_base
;
2719 if (!strcmp(filename
, "-"))
2722 using_stdin
|= !strncmp(filename
, "pipe:", 5) ||
2723 !strcmp(filename
, "/dev/stdin");
2725 /* get default parameters from command line */
2726 ic
= av_alloc_format_context();
2728 memset(ap
, 0, sizeof(*ap
));
2729 ap
->prealloced_context
= 1;
2730 ap
->sample_rate
= audio_sample_rate
;
2731 ap
->channels
= audio_channels
;
2732 ap
->time_base
.den
= frame_rate
.num
;
2733 ap
->time_base
.num
= frame_rate
.den
;
2734 ap
->width
= frame_width
+ frame_padleft
+ frame_padright
;
2735 ap
->height
= frame_height
+ frame_padtop
+ frame_padbottom
;
2736 ap
->pix_fmt
= frame_pix_fmt
;
2737 ap
->channel
= video_channel
;
2738 ap
->standard
= video_standard
;
2739 ap
->video_codec_id
= find_codec_or_die(video_codec_name
, CODEC_TYPE_VIDEO
, 0);
2740 ap
->audio_codec_id
= find_codec_or_die(audio_codec_name
, CODEC_TYPE_AUDIO
, 0);
2741 if(pgmyuv_compatibility_hack
)
2742 ap
->video_codec_id
= CODEC_ID_PGMYUV
;
2744 set_context_opts(ic
, avformat_opts
, AV_OPT_FLAG_DECODING_PARAM
);
2746 ic
->video_codec_id
= find_codec_or_die(video_codec_name
, CODEC_TYPE_VIDEO
, 0);
2747 ic
->audio_codec_id
= find_codec_or_die(audio_codec_name
, CODEC_TYPE_AUDIO
, 0);
2748 ic
->subtitle_codec_id
= find_codec_or_die(subtitle_codec_name
, CODEC_TYPE_SUBTITLE
, 0);
2750 /* open the input file with generic libav function */
2751 err
= av_open_input_file(&ic
, filename
, file_iformat
, 0, ap
);
2753 print_error(filename
, err
);
2758 for(i
=0; i
<ic
->nb_programs
; i
++)
2759 if(ic
->programs
[i
]->id
!= opt_programid
)
2760 ic
->programs
[i
]->discard
= AVDISCARD_ALL
;
2763 ic
->loop_input
= loop_input
;
2765 /* If not enough info to get the stream parameters, we decode the
2766 first frames to get it. (used in mpeg case for example) */
2767 ret
= av_find_stream_info(ic
);
2768 if (ret
< 0 && verbose
>= 0) {
2769 fprintf(stderr
, "%s: could not find codec parameters\n", filename
);
2773 timestamp
= start_time
;
2774 /* add the stream start time */
2775 if (ic
->start_time
!= AV_NOPTS_VALUE
)
2776 timestamp
+= ic
->start_time
;
2778 /* if seeking requested, we execute it */
2779 if (start_time
!= 0) {
2780 ret
= av_seek_frame(ic
, -1, timestamp
, AVSEEK_FLAG_BACKWARD
);
2782 fprintf(stderr
, "%s: could not seek to position %0.3f\n",
2783 filename
, (double)timestamp
/ AV_TIME_BASE
);
2785 /* reset seek info */
2789 /* update the current parameters so that they match the one of the input stream */
2790 for(i
=0;i
<ic
->nb_streams
;i
++) {
2791 AVCodecContext
*enc
= ic
->streams
[i
]->codec
;
2793 avcodec_thread_init(enc
, thread_count
);
2794 enc
->thread_count
= thread_count
;
2795 switch(enc
->codec_type
) {
2796 case CODEC_TYPE_AUDIO
:
2797 set_context_opts(enc
, avctx_opts
[CODEC_TYPE_AUDIO
], AV_OPT_FLAG_AUDIO_PARAM
| AV_OPT_FLAG_DECODING_PARAM
);
2798 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2799 audio_channels
= enc
->channels
;
2800 audio_sample_rate
= enc
->sample_rate
;
2802 ic
->streams
[i
]->discard
= AVDISCARD_ALL
;
2804 case CODEC_TYPE_VIDEO
:
2805 set_context_opts(enc
, avctx_opts
[CODEC_TYPE_VIDEO
], AV_OPT_FLAG_VIDEO_PARAM
| AV_OPT_FLAG_DECODING_PARAM
);
2806 frame_height
= enc
->height
;
2807 frame_width
= enc
->width
;
2808 frame_aspect_ratio
= av_q2d(enc
->sample_aspect_ratio
) * enc
->width
/ enc
->height
;
2809 frame_pix_fmt
= enc
->pix_fmt
;
2810 rfps
= ic
->streams
[i
]->r_frame_rate
.num
;
2811 rfps_base
= ic
->streams
[i
]->r_frame_rate
.den
;
2812 if(enc
->lowres
) enc
->flags
|= CODEC_FLAG_EMU_EDGE
;
2814 enc
->debug
|= FF_DEBUG_MV
;
2816 if (enc
->time_base
.den
!= rfps
|| enc
->time_base
.num
!= rfps_base
) {
2819 fprintf(stderr
,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2820 i
, (float)enc
->time_base
.den
/ enc
->time_base
.num
, enc
->time_base
.den
, enc
->time_base
.num
,
2822 (float)rfps
/ rfps_base
, rfps
, rfps_base
);
2824 /* update the current frame rate to match the stream frame rate */
2825 frame_rate
.num
= rfps
;
2826 frame_rate
.den
= rfps_base
;
2828 enc
->rate_emu
= rate_emu
;
2830 ic
->streams
[i
]->discard
= AVDISCARD_ALL
;
2831 else if(video_discard
)
2832 ic
->streams
[i
]->discard
= video_discard
;
2834 case CODEC_TYPE_DATA
:
2836 case CODEC_TYPE_SUBTITLE
:
2837 if(subtitle_disable
)
2838 ic
->streams
[i
]->discard
= AVDISCARD_ALL
;
2840 case CODEC_TYPE_ATTACHMENT
:
2841 case CODEC_TYPE_UNKNOWN
:
2848 input_files
[nb_input_files
] = ic
;
2849 input_files_ts_offset
[nb_input_files
] = input_ts_offset
- (copy_ts
? 0 : timestamp
);
2850 /* dump the file content */
2852 dump_format(ic
, nb_input_files
, filename
, 0);
2855 file_iformat
= NULL
;
2856 file_oformat
= NULL
;
2861 av_freep(&video_codec_name
);
2862 av_freep(&audio_codec_name
);
2863 av_freep(&subtitle_codec_name
);
2866 static void check_audio_video_sub_inputs(int *has_video_ptr
, int *has_audio_ptr
,
2867 int *has_subtitle_ptr
)
2869 int has_video
, has_audio
, has_subtitle
, i
, j
;
2870 AVFormatContext
*ic
;
2875 for(j
=0;j
<nb_input_files
;j
++) {
2876 ic
= input_files
[j
];
2877 for(i
=0;i
<ic
->nb_streams
;i
++) {
2878 AVCodecContext
*enc
= ic
->streams
[i
]->codec
;
2879 switch(enc
->codec_type
) {
2880 case CODEC_TYPE_AUDIO
:
2883 case CODEC_TYPE_VIDEO
:
2886 case CODEC_TYPE_SUBTITLE
:
2889 case CODEC_TYPE_DATA
:
2890 case CODEC_TYPE_ATTACHMENT
:
2891 case CODEC_TYPE_UNKNOWN
:
2898 *has_video_ptr
= has_video
;
2899 *has_audio_ptr
= has_audio
;
2900 *has_subtitle_ptr
= has_subtitle
;
2903 static void new_video_stream(AVFormatContext
*oc
)
2906 AVCodecContext
*video_enc
;
2909 st
= av_new_stream(oc
, oc
->nb_streams
);
2911 fprintf(stderr
, "Could not alloc stream\n");
2914 avcodec_get_context_defaults2(st
->codec
, CODEC_TYPE_VIDEO
);
2915 bitstream_filters
[nb_output_files
][oc
->nb_streams
- 1]= video_bitstream_filters
;
2916 video_bitstream_filters
= NULL
;
2919 avcodec_thread_init(st
->codec
, thread_count
);
2921 video_enc
= st
->codec
;
2924 video_enc
->codec_tag
= video_codec_tag
;
2926 if( (video_global_header
&1)
2927 || (video_global_header
==0 && (oc
->oformat
->flags
& AVFMT_GLOBALHEADER
))){
2928 video_enc
->flags
|= CODEC_FLAG_GLOBAL_HEADER
;
2929 avctx_opts
[CODEC_TYPE_VIDEO
]->flags
|= CODEC_FLAG_GLOBAL_HEADER
;
2931 if(video_global_header
&2){
2932 video_enc
->flags2
|= CODEC_FLAG2_LOCAL_HEADER
;
2933 avctx_opts
[CODEC_TYPE_VIDEO
]->flags2
|= CODEC_FLAG2_LOCAL_HEADER
;
2936 if (video_stream_copy
) {
2937 st
->stream_copy
= 1;
2938 video_enc
->codec_type
= CODEC_TYPE_VIDEO
;
2943 AVRational fps
= frame_rate
.num
? frame_rate
: (AVRational
){25,1};
2945 codec_id
= av_guess_codec(oc
->oformat
, NULL
, oc
->filename
, NULL
, CODEC_TYPE_VIDEO
);
2946 if (video_codec_name
)
2947 codec_id
= find_codec_or_die(video_codec_name
, CODEC_TYPE_VIDEO
, 1);
2949 video_enc
->codec_id
= codec_id
;
2950 codec
= avcodec_find_encoder(codec_id
);
2952 set_context_opts(video_enc
, avctx_opts
[CODEC_TYPE_VIDEO
], AV_OPT_FLAG_VIDEO_PARAM
| AV_OPT_FLAG_ENCODING_PARAM
);
2954 video_enc
->time_base
.den
= fps
.num
;
2955 video_enc
->time_base
.num
= fps
.den
;
2956 if(codec
&& codec
->supported_framerates
){
2957 const AVRational
*p
= codec
->supported_framerates
;
2958 const AVRational
*best
=NULL
;
2959 AVRational best_error
= (AVRational
){INT_MAX
, 1};
2960 for(; p
->den
!=0; p
++){
2961 AVRational error
= av_sub_q(fps
, *p
);
2962 if(error
.num
<0) error
.num
*= -1;
2963 if(av_cmp_q(error
, best_error
) < 0){
2968 video_enc
->time_base
.den
= best
->num
;
2969 video_enc
->time_base
.num
= best
->den
;
2972 video_enc
->width
= frame_width
+ frame_padright
+ frame_padleft
;
2973 video_enc
->height
= frame_height
+ frame_padtop
+ frame_padbottom
;
2974 video_enc
->sample_aspect_ratio
= av_d2q(frame_aspect_ratio
*video_enc
->height
/video_enc
->width
, 255);
2975 video_enc
->pix_fmt
= frame_pix_fmt
;
2977 if(codec
&& codec
->pix_fmts
){
2978 const enum PixelFormat
*p
= codec
->pix_fmts
;
2980 if(*p
== video_enc
->pix_fmt
)
2984 video_enc
->pix_fmt
= codec
->pix_fmts
[0];
2988 video_enc
->gop_size
= 0;
2989 if (video_qscale
|| same_quality
) {
2990 video_enc
->flags
|= CODEC_FLAG_QSCALE
;
2991 video_enc
->global_quality
=
2992 st
->quality
= FF_QP2LAMBDA
* video_qscale
;
2996 video_enc
->intra_matrix
= intra_matrix
;
2998 video_enc
->inter_matrix
= inter_matrix
;
3000 video_enc
->max_qdiff
= video_qdiff
;
3001 video_enc
->thread_count
= thread_count
;
3002 p
= video_rc_override_string
;
3005 int e
=sscanf(p
, "%d,%d,%d", &start
, &end
, &q
);
3007 fprintf(stderr
, "error parsing rc_override\n");
3010 video_enc
->rc_override
=
3011 av_realloc(video_enc
->rc_override
,
3012 sizeof(RcOverride
)*(i
+1));
3013 video_enc
->rc_override
[i
].start_frame
= start
;
3014 video_enc
->rc_override
[i
].end_frame
= end
;
3016 video_enc
->rc_override
[i
].qscale
= q
;
3017 video_enc
->rc_override
[i
].quality_factor
= 1.0;
3020 video_enc
->rc_override
[i
].qscale
= 0;
3021 video_enc
->rc_override
[i
].quality_factor
= -q
/100.0;
3026 video_enc
->rc_override_count
=i
;
3027 if (!video_enc
->rc_initial_buffer_occupancy
)
3028 video_enc
->rc_initial_buffer_occupancy
= video_enc
->rc_buffer_size
*3/4;
3029 video_enc
->me_threshold
= me_threshold
;
3030 video_enc
->intra_dc_precision
= intra_dc_precision
- 8;
3031 video_enc
->strict_std_compliance
= strict
;
3034 video_enc
->flags
|= CODEC_FLAG_PSNR
;
3039 video_enc
->flags
|= CODEC_FLAG_PASS1
;
3041 video_enc
->flags
|= CODEC_FLAG_PASS2
;
3046 /* reset some key parameters */
3048 av_freep(&video_codec_name
);
3049 video_stream_copy
= 0;
3052 static void new_audio_stream(AVFormatContext
*oc
)
3055 AVCodecContext
*audio_enc
;
3058 st
= av_new_stream(oc
, oc
->nb_streams
);
3060 fprintf(stderr
, "Could not alloc stream\n");
3063 avcodec_get_context_defaults2(st
->codec
, CODEC_TYPE_AUDIO
);
3065 bitstream_filters
[nb_output_files
][oc
->nb_streams
- 1]= audio_bitstream_filters
;
3066 audio_bitstream_filters
= NULL
;
3069 avcodec_thread_init(st
->codec
, thread_count
);
3071 audio_enc
= st
->codec
;
3072 audio_enc
->codec_type
= CODEC_TYPE_AUDIO
;
3073 audio_enc
->strict_std_compliance
= strict
;
3076 audio_enc
->codec_tag
= audio_codec_tag
;
3078 if (oc
->oformat
->flags
& AVFMT_GLOBALHEADER
) {
3079 audio_enc
->flags
|= CODEC_FLAG_GLOBAL_HEADER
;
3080 avctx_opts
[CODEC_TYPE_AUDIO
]->flags
|= CODEC_FLAG_GLOBAL_HEADER
;
3082 if (audio_stream_copy
) {
3083 st
->stream_copy
= 1;
3084 audio_enc
->channels
= audio_channels
;
3086 codec_id
= av_guess_codec(oc
->oformat
, NULL
, oc
->filename
, NULL
, CODEC_TYPE_AUDIO
);
3088 set_context_opts(audio_enc
, avctx_opts
[CODEC_TYPE_AUDIO
], AV_OPT_FLAG_AUDIO_PARAM
| AV_OPT_FLAG_ENCODING_PARAM
);
3090 if (audio_codec_name
)
3091 codec_id
= find_codec_or_die(audio_codec_name
, CODEC_TYPE_AUDIO
, 1);
3092 audio_enc
->codec_id
= codec_id
;
3094 if (audio_qscale
> QSCALE_NONE
) {
3095 audio_enc
->flags
|= CODEC_FLAG_QSCALE
;
3096 audio_enc
->global_quality
= st
->quality
= FF_QP2LAMBDA
* audio_qscale
;
3098 audio_enc
->thread_count
= thread_count
;
3099 audio_enc
->channels
= audio_channels
;
3101 audio_enc
->sample_rate
= audio_sample_rate
;
3102 audio_enc
->time_base
= (AVRational
){1, audio_sample_rate
};
3103 if (audio_language
) {
3104 av_strlcpy(st
->language
, audio_language
, sizeof(st
->language
));
3105 av_free(audio_language
);
3106 audio_language
= NULL
;
3109 /* reset some key parameters */
3111 av_freep(&audio_codec_name
);
3112 audio_stream_copy
= 0;
3115 static void new_subtitle_stream(AVFormatContext
*oc
)
3118 AVCodecContext
*subtitle_enc
;
3120 st
= av_new_stream(oc
, oc
->nb_streams
);
3122 fprintf(stderr
, "Could not alloc stream\n");
3125 avcodec_get_context_defaults2(st
->codec
, CODEC_TYPE_SUBTITLE
);
3127 bitstream_filters
[nb_output_files
][oc
->nb_streams
- 1]= subtitle_bitstream_filters
;
3128 subtitle_bitstream_filters
= NULL
;
3130 subtitle_enc
= st
->codec
;
3131 subtitle_enc
->codec_type
= CODEC_TYPE_SUBTITLE
;
3132 if (subtitle_stream_copy
) {
3133 st
->stream_copy
= 1;
3135 set_context_opts(avctx_opts
[CODEC_TYPE_SUBTITLE
], subtitle_enc
, AV_OPT_FLAG_SUBTITLE_PARAM
| AV_OPT_FLAG_ENCODING_PARAM
);
3136 subtitle_enc
->codec_id
= find_codec_or_die(subtitle_codec_name
, CODEC_TYPE_SUBTITLE
, 1);
3139 if (subtitle_language
) {
3140 av_strlcpy(st
->language
, subtitle_language
, sizeof(st
->language
));
3141 av_free(subtitle_language
);
3142 subtitle_language
= NULL
;
3145 subtitle_disable
= 0;
3146 av_freep(&subtitle_codec_name
);
3147 subtitle_stream_copy
= 0;
3150 static void opt_new_audio_stream(void)
3152 AVFormatContext
*oc
;
3153 if (nb_output_files
<= 0) {
3154 fprintf(stderr
, "At least one output file must be specified\n");
3157 oc
= output_files
[nb_output_files
- 1];
3158 new_audio_stream(oc
);
3161 static void opt_new_video_stream(void)
3163 AVFormatContext
*oc
;
3164 if (nb_output_files
<= 0) {
3165 fprintf(stderr
, "At least one output file must be specified\n");
3168 oc
= output_files
[nb_output_files
- 1];
3169 new_video_stream(oc
);
3172 static void opt_new_subtitle_stream(void)
3174 AVFormatContext
*oc
;
3175 if (nb_output_files
<= 0) {
3176 fprintf(stderr
, "At least one output file must be specified\n");
3179 oc
= output_files
[nb_output_files
- 1];
3180 new_subtitle_stream(oc
);
3183 static void opt_output_file(const char *filename
)
3185 AVFormatContext
*oc
;
3186 int use_video
, use_audio
, use_subtitle
;
3187 int input_has_video
, input_has_audio
, input_has_subtitle
;
3188 AVFormatParameters params
, *ap
= ¶ms
;
3190 if (!strcmp(filename
, "-"))
3193 oc
= av_alloc_format_context();
3195 if (!file_oformat
) {
3196 file_oformat
= guess_format(NULL
, filename
, NULL
);
3197 if (!file_oformat
) {
3198 fprintf(stderr
, "Unable to find a suitable output format for '%s'\n",
3204 oc
->oformat
= file_oformat
;
3205 av_strlcpy(oc
->filename
, filename
, sizeof(oc
->filename
));
3207 if (!strcmp(file_oformat
->name
, "ffm") &&
3208 av_strstart(filename
, "http:", NULL
)) {
3209 /* special case for files sent to ffserver: we get the stream
3210 parameters from ffserver */
3211 int err
= read_ffserver_streams(oc
, filename
);
3213 print_error(filename
, err
);
3217 use_video
= file_oformat
->video_codec
!= CODEC_ID_NONE
|| video_stream_copy
|| video_codec_name
;
3218 use_audio
= file_oformat
->audio_codec
!= CODEC_ID_NONE
|| audio_stream_copy
|| audio_codec_name
;
3219 use_subtitle
= file_oformat
->subtitle_codec
!= CODEC_ID_NONE
|| subtitle_stream_copy
|| subtitle_codec_name
;
3221 /* disable if no corresponding type found and at least one
3223 if (nb_input_files
> 0) {
3224 check_audio_video_sub_inputs(&input_has_video
, &input_has_audio
,
3225 &input_has_subtitle
);
3226 if (!input_has_video
)
3228 if (!input_has_audio
)
3230 if (!input_has_subtitle
)
3234 /* manual disable */
3235 if (audio_disable
) {
3238 if (video_disable
) {
3241 if (subtitle_disable
) {
3246 new_video_stream(oc
);
3250 new_audio_stream(oc
);
3254 new_subtitle_stream(oc
);
3257 oc
->timestamp
= rec_timestamp
;
3260 av_strlcpy(oc
->title
, str_title
, sizeof(oc
->title
));
3262 av_strlcpy(oc
->author
, str_author
, sizeof(oc
->author
));
3264 av_strlcpy(oc
->copyright
, str_copyright
, sizeof(oc
->copyright
));
3266 av_strlcpy(oc
->comment
, str_comment
, sizeof(oc
->comment
));
3268 av_strlcpy(oc
->album
, str_album
, sizeof(oc
->album
));
3270 av_strlcpy(oc
->genre
, str_genre
, sizeof(oc
->genre
));
3273 output_files
[nb_output_files
++] = oc
;
3275 /* check filename in case of an image number is expected */
3276 if (oc
->oformat
->flags
& AVFMT_NEEDNUMBER
) {
3277 if (!av_filename_number_test(oc
->filename
)) {
3278 print_error(oc
->filename
, AVERROR_NUMEXPECTED
);
3283 if (!(oc
->oformat
->flags
& AVFMT_NOFILE
)) {
3284 /* test if it already exists to avoid loosing precious files */
3285 if (!file_overwrite
&&
3286 (strchr(filename
, ':') == NULL
||
3287 filename
[1] == ':' ||
3288 av_strstart(filename
, "file:", NULL
))) {
3289 if (url_exist(filename
)) {
3293 fprintf(stderr
,"File '%s' already exists. Overwrite ? [y/N] ", filename
);
3296 if (toupper(c
) != 'Y') {
3297 fprintf(stderr
, "Not overwriting - exiting\n");
3302 fprintf(stderr
,"File '%s' already exists. Exiting.\n", filename
);
3309 if (url_fopen(&oc
->pb
, filename
, URL_WRONLY
) < 0) {
3310 fprintf(stderr
, "Could not open '%s'\n", filename
);
3315 memset(ap
, 0, sizeof(*ap
));
3316 if (av_set_parameters(oc
, ap
) < 0) {
3317 fprintf(stderr
, "%s: Invalid encoding parameters\n",
3322 oc
->preload
= (int)(mux_preload
*AV_TIME_BASE
);
3323 oc
->max_delay
= (int)(mux_max_delay
*AV_TIME_BASE
);
3324 oc
->loop_output
= loop_output
;
3326 set_context_opts(oc
, avformat_opts
, AV_OPT_FLAG_ENCODING_PARAM
);
3328 /* reset some options */
3329 file_oformat
= NULL
;
3330 file_iformat
= NULL
;
3333 /* same option as mencoder */
3334 static void opt_pass(const char *pass_str
)
3337 pass
= atoi(pass_str
);
3338 if (pass
!= 1 && pass
!= 2) {
3339 fprintf(stderr
, "pass number can be only 1 or 2\n");
3345 static int64_t getutime(void)
3347 #ifdef HAVE_GETRUSAGE
3348 struct rusage rusage
;
3350 getrusage(RUSAGE_SELF
, &rusage
);
3351 return (rusage
.ru_utime
.tv_sec
* 1000000LL) + rusage
.ru_utime
.tv_usec
;
3352 #elif defined(HAVE_GETPROCESSTIMES)
3354 FILETIME c
, e
, k
, u
;
3355 proc
= GetCurrentProcess();
3356 GetProcessTimes(proc
, &c
, &e
, &k
, &u
);
3357 return ((int64_t) u
.dwHighDateTime
<< 32 | u
.dwLowDateTime
) / 10;
3359 return av_gettime();
3363 static void parse_matrix_coeffs(uint16_t *dest
, const char *str
)
3366 const char *p
= str
;
3373 fprintf(stderr
, "Syntax error in matrix \"%s\" at coeff %d\n", str
, i
);
3380 static void opt_inter_matrix(const char *arg
)
3382 inter_matrix
= av_mallocz(sizeof(uint16_t) * 64);
3383 parse_matrix_coeffs(inter_matrix
, arg
);
3386 static void opt_intra_matrix(const char *arg
)
3388 intra_matrix
= av_mallocz(sizeof(uint16_t) * 64);
3389 parse_matrix_coeffs(intra_matrix
, arg
);
3393 * Trivial log callback.
3394 * Only suitable for show_help and similar since it lacks prefix handling.
3396 static void log_callback_help(void* ptr
, int level
, const char* fmt
, va_list vl
)
3398 vfprintf(stdout
, fmt
, vl
);
3401 static void show_help(void)
3403 av_log_set_callback(log_callback_help
);
3404 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3405 "Hyper fast Audio and Video encoder\n");
3407 show_help_options(options
, "Main options:\n",
3408 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_SUBTITLE
| OPT_GRAB
, 0);
3409 show_help_options(options
, "\nAdvanced options:\n",
3410 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_SUBTITLE
| OPT_GRAB
,
3412 show_help_options(options
, "\nVideo options:\n",
3413 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_GRAB
,
3415 show_help_options(options
, "\nAdvanced Video options:\n",
3416 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_GRAB
,
3417 OPT_VIDEO
| OPT_EXPERT
);
3418 show_help_options(options
, "\nAudio options:\n",
3419 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_GRAB
,
3421 show_help_options(options
, "\nAdvanced Audio options:\n",
3422 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_GRAB
,
3423 OPT_AUDIO
| OPT_EXPERT
);
3424 show_help_options(options
, "\nSubtitle options:\n",
3425 OPT_SUBTITLE
| OPT_GRAB
,
3427 show_help_options(options
, "\nAudio/Video grab options:\n",
3431 av_opt_show(avctx_opts
[0], NULL
);
3433 av_opt_show(avformat_opts
, NULL
);
3435 av_opt_show(sws_opts
, NULL
);
3438 static void opt_target(const char *arg
)
3441 static const char *const frame_rates
[] = {"25", "30000/1001", "24000/1001"};
3443 if(!strncmp(arg
, "pal-", 4)) {
3446 } else if(!strncmp(arg
, "ntsc-", 5)) {
3449 } else if(!strncmp(arg
, "film-", 5)) {
3454 /* Calculate FR via float to avoid int overflow */
3455 fr
= (int)(frame_rate
.num
* 1000.0 / frame_rate
.den
);
3458 } else if((fr
== 29970) || (fr
== 23976)) {
3461 /* Try to determine PAL/NTSC by peeking in the input files */
3462 if(nb_input_files
) {
3464 for(j
= 0; j
< nb_input_files
; j
++) {
3465 for(i
= 0; i
< input_files
[j
]->nb_streams
; i
++) {
3466 AVCodecContext
*c
= input_files
[j
]->streams
[i
]->codec
;
3467 if(c
->codec_type
!= CODEC_TYPE_VIDEO
)
3469 fr
= c
->time_base
.den
* 1000 / c
->time_base
.num
;
3473 } else if((fr
== 29970) || (fr
== 23976)) {
3483 if(verbose
&& norm
>= 0)
3484 fprintf(stderr
, "Assuming %s for target.\n", norm
? "NTSC" : "PAL");
3488 fprintf(stderr
, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3489 fprintf(stderr
, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3490 fprintf(stderr
, "or set a framerate with \"-r xxx\".\n");
3494 if(!strcmp(arg
, "vcd")) {
3496 opt_video_codec("mpeg1video");
3497 opt_audio_codec("mp2");
3500 opt_frame_size(norm
? "352x240" : "352x288");
3501 opt_frame_rate(frame_rates
[norm
]);
3502 opt_default("gop", norm
? "18" : "15");
3504 opt_default("b", "1150000");
3505 opt_default("maxrate", "1150000");
3506 opt_default("minrate", "1150000");
3507 opt_default("bufsize", "327680"); // 40*1024*8;
3509 opt_default("ab", "224000");
3510 audio_sample_rate
= 44100;
3513 opt_default("packetsize", "2324");
3514 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3516 /* We have to offset the PTS, so that it is consistent with the SCR.
3517 SCR starts at 36000, but the first two packs contain only padding
3518 and the first pack from the other stream, respectively, may also have
3519 been written before.
3520 So the real data starts at SCR 36000+3*1200. */
3521 mux_preload
= (36000+3*1200) / 90000.0; //0.44
3522 } else if(!strcmp(arg
, "svcd")) {
3524 opt_video_codec("mpeg2video");
3525 opt_audio_codec("mp2");
3528 opt_frame_size(norm
? "480x480" : "480x576");
3529 opt_frame_rate(frame_rates
[norm
]);
3530 opt_default("gop", norm
? "18" : "15");
3532 opt_default("b", "2040000");
3533 opt_default("maxrate", "2516000");
3534 opt_default("minrate", "0"); //1145000;
3535 opt_default("bufsize", "1835008"); //224*1024*8;
3536 opt_default("flags", "+SCAN_OFFSET");
3539 opt_default("ab", "224000");
3540 audio_sample_rate
= 44100;
3542 opt_default("packetsize", "2324");
3544 } else if(!strcmp(arg
, "dvd")) {
3546 opt_video_codec("mpeg2video");
3547 opt_audio_codec("ac3");
3550 opt_frame_size(norm
? "720x480" : "720x576");
3551 opt_frame_rate(frame_rates
[norm
]);
3552 opt_default("gop", norm
? "18" : "15");
3554 opt_default("b", "6000000");
3555 opt_default("maxrate", "9000000");
3556 opt_default("minrate", "0"); //1500000;
3557 opt_default("bufsize", "1835008"); //224*1024*8;
3559 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3560 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3562 opt_default("ab", "448000");
3563 audio_sample_rate
= 48000;
3565 } else if(!strncmp(arg
, "dv", 2)) {
3569 opt_frame_size(norm
? "720x480" : "720x576");
3570 opt_frame_pix_fmt(!strncmp(arg
, "dv50", 4) ? "yuv422p" :
3571 (norm
? "yuv411p" : "yuv420p"));
3572 opt_frame_rate(frame_rates
[norm
]);
3574 audio_sample_rate
= 48000;
3578 fprintf(stderr
, "Unknown target: %s\n", arg
);
3583 static void opt_vstats_file (const char *arg
)
3585 av_free (vstats_filename
);
3586 vstats_filename
=av_strdup (arg
);
3589 static void opt_vstats (void)
3592 time_t today2
= time(NULL
);
3593 struct tm
*today
= localtime(&today2
);
3595 snprintf(filename
, sizeof(filename
), "vstats_%02d%02d%02d.log", today
->tm_hour
, today
->tm_min
,
3597 opt_vstats_file(filename
);
3600 static int opt_bsf(const char *opt
, const char *arg
)
3602 AVBitStreamFilterContext
*bsfc
= av_bitstream_filter_init(arg
); //FIXME split name and args for filter at '='
3603 AVBitStreamFilterContext
**bsfp
;
3606 fprintf(stderr
, "Unknown bitstream filter %s\n", arg
);
3610 bsfp
= *opt
== 'v' ? &video_bitstream_filters
:
3611 *opt
== 'a' ? &audio_bitstream_filters
:
3612 &subtitle_bitstream_filters
;
3614 bsfp
= &(*bsfp
)->next
;
3621 static int opt_preset(const char *opt
, const char *arg
)
3624 char tmp
[1000], tmp2
[1000];
3626 const char *base
[3]= { getenv("HOME"),
3631 for(i
=!base
[0]; i
<3 && !f
; i
++){
3632 snprintf(tmp
, sizeof(tmp
), "%s/%sffmpeg/%s.ffpreset", base
[i
], i
? "" : ".", arg
);
3635 char *codec_name
= *opt
== 'v' ? video_codec_name
:
3636 *opt
== 'a' ? audio_codec_name
:
3637 subtitle_codec_name
;
3638 snprintf(tmp
, sizeof(tmp
), "%s/%sffmpeg/%s-%s.ffpreset", base
[i
], i
? "" : ".", codec_name
, arg
);
3644 fprintf(stderr
, "Preset file not found\n");
3649 int e
= fscanf(f
, "%999[^=]=%999[^\n]\n", tmp
, tmp2
);
3651 fprintf(stderr
, "Preset file invalid\n");
3654 opt_default(tmp
, tmp2
);
3662 static const OptionDef options
[] = {
3664 { "L", OPT_EXIT
, {(void*)show_license
}, "show license" },
3665 { "h", OPT_EXIT
, {(void*)show_help
}, "show help" },
3666 { "version", OPT_EXIT
, {(void*)show_version
}, "show version" },
3667 { "formats", OPT_EXIT
, {(void*)show_formats
}, "show available formats, codecs, protocols, ..." },
3668 { "f", HAS_ARG
, {(void*)opt_format
}, "force format", "fmt" },
3669 { "i", HAS_ARG
, {(void*)opt_input_file
}, "input file name", "filename" },
3670 { "y", OPT_BOOL
, {(void*)&file_overwrite
}, "overwrite output files" },
3671 { "map", HAS_ARG
| OPT_EXPERT
, {(void*)opt_map
}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3672 { "map_meta_data", HAS_ARG
| OPT_EXPERT
, {(void*)opt_map_meta_data
}, "set meta data information of outfile from infile", "outfile:infile" },
3673 { "t", OPT_FUNC2
| HAS_ARG
, {(void*)opt_recording_time
}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3674 { "fs", HAS_ARG
| OPT_INT64
, {(void*)&limit_filesize
}, "set the limit file size in bytes", "limit_size" }, //
3675 { "ss", OPT_FUNC2
| HAS_ARG
, {(void*)opt_start_time
}, "set the start time offset", "time_off" },
3676 { "itsoffset", OPT_FUNC2
| HAS_ARG
, {(void*)opt_input_ts_offset
}, "set the input ts offset", "time_off" },
3677 { "title", HAS_ARG
| OPT_STRING
, {(void*)&str_title
}, "set the title", "string" },
3678 { "timestamp", OPT_FUNC2
| HAS_ARG
, {(void*)&opt_rec_timestamp
}, "set the timestamp", "time" },
3679 { "author", HAS_ARG
| OPT_STRING
, {(void*)&str_author
}, "set the author", "string" },
3680 { "copyright", HAS_ARG
| OPT_STRING
, {(void*)&str_copyright
}, "set the copyright", "string" },
3681 { "comment", HAS_ARG
| OPT_STRING
, {(void*)&str_comment
}, "set the comment", "string" },
3682 { "genre", HAS_ARG
| OPT_STRING
, {(void*)&str_genre
}, "set the genre", "string" },
3683 { "album", HAS_ARG
| OPT_STRING
, {(void*)&str_album
}, "set the album", "string" },
3684 { "dframes", OPT_INT
| HAS_ARG
, {(void*)&max_frames
[CODEC_TYPE_DATA
]}, "set the number of data frames to record", "number" },
3685 { "benchmark", OPT_BOOL
| OPT_EXPERT
, {(void*)&do_benchmark
},
3686 "add timings for benchmarking" },
3687 { "dump", OPT_BOOL
| OPT_EXPERT
, {(void*)&do_pkt_dump
},
3688 "dump each input packet" },
3689 { "hex", OPT_BOOL
| OPT_EXPERT
, {(void*)&do_hex_dump
},
3690 "when dumping packets, also dump the payload" },
3691 { "re", OPT_BOOL
| OPT_EXPERT
, {(void*)&rate_emu
}, "read input at native frame rate", "" },
3692 { "loop_input", OPT_BOOL
| OPT_EXPERT
, {(void*)&loop_input
}, "loop (current only works with images)" },
3693 { "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)", "" },
3694 { "v", HAS_ARG
| OPT_FUNC2
, {(void*)opt_verbose
}, "set the logging verbosity level", "number" },
3695 { "target", HAS_ARG
, {(void*)opt_target
}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3696 { "threads", OPT_FUNC2
| HAS_ARG
| OPT_EXPERT
, {(void*)opt_thread_count
}, "thread count", "count" },
3697 { "vsync", HAS_ARG
| OPT_INT
| OPT_EXPERT
, {(void*)&video_sync_method
}, "video sync method", "" },
3698 { "async", HAS_ARG
| OPT_INT
| OPT_EXPERT
, {(void*)&audio_sync_method
}, "audio sync method", "" },
3699 { "adrift_threshold", HAS_ARG
| OPT_FLOAT
| OPT_EXPERT
, {(void*)&audio_drift_threshold
}, "audio drift threshold", "threshold" },
3700 { "vglobal", HAS_ARG
| OPT_INT
| OPT_EXPERT
, {(void*)&video_global_header
}, "video global header storage type", "" },
3701 { "copyts", OPT_BOOL
| OPT_EXPERT
, {(void*)©_ts
}, "copy timestamps" },
3702 { "shortest", OPT_BOOL
| OPT_EXPERT
, {(void*)&opt_shortest
}, "finish encoding within shortest input" }, //
3703 { "dts_delta_threshold", HAS_ARG
| OPT_FLOAT
| OPT_EXPERT
, {(void*)&dts_delta_threshold
}, "timestamp discontinuity delta threshold", "threshold" },
3704 { "programid", HAS_ARG
| OPT_INT
| OPT_EXPERT
, {(void*)&opt_programid
}, "desired program number", "" },
3707 { "b", OPT_FUNC2
| HAS_ARG
| OPT_VIDEO
, {(void*)opt_bitrate
}, "set bitrate (in bits/s)", "bitrate" },
3708 { "vb", OPT_FUNC2
| HAS_ARG
| OPT_VIDEO
, {(void*)opt_bitrate
}, "set bitrate (in bits/s)", "bitrate" },
3709 { "vframes", OPT_INT
| HAS_ARG
| OPT_VIDEO
, {(void*)&max_frames
[CODEC_TYPE_VIDEO
]}, "set the number of video frames to record", "number" },
3710 { "r", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_rate
}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3711 { "s", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_size
}, "set frame size (WxH or abbreviation)", "size" },
3712 { "aspect", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_aspect_ratio
}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3713 { "pix_fmt", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_frame_pix_fmt
}, "set pixel format, 'list' as argument shows all the pixel formats supported", "format" },
3714 { "croptop", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_crop_top
}, "set top crop band size (in pixels)", "size" },
3715 { "cropbottom", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_crop_bottom
}, "set bottom crop band size (in pixels)", "size" },
3716 { "cropleft", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_crop_left
}, "set left crop band size (in pixels)", "size" },
3717 { "cropright", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_crop_right
}, "set right crop band size (in pixels)", "size" },
3718 { "padtop", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_pad_top
}, "set top pad band size (in pixels)", "size" },
3719 { "padbottom", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_pad_bottom
}, "set bottom pad band size (in pixels)", "size" },
3720 { "padleft", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_pad_left
}, "set left pad band size (in pixels)", "size" },
3721 { "padright", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_pad_right
}, "set right pad band size (in pixels)", "size" },
3722 { "padcolor", HAS_ARG
| OPT_VIDEO
, {(void*)opt_pad_color
}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3723 { "intra", OPT_BOOL
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&intra_only
}, "use only intra frames"},
3724 { "vn", OPT_BOOL
| OPT_VIDEO
, {(void*)&video_disable
}, "disable video" },
3725 { "vdt", OPT_INT
| HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&video_discard
}, "discard threshold", "n" },
3726 { "qscale", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_qscale
}, "use fixed video quantizer scale (VBR)", "q" },
3727 { "qdiff", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_qdiff
}, "max difference between the quantizer scale (VBR)", "q" },
3728 { "rc_override", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_video_rc_override_string
}, "rate control override for specific intervals", "override" },
3729 { "vcodec", HAS_ARG
| OPT_VIDEO
, {(void*)opt_video_codec
}, "force video codec ('copy' to copy stream)", "codec" },
3730 { "me_threshold", HAS_ARG
| OPT_FUNC2
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_me_threshold
}, "motion estimaton threshold", "threshold" },
3731 { "strict", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_strict
}, "how strictly to follow the standards", "strictness" },
3732 { "sameq", OPT_BOOL
| OPT_VIDEO
, {(void*)&same_quality
},
3733 "use same video quality as source (implies VBR)" },
3734 { "pass", HAS_ARG
| OPT_VIDEO
, {(void*)&opt_pass
}, "select the pass number (1 or 2)", "n" },
3735 { "passlogfile", HAS_ARG
| OPT_STRING
| OPT_VIDEO
, {(void*)&pass_logfilename
}, "select two pass log file name", "file" },
3736 { "deinterlace", OPT_BOOL
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&do_deinterlace
},
3737 "deinterlace pictures" },
3738 { "psnr", OPT_BOOL
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&do_psnr
}, "calculate PSNR of compressed frames" },
3739 { "vstats", OPT_EXPERT
| OPT_VIDEO
, {(void*)&opt_vstats
}, "dump video coding statistics to file" },
3740 { "vstats_file", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_vstats_file
}, "dump video coding statistics to file", "file" },
3742 { "vhook", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)add_frame_hooker
}, "insert video processing module", "module" },
3744 { "intra_matrix", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_intra_matrix
}, "specify intra matrix coeffs", "matrix" },
3745 { "inter_matrix", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_inter_matrix
}, "specify inter matrix coeffs", "matrix" },
3746 { "top", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_top_field_first
}, "top=1/bottom=0/auto=-1 field first", "" },
3747 { "dc", OPT_INT
| HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&intra_dc_precision
}, "intra_dc_precision", "precision" },
3748 { "vtag", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_video_tag
}, "force video tag/fourcc", "fourcc/tag" },
3749 { "newvideo", OPT_VIDEO
, {(void*)opt_new_video_stream
}, "add a new video stream to the current output stream" },
3750 { "qphist", OPT_BOOL
| OPT_EXPERT
| OPT_VIDEO
, { (void *)&qp_hist
}, "show QP histogram" },
3753 { "ab", OPT_FUNC2
| HAS_ARG
| OPT_AUDIO
, {(void*)opt_bitrate
}, "set bitrate (in bits/s)", "bitrate" },
3754 { "aframes", OPT_INT
| HAS_ARG
| OPT_AUDIO
, {(void*)&max_frames
[CODEC_TYPE_AUDIO
]}, "set the number of audio frames to record", "number" },
3755 { "aq", OPT_FLOAT
| HAS_ARG
| OPT_AUDIO
, {(void*)&audio_qscale
}, "set audio quality (codec-specific)", "quality", },
3756 { "ar", HAS_ARG
| OPT_FUNC2
| OPT_AUDIO
, {(void*)opt_audio_rate
}, "set audio sampling rate (in Hz)", "rate" },
3757 { "ac", HAS_ARG
| OPT_FUNC2
| OPT_AUDIO
, {(void*)opt_audio_channels
}, "set number of audio channels", "channels" },
3758 { "an", OPT_BOOL
| OPT_AUDIO
, {(void*)&audio_disable
}, "disable audio" },
3759 { "acodec", HAS_ARG
| OPT_AUDIO
, {(void*)opt_audio_codec
}, "force audio codec ('copy' to copy stream)", "codec" },
3760 { "atag", HAS_ARG
| OPT_EXPERT
| OPT_AUDIO
, {(void*)opt_audio_tag
}, "force audio tag/fourcc", "fourcc/tag" },
3761 { "vol", OPT_INT
| HAS_ARG
| OPT_AUDIO
, {(void*)&audio_volume
}, "change audio volume (256=normal)" , "volume" }, //
3762 { "newaudio", OPT_AUDIO
, {(void*)opt_new_audio_stream
}, "add a new audio stream to the current output stream" },
3763 { "alang", HAS_ARG
| OPT_STRING
| OPT_AUDIO
, {(void *)&audio_language
}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3765 /* subtitle options */
3766 { "sn", OPT_BOOL
| OPT_SUBTITLE
, {(void*)&subtitle_disable
}, "disable subtitle" },
3767 { "scodec", HAS_ARG
| OPT_SUBTITLE
, {(void*)opt_subtitle_codec
}, "force subtitle codec ('copy' to copy stream)", "codec" },
3768 { "newsubtitle", OPT_SUBTITLE
, {(void*)opt_new_subtitle_stream
}, "add a new subtitle stream to the current output stream" },
3769 { "slang", HAS_ARG
| OPT_STRING
| OPT_SUBTITLE
, {(void *)&subtitle_language
}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3772 { "vc", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
| OPT_GRAB
, {(void*)opt_video_channel
}, "set video grab channel (DV1394 only)", "channel" },
3773 { "tvstd", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
| OPT_GRAB
, {(void*)opt_video_standard
}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3774 { "isync", OPT_BOOL
| OPT_EXPERT
| OPT_GRAB
, {(void*)&input_sync
}, "sync read on input", "" },
3777 { "muxdelay", OPT_FLOAT
| HAS_ARG
| OPT_EXPERT
, {(void*)&mux_max_delay
}, "set the maximum demux-decode delay", "seconds" },
3778 { "muxpreload", OPT_FLOAT
| HAS_ARG
| OPT_EXPERT
, {(void*)&mux_preload
}, "set the initial demux-decode delay", "seconds" },
3780 { "absf", OPT_FUNC2
| HAS_ARG
| OPT_AUDIO
| OPT_EXPERT
, {(void*)opt_bsf
}, "", "bitstream_filter" },
3781 { "vbsf", OPT_FUNC2
| HAS_ARG
| OPT_VIDEO
| OPT_EXPERT
, {(void*)opt_bsf
}, "", "bitstream_filter" },
3782 { "sbsf", OPT_FUNC2
| HAS_ARG
| OPT_SUBTITLE
| OPT_EXPERT
, {(void*)opt_bsf
}, "", "bitstream_filter" },
3784 { "apre", OPT_FUNC2
| HAS_ARG
| OPT_AUDIO
| OPT_EXPERT
, {(void*)opt_preset
}, "", "preset" },
3785 { "vpre", OPT_FUNC2
| HAS_ARG
| OPT_VIDEO
| OPT_EXPERT
, {(void*)opt_preset
}, "", "preset" },
3786 { "spre", OPT_FUNC2
| HAS_ARG
| OPT_SUBTITLE
| OPT_EXPERT
, {(void*)opt_preset
}, "", "preset" },
3788 { "default", OPT_FUNC2
| HAS_ARG
| OPT_AUDIO
| OPT_VIDEO
| OPT_EXPERT
, {(void*)opt_default
}, "generic catch all option", "" },
3792 int main(int argc
, char **argv
)
3797 avcodec_register_all();
3798 avdevice_register_all();
3801 for(i
=0; i
<CODEC_TYPE_NB
; i
++){
3802 avctx_opts
[i
]= avcodec_alloc_context2(i
);
3804 avformat_opts
= av_alloc_format_context();
3805 sws_opts
= sws_getContext(16,16,0, 16,16,0, sws_flags
, NULL
,NULL
,NULL
);
3814 parse_options(argc
, argv
, options
, opt_output_file
);
3816 /* file converter / grab */
3817 if (nb_output_files
<= 0) {
3818 fprintf(stderr
, "Must supply at least one output file\n");
3822 if (nb_input_files
== 0) {
3823 fprintf(stderr
, "Must supply at least one input file\n");
3828 av_encode(output_files
, nb_output_files
, input_files
, nb_input_files
,
3829 stream_maps
, nb_stream_maps
);
3830 ti
= getutime() - ti
;
3832 printf("bench: utime=%0.3fs\n", ti
/ 1000000.0);