3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 /* needed for usleep() */
23 #define _XOPEN_SOURCE 600
34 #include "libavformat/avformat.h"
35 #include "libavdevice/avdevice.h"
36 #include "libswscale/swscale.h"
37 #include "libavcodec/opt.h"
38 #include "libavcodec/audioconvert.h"
39 #include "libavcodec/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/avstring.h"
42 #include "libavformat/os_support.h"
44 #if HAVE_SYS_RESOURCE_H
45 #include <sys/types.h>
46 #include <sys/resource.h>
47 #elif HAVE_GETPROCESSTIMES
52 #include <sys/select.h>
57 #include <sys/ioctl.h>
63 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
73 const char program_name
[] = "FFmpeg";
74 const int program_birth_year
= 2000;
76 /* select an input stream for an output stream */
77 typedef struct AVStreamMap
{
81 int sync_stream_index
;
84 /** select an input file for an output file */
85 typedef struct AVMetaDataMap
{
90 static const OptionDef options
[];
94 static AVFormatContext
*input_files
[MAX_FILES
];
95 static int64_t input_files_ts_offset
[MAX_FILES
];
96 static double input_files_ts_scale
[MAX_FILES
][MAX_STREAMS
];
97 static AVCodec
*input_codecs
[MAX_FILES
*MAX_STREAMS
];
98 static int nb_input_files
= 0;
99 static int nb_icodecs
;
101 static AVFormatContext
*output_files
[MAX_FILES
];
102 static AVCodec
*output_codecs
[MAX_FILES
*MAX_STREAMS
];
103 static int nb_output_files
= 0;
104 static int nb_ocodecs
;
106 static AVStreamMap stream_maps
[MAX_FILES
*MAX_STREAMS
];
107 static int nb_stream_maps
;
109 static AVMetaDataMap meta_data_maps
[MAX_FILES
];
110 static int nb_meta_data_maps
;
112 static AVInputFormat
*file_iformat
;
113 static AVOutputFormat
*file_oformat
;
114 static int frame_width
= 0;
115 static int frame_height
= 0;
116 static float frame_aspect_ratio
= 0;
117 static enum PixelFormat frame_pix_fmt
= PIX_FMT_NONE
;
118 static enum SampleFormat audio_sample_fmt
= SAMPLE_FMT_NONE
;
119 static int frame_padtop
= 0;
120 static int frame_padbottom
= 0;
121 static int frame_padleft
= 0;
122 static int frame_padright
= 0;
123 static int padcolor
[3] = {16,128,128}; /* default to black */
124 static int frame_topBand
= 0;
125 static int frame_bottomBand
= 0;
126 static int frame_leftBand
= 0;
127 static int frame_rightBand
= 0;
128 static int max_frames
[4] = {INT_MAX
, INT_MAX
, INT_MAX
, INT_MAX
};
129 static AVRational frame_rate
;
130 static float video_qscale
= 0;
131 static uint16_t *intra_matrix
= NULL
;
132 static uint16_t *inter_matrix
= NULL
;
133 #if 0 //experimental, (can be removed)
134 static float video_rc_qsquish
=1.0;
135 static float video_rc_qmod_amp
=0;
136 static int video_rc_qmod_freq
=0;
138 static const char *video_rc_override_string
=NULL
;
139 static int video_disable
= 0;
140 static int video_discard
= 0;
141 static char *video_codec_name
= NULL
;
142 static int video_codec_tag
= 0;
143 static int same_quality
= 0;
144 static int do_deinterlace
= 0;
145 static int top_field_first
= -1;
146 static int me_threshold
= 0;
147 static int intra_dc_precision
= 8;
148 static int loop_input
= 0;
149 static int loop_output
= AVFMT_NOOUTPUTLOOP
;
150 static int qp_hist
= 0;
152 static int intra_only
= 0;
153 static int audio_sample_rate
= 44100;
154 static int64_t channel_layout
= 0;
155 #define QSCALE_NONE -99999
156 static float audio_qscale
= QSCALE_NONE
;
157 static int audio_disable
= 0;
158 static int audio_channels
= 1;
159 static char *audio_codec_name
= NULL
;
160 static int audio_codec_tag
= 0;
161 static char *audio_language
= NULL
;
163 static int subtitle_disable
= 0;
164 static char *subtitle_codec_name
= NULL
;
165 static char *subtitle_language
= NULL
;
166 static int subtitle_codec_tag
= 0;
168 static float mux_preload
= 0.5;
169 static float mux_max_delay
= 0.7;
171 static int64_t recording_time
= INT64_MAX
;
172 static int64_t start_time
= 0;
173 static int64_t rec_timestamp
= 0;
174 static int64_t input_ts_offset
= 0;
175 static int file_overwrite
= 0;
176 static int metadata_count
;
177 static AVMetadataTag
*metadata
;
178 static int do_benchmark
= 0;
179 static int do_hex_dump
= 0;
180 static int do_pkt_dump
= 0;
181 static int do_psnr
= 0;
182 static int do_pass
= 0;
183 static char *pass_logfilename_prefix
= NULL
;
184 static int audio_stream_copy
= 0;
185 static int video_stream_copy
= 0;
186 static int subtitle_stream_copy
= 0;
187 static int video_sync_method
= -1;
188 static int audio_sync_method
= 0;
189 static float audio_drift_threshold
= 0.1;
190 static int copy_ts
= 0;
191 static int opt_shortest
= 0;
192 static int video_global_header
= 0;
193 static char *vstats_filename
;
194 static FILE *vstats_file
;
195 static int opt_programid
= 0;
196 static int copy_initial_nonkeyframes
= 0;
198 static int rate_emu
= 0;
200 static int video_channel
= 0;
201 static char *video_standard
;
203 static int audio_volume
= 256;
205 static int exit_on_error
= 0;
206 static int using_stdin
= 0;
207 static int verbose
= 1;
208 static int thread_count
= 1;
209 static int q_pressed
= 0;
210 static int64_t video_size
= 0;
211 static int64_t audio_size
= 0;
212 static int64_t extra_size
= 0;
213 static int nb_frames_dup
= 0;
214 static int nb_frames_drop
= 0;
215 static int input_sync
;
216 static uint64_t limit_filesize
= 0;
217 static int force_fps
= 0;
219 static int pgmyuv_compatibility_hack
=0;
220 static float dts_delta_threshold
= 10;
222 static unsigned int sws_flags
= SWS_BICUBIC
;
224 static int64_t timer_start
;
226 static uint8_t *audio_buf
;
227 static uint8_t *audio_out
;
228 static uint8_t *audio_out2
;
230 static short *samples
;
232 static AVBitStreamFilterContext
*video_bitstream_filters
=NULL
;
233 static AVBitStreamFilterContext
*audio_bitstream_filters
=NULL
;
234 static AVBitStreamFilterContext
*subtitle_bitstream_filters
=NULL
;
235 static AVBitStreamFilterContext
*bitstream_filters
[MAX_FILES
][MAX_STREAMS
];
237 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
239 struct AVInputStream
;
241 typedef struct AVOutputStream
{
242 int file_index
; /* file index */
243 int index
; /* stream index in the output file */
244 int source_index
; /* AVInputStream index */
245 AVStream
*st
; /* stream in the output file */
246 int encoding_needed
; /* true if encoding needed for this stream */
248 /* input pts and corresponding output pts
250 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
251 struct AVInputStream
*sync_ist
; /* input stream to sync against */
252 int64_t sync_opts
; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
255 AVFrame pict_tmp
; /* temporary image for resampling */
256 struct SwsContext
*img_resample_ctx
; /* for image resampling */
259 int resample_pix_fmt
;
261 /* full frame size of first frame */
265 /* cropping area sizes */
272 /* cropping area of first frame */
273 int original_topBand
;
274 int original_bottomBand
;
275 int original_leftBand
;
276 int original_rightBand
;
278 /* padding area sizes */
287 ReSampleContext
*resample
; /* for audio resampling */
289 AVAudioConvert
*reformat_ctx
;
290 AVFifoBuffer
*fifo
; /* for compression: one audio fifo per codec */
294 typedef struct AVInputStream
{
298 int discard
; /* true if stream data should be discarded */
299 int decoding_needed
; /* true if the packets must be decoded in 'raw_fifo' */
300 int64_t sample_index
; /* current sample */
302 int64_t start
; /* time when read started */
303 int64_t next_pts
; /* synthetic pts for cases where pkt.pts
305 int64_t pts
; /* current pts */
306 int is_start
; /* is 1 at the start and after a discontinuity */
309 typedef struct AVInputFile
{
310 int eof_reached
; /* true if eof reached */
311 int ist_index
; /* index of first stream in ist_table */
312 int buffer_size
; /* current total buffer size */
313 int nb_streams
; /* nb streams we are aware of */
318 /* init terminal so that we can grab keys */
319 static struct termios oldtty
;
322 static void term_exit(void)
325 tcsetattr (0, TCSANOW
, &oldtty
);
329 static volatile int received_sigterm
= 0;
332 sigterm_handler(int sig
)
334 received_sigterm
= sig
;
338 static void term_init(void)
346 tty
.c_iflag
&= ~(IGNBRK
|BRKINT
|PARMRK
|ISTRIP
347 |INLCR
|IGNCR
|ICRNL
|IXON
);
348 tty
.c_oflag
|= OPOST
;
349 tty
.c_lflag
&= ~(ECHO
|ECHONL
|ICANON
|IEXTEN
);
350 tty
.c_cflag
&= ~(CSIZE
|PARENB
);
355 tcsetattr (0, TCSANOW
, &tty
);
356 signal(SIGQUIT
, sigterm_handler
); /* Quit (POSIX). */
359 signal(SIGINT
, sigterm_handler
); /* Interrupt (ANSI). */
360 signal(SIGTERM
, sigterm_handler
); /* Termination (ANSI). */
362 register a function to be called at normal program termination
365 #if CONFIG_BEOS_NETSERVER
366 fcntl(0, F_SETFL
, fcntl(0, F_GETFL
) | O_NONBLOCK
);
370 /* read a key without blocking */
371 static int read_key(void)
376 #if !CONFIG_BEOS_NETSERVER
384 n
= select(1, &rfds
, NULL
, NULL
, &tv
);
400 static int decode_interrupt_cb(void)
402 return q_pressed
|| (q_pressed
= read_key() == 'q');
405 static int av_exit(int ret
)
410 for(i
=0;i
<nb_output_files
;i
++) {
411 /* maybe av_close_output_file ??? */
412 AVFormatContext
*s
= output_files
[i
];
414 if (!(s
->oformat
->flags
& AVFMT_NOFILE
) && s
->pb
)
416 for(j
=0;j
<s
->nb_streams
;j
++) {
417 av_metadata_free(&s
->streams
[j
]->metadata
);
418 av_free(s
->streams
[j
]->codec
);
419 av_free(s
->streams
[j
]);
421 for(j
=0;j
<s
->nb_programs
;j
++) {
422 av_metadata_free(&s
->programs
[j
]->metadata
);
424 for(j
=0;j
<s
->nb_chapters
;j
++) {
425 av_metadata_free(&s
->chapters
[j
]->metadata
);
427 av_metadata_free(&s
->metadata
);
430 for(i
=0;i
<nb_input_files
;i
++)
431 av_close_input_file(input_files
[i
]);
433 av_free(intra_matrix
);
434 av_free(inter_matrix
);
438 av_free(vstats_filename
);
442 av_free(video_codec_name
);
443 av_free(audio_codec_name
);
444 av_free(subtitle_codec_name
);
446 av_free(video_standard
);
448 #if CONFIG_POWERPC_PERF
449 void powerpc_display_perf_report(void);
450 powerpc_display_perf_report();
451 #endif /* CONFIG_POWERPC_PERF */
453 for (i
=0;i
<CODEC_TYPE_NB
;i
++)
454 av_free(avcodec_opts
[i
]);
455 av_free(avformat_opts
);
462 if (received_sigterm
) {
464 "Received signal %d: terminating.\n",
465 (int) received_sigterm
);
469 exit(ret
); /* not all OS-es handle main() return value */
473 static int read_ffserver_streams(AVFormatContext
*s
, const char *filename
)
479 err
= av_open_input_file(&ic
, filename
, NULL
, FFM_PACKET_SIZE
, NULL
);
482 /* copy stream format */
483 s
->nb_streams
= ic
->nb_streams
;
484 for(i
=0;i
<ic
->nb_streams
;i
++) {
487 // FIXME: a more elegant solution is needed
488 st
= av_mallocz(sizeof(AVStream
));
489 memcpy(st
, ic
->streams
[i
], sizeof(AVStream
));
490 st
->codec
= avcodec_alloc_context();
491 memcpy(st
->codec
, ic
->streams
[i
]->codec
, sizeof(AVCodecContext
));
494 if (st
->codec
->codec_type
== CODEC_TYPE_AUDIO
&& audio_stream_copy
)
496 else if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
&& video_stream_copy
)
499 if(!st
->codec
->thread_count
)
500 st
->codec
->thread_count
= 1;
501 if(st
->codec
->thread_count
>1)
502 avcodec_thread_init(st
->codec
, st
->codec
->thread_count
);
504 if(st
->codec
->flags
& CODEC_FLAG_BITEXACT
)
509 s
->timestamp
= av_gettime();
511 av_close_input_file(ic
);
516 get_sync_ipts(const AVOutputStream
*ost
)
518 const AVInputStream
*ist
= ost
->sync_ist
;
519 return (double)(ist
->pts
- start_time
)/AV_TIME_BASE
;
522 static void write_frame(AVFormatContext
*s
, AVPacket
*pkt
, AVCodecContext
*avctx
, AVBitStreamFilterContext
*bsfc
){
526 AVPacket new_pkt
= *pkt
;
527 int a
= av_bitstream_filter_filter(bsfc
, avctx
, NULL
,
528 &new_pkt
.data
, &new_pkt
.size
,
529 pkt
->data
, pkt
->size
,
530 pkt
->flags
& PKT_FLAG_KEY
);
533 new_pkt
.destruct
= av_destruct_packet
;
535 fprintf(stderr
, "%s failed for stream %d, codec %s",
536 bsfc
->filter
->name
, pkt
->stream_index
,
537 avctx
->codec
? avctx
->codec
->name
: "copy");
547 ret
= av_interleaved_write_frame(s
, pkt
);
549 print_error("av_interleaved_write_frame()", ret
);
554 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
556 static void do_audio_out(AVFormatContext
*s
,
559 unsigned char *buf
, int size
)
562 const int audio_out_size
= 4*MAX_AUDIO_PACKET_SIZE
;
564 int size_out
, frame_bytes
, ret
;
565 AVCodecContext
*enc
= ost
->st
->codec
;
566 AVCodecContext
*dec
= ist
->st
->codec
;
567 int osize
= av_get_bits_per_sample_format(enc
->sample_fmt
)/8;
568 int isize
= av_get_bits_per_sample_format(dec
->sample_fmt
)/8;
570 /* SC: dynamic allocation of buffers */
572 audio_buf
= av_malloc(2*MAX_AUDIO_PACKET_SIZE
);
574 audio_out
= av_malloc(audio_out_size
);
575 if (!audio_buf
|| !audio_out
)
576 return; /* Should signal an error ! */
578 if (enc
->channels
!= dec
->channels
)
579 ost
->audio_resample
= 1;
581 if (ost
->audio_resample
&& !ost
->resample
) {
582 if (dec
->sample_fmt
!= SAMPLE_FMT_S16
)
583 fprintf(stderr
, "Warning, using s16 intermediate sample format for resampling\n");
584 ost
->resample
= av_audio_resample_init(enc
->channels
, dec
->channels
,
585 enc
->sample_rate
, dec
->sample_rate
,
586 enc
->sample_fmt
, dec
->sample_fmt
,
588 if (!ost
->resample
) {
589 fprintf(stderr
, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
590 dec
->channels
, dec
->sample_rate
,
591 enc
->channels
, enc
->sample_rate
);
596 #define MAKE_SFMT_PAIR(a,b) ((a)+SAMPLE_FMT_NB*(b))
597 if (!ost
->audio_resample
&& dec
->sample_fmt
!=enc
->sample_fmt
&&
598 MAKE_SFMT_PAIR(enc
->sample_fmt
,dec
->sample_fmt
)!=ost
->reformat_pair
) {
600 audio_out2
= av_malloc(audio_out_size
);
603 if (ost
->reformat_ctx
)
604 av_audio_convert_free(ost
->reformat_ctx
);
605 ost
->reformat_ctx
= av_audio_convert_alloc(enc
->sample_fmt
, 1,
606 dec
->sample_fmt
, 1, NULL
, 0);
607 if (!ost
->reformat_ctx
) {
608 fprintf(stderr
, "Cannot convert %s sample format to %s sample format\n",
609 avcodec_get_sample_fmt_name(dec
->sample_fmt
),
610 avcodec_get_sample_fmt_name(enc
->sample_fmt
));
613 ost
->reformat_pair
=MAKE_SFMT_PAIR(enc
->sample_fmt
,dec
->sample_fmt
);
616 if(audio_sync_method
){
617 double delta
= get_sync_ipts(ost
) * enc
->sample_rate
- ost
->sync_opts
618 - av_fifo_size(ost
->fifo
)/(ost
->st
->codec
->channels
* 2);
619 double idelta
= delta
*ist
->st
->codec
->sample_rate
/ enc
->sample_rate
;
620 int byte_delta
= ((int)idelta
)*2*ist
->st
->codec
->channels
;
622 //FIXME resample delay
623 if(fabs(delta
) > 50){
624 if(ist
->is_start
|| fabs(delta
) > audio_drift_threshold
*enc
->sample_rate
){
626 byte_delta
= FFMAX(byte_delta
, -size
);
630 fprintf(stderr
, "discarding %d audio samples\n", (int)-delta
);
635 static uint8_t *input_tmp
= NULL
;
636 input_tmp
= av_realloc(input_tmp
, byte_delta
+ size
);
638 if(byte_delta
+ size
<= MAX_AUDIO_PACKET_SIZE
)
641 byte_delta
= MAX_AUDIO_PACKET_SIZE
- size
;
643 memset(input_tmp
, 0, byte_delta
);
644 memcpy(input_tmp
+ byte_delta
, buf
, size
);
648 fprintf(stderr
, "adding %d audio samples of silence\n", (int)delta
);
650 }else if(audio_sync_method
>1){
651 int comp
= av_clip(delta
, -audio_sync_method
, audio_sync_method
);
652 assert(ost
->audio_resample
);
654 fprintf(stderr
, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta
, comp
, enc
->sample_rate
);
655 // fprintf(stderr, "drift:%f len:%d opts:%"PRId64" ipts:%"PRId64" fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(get_sync_ipts(ost) * enc->sample_rate), av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2));
656 av_resample_compensate(*(struct AVResampleContext
**)ost
->resample
, comp
, enc
->sample_rate
);
660 ost
->sync_opts
= lrintf(get_sync_ipts(ost
) * enc
->sample_rate
)
661 - av_fifo_size(ost
->fifo
)/(ost
->st
->codec
->channels
* 2); //FIXME wrong
663 if (ost
->audio_resample
) {
665 size_out
= audio_resample(ost
->resample
,
666 (short *)buftmp
, (short *)buf
,
667 size
/ (ist
->st
->codec
->channels
* isize
));
668 size_out
= size_out
* enc
->channels
* osize
;
674 if (!ost
->audio_resample
&& dec
->sample_fmt
!=enc
->sample_fmt
) {
675 const void *ibuf
[6]= {buftmp
};
676 void *obuf
[6]= {audio_out2
};
677 int istride
[6]= {isize
};
678 int ostride
[6]= {osize
};
679 int len
= size_out
/istride
[0];
680 if (av_audio_convert(ost
->reformat_ctx
, obuf
, ostride
, ibuf
, istride
, len
)<0) {
681 printf("av_audio_convert() failed\n");
687 size_out
= len
*osize
;
690 /* now encode as many frames as possible */
691 if (enc
->frame_size
> 1) {
692 /* output resampled raw samples */
693 if (av_fifo_realloc2(ost
->fifo
, av_fifo_size(ost
->fifo
) + size_out
) < 0) {
694 fprintf(stderr
, "av_fifo_realloc2() failed\n");
697 av_fifo_generic_write(ost
->fifo
, buftmp
, size_out
, NULL
);
699 frame_bytes
= enc
->frame_size
* osize
* enc
->channels
;
701 while (av_fifo_size(ost
->fifo
) >= frame_bytes
) {
703 av_init_packet(&pkt
);
705 av_fifo_generic_read(ost
->fifo
, audio_buf
, frame_bytes
, NULL
);
707 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
709 ret
= avcodec_encode_audio(enc
, audio_out
, audio_out_size
,
712 fprintf(stderr
, "Audio encoding failed\n");
716 pkt
.stream_index
= ost
->index
;
719 if(enc
->coded_frame
&& enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
720 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
721 pkt
.flags
|= PKT_FLAG_KEY
;
722 write_frame(s
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
724 ost
->sync_opts
+= enc
->frame_size
;
728 int coded_bps
= av_get_bits_per_sample(enc
->codec
->id
)/8;
729 av_init_packet(&pkt
);
731 ost
->sync_opts
+= size_out
/ (osize
* enc
->channels
);
733 /* output a pcm frame */
734 /* determine the size of the coded buffer */
737 size_out
*= coded_bps
;
739 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
740 ret
= avcodec_encode_audio(enc
, audio_out
, size_out
,
743 fprintf(stderr
, "Audio encoding failed\n");
747 pkt
.stream_index
= ost
->index
;
750 if(enc
->coded_frame
&& enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
751 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
752 pkt
.flags
|= PKT_FLAG_KEY
;
753 write_frame(s
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
757 static void pre_process_video_frame(AVInputStream
*ist
, AVPicture
*picture
, void **bufp
)
761 AVPicture picture_tmp
;
764 dec
= ist
->st
->codec
;
766 /* deinterlace : must be done before any resize */
767 if (do_deinterlace
) {
770 /* create temporary picture */
771 size
= avpicture_get_size(dec
->pix_fmt
, dec
->width
, dec
->height
);
772 buf
= av_malloc(size
);
776 picture2
= &picture_tmp
;
777 avpicture_fill(picture2
, buf
, dec
->pix_fmt
, dec
->width
, dec
->height
);
779 if(avpicture_deinterlace(picture2
, picture
,
780 dec
->pix_fmt
, dec
->width
, dec
->height
) < 0) {
781 /* if error, do not deinterlace */
782 fprintf(stderr
, "Deinterlacing failed\n");
791 if (picture
!= picture2
)
792 *picture
= *picture2
;
796 /* we begin to correct av delay at this threshold */
797 #define AV_DELAY_MAX 0.100
799 static void do_subtitle_out(AVFormatContext
*s
,
805 static uint8_t *subtitle_out
= NULL
;
806 int subtitle_out_max_size
= 65536;
807 int subtitle_out_size
, nb
, i
;
811 if (pts
== AV_NOPTS_VALUE
) {
812 fprintf(stderr
, "Subtitle packets must have a pts\n");
818 enc
= ost
->st
->codec
;
821 subtitle_out
= av_malloc(subtitle_out_max_size
);
824 /* Note: DVB subtitle need one packet to draw them and one other
825 packet to clear them */
826 /* XXX: signal it in the codec context ? */
827 if (enc
->codec_id
== CODEC_ID_DVB_SUBTITLE
)
832 for(i
= 0; i
< nb
; i
++) {
833 sub
->pts
= av_rescale_q(pts
, ist
->st
->time_base
, AV_TIME_BASE_Q
);
834 subtitle_out_size
= avcodec_encode_subtitle(enc
, subtitle_out
,
835 subtitle_out_max_size
, sub
);
837 av_init_packet(&pkt
);
838 pkt
.stream_index
= ost
->index
;
839 pkt
.data
= subtitle_out
;
840 pkt
.size
= subtitle_out_size
;
841 pkt
.pts
= av_rescale_q(pts
, ist
->st
->time_base
, ost
->st
->time_base
);
842 if (enc
->codec_id
== CODEC_ID_DVB_SUBTITLE
) {
843 /* XXX: the pts correction is handled here. Maybe handling
844 it in the codec would be better */
846 pkt
.pts
+= 90 * sub
->start_display_time
;
848 pkt
.pts
+= 90 * sub
->end_display_time
;
850 write_frame(s
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
854 static int bit_buffer_size
= 1024*256;
855 static uint8_t *bit_buffer
= NULL
;
857 static void do_video_out(AVFormatContext
*s
,
863 int nb_frames
, i
, ret
;
864 int64_t topBand
, bottomBand
, leftBand
, rightBand
;
865 AVFrame
*final_picture
, *formatted_picture
, *resampling_dst
, *padding_src
;
866 AVFrame picture_crop_temp
, picture_pad_temp
;
867 AVCodecContext
*enc
, *dec
;
869 avcodec_get_frame_defaults(&picture_crop_temp
);
870 avcodec_get_frame_defaults(&picture_pad_temp
);
872 enc
= ost
->st
->codec
;
873 dec
= ist
->st
->codec
;
875 /* by default, we output a single frame */
880 if(video_sync_method
>0 || (video_sync_method
&& av_q2d(enc
->time_base
) > 0.001)){
882 vdelta
= get_sync_ipts(ost
) / av_q2d(enc
->time_base
) - ost
->sync_opts
;
883 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
886 else if (video_sync_method
== 2 || (video_sync_method
<0 && (s
->oformat
->flags
& AVFMT_VARIABLE_FPS
))){
890 ost
->sync_opts
= lrintf(get_sync_ipts(ost
) / av_q2d(enc
->time_base
));
891 }else if (vdelta
> 1.1)
892 nb_frames
= lrintf(vdelta
);
893 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, get_sync_ipts(ost), nb_frames);
897 fprintf(stderr
, "*** drop!\n");
898 }else if (nb_frames
> 1) {
899 nb_frames_dup
+= nb_frames
;
901 fprintf(stderr
, "*** %d dup!\n", nb_frames
-1);
904 ost
->sync_opts
= lrintf(get_sync_ipts(ost
) / av_q2d(enc
->time_base
));
906 nb_frames
= FFMIN(nb_frames
, max_frames
[CODEC_TYPE_VIDEO
] - ost
->frame_number
);
910 if (ost
->video_crop
) {
911 if (av_picture_crop((AVPicture
*)&picture_crop_temp
, (AVPicture
*)in_picture
, dec
->pix_fmt
, ost
->topBand
, ost
->leftBand
) < 0) {
912 fprintf(stderr
, "error cropping picture\n");
917 formatted_picture
= &picture_crop_temp
;
919 formatted_picture
= in_picture
;
922 final_picture
= formatted_picture
;
923 padding_src
= formatted_picture
;
924 resampling_dst
= &ost
->pict_tmp
;
925 if (ost
->video_pad
) {
926 final_picture
= &ost
->pict_tmp
;
927 if (ost
->video_resample
) {
928 if (av_picture_crop((AVPicture
*)&picture_pad_temp
, (AVPicture
*)final_picture
, enc
->pix_fmt
, ost
->padtop
, ost
->padleft
) < 0) {
929 fprintf(stderr
, "error padding picture\n");
934 resampling_dst
= &picture_pad_temp
;
938 if (ost
->video_resample
) {
940 final_picture
= &ost
->pict_tmp
;
941 if( (ost
->resample_height
!= (ist
->st
->codec
->height
- (ost
->topBand
+ ost
->bottomBand
)))
942 || (ost
->resample_width
!= (ist
->st
->codec
->width
- (ost
->leftBand
+ ost
->rightBand
)))
943 || (ost
->resample_pix_fmt
!= ist
->st
->codec
->pix_fmt
) ) {
945 fprintf(stderr
,"Input Stream #%d.%d frame size changed to %dx%d, %s\n", ist
->file_index
, ist
->index
, ist
->st
->codec
->width
, ist
->st
->codec
->height
,avcodec_get_pix_fmt_name(ist
->st
->codec
->pix_fmt
));
946 /* keep bands proportional to the frame size */
947 topBand
= ((int64_t)ist
->st
->codec
->height
* ost
->original_topBand
/ ost
->original_height
) & ~1;
948 bottomBand
= ((int64_t)ist
->st
->codec
->height
* ost
->original_bottomBand
/ ost
->original_height
) & ~1;
949 leftBand
= ((int64_t)ist
->st
->codec
->width
* ost
->original_leftBand
/ ost
->original_width
) & ~1;
950 rightBand
= ((int64_t)ist
->st
->codec
->width
* ost
->original_rightBand
/ ost
->original_width
) & ~1;
952 /* sanity check to ensure no bad band sizes sneak in */
953 assert(topBand
<= INT_MAX
&& topBand
>= 0);
954 assert(bottomBand
<= INT_MAX
&& bottomBand
>= 0);
955 assert(leftBand
<= INT_MAX
&& leftBand
>= 0);
956 assert(rightBand
<= INT_MAX
&& rightBand
>= 0);
958 ost
->topBand
= topBand
;
959 ost
->bottomBand
= bottomBand
;
960 ost
->leftBand
= leftBand
;
961 ost
->rightBand
= rightBand
;
963 ost
->resample_height
= ist
->st
->codec
->height
- (ost
->topBand
+ ost
->bottomBand
);
964 ost
->resample_width
= ist
->st
->codec
->width
- (ost
->leftBand
+ ost
->rightBand
);
965 ost
->resample_pix_fmt
= ist
->st
->codec
->pix_fmt
;
967 /* initialize a new scaler context */
968 sws_freeContext(ost
->img_resample_ctx
);
969 sws_flags
= av_get_int(sws_opts
, "sws_flags", NULL
);
970 ost
->img_resample_ctx
= sws_getContext(
971 ist
->st
->codec
->width
- (ost
->leftBand
+ ost
->rightBand
),
972 ist
->st
->codec
->height
- (ost
->topBand
+ ost
->bottomBand
),
973 ist
->st
->codec
->pix_fmt
,
974 ost
->st
->codec
->width
- (ost
->padleft
+ ost
->padright
),
975 ost
->st
->codec
->height
- (ost
->padtop
+ ost
->padbottom
),
976 ost
->st
->codec
->pix_fmt
,
977 sws_flags
, NULL
, NULL
, NULL
);
978 if (ost
->img_resample_ctx
== NULL
) {
979 fprintf(stderr
, "Cannot get resampling context\n");
983 sws_scale(ost
->img_resample_ctx
, formatted_picture
->data
, formatted_picture
->linesize
,
984 0, ost
->resample_height
, resampling_dst
->data
, resampling_dst
->linesize
);
987 if (ost
->video_pad
) {
988 av_picture_pad((AVPicture
*)final_picture
, (AVPicture
*)padding_src
,
989 enc
->height
, enc
->width
, enc
->pix_fmt
,
990 ost
->padtop
, ost
->padbottom
, ost
->padleft
, ost
->padright
, padcolor
);
993 /* duplicates frame if needed */
994 for(i
=0;i
<nb_frames
;i
++) {
996 av_init_packet(&pkt
);
997 pkt
.stream_index
= ost
->index
;
999 if (s
->oformat
->flags
& AVFMT_RAWPICTURE
) {
1000 /* raw pictures are written as AVPicture structure to
1001 avoid any copies. We support temorarily the older
1003 AVFrame
* old_frame
= enc
->coded_frame
;
1004 enc
->coded_frame
= dec
->coded_frame
; //FIXME/XXX remove this hack
1005 pkt
.data
= (uint8_t *)final_picture
;
1006 pkt
.size
= sizeof(AVPicture
);
1007 pkt
.pts
= av_rescale_q(ost
->sync_opts
, enc
->time_base
, ost
->st
->time_base
);
1008 pkt
.flags
|= PKT_FLAG_KEY
;
1010 write_frame(s
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
1011 enc
->coded_frame
= old_frame
;
1013 AVFrame big_picture
;
1015 big_picture
= *final_picture
;
1016 /* better than nothing: use input picture interlaced
1018 big_picture
.interlaced_frame
= in_picture
->interlaced_frame
;
1019 if(avcodec_opts
[CODEC_TYPE_VIDEO
]->flags
& (CODEC_FLAG_INTERLACED_DCT
|CODEC_FLAG_INTERLACED_ME
)){
1020 if(top_field_first
== -1)
1021 big_picture
.top_field_first
= in_picture
->top_field_first
;
1023 big_picture
.top_field_first
= top_field_first
;
1026 /* handles sameq here. This is not correct because it may
1027 not be a global option */
1029 big_picture
.quality
= ist
->st
->quality
;
1031 big_picture
.quality
= ost
->st
->quality
;
1033 big_picture
.pict_type
= 0;
1034 // big_picture.pts = AV_NOPTS_VALUE;
1035 big_picture
.pts
= ost
->sync_opts
;
1036 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1037 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1038 ret
= avcodec_encode_video(enc
,
1039 bit_buffer
, bit_buffer_size
,
1042 fprintf(stderr
, "Video encoding failed\n");
1047 pkt
.data
= bit_buffer
;
1049 if(enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
1050 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
1051 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1052 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1053 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1055 if(enc
->coded_frame
->key_frame
)
1056 pkt
.flags
|= PKT_FLAG_KEY
;
1057 write_frame(s
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
1060 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1061 // enc->frame_number-1, ret, enc->pict_type);
1062 /* if two pass, output log */
1063 if (ost
->logfile
&& enc
->stats_out
) {
1064 fprintf(ost
->logfile
, "%s", enc
->stats_out
);
1069 ost
->frame_number
++;
1073 static double psnr(double d
){
1074 return -10.0*log(d
)/log(10.0);
1077 static void do_video_stats(AVFormatContext
*os
, AVOutputStream
*ost
,
1080 AVCodecContext
*enc
;
1082 double ti1
, bitrate
, avg_bitrate
;
1084 /* this is executed just the first time do_video_stats is called */
1086 vstats_file
= fopen(vstats_filename
, "w");
1093 enc
= ost
->st
->codec
;
1094 if (enc
->codec_type
== CODEC_TYPE_VIDEO
) {
1095 frame_number
= ost
->frame_number
;
1096 fprintf(vstats_file
, "frame= %5d q= %2.1f ", frame_number
, enc
->coded_frame
->quality
/(float)FF_QP2LAMBDA
);
1097 if (enc
->flags
&CODEC_FLAG_PSNR
)
1098 fprintf(vstats_file
, "PSNR= %6.2f ", psnr(enc
->coded_frame
->error
[0]/(enc
->width
*enc
->height
*255.0*255.0)));
1100 fprintf(vstats_file
,"f_size= %6d ", frame_size
);
1101 /* compute pts value */
1102 ti1
= ost
->sync_opts
* av_q2d(enc
->time_base
);
1106 bitrate
= (frame_size
* 8) / av_q2d(enc
->time_base
) / 1000.0;
1107 avg_bitrate
= (double)(video_size
* 8) / ti1
/ 1000.0;
1108 fprintf(vstats_file
, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1109 (double)video_size
/ 1024, ti1
, bitrate
, avg_bitrate
);
1110 fprintf(vstats_file
,"type= %c\n", av_get_pict_type_char(enc
->coded_frame
->pict_type
));
1114 static void print_report(AVFormatContext
**output_files
,
1115 AVOutputStream
**ost_table
, int nb_ostreams
,
1119 AVOutputStream
*ost
;
1120 AVFormatContext
*oc
;
1122 AVCodecContext
*enc
;
1123 int frame_number
, vid
, i
;
1124 double bitrate
, ti1
, pts
;
1125 static int64_t last_time
= -1;
1126 static int qp_histogram
[52];
1128 if (!is_last_report
) {
1130 /* display the report every 0.5 seconds */
1131 cur_time
= av_gettime();
1132 if (last_time
== -1) {
1133 last_time
= cur_time
;
1136 if ((cur_time
- last_time
) < 500000)
1138 last_time
= cur_time
;
1142 oc
= output_files
[0];
1144 total_size
= url_fsize(oc
->pb
);
1145 if(total_size
<0) // FIXME improve url_fsize() so it works with non seekable output too
1146 total_size
= url_ftell(oc
->pb
);
1151 for(i
=0;i
<nb_ostreams
;i
++) {
1153 enc
= ost
->st
->codec
;
1154 if (vid
&& enc
->codec_type
== CODEC_TYPE_VIDEO
) {
1155 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "q=%2.1f ",
1156 !ost
->st
->stream_copy
?
1157 enc
->coded_frame
->quality
/(float)FF_QP2LAMBDA
: -1);
1159 if (!vid
&& enc
->codec_type
== CODEC_TYPE_VIDEO
) {
1160 float t
= (av_gettime()-timer_start
) / 1000000.0;
1162 frame_number
= ost
->frame_number
;
1163 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "frame=%5d fps=%3d q=%3.1f ",
1164 frame_number
, (t
>1)?(int)(frame_number
/t
+0.5) : 0,
1165 !ost
->st
->stream_copy
?
1166 enc
->coded_frame
->quality
/(float)FF_QP2LAMBDA
: -1);
1168 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "L");
1171 int qp
= lrintf(enc
->coded_frame
->quality
/(float)FF_QP2LAMBDA
);
1172 if(qp
>=0 && qp
<FF_ARRAY_ELEMS(qp_histogram
))
1175 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "%X", (int)lrintf(log(qp_histogram
[j
]+1)/log(2)));
1177 if (enc
->flags
&CODEC_FLAG_PSNR
){
1179 double error
, error_sum
=0;
1180 double scale
, scale_sum
=0;
1181 char type
[3]= {'Y','U','V'};
1182 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "PSNR=");
1185 error
= enc
->error
[j
];
1186 scale
= enc
->width
*enc
->height
*255.0*255.0*frame_number
;
1188 error
= enc
->coded_frame
->error
[j
];
1189 scale
= enc
->width
*enc
->height
*255.0*255.0;
1194 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "%c:%2.2f ", type
[j
], psnr(error
/scale
));
1196 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "*:%2.2f ", psnr(error_sum
/scale_sum
));
1200 /* compute min output value */
1201 pts
= (double)ost
->st
->pts
.val
* av_q2d(ost
->st
->time_base
);
1202 if ((pts
< ti1
) && (pts
> 0))
1208 if (verbose
|| is_last_report
) {
1209 bitrate
= (double)(total_size
* 8) / ti1
/ 1000.0;
1211 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
),
1212 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1213 (double)total_size
/ 1024, ti1
, bitrate
);
1216 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), " dup=%d drop=%d",
1217 nb_frames_dup
, nb_frames_drop
);
1220 fprintf(stderr
, "%s \r", buf
);
1225 if (is_last_report
&& verbose
>= 0){
1226 int64_t raw
= audio_size
+ video_size
+ extra_size
;
1227 fprintf(stderr
, "\n");
1228 fprintf(stderr
, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1232 100.0*(total_size
- raw
)/raw
1237 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1238 static int output_packet(AVInputStream
*ist
, int ist_index
,
1239 AVOutputStream
**ost_table
, int nb_ostreams
,
1240 const AVPacket
*pkt
)
1242 AVFormatContext
*os
;
1243 AVOutputStream
*ost
;
1246 int data_size
, got_picture
;
1248 void *buffer_to_free
;
1249 static unsigned int samples_size
= 0;
1250 AVSubtitle subtitle
, *subtitle_to_free
;
1254 if(ist
->next_pts
== AV_NOPTS_VALUE
)
1255 ist
->next_pts
= ist
->pts
;
1259 av_init_packet(&avpkt
);
1267 if(pkt
->dts
!= AV_NOPTS_VALUE
)
1268 ist
->next_pts
= ist
->pts
= av_rescale_q(pkt
->dts
, ist
->st
->time_base
, AV_TIME_BASE_Q
);
1270 //while we have more to decode or while the decoder did output something on EOF
1271 while (avpkt
.size
> 0 || (!pkt
&& ist
->next_pts
!= ist
->pts
)) {
1273 ist
->pts
= ist
->next_pts
;
1275 if(avpkt
.size
&& avpkt
.size
!= pkt
->size
&& verbose
>0)
1276 fprintf(stderr
, "Multiple frames in a packet from stream %d\n", pkt
->stream_index
);
1278 /* decode the packet if needed */
1279 data_buf
= NULL
; /* fail safe */
1281 subtitle_to_free
= NULL
;
1282 if (ist
->decoding_needed
) {
1283 switch(ist
->st
->codec
->codec_type
) {
1284 case CODEC_TYPE_AUDIO
:{
1285 if(pkt
&& samples_size
< FFMAX(pkt
->size
*sizeof(*samples
), AVCODEC_MAX_AUDIO_FRAME_SIZE
)) {
1286 samples_size
= FFMAX(pkt
->size
*sizeof(*samples
), AVCODEC_MAX_AUDIO_FRAME_SIZE
);
1288 samples
= av_malloc(samples_size
);
1290 data_size
= samples_size
;
1291 /* XXX: could avoid copy if PCM 16 bits with same
1292 endianness as CPU */
1293 ret
= avcodec_decode_audio3(ist
->st
->codec
, samples
, &data_size
,
1299 /* Some bug in mpeg audio decoder gives */
1300 /* data_size < 0, it seems they are overflows */
1301 if (data_size
<= 0) {
1302 /* no audio frame */
1305 data_buf
= (uint8_t *)samples
;
1306 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
/2 * data_size
) /
1307 (ist
->st
->codec
->sample_rate
* ist
->st
->codec
->channels
);
1309 case CODEC_TYPE_VIDEO
:
1310 data_size
= (ist
->st
->codec
->width
* ist
->st
->codec
->height
* 3) / 2;
1311 /* XXX: allocate picture correctly */
1312 avcodec_get_frame_defaults(&picture
);
1314 ret
= avcodec_decode_video2(ist
->st
->codec
,
1315 &picture
, &got_picture
, &avpkt
);
1316 ist
->st
->quality
= picture
.quality
;
1320 /* no picture yet */
1321 goto discard_packet
;
1323 if (ist
->st
->codec
->time_base
.num
!= 0) {
1324 int ticks
= ist
->st
->parser
? ist
->st
->parser
->repeat_pict
+1 : ist
->st
->codec
->ticks_per_frame
;
1325 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
*
1326 ist
->st
->codec
->time_base
.num
* ticks
) /
1327 ist
->st
->codec
->time_base
.den
;
1331 case CODEC_TYPE_SUBTITLE
:
1332 ret
= avcodec_decode_subtitle2(ist
->st
->codec
,
1333 &subtitle
, &got_subtitle
, &avpkt
);
1336 if (!got_subtitle
) {
1337 goto discard_packet
;
1339 subtitle_to_free
= &subtitle
;
1346 switch(ist
->st
->codec
->codec_type
) {
1347 case CODEC_TYPE_AUDIO
:
1348 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
* ist
->st
->codec
->frame_size
) /
1349 ist
->st
->codec
->sample_rate
;
1351 case CODEC_TYPE_VIDEO
:
1352 if (ist
->st
->codec
->time_base
.num
!= 0) {
1353 int ticks
= ist
->st
->parser
? ist
->st
->parser
->repeat_pict
+1 : ist
->st
->codec
->ticks_per_frame
;
1354 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
*
1355 ist
->st
->codec
->time_base
.num
* ticks
) /
1356 ist
->st
->codec
->time_base
.den
;
1360 data_buf
= avpkt
.data
;
1361 data_size
= avpkt
.size
;
1366 buffer_to_free
= NULL
;
1367 if (ist
->st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
1368 pre_process_video_frame(ist
, (AVPicture
*)&picture
,
1372 // preprocess audio (volume)
1373 if (ist
->st
->codec
->codec_type
== CODEC_TYPE_AUDIO
) {
1374 if (audio_volume
!= 256) {
1377 for(i
=0;i
<(data_size
/ sizeof(short));i
++) {
1378 int v
= ((*volp
) * audio_volume
+ 128) >> 8;
1379 if (v
< -32768) v
= -32768;
1380 if (v
> 32767) v
= 32767;
1386 /* frame rate emulation */
1388 int64_t pts
= av_rescale(ist
->pts
, 1000000, AV_TIME_BASE
);
1389 int64_t now
= av_gettime() - ist
->start
;
1394 /* if output time reached then transcode raw format,
1395 encode packets and output them */
1396 if (start_time
== 0 || ist
->pts
>= start_time
)
1397 for(i
=0;i
<nb_ostreams
;i
++) {
1401 if (ost
->source_index
== ist_index
) {
1402 os
= output_files
[ost
->file_index
];
1405 printf("%d: got pts=%0.3f %0.3f\n", i
,
1406 (double)pkt
->pts
/ AV_TIME_BASE
,
1407 ((double)ist
->pts
/ AV_TIME_BASE
) -
1408 ((double)ost
->st
->pts
.val
* ost
->st
->time_base
.num
/ ost
->st
->time_base
.den
));
1410 /* set the input output pts pairs */
1411 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1413 if (ost
->encoding_needed
) {
1414 switch(ost
->st
->codec
->codec_type
) {
1415 case CODEC_TYPE_AUDIO
:
1416 do_audio_out(os
, ost
, ist
, data_buf
, data_size
);
1418 case CODEC_TYPE_VIDEO
:
1419 do_video_out(os
, ost
, ist
, &picture
, &frame_size
);
1420 if (vstats_filename
&& frame_size
)
1421 do_video_stats(os
, ost
, frame_size
);
1423 case CODEC_TYPE_SUBTITLE
:
1424 do_subtitle_out(os
, ost
, ist
, &subtitle
,
1431 AVFrame avframe
; //FIXME/XXX remove this
1433 int64_t ost_tb_start_time
= av_rescale_q(start_time
, AV_TIME_BASE_Q
, ost
->st
->time_base
);
1435 av_init_packet(&opkt
);
1437 if ((!ost
->frame_number
&& !(pkt
->flags
& PKT_FLAG_KEY
)) && !copy_initial_nonkeyframes
)
1440 /* no reencoding needed : output the packet directly */
1441 /* force the input stream PTS */
1443 avcodec_get_frame_defaults(&avframe
);
1444 ost
->st
->codec
->coded_frame
= &avframe
;
1445 avframe
.key_frame
= pkt
->flags
& PKT_FLAG_KEY
;
1447 if(ost
->st
->codec
->codec_type
== CODEC_TYPE_AUDIO
)
1448 audio_size
+= data_size
;
1449 else if (ost
->st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
1450 video_size
+= data_size
;
1454 opkt
.stream_index
= ost
->index
;
1455 if(pkt
->pts
!= AV_NOPTS_VALUE
)
1456 opkt
.pts
= av_rescale_q(pkt
->pts
, ist
->st
->time_base
, ost
->st
->time_base
) - ost_tb_start_time
;
1458 opkt
.pts
= AV_NOPTS_VALUE
;
1460 if (pkt
->dts
== AV_NOPTS_VALUE
)
1461 opkt
.dts
= av_rescale_q(ist
->pts
, AV_TIME_BASE_Q
, ost
->st
->time_base
);
1463 opkt
.dts
= av_rescale_q(pkt
->dts
, ist
->st
->time_base
, ost
->st
->time_base
);
1464 opkt
.dts
-= ost_tb_start_time
;
1466 opkt
.duration
= av_rescale_q(pkt
->duration
, ist
->st
->time_base
, ost
->st
->time_base
);
1467 opkt
.flags
= pkt
->flags
;
1469 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1470 if(ost
->st
->codec
->codec_id
!= CODEC_ID_H264
) {
1471 if(av_parser_change(ist
->st
->parser
, ost
->st
->codec
, &opkt
.data
, &opkt
.size
, data_buf
, data_size
, pkt
->flags
& PKT_FLAG_KEY
))
1472 opkt
.destruct
= av_destruct_packet
;
1474 opkt
.data
= data_buf
;
1475 opkt
.size
= data_size
;
1478 write_frame(os
, &opkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][opkt
.stream_index
]);
1479 ost
->st
->codec
->frame_number
++;
1480 ost
->frame_number
++;
1481 av_free_packet(&opkt
);
1485 av_free(buffer_to_free
);
1486 /* XXX: allocate the subtitles in the codec ? */
1487 if (subtitle_to_free
) {
1488 if (subtitle_to_free
->rects
!= NULL
) {
1489 for (i
= 0; i
< subtitle_to_free
->num_rects
; i
++) {
1490 av_freep(&subtitle_to_free
->rects
[i
]->pict
.data
[0]);
1491 av_freep(&subtitle_to_free
->rects
[i
]->pict
.data
[1]);
1492 av_freep(&subtitle_to_free
->rects
[i
]);
1494 av_freep(&subtitle_to_free
->rects
);
1496 subtitle_to_free
->num_rects
= 0;
1497 subtitle_to_free
= NULL
;
1504 for(i
=0;i
<nb_ostreams
;i
++) {
1506 if (ost
->source_index
== ist_index
) {
1507 AVCodecContext
*enc
= ost
->st
->codec
;
1508 os
= output_files
[ost
->file_index
];
1510 if(ost
->st
->codec
->codec_type
== CODEC_TYPE_AUDIO
&& enc
->frame_size
<=1)
1512 if(ost
->st
->codec
->codec_type
== CODEC_TYPE_VIDEO
&& (os
->oformat
->flags
& AVFMT_RAWPICTURE
))
1515 if (ost
->encoding_needed
) {
1519 av_init_packet(&pkt
);
1520 pkt
.stream_index
= ost
->index
;
1522 switch(ost
->st
->codec
->codec_type
) {
1523 case CODEC_TYPE_AUDIO
:
1524 fifo_bytes
= av_fifo_size(ost
->fifo
);
1526 /* encode any samples remaining in fifo */
1527 if (fifo_bytes
> 0) {
1528 int osize
= av_get_bits_per_sample_format(enc
->sample_fmt
) >> 3;
1529 int fs_tmp
= enc
->frame_size
;
1531 av_fifo_generic_read(ost
->fifo
, samples
, fifo_bytes
, NULL
);
1532 if (enc
->codec
->capabilities
& CODEC_CAP_SMALL_LAST_FRAME
) {
1533 enc
->frame_size
= fifo_bytes
/ (osize
* enc
->channels
);
1535 int frame_bytes
= enc
->frame_size
*osize
*enc
->channels
;
1536 if (samples_size
< frame_bytes
)
1538 memset((uint8_t*)samples
+fifo_bytes
, 0, frame_bytes
- fifo_bytes
);
1541 ret
= avcodec_encode_audio(enc
, bit_buffer
, bit_buffer_size
, samples
);
1542 pkt
.duration
= av_rescale((int64_t)enc
->frame_size
*ost
->st
->time_base
.den
,
1543 ost
->st
->time_base
.num
, enc
->sample_rate
);
1544 enc
->frame_size
= fs_tmp
;
1547 ret
= avcodec_encode_audio(enc
, bit_buffer
, bit_buffer_size
, NULL
);
1550 fprintf(stderr
, "Audio encoding failed\n");
1554 pkt
.flags
|= PKT_FLAG_KEY
;
1556 case CODEC_TYPE_VIDEO
:
1557 ret
= avcodec_encode_video(enc
, bit_buffer
, bit_buffer_size
, NULL
);
1559 fprintf(stderr
, "Video encoding failed\n");
1563 if(enc
->coded_frame
&& enc
->coded_frame
->key_frame
)
1564 pkt
.flags
|= PKT_FLAG_KEY
;
1565 if (ost
->logfile
&& enc
->stats_out
) {
1566 fprintf(ost
->logfile
, "%s", enc
->stats_out
);
1575 pkt
.data
= bit_buffer
;
1577 if(enc
->coded_frame
&& enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
1578 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
1579 write_frame(os
, &pkt
, ost
->st
->codec
, bitstream_filters
[ost
->file_index
][pkt
.stream_index
]);
1591 static void print_sdp(AVFormatContext
**avc
, int n
)
1595 avf_sdp_create(avc
, n
, sdp
, sizeof(sdp
));
1596 printf("SDP:\n%s\n", sdp
);
1600 static int stream_index_from_inputs(AVFormatContext
**input_files
,
1602 AVInputFile
*file_table
,
1603 AVInputStream
**ist_table
,
1604 enum CodecType type
,
1608 for(z
=0; z
<nb_input_files
; z
++) {
1609 AVFormatContext
*ic
= input_files
[z
];
1610 for(p
=0; p
<ic
->nb_programs
; p
++) {
1611 AVProgram
*program
= ic
->programs
[p
];
1612 if(program
->id
!= programid
)
1614 for(q
=0; q
<program
->nb_stream_indexes
; q
++) {
1615 int sidx
= program
->stream_index
[q
];
1616 int ris
= file_table
[z
].ist_index
+ sidx
;
1617 if(ist_table
[ris
]->discard
&& ic
->streams
[sidx
]->codec
->codec_type
== type
)
1627 * The following code is the main loop of the file converter
1629 static int av_encode(AVFormatContext
**output_files
,
1630 int nb_output_files
,
1631 AVFormatContext
**input_files
,
1633 AVStreamMap
*stream_maps
, int nb_stream_maps
)
1635 int ret
= 0, i
, j
, k
, n
, nb_istreams
= 0, nb_ostreams
= 0;
1636 AVFormatContext
*is
, *os
;
1637 AVCodecContext
*codec
, *icodec
;
1638 AVOutputStream
*ost
, **ost_table
= NULL
;
1639 AVInputStream
*ist
, **ist_table
= NULL
;
1640 AVInputFile
*file_table
;
1644 uint8_t no_packet
[MAX_FILES
]={0};
1645 int no_packet_count
=0;
1647 file_table
= av_mallocz(nb_input_files
* sizeof(AVInputFile
));
1651 /* input stream init */
1653 for(i
=0;i
<nb_input_files
;i
++) {
1654 is
= input_files
[i
];
1655 file_table
[i
].ist_index
= j
;
1656 file_table
[i
].nb_streams
= is
->nb_streams
;
1657 j
+= is
->nb_streams
;
1661 ist_table
= av_mallocz(nb_istreams
* sizeof(AVInputStream
*));
1665 for(i
=0;i
<nb_istreams
;i
++) {
1666 ist
= av_mallocz(sizeof(AVInputStream
));
1672 for(i
=0;i
<nb_input_files
;i
++) {
1673 is
= input_files
[i
];
1674 for(k
=0;k
<is
->nb_streams
;k
++) {
1675 ist
= ist_table
[j
++];
1676 ist
->st
= is
->streams
[k
];
1677 ist
->file_index
= i
;
1679 ist
->discard
= 1; /* the stream is discarded by default
1683 ist
->start
= av_gettime();
1688 /* output stream init */
1690 for(i
=0;i
<nb_output_files
;i
++) {
1691 os
= output_files
[i
];
1692 if (!os
->nb_streams
) {
1693 dump_format(output_files
[i
], i
, output_files
[i
]->filename
, 1);
1694 fprintf(stderr
, "Output file #%d does not contain any stream\n", i
);
1697 nb_ostreams
+= os
->nb_streams
;
1699 if (nb_stream_maps
> 0 && nb_stream_maps
!= nb_ostreams
) {
1700 fprintf(stderr
, "Number of stream maps must match number of output streams\n");
1704 /* Sanity check the mapping args -- do the input files & streams exist? */
1705 for(i
=0;i
<nb_stream_maps
;i
++) {
1706 int fi
= stream_maps
[i
].file_index
;
1707 int si
= stream_maps
[i
].stream_index
;
1709 if (fi
< 0 || fi
> nb_input_files
- 1 ||
1710 si
< 0 || si
> file_table
[fi
].nb_streams
- 1) {
1711 fprintf(stderr
,"Could not find input stream #%d.%d\n", fi
, si
);
1714 fi
= stream_maps
[i
].sync_file_index
;
1715 si
= stream_maps
[i
].sync_stream_index
;
1716 if (fi
< 0 || fi
> nb_input_files
- 1 ||
1717 si
< 0 || si
> file_table
[fi
].nb_streams
- 1) {
1718 fprintf(stderr
,"Could not find sync stream #%d.%d\n", fi
, si
);
1723 ost_table
= av_mallocz(sizeof(AVOutputStream
*) * nb_ostreams
);
1726 for(i
=0;i
<nb_ostreams
;i
++) {
1727 ost
= av_mallocz(sizeof(AVOutputStream
));
1734 for(k
=0;k
<nb_output_files
;k
++) {
1735 os
= output_files
[k
];
1736 for(i
=0;i
<os
->nb_streams
;i
++,n
++) {
1739 ost
->file_index
= k
;
1741 ost
->st
= os
->streams
[i
];
1742 if (nb_stream_maps
> 0) {
1743 ost
->source_index
= file_table
[stream_maps
[n
].file_index
].ist_index
+
1744 stream_maps
[n
].stream_index
;
1746 /* Sanity check that the stream types match */
1747 if (ist_table
[ost
->source_index
]->st
->codec
->codec_type
!= ost
->st
->codec
->codec_type
) {
1748 int i
= ost
->file_index
;
1749 dump_format(output_files
[i
], i
, output_files
[i
]->filename
, 1);
1750 fprintf(stderr
, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1751 stream_maps
[n
].file_index
, stream_maps
[n
].stream_index
,
1752 ost
->file_index
, ost
->index
);
1759 j
= stream_index_from_inputs(input_files
, nb_input_files
, file_table
, ist_table
, ost
->st
->codec
->codec_type
, opt_programid
);
1761 ost
->source_index
= j
;
1765 /* get corresponding input stream index : we select the first one with the right type */
1767 for(j
=0;j
<nb_istreams
;j
++) {
1770 ist
->st
->codec
->codec_type
== ost
->st
->codec
->codec_type
) {
1771 ost
->source_index
= j
;
1779 if(! opt_programid
) {
1780 /* try again and reuse existing stream */
1781 for(j
=0;j
<nb_istreams
;j
++) {
1783 if (ist
->st
->codec
->codec_type
== ost
->st
->codec
->codec_type
) {
1784 ost
->source_index
= j
;
1790 int i
= ost
->file_index
;
1791 dump_format(output_files
[i
], i
, output_files
[i
]->filename
, 1);
1792 fprintf(stderr
, "Could not find input stream matching output stream #%d.%d\n",
1793 ost
->file_index
, ost
->index
);
1798 ist
= ist_table
[ost
->source_index
];
1800 ost
->sync_ist
= (nb_stream_maps
> 0) ?
1801 ist_table
[file_table
[stream_maps
[n
].sync_file_index
].ist_index
+
1802 stream_maps
[n
].sync_stream_index
] : ist
;
1806 /* for each output stream, we compute the right encoding parameters */
1807 for(i
=0;i
<nb_ostreams
;i
++) {
1808 AVMetadataTag
*lang
;
1810 os
= output_files
[ost
->file_index
];
1811 ist
= ist_table
[ost
->source_index
];
1813 codec
= ost
->st
->codec
;
1814 icodec
= ist
->st
->codec
;
1816 if ((lang
=av_metadata_get(ist
->st
->metadata
, "language", NULL
, 0))
1817 && !av_metadata_get(ost
->st
->metadata
, "language", NULL
, 0))
1818 av_metadata_set(&ost
->st
->metadata
, "language", lang
->value
);
1820 ost
->st
->disposition
= ist
->st
->disposition
;
1821 codec
->bits_per_raw_sample
= icodec
->bits_per_raw_sample
;
1822 codec
->chroma_sample_location
= icodec
->chroma_sample_location
;
1824 if (ost
->st
->stream_copy
) {
1825 /* if stream_copy is selected, no need to decode or encode */
1826 codec
->codec_id
= icodec
->codec_id
;
1827 codec
->codec_type
= icodec
->codec_type
;
1829 if(!codec
->codec_tag
){
1830 if( !os
->oformat
->codec_tag
1831 || av_codec_get_id (os
->oformat
->codec_tag
, icodec
->codec_tag
) > 0
1832 || av_codec_get_tag(os
->oformat
->codec_tag
, icodec
->codec_id
) <= 0)
1833 codec
->codec_tag
= icodec
->codec_tag
;
1836 codec
->bit_rate
= icodec
->bit_rate
;
1837 codec
->extradata
= icodec
->extradata
;
1838 codec
->extradata_size
= icodec
->extradata_size
;
1839 if(av_q2d(icodec
->time_base
)*icodec
->ticks_per_frame
> av_q2d(ist
->st
->time_base
) && av_q2d(ist
->st
->time_base
) < 1.0/1000){
1840 codec
->time_base
= icodec
->time_base
;
1841 codec
->time_base
.num
*= icodec
->ticks_per_frame
;
1843 codec
->time_base
= ist
->st
->time_base
;
1844 switch(codec
->codec_type
) {
1845 case CODEC_TYPE_AUDIO
:
1846 if(audio_volume
!= 256) {
1847 fprintf(stderr
,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1850 codec
->channel_layout
= icodec
->channel_layout
;
1851 codec
->sample_rate
= icodec
->sample_rate
;
1852 codec
->channels
= icodec
->channels
;
1853 codec
->frame_size
= icodec
->frame_size
;
1854 codec
->block_align
= icodec
->block_align
;
1855 if(codec
->block_align
== 1 && codec
->codec_id
== CODEC_ID_MP3
)
1856 codec
->block_align
= 0;
1857 if(codec
->codec_id
== CODEC_ID_AC3
)
1858 codec
->block_align
= 0;
1860 case CODEC_TYPE_VIDEO
:
1861 codec
->pix_fmt
= icodec
->pix_fmt
;
1862 codec
->width
= icodec
->width
;
1863 codec
->height
= icodec
->height
;
1864 codec
->has_b_frames
= icodec
->has_b_frames
;
1866 case CODEC_TYPE_SUBTITLE
:
1867 codec
->width
= icodec
->width
;
1868 codec
->height
= icodec
->height
;
1874 switch(codec
->codec_type
) {
1875 case CODEC_TYPE_AUDIO
:
1876 ost
->fifo
= av_fifo_alloc(1024);
1879 ost
->reformat_pair
= MAKE_SFMT_PAIR(SAMPLE_FMT_NONE
,SAMPLE_FMT_NONE
);
1880 ost
->audio_resample
= codec
->sample_rate
!= icodec
->sample_rate
|| audio_sync_method
> 1;
1881 icodec
->request_channels
= codec
->channels
;
1882 ist
->decoding_needed
= 1;
1883 ost
->encoding_needed
= 1;
1885 case CODEC_TYPE_VIDEO
:
1886 if (ost
->st
->codec
->pix_fmt
== PIX_FMT_NONE
) {
1887 fprintf(stderr
, "Video pixel format is unknown, stream cannot be decoded\n");
1890 ost
->video_crop
= ((frame_leftBand
+ frame_rightBand
+ frame_topBand
+ frame_bottomBand
) != 0);
1891 ost
->video_pad
= ((frame_padleft
+ frame_padright
+ frame_padtop
+ frame_padbottom
) != 0);
1892 ost
->video_resample
= ((codec
->width
!= icodec
->width
-
1893 (frame_leftBand
+ frame_rightBand
) +
1894 (frame_padleft
+ frame_padright
)) ||
1895 (codec
->height
!= icodec
->height
-
1896 (frame_topBand
+ frame_bottomBand
) +
1897 (frame_padtop
+ frame_padbottom
)) ||
1898 (codec
->pix_fmt
!= icodec
->pix_fmt
));
1899 if (ost
->video_crop
) {
1900 ost
->topBand
= ost
->original_topBand
= frame_topBand
;
1901 ost
->bottomBand
= ost
->original_bottomBand
= frame_bottomBand
;
1902 ost
->leftBand
= ost
->original_leftBand
= frame_leftBand
;
1903 ost
->rightBand
= ost
->original_rightBand
= frame_rightBand
;
1905 if (ost
->video_pad
) {
1906 ost
->padtop
= frame_padtop
;
1907 ost
->padleft
= frame_padleft
;
1908 ost
->padbottom
= frame_padbottom
;
1909 ost
->padright
= frame_padright
;
1910 if (!ost
->video_resample
) {
1911 avcodec_get_frame_defaults(&ost
->pict_tmp
);
1912 if(avpicture_alloc((AVPicture
*)&ost
->pict_tmp
, codec
->pix_fmt
,
1913 codec
->width
, codec
->height
))
1917 if (ost
->video_resample
) {
1918 avcodec_get_frame_defaults(&ost
->pict_tmp
);
1919 if(avpicture_alloc((AVPicture
*)&ost
->pict_tmp
, codec
->pix_fmt
,
1920 codec
->width
, codec
->height
)) {
1921 fprintf(stderr
, "Cannot allocate temp picture, check pix fmt\n");
1924 sws_flags
= av_get_int(sws_opts
, "sws_flags", NULL
);
1925 ost
->img_resample_ctx
= sws_getContext(
1926 icodec
->width
- (frame_leftBand
+ frame_rightBand
),
1927 icodec
->height
- (frame_topBand
+ frame_bottomBand
),
1929 codec
->width
- (frame_padleft
+ frame_padright
),
1930 codec
->height
- (frame_padtop
+ frame_padbottom
),
1932 sws_flags
, NULL
, NULL
, NULL
);
1933 if (ost
->img_resample_ctx
== NULL
) {
1934 fprintf(stderr
, "Cannot get resampling context\n");
1938 ost
->original_height
= icodec
->height
;
1939 ost
->original_width
= icodec
->width
;
1941 ost
->resample_height
= icodec
->height
- (frame_topBand
+ frame_bottomBand
);
1942 ost
->resample_width
= icodec
->width
- (frame_leftBand
+ frame_rightBand
);
1943 ost
->resample_pix_fmt
= icodec
->pix_fmt
;
1944 codec
->bits_per_raw_sample
= 0;
1946 ost
->encoding_needed
= 1;
1947 ist
->decoding_needed
= 1;
1949 case CODEC_TYPE_SUBTITLE
:
1950 ost
->encoding_needed
= 1;
1951 ist
->decoding_needed
= 1;
1958 if (ost
->encoding_needed
&&
1959 (codec
->flags
& (CODEC_FLAG_PASS1
| CODEC_FLAG_PASS2
))) {
1960 char logfilename
[1024];
1965 snprintf(logfilename
, sizeof(logfilename
), "%s-%d.log",
1966 pass_logfilename_prefix
? pass_logfilename_prefix
: DEFAULT_PASS_LOGFILENAME_PREFIX
,
1968 if (codec
->flags
& CODEC_FLAG_PASS1
) {
1969 f
= fopen(logfilename
, "w");
1971 fprintf(stderr
, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename
, strerror(errno
));
1976 /* read the log file */
1977 f
= fopen(logfilename
, "r");
1979 fprintf(stderr
, "Cannot read log file '%s' for pass-2 encoding: %s\n", logfilename
, strerror(errno
));
1982 fseek(f
, 0, SEEK_END
);
1984 fseek(f
, 0, SEEK_SET
);
1985 logbuffer
= av_malloc(size
+ 1);
1987 fprintf(stderr
, "Could not allocate log buffer\n");
1990 size
= fread(logbuffer
, 1, size
, f
);
1992 logbuffer
[size
] = '\0';
1993 codec
->stats_in
= logbuffer
;
1997 if(codec
->codec_type
== CODEC_TYPE_VIDEO
){
1998 int size
= codec
->width
* codec
->height
;
1999 bit_buffer_size
= FFMAX(bit_buffer_size
, 6*size
+ 200);
2004 bit_buffer
= av_malloc(bit_buffer_size
);
2006 fprintf(stderr
, "Cannot allocate %d bytes output buffer\n",
2008 ret
= AVERROR(ENOMEM
);
2012 /* open each encoder */
2013 for(i
=0;i
<nb_ostreams
;i
++) {
2015 if (ost
->encoding_needed
) {
2016 AVCodec
*codec
= output_codecs
[i
];
2018 codec
= avcodec_find_encoder(ost
->st
->codec
->codec_id
);
2020 snprintf(error
, sizeof(error
), "Encoder (codec id %d) not found for output stream #%d.%d",
2021 ost
->st
->codec
->codec_id
, ost
->file_index
, ost
->index
);
2022 ret
= AVERROR(EINVAL
);
2025 if (avcodec_open(ost
->st
->codec
, codec
) < 0) {
2026 snprintf(error
, sizeof(error
), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2027 ost
->file_index
, ost
->index
);
2028 ret
= AVERROR(EINVAL
);
2031 extra_size
+= ost
->st
->codec
->extradata_size
;
2035 /* open each decoder */
2036 for(i
=0;i
<nb_istreams
;i
++) {
2038 if (ist
->decoding_needed
) {
2039 AVCodec
*codec
= input_codecs
[i
];
2041 codec
= avcodec_find_decoder(ist
->st
->codec
->codec_id
);
2043 snprintf(error
, sizeof(error
), "Decoder (codec id %d) not found for input stream #%d.%d",
2044 ist
->st
->codec
->codec_id
, ist
->file_index
, ist
->index
);
2045 ret
= AVERROR(EINVAL
);
2048 if (avcodec_open(ist
->st
->codec
, codec
) < 0) {
2049 snprintf(error
, sizeof(error
), "Error while opening decoder for input stream #%d.%d",
2050 ist
->file_index
, ist
->index
);
2051 ret
= AVERROR(EINVAL
);
2054 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
2055 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2060 for(i
=0;i
<nb_istreams
;i
++) {
2063 ist
->next_pts
= AV_NOPTS_VALUE
;
2067 /* set meta data information from input file if required */
2068 for (i
=0;i
<nb_meta_data_maps
;i
++) {
2069 AVFormatContext
*out_file
;
2070 AVFormatContext
*in_file
;
2071 AVMetadataTag
*mtag
;
2073 int out_file_index
= meta_data_maps
[i
].out_file
;
2074 int in_file_index
= meta_data_maps
[i
].in_file
;
2075 if (out_file_index
< 0 || out_file_index
>= nb_output_files
) {
2076 snprintf(error
, sizeof(error
), "Invalid output file index %d map_meta_data(%d,%d)",
2077 out_file_index
, out_file_index
, in_file_index
);
2078 ret
= AVERROR(EINVAL
);
2081 if (in_file_index
< 0 || in_file_index
>= nb_input_files
) {
2082 snprintf(error
, sizeof(error
), "Invalid input file index %d map_meta_data(%d,%d)",
2083 in_file_index
, out_file_index
, in_file_index
);
2084 ret
= AVERROR(EINVAL
);
2088 out_file
= output_files
[out_file_index
];
2089 in_file
= input_files
[in_file_index
];
2093 while((mtag
=av_metadata_get(in_file
->metadata
, "", mtag
, AV_METADATA_IGNORE_SUFFIX
)))
2094 av_metadata_set(&out_file
->metadata
, mtag
->key
, mtag
->value
);
2095 av_metadata_conv(out_file
, out_file
->oformat
->metadata_conv
,
2096 in_file
->iformat
->metadata_conv
);
2099 /* open files and write file headers */
2100 for(i
=0;i
<nb_output_files
;i
++) {
2101 os
= output_files
[i
];
2102 if (av_write_header(os
) < 0) {
2103 snprintf(error
, sizeof(error
), "Could not write header for output file #%d (incorrect codec parameters ?)", i
);
2104 ret
= AVERROR(EINVAL
);
2107 if (strcmp(output_files
[i
]->oformat
->name
, "rtp")) {
2113 /* dump the file output parameters - cannot be done before in case
2115 for(i
=0;i
<nb_output_files
;i
++) {
2116 dump_format(output_files
[i
], i
, output_files
[i
]->filename
, 1);
2119 /* dump the stream mapping */
2121 fprintf(stderr
, "Stream mapping:\n");
2122 for(i
=0;i
<nb_ostreams
;i
++) {
2124 fprintf(stderr
, " Stream #%d.%d -> #%d.%d",
2125 ist_table
[ost
->source_index
]->file_index
,
2126 ist_table
[ost
->source_index
]->index
,
2129 if (ost
->sync_ist
!= ist_table
[ost
->source_index
])
2130 fprintf(stderr
, " [sync #%d.%d]",
2131 ost
->sync_ist
->file_index
,
2132 ost
->sync_ist
->index
);
2133 fprintf(stderr
, "\n");
2138 fprintf(stderr
, "%s\n", error
);
2143 print_sdp(output_files
, nb_output_files
);
2146 if (!using_stdin
&& verbose
>= 0) {
2147 fprintf(stderr
, "Press [q] to stop encoding\n");
2148 url_set_interrupt_cb(decode_interrupt_cb
);
2152 timer_start
= av_gettime();
2154 for(; received_sigterm
== 0;) {
2155 int file_index
, ist_index
;
2163 /* if 'q' pressed, exits */
2167 /* read_key() returns 0 on EOF */
2173 /* select the stream that we must read now by looking at the
2174 smallest output pts */
2176 for(i
=0;i
<nb_ostreams
;i
++) {
2179 os
= output_files
[ost
->file_index
];
2180 ist
= ist_table
[ost
->source_index
];
2181 if(no_packet
[ist
->file_index
])
2183 if(ost
->st
->codec
->codec_type
== CODEC_TYPE_VIDEO
)
2184 opts
= ost
->sync_opts
* av_q2d(ost
->st
->codec
->time_base
);
2186 opts
= ost
->st
->pts
.val
* av_q2d(ost
->st
->time_base
);
2187 ipts
= (double)ist
->pts
;
2188 if (!file_table
[ist
->file_index
].eof_reached
){
2189 if(ipts
< ipts_min
) {
2191 if(input_sync
) file_index
= ist
->file_index
;
2193 if(opts
< opts_min
) {
2195 if(!input_sync
) file_index
= ist
->file_index
;
2198 if(ost
->frame_number
>= max_frames
[ost
->st
->codec
->codec_type
]){
2203 /* if none, if is finished */
2204 if (file_index
< 0) {
2205 if(no_packet_count
){
2207 memset(no_packet
, 0, sizeof(no_packet
));
2214 /* finish if recording time exhausted */
2215 if (opts_min
>= (recording_time
/ 1000000.0))
2218 /* finish if limit size exhausted */
2219 if (limit_filesize
!= 0 && limit_filesize
< url_ftell(output_files
[0]->pb
))
2222 /* read a frame from it and output it in the fifo */
2223 is
= input_files
[file_index
];
2224 ret
= av_read_frame(is
, &pkt
);
2225 if(ret
== AVERROR(EAGAIN
)){
2226 no_packet
[file_index
]=1;
2231 file_table
[file_index
].eof_reached
= 1;
2239 memset(no_packet
, 0, sizeof(no_packet
));
2242 av_pkt_dump_log(NULL
, AV_LOG_DEBUG
, &pkt
, do_hex_dump
);
2244 /* the following test is needed in case new streams appear
2245 dynamically in stream : we ignore them */
2246 if (pkt
.stream_index
>= file_table
[file_index
].nb_streams
)
2247 goto discard_packet
;
2248 ist_index
= file_table
[file_index
].ist_index
+ pkt
.stream_index
;
2249 ist
= ist_table
[ist_index
];
2251 goto discard_packet
;
2253 if (pkt
.dts
!= AV_NOPTS_VALUE
)
2254 pkt
.dts
+= av_rescale_q(input_files_ts_offset
[ist
->file_index
], AV_TIME_BASE_Q
, ist
->st
->time_base
);
2255 if (pkt
.pts
!= AV_NOPTS_VALUE
)
2256 pkt
.pts
+= av_rescale_q(input_files_ts_offset
[ist
->file_index
], AV_TIME_BASE_Q
, ist
->st
->time_base
);
2258 if(input_files_ts_scale
[file_index
][pkt
.stream_index
]){
2259 if(pkt
.pts
!= AV_NOPTS_VALUE
)
2260 pkt
.pts
*= input_files_ts_scale
[file_index
][pkt
.stream_index
];
2261 if(pkt
.dts
!= AV_NOPTS_VALUE
)
2262 pkt
.dts
*= input_files_ts_scale
[file_index
][pkt
.stream_index
];
2265 // fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files_ts_offset[ist->file_index], ist->st->codec->codec_type);
2266 if (pkt
.dts
!= AV_NOPTS_VALUE
&& ist
->next_pts
!= AV_NOPTS_VALUE
2267 && (is
->iformat
->flags
& AVFMT_TS_DISCONT
)) {
2268 int64_t pkt_dts
= av_rescale_q(pkt
.dts
, ist
->st
->time_base
, AV_TIME_BASE_Q
);
2269 int64_t delta
= pkt_dts
- ist
->next_pts
;
2270 if((FFABS(delta
) > 1LL*dts_delta_threshold
*AV_TIME_BASE
|| pkt_dts
+1<ist
->pts
)&& !copy_ts
){
2271 input_files_ts_offset
[ist
->file_index
]-= delta
;
2273 fprintf(stderr
, "timestamp discontinuity %"PRId64
", new offset= %"PRId64
"\n", delta
, input_files_ts_offset
[ist
->file_index
]);
2274 pkt
.dts
-= av_rescale_q(delta
, AV_TIME_BASE_Q
, ist
->st
->time_base
);
2275 if(pkt
.pts
!= AV_NOPTS_VALUE
)
2276 pkt
.pts
-= av_rescale_q(delta
, AV_TIME_BASE_Q
, ist
->st
->time_base
);
2280 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2281 if (output_packet(ist
, ist_index
, ost_table
, nb_ostreams
, &pkt
) < 0) {
2284 fprintf(stderr
, "Error while decoding stream #%d.%d\n",
2285 ist
->file_index
, ist
->index
);
2288 av_free_packet(&pkt
);
2293 av_free_packet(&pkt
);
2295 /* dump report by using the output first video and audio streams */
2296 print_report(output_files
, ost_table
, nb_ostreams
, 0);
2299 /* at the end of stream, we must flush the decoder buffers */
2300 for(i
=0;i
<nb_istreams
;i
++) {
2302 if (ist
->decoding_needed
) {
2303 output_packet(ist
, i
, ost_table
, nb_ostreams
, NULL
);
2309 /* write the trailer if needed and close file */
2310 for(i
=0;i
<nb_output_files
;i
++) {
2311 os
= output_files
[i
];
2312 av_write_trailer(os
);
2315 /* dump report by using the first video and audio streams */
2316 print_report(output_files
, ost_table
, nb_ostreams
, 1);
2318 /* close each encoder */
2319 for(i
=0;i
<nb_ostreams
;i
++) {
2321 if (ost
->encoding_needed
) {
2322 av_freep(&ost
->st
->codec
->stats_in
);
2323 avcodec_close(ost
->st
->codec
);
2327 /* close each decoder */
2328 for(i
=0;i
<nb_istreams
;i
++) {
2330 if (ist
->decoding_needed
) {
2331 avcodec_close(ist
->st
->codec
);
2339 av_freep(&bit_buffer
);
2340 av_free(file_table
);
2343 for(i
=0;i
<nb_istreams
;i
++) {
2350 for(i
=0;i
<nb_ostreams
;i
++) {
2354 fclose(ost
->logfile
);
2355 ost
->logfile
= NULL
;
2357 av_fifo_free(ost
->fifo
); /* works even if fifo is not
2358 initialized but set to zero */
2359 av_free(ost
->pict_tmp
.data
[0]);
2360 if (ost
->video_resample
)
2361 sws_freeContext(ost
->img_resample_ctx
);
2363 audio_resample_close(ost
->resample
);
2364 if (ost
->reformat_ctx
)
2365 av_audio_convert_free(ost
->reformat_ctx
);
2375 int file_read(const char *filename
)
2378 unsigned char buffer
[1024];
2381 if (url_open(&h
, filename
, O_RDONLY
) < 0) {
2382 printf("could not open '%s'\n", filename
);
2386 len
= url_read(h
, buffer
, sizeof(buffer
));
2389 for(i
=0;i
<len
;i
++) putchar(buffer
[i
]);
2396 static void opt_format(const char *arg
)
2398 /* compatibility stuff for pgmyuv */
2399 if (!strcmp(arg
, "pgmyuv")) {
2400 pgmyuv_compatibility_hack
=1;
2401 // opt_image_format(arg);
2403 fprintf(stderr
, "pgmyuv format is deprecated, use image2\n");
2406 file_iformat
= av_find_input_format(arg
);
2407 file_oformat
= guess_format(arg
, NULL
, NULL
);
2408 if (!file_iformat
&& !file_oformat
) {
2409 fprintf(stderr
, "Unknown input or output format: %s\n", arg
);
2414 static void opt_video_rc_override_string(const char *arg
)
2416 video_rc_override_string
= arg
;
2419 static int opt_me_threshold(const char *opt
, const char *arg
)
2421 me_threshold
= parse_number_or_die(opt
, arg
, OPT_INT64
, INT_MIN
, INT_MAX
);
2425 static int opt_verbose(const char *opt
, const char *arg
)
2427 verbose
= parse_number_or_die(opt
, arg
, OPT_INT64
, -10, 10);
2431 static int opt_frame_rate(const char *opt
, const char *arg
)
2433 if (av_parse_video_frame_rate(&frame_rate
, arg
) < 0) {
2434 fprintf(stderr
, "Incorrect value for %s: %s\n", opt
, arg
);
2440 static int opt_bitrate(const char *opt
, const char *arg
)
2442 int codec_type
= opt
[0]=='a' ? CODEC_TYPE_AUDIO
: CODEC_TYPE_VIDEO
;
2444 opt_default(opt
, arg
);
2446 if (av_get_int(avcodec_opts
[codec_type
], "b", NULL
) < 1000)
2447 fprintf(stderr
, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2452 static void opt_frame_crop_top(const char *arg
)
2454 frame_topBand
= atoi(arg
);
2455 if (frame_topBand
< 0) {
2456 fprintf(stderr
, "Incorrect top crop size\n");
2459 if ((frame_topBand
) >= frame_height
){
2460 fprintf(stderr
, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2463 frame_height
-= frame_topBand
;
2466 static void opt_frame_crop_bottom(const char *arg
)
2468 frame_bottomBand
= atoi(arg
);
2469 if (frame_bottomBand
< 0) {
2470 fprintf(stderr
, "Incorrect bottom crop size\n");
2473 if ((frame_bottomBand
) >= frame_height
){
2474 fprintf(stderr
, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2477 frame_height
-= frame_bottomBand
;
2480 static void opt_frame_crop_left(const char *arg
)
2482 frame_leftBand
= atoi(arg
);
2483 if (frame_leftBand
< 0) {
2484 fprintf(stderr
, "Incorrect left crop size\n");
2487 if ((frame_leftBand
) >= frame_width
){
2488 fprintf(stderr
, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2491 frame_width
-= frame_leftBand
;
2494 static void opt_frame_crop_right(const char *arg
)
2496 frame_rightBand
= atoi(arg
);
2497 if (frame_rightBand
< 0) {
2498 fprintf(stderr
, "Incorrect right crop size\n");
2501 if ((frame_rightBand
) >= frame_width
){
2502 fprintf(stderr
, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2505 frame_width
-= frame_rightBand
;
2508 static void opt_frame_size(const char *arg
)
2510 if (av_parse_video_frame_size(&frame_width
, &frame_height
, arg
) < 0) {
2511 fprintf(stderr
, "Incorrect frame size\n");
2514 if ((frame_width
% 2) != 0 || (frame_height
% 2) != 0) {
2515 fprintf(stderr
, "Frame size must be a multiple of 2\n");
2520 static void opt_pad_color(const char *arg
) {
2521 /* Input is expected to be six hex digits similar to
2522 how colors are expressed in html tags (but without the #) */
2523 int rgb
= strtol(arg
, NULL
, 16);
2527 g
= ((rgb
>> 8) & 255);
2530 padcolor
[0] = RGB_TO_Y(r
,g
,b
);
2531 padcolor
[1] = RGB_TO_U(r
,g
,b
,0);
2532 padcolor
[2] = RGB_TO_V(r
,g
,b
,0);
2535 static void opt_frame_pad_top(const char *arg
)
2537 frame_padtop
= atoi(arg
);
2538 if (frame_padtop
< 0) {
2539 fprintf(stderr
, "Incorrect top pad size\n");
2544 static void opt_frame_pad_bottom(const char *arg
)
2546 frame_padbottom
= atoi(arg
);
2547 if (frame_padbottom
< 0) {
2548 fprintf(stderr
, "Incorrect bottom pad size\n");
2554 static void opt_frame_pad_left(const char *arg
)
2556 frame_padleft
= atoi(arg
);
2557 if (frame_padleft
< 0) {
2558 fprintf(stderr
, "Incorrect left pad size\n");
2564 static void opt_frame_pad_right(const char *arg
)
2566 frame_padright
= atoi(arg
);
2567 if (frame_padright
< 0) {
2568 fprintf(stderr
, "Incorrect right pad size\n");
2573 static void list_fmts(void (*get_fmt_string
)(char *buf
, int buf_size
, int fmt
), int nb_fmts
)
2577 for (i
=-1; i
< nb_fmts
; i
++) {
2578 get_fmt_string (fmt_str
, sizeof(fmt_str
), i
);
2579 fprintf(stdout
, "%s\n", fmt_str
);
2583 static void opt_frame_pix_fmt(const char *arg
)
2585 if (strcmp(arg
, "list")) {
2586 frame_pix_fmt
= avcodec_get_pix_fmt(arg
);
2587 if (frame_pix_fmt
== PIX_FMT_NONE
) {
2588 fprintf(stderr
, "Unknown pixel format requested: %s\n", arg
);
2592 list_fmts(avcodec_pix_fmt_string
, PIX_FMT_NB
);
2597 static void opt_frame_aspect_ratio(const char *arg
)
2604 p
= strchr(arg
, ':');
2606 x
= strtol(arg
, &end
, 10);
2608 y
= strtol(end
+1, &end
, 10);
2610 ar
= (double)x
/ (double)y
;
2612 ar
= strtod(arg
, NULL
);
2615 fprintf(stderr
, "Incorrect aspect ratio specification.\n");
2618 frame_aspect_ratio
= ar
;
2621 static int opt_metadata(const char *opt
, const char *arg
)
2623 char *mid
= strchr(arg
, '=');
2626 fprintf(stderr
, "Missing =\n");
2632 metadata
= av_realloc(metadata
, sizeof(*metadata
)*metadata_count
);
2633 metadata
[metadata_count
-1].key
= av_strdup(arg
);
2634 metadata
[metadata_count
-1].value
= av_strdup(mid
);
2639 static void opt_qscale(const char *arg
)
2641 video_qscale
= atof(arg
);
2642 if (video_qscale
<= 0 ||
2643 video_qscale
> 255) {
2644 fprintf(stderr
, "qscale must be > 0.0 and <= 255\n");
2649 static void opt_top_field_first(const char *arg
)
2651 top_field_first
= atoi(arg
);
2654 static int opt_thread_count(const char *opt
, const char *arg
)
2656 thread_count
= parse_number_or_die(opt
, arg
, OPT_INT64
, 0, INT_MAX
);
2659 fprintf(stderr
, "Warning: not compiled with thread support, using thread emulation\n");
2664 static void opt_audio_sample_fmt(const char *arg
)
2666 if (strcmp(arg
, "list"))
2667 audio_sample_fmt
= avcodec_get_sample_fmt(arg
);
2669 list_fmts(avcodec_sample_fmt_string
, SAMPLE_FMT_NB
);
2674 static int opt_audio_rate(const char *opt
, const char *arg
)
2676 audio_sample_rate
= parse_number_or_die(opt
, arg
, OPT_INT64
, 0, INT_MAX
);
2680 static int opt_audio_channels(const char *opt
, const char *arg
)
2682 audio_channels
= parse_number_or_die(opt
, arg
, OPT_INT64
, 0, INT_MAX
);
2686 static void opt_video_channel(const char *arg
)
2688 video_channel
= strtol(arg
, NULL
, 0);
2691 static void opt_video_standard(const char *arg
)
2693 video_standard
= av_strdup(arg
);
2696 static void opt_codec(int *pstream_copy
, char **pcodec_name
,
2697 int codec_type
, const char *arg
)
2699 av_freep(pcodec_name
);
2700 if (!strcmp(arg
, "copy")) {
2703 *pcodec_name
= av_strdup(arg
);
2707 static void opt_audio_codec(const char *arg
)
2709 opt_codec(&audio_stream_copy
, &audio_codec_name
, CODEC_TYPE_AUDIO
, arg
);
2712 static void opt_audio_tag(const char *arg
)
2715 audio_codec_tag
= strtol(arg
, &tail
, 0);
2718 audio_codec_tag
= arg
[0] + (arg
[1]<<8) + (arg
[2]<<16) + (arg
[3]<<24);
2721 static void opt_video_tag(const char *arg
)
2724 video_codec_tag
= strtol(arg
, &tail
, 0);
2727 video_codec_tag
= arg
[0] + (arg
[1]<<8) + (arg
[2]<<16) + (arg
[3]<<24);
2730 static void opt_video_codec(const char *arg
)
2732 opt_codec(&video_stream_copy
, &video_codec_name
, CODEC_TYPE_VIDEO
, arg
);
2735 static void opt_subtitle_codec(const char *arg
)
2737 opt_codec(&subtitle_stream_copy
, &subtitle_codec_name
, CODEC_TYPE_SUBTITLE
, arg
);
2740 static void opt_subtitle_tag(const char *arg
)
2743 subtitle_codec_tag
= strtol(arg
, &tail
, 0);
2746 subtitle_codec_tag
= arg
[0] + (arg
[1]<<8) + (arg
[2]<<16) + (arg
[3]<<24);
2749 static void opt_map(const char *arg
)
2754 m
= &stream_maps
[nb_stream_maps
++];
2756 m
->file_index
= strtol(arg
, &p
, 0);
2760 m
->stream_index
= strtol(p
, &p
, 0);
2763 m
->sync_file_index
= strtol(p
, &p
, 0);
2766 m
->sync_stream_index
= strtol(p
, &p
, 0);
2768 m
->sync_file_index
= m
->file_index
;
2769 m
->sync_stream_index
= m
->stream_index
;
2773 static void opt_map_meta_data(const char *arg
)
2778 m
= &meta_data_maps
[nb_meta_data_maps
++];
2780 m
->out_file
= strtol(arg
, &p
, 0);
2784 m
->in_file
= strtol(p
, &p
, 0);
2787 static void opt_input_ts_scale(const char *arg
)
2789 unsigned int stream
;
2793 stream
= strtol(arg
, &p
, 0);
2796 scale
= strtod(p
, &p
);
2798 if(stream
>= MAX_STREAMS
)
2801 input_files_ts_scale
[nb_input_files
][stream
]= scale
;
2804 static int opt_recording_time(const char *opt
, const char *arg
)
2806 recording_time
= parse_time_or_die(opt
, arg
, 1);
2810 static int opt_start_time(const char *opt
, const char *arg
)
2812 start_time
= parse_time_or_die(opt
, arg
, 1);
2816 static int opt_rec_timestamp(const char *opt
, const char *arg
)
2818 rec_timestamp
= parse_time_or_die(opt
, arg
, 0) / 1000000;
2822 static int opt_input_ts_offset(const char *opt
, const char *arg
)
2824 input_ts_offset
= parse_time_or_die(opt
, arg
, 1);
2828 static enum CodecID
find_codec_or_die(const char *name
, int type
, int encoder
)
2830 const char *codec_string
= encoder
? "encoder" : "decoder";
2834 return CODEC_ID_NONE
;
2836 avcodec_find_encoder_by_name(name
) :
2837 avcodec_find_decoder_by_name(name
);
2839 fprintf(stderr
, "Unknown %s '%s'\n", codec_string
, name
);
2842 if(codec
->type
!= type
) {
2843 fprintf(stderr
, "Invalid %s type '%s'\n", codec_string
, name
);
2849 static void opt_input_file(const char *filename
)
2851 AVFormatContext
*ic
;
2852 AVFormatParameters params
, *ap
= ¶ms
;
2853 int err
, i
, ret
, rfps
, rfps_base
;
2856 if (!strcmp(filename
, "-"))
2859 using_stdin
|= !strncmp(filename
, "pipe:", 5) ||
2860 !strcmp(filename
, "/dev/stdin");
2862 /* get default parameters from command line */
2863 ic
= avformat_alloc_context();
2865 memset(ap
, 0, sizeof(*ap
));
2866 ap
->prealloced_context
= 1;
2867 ap
->sample_rate
= audio_sample_rate
;
2868 ap
->channels
= audio_channels
;
2869 ap
->time_base
.den
= frame_rate
.num
;
2870 ap
->time_base
.num
= frame_rate
.den
;
2871 ap
->width
= frame_width
+ frame_padleft
+ frame_padright
;
2872 ap
->height
= frame_height
+ frame_padtop
+ frame_padbottom
;
2873 ap
->pix_fmt
= frame_pix_fmt
;
2874 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
2875 ap
->channel
= video_channel
;
2876 ap
->standard
= video_standard
;
2877 ap
->video_codec_id
= find_codec_or_die(video_codec_name
, CODEC_TYPE_VIDEO
, 0);
2878 ap
->audio_codec_id
= find_codec_or_die(audio_codec_name
, CODEC_TYPE_AUDIO
, 0);
2879 if(pgmyuv_compatibility_hack
)
2880 ap
->video_codec_id
= CODEC_ID_PGMYUV
;
2882 set_context_opts(ic
, avformat_opts
, AV_OPT_FLAG_DECODING_PARAM
);
2884 ic
->video_codec_id
= find_codec_or_die(video_codec_name
, CODEC_TYPE_VIDEO
, 0);
2885 ic
->audio_codec_id
= find_codec_or_die(audio_codec_name
, CODEC_TYPE_AUDIO
, 0);
2886 ic
->subtitle_codec_id
= find_codec_or_die(subtitle_codec_name
, CODEC_TYPE_SUBTITLE
, 0);
2887 ic
->flags
|= AVFMT_FLAG_NONBLOCK
;
2889 /* open the input file with generic libav function */
2890 err
= av_open_input_file(&ic
, filename
, file_iformat
, 0, ap
);
2892 print_error(filename
, err
);
2897 for(i
=0; i
<ic
->nb_programs
; i
++)
2898 if(ic
->programs
[i
]->id
!= opt_programid
)
2899 ic
->programs
[i
]->discard
= AVDISCARD_ALL
;
2902 ic
->loop_input
= loop_input
;
2904 /* If not enough info to get the stream parameters, we decode the
2905 first frames to get it. (used in mpeg case for example) */
2906 ret
= av_find_stream_info(ic
);
2907 if (ret
< 0 && verbose
>= 0) {
2908 fprintf(stderr
, "%s: could not find codec parameters\n", filename
);
2912 timestamp
= start_time
;
2913 /* add the stream start time */
2914 if (ic
->start_time
!= AV_NOPTS_VALUE
)
2915 timestamp
+= ic
->start_time
;
2917 /* if seeking requested, we execute it */
2918 if (start_time
!= 0) {
2919 ret
= av_seek_frame(ic
, -1, timestamp
, AVSEEK_FLAG_BACKWARD
);
2921 fprintf(stderr
, "%s: could not seek to position %0.3f\n",
2922 filename
, (double)timestamp
/ AV_TIME_BASE
);
2924 /* reset seek info */
2928 /* update the current parameters so that they match the one of the input stream */
2929 for(i
=0;i
<ic
->nb_streams
;i
++) {
2930 AVCodecContext
*enc
= ic
->streams
[i
]->codec
;
2932 avcodec_thread_init(enc
, thread_count
);
2933 enc
->thread_count
= thread_count
;
2934 switch(enc
->codec_type
) {
2935 case CODEC_TYPE_AUDIO
:
2936 set_context_opts(enc
, avcodec_opts
[CODEC_TYPE_AUDIO
], AV_OPT_FLAG_AUDIO_PARAM
| AV_OPT_FLAG_DECODING_PARAM
);
2937 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2938 channel_layout
= enc
->channel_layout
;
2939 audio_channels
= enc
->channels
;
2940 audio_sample_rate
= enc
->sample_rate
;
2941 audio_sample_fmt
= enc
->sample_fmt
;
2942 input_codecs
[nb_icodecs
++] = avcodec_find_decoder_by_name(audio_codec_name
);
2944 ic
->streams
[i
]->discard
= AVDISCARD_ALL
;
2946 case CODEC_TYPE_VIDEO
:
2947 set_context_opts(enc
, avcodec_opts
[CODEC_TYPE_VIDEO
], AV_OPT_FLAG_VIDEO_PARAM
| AV_OPT_FLAG_DECODING_PARAM
);
2948 frame_height
= enc
->height
;
2949 frame_width
= enc
->width
;
2950 if(ic
->streams
[i
]->sample_aspect_ratio
.num
)
2951 frame_aspect_ratio
=av_q2d(ic
->streams
[i
]->sample_aspect_ratio
);
2953 frame_aspect_ratio
=av_q2d(enc
->sample_aspect_ratio
);
2954 frame_aspect_ratio
*= (float) enc
->width
/ enc
->height
;
2955 frame_pix_fmt
= enc
->pix_fmt
;
2956 rfps
= ic
->streams
[i
]->r_frame_rate
.num
;
2957 rfps_base
= ic
->streams
[i
]->r_frame_rate
.den
;
2958 if(enc
->lowres
) enc
->flags
|= CODEC_FLAG_EMU_EDGE
;
2960 enc
->debug
|= FF_DEBUG_MV
;
2962 if (enc
->time_base
.den
!= rfps
|| enc
->time_base
.num
!= rfps_base
) {
2965 fprintf(stderr
,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2966 i
, (float)enc
->time_base
.den
/ enc
->time_base
.num
, enc
->time_base
.den
, enc
->time_base
.num
,
2968 (float)rfps
/ rfps_base
, rfps
, rfps_base
);
2970 /* update the current frame rate to match the stream frame rate */
2971 frame_rate
.num
= rfps
;
2972 frame_rate
.den
= rfps_base
;
2974 input_codecs
[nb_icodecs
++] = avcodec_find_decoder_by_name(video_codec_name
);
2976 ic
->streams
[i
]->discard
= AVDISCARD_ALL
;
2977 else if(video_discard
)
2978 ic
->streams
[i
]->discard
= video_discard
;
2980 case CODEC_TYPE_DATA
:
2982 case CODEC_TYPE_SUBTITLE
:
2983 input_codecs
[nb_icodecs
++] = avcodec_find_decoder_by_name(subtitle_codec_name
);
2984 if(subtitle_disable
)
2985 ic
->streams
[i
]->discard
= AVDISCARD_ALL
;
2987 case CODEC_TYPE_ATTACHMENT
:
2988 case CODEC_TYPE_UNKNOWN
:
2996 input_files
[nb_input_files
] = ic
;
2997 input_files_ts_offset
[nb_input_files
] = input_ts_offset
- (copy_ts
? 0 : timestamp
);
2998 /* dump the file content */
3000 dump_format(ic
, nb_input_files
, filename
, 0);
3003 file_iformat
= NULL
;
3004 file_oformat
= NULL
;
3008 av_freep(&video_codec_name
);
3009 av_freep(&audio_codec_name
);
3010 av_freep(&subtitle_codec_name
);
3013 static void check_audio_video_sub_inputs(int *has_video_ptr
, int *has_audio_ptr
,
3014 int *has_subtitle_ptr
)
3016 int has_video
, has_audio
, has_subtitle
, i
, j
;
3017 AVFormatContext
*ic
;
3022 for(j
=0;j
<nb_input_files
;j
++) {
3023 ic
= input_files
[j
];
3024 for(i
=0;i
<ic
->nb_streams
;i
++) {
3025 AVCodecContext
*enc
= ic
->streams
[i
]->codec
;
3026 switch(enc
->codec_type
) {
3027 case CODEC_TYPE_AUDIO
:
3030 case CODEC_TYPE_VIDEO
:
3033 case CODEC_TYPE_SUBTITLE
:
3036 case CODEC_TYPE_DATA
:
3037 case CODEC_TYPE_ATTACHMENT
:
3038 case CODEC_TYPE_UNKNOWN
:
3045 *has_video_ptr
= has_video
;
3046 *has_audio_ptr
= has_audio
;
3047 *has_subtitle_ptr
= has_subtitle
;
3050 static void new_video_stream(AVFormatContext
*oc
)
3053 AVCodecContext
*video_enc
;
3054 enum CodecID codec_id
;
3056 st
= av_new_stream(oc
, oc
->nb_streams
);
3058 fprintf(stderr
, "Could not alloc stream\n");
3061 avcodec_get_context_defaults2(st
->codec
, CODEC_TYPE_VIDEO
);
3062 bitstream_filters
[nb_output_files
][oc
->nb_streams
- 1]= video_bitstream_filters
;
3063 video_bitstream_filters
= NULL
;
3066 avcodec_thread_init(st
->codec
, thread_count
);
3068 video_enc
= st
->codec
;
3071 video_enc
->codec_tag
= video_codec_tag
;
3073 if( (video_global_header
&1)
3074 || (video_global_header
==0 && (oc
->oformat
->flags
& AVFMT_GLOBALHEADER
))){
3075 video_enc
->flags
|= CODEC_FLAG_GLOBAL_HEADER
;
3076 avcodec_opts
[CODEC_TYPE_VIDEO
]->flags
|= CODEC_FLAG_GLOBAL_HEADER
;
3078 if(video_global_header
&2){
3079 video_enc
->flags2
|= CODEC_FLAG2_LOCAL_HEADER
;
3080 avcodec_opts
[CODEC_TYPE_VIDEO
]->flags2
|= CODEC_FLAG2_LOCAL_HEADER
;
3083 if (video_stream_copy
) {
3084 st
->stream_copy
= 1;
3085 video_enc
->codec_type
= CODEC_TYPE_VIDEO
;
3086 video_enc
->sample_aspect_ratio
=
3087 st
->sample_aspect_ratio
= av_d2q(frame_aspect_ratio
*frame_height
/frame_width
, 255);
3092 AVRational fps
= frame_rate
.num
? frame_rate
: (AVRational
){25,1};
3094 if (video_codec_name
) {
3095 codec_id
= find_codec_or_die(video_codec_name
, CODEC_TYPE_VIDEO
, 1);
3096 codec
= avcodec_find_encoder_by_name(video_codec_name
);
3097 output_codecs
[nb_ocodecs
] = codec
;
3099 codec_id
= av_guess_codec(oc
->oformat
, NULL
, oc
->filename
, NULL
, CODEC_TYPE_VIDEO
);
3100 codec
= avcodec_find_encoder(codec_id
);
3103 video_enc
->codec_id
= codec_id
;
3105 set_context_opts(video_enc
, avcodec_opts
[CODEC_TYPE_VIDEO
], AV_OPT_FLAG_VIDEO_PARAM
| AV_OPT_FLAG_ENCODING_PARAM
);
3107 if (codec
&& codec
->supported_framerates
&& !force_fps
)
3108 fps
= codec
->supported_framerates
[av_find_nearest_q_idx(fps
, codec
->supported_framerates
)];
3109 video_enc
->time_base
.den
= fps
.num
;
3110 video_enc
->time_base
.num
= fps
.den
;
3112 video_enc
->width
= frame_width
+ frame_padright
+ frame_padleft
;
3113 video_enc
->height
= frame_height
+ frame_padtop
+ frame_padbottom
;
3114 video_enc
->sample_aspect_ratio
= av_d2q(frame_aspect_ratio
*video_enc
->height
/video_enc
->width
, 255);
3115 video_enc
->pix_fmt
= frame_pix_fmt
;
3116 st
->sample_aspect_ratio
= video_enc
->sample_aspect_ratio
;
3118 if(codec
&& codec
->pix_fmts
){
3119 const enum PixelFormat
*p
= codec
->pix_fmts
;
3121 if(*p
== video_enc
->pix_fmt
)
3125 video_enc
->pix_fmt
= codec
->pix_fmts
[0];
3129 video_enc
->gop_size
= 0;
3130 if (video_qscale
|| same_quality
) {
3131 video_enc
->flags
|= CODEC_FLAG_QSCALE
;
3132 video_enc
->global_quality
=
3133 st
->quality
= FF_QP2LAMBDA
* video_qscale
;
3137 video_enc
->intra_matrix
= intra_matrix
;
3139 video_enc
->inter_matrix
= inter_matrix
;
3141 video_enc
->thread_count
= thread_count
;
3142 p
= video_rc_override_string
;
3145 int e
=sscanf(p
, "%d,%d,%d", &start
, &end
, &q
);
3147 fprintf(stderr
, "error parsing rc_override\n");
3150 video_enc
->rc_override
=
3151 av_realloc(video_enc
->rc_override
,
3152 sizeof(RcOverride
)*(i
+1));
3153 video_enc
->rc_override
[i
].start_frame
= start
;
3154 video_enc
->rc_override
[i
].end_frame
= end
;
3156 video_enc
->rc_override
[i
].qscale
= q
;
3157 video_enc
->rc_override
[i
].quality_factor
= 1.0;
3160 video_enc
->rc_override
[i
].qscale
= 0;
3161 video_enc
->rc_override
[i
].quality_factor
= -q
/100.0;
3166 video_enc
->rc_override_count
=i
;
3167 if (!video_enc
->rc_initial_buffer_occupancy
)
3168 video_enc
->rc_initial_buffer_occupancy
= video_enc
->rc_buffer_size
*3/4;
3169 video_enc
->me_threshold
= me_threshold
;
3170 video_enc
->intra_dc_precision
= intra_dc_precision
- 8;
3173 video_enc
->flags
|= CODEC_FLAG_PSNR
;
3178 video_enc
->flags
|= CODEC_FLAG_PASS1
;
3180 video_enc
->flags
|= CODEC_FLAG_PASS2
;
3186 /* reset some key parameters */
3188 av_freep(&video_codec_name
);
3189 video_stream_copy
= 0;
3192 static void new_audio_stream(AVFormatContext
*oc
)
3195 AVCodecContext
*audio_enc
;
3196 enum CodecID codec_id
;
3198 st
= av_new_stream(oc
, oc
->nb_streams
);
3200 fprintf(stderr
, "Could not alloc stream\n");
3203 avcodec_get_context_defaults2(st
->codec
, CODEC_TYPE_AUDIO
);
3205 bitstream_filters
[nb_output_files
][oc
->nb_streams
- 1]= audio_bitstream_filters
;
3206 audio_bitstream_filters
= NULL
;
3209 avcodec_thread_init(st
->codec
, thread_count
);
3211 audio_enc
= st
->codec
;
3212 audio_enc
->codec_type
= CODEC_TYPE_AUDIO
;
3215 audio_enc
->codec_tag
= audio_codec_tag
;
3217 if (oc
->oformat
->flags
& AVFMT_GLOBALHEADER
) {
3218 audio_enc
->flags
|= CODEC_FLAG_GLOBAL_HEADER
;
3219 avcodec_opts
[CODEC_TYPE_AUDIO
]->flags
|= CODEC_FLAG_GLOBAL_HEADER
;
3221 if (audio_stream_copy
) {
3222 st
->stream_copy
= 1;
3223 audio_enc
->channels
= audio_channels
;
3227 set_context_opts(audio_enc
, avcodec_opts
[CODEC_TYPE_AUDIO
], AV_OPT_FLAG_AUDIO_PARAM
| AV_OPT_FLAG_ENCODING_PARAM
);
3229 if (audio_codec_name
) {
3230 codec_id
= find_codec_or_die(audio_codec_name
, CODEC_TYPE_AUDIO
, 1);
3231 codec
= avcodec_find_encoder_by_name(audio_codec_name
);
3232 output_codecs
[nb_ocodecs
] = codec
;
3234 codec_id
= av_guess_codec(oc
->oformat
, NULL
, oc
->filename
, NULL
, CODEC_TYPE_AUDIO
);
3235 codec
= avcodec_find_encoder(codec_id
);
3237 audio_enc
->codec_id
= codec_id
;
3239 if (audio_qscale
> QSCALE_NONE
) {
3240 audio_enc
->flags
|= CODEC_FLAG_QSCALE
;
3241 audio_enc
->global_quality
= st
->quality
= FF_QP2LAMBDA
* audio_qscale
;
3243 audio_enc
->thread_count
= thread_count
;
3244 audio_enc
->channels
= audio_channels
;
3245 audio_enc
->sample_fmt
= audio_sample_fmt
;
3246 audio_enc
->channel_layout
= channel_layout
;
3247 if (avcodec_channel_layout_num_channels(channel_layout
) != audio_channels
)
3248 audio_enc
->channel_layout
= 0;
3250 if(codec
&& codec
->sample_fmts
){
3251 const enum SampleFormat
*p
= codec
->sample_fmts
;
3253 if(*p
== audio_enc
->sample_fmt
)
3257 audio_enc
->sample_fmt
= codec
->sample_fmts
[0];
3261 audio_enc
->sample_rate
= audio_sample_rate
;
3262 audio_enc
->time_base
= (AVRational
){1, audio_sample_rate
};
3263 if (audio_language
) {
3264 av_metadata_set(&st
->metadata
, "language", audio_language
);
3265 av_free(audio_language
);
3266 audio_language
= NULL
;
3269 /* reset some key parameters */
3271 av_freep(&audio_codec_name
);
3272 audio_stream_copy
= 0;
3275 static void new_subtitle_stream(AVFormatContext
*oc
)
3278 AVCodecContext
*subtitle_enc
;
3280 st
= av_new_stream(oc
, oc
->nb_streams
);
3282 fprintf(stderr
, "Could not alloc stream\n");
3285 avcodec_get_context_defaults2(st
->codec
, CODEC_TYPE_SUBTITLE
);
3287 bitstream_filters
[nb_output_files
][oc
->nb_streams
- 1]= subtitle_bitstream_filters
;
3288 subtitle_bitstream_filters
= NULL
;
3290 subtitle_enc
= st
->codec
;
3291 subtitle_enc
->codec_type
= CODEC_TYPE_SUBTITLE
;
3293 if(subtitle_codec_tag
)
3294 subtitle_enc
->codec_tag
= subtitle_codec_tag
;
3296 if (subtitle_stream_copy
) {
3297 st
->stream_copy
= 1;
3299 set_context_opts(avcodec_opts
[CODEC_TYPE_SUBTITLE
], subtitle_enc
, AV_OPT_FLAG_SUBTITLE_PARAM
| AV_OPT_FLAG_ENCODING_PARAM
);
3300 subtitle_enc
->codec_id
= find_codec_or_die(subtitle_codec_name
, CODEC_TYPE_SUBTITLE
, 1);
3301 output_codecs
[nb_ocodecs
] = avcodec_find_encoder_by_name(subtitle_codec_name
);
3305 if (subtitle_language
) {
3306 av_metadata_set(&st
->metadata
, "language", subtitle_language
);
3307 av_free(subtitle_language
);
3308 subtitle_language
= NULL
;
3311 subtitle_disable
= 0;
3312 av_freep(&subtitle_codec_name
);
3313 subtitle_stream_copy
= 0;
3316 static void opt_new_audio_stream(void)
3318 AVFormatContext
*oc
;
3319 if (nb_output_files
<= 0) {
3320 fprintf(stderr
, "At least one output file must be specified\n");
3323 oc
= output_files
[nb_output_files
- 1];
3324 new_audio_stream(oc
);
3327 static void opt_new_video_stream(void)
3329 AVFormatContext
*oc
;
3330 if (nb_output_files
<= 0) {
3331 fprintf(stderr
, "At least one output file must be specified\n");
3334 oc
= output_files
[nb_output_files
- 1];
3335 new_video_stream(oc
);
3338 static void opt_new_subtitle_stream(void)
3340 AVFormatContext
*oc
;
3341 if (nb_output_files
<= 0) {
3342 fprintf(stderr
, "At least one output file must be specified\n");
3345 oc
= output_files
[nb_output_files
- 1];
3346 new_subtitle_stream(oc
);
3349 static void opt_output_file(const char *filename
)
3351 AVFormatContext
*oc
;
3352 int use_video
, use_audio
, use_subtitle
;
3353 int input_has_video
, input_has_audio
, input_has_subtitle
;
3354 AVFormatParameters params
, *ap
= ¶ms
;
3356 if (!strcmp(filename
, "-"))
3359 oc
= avformat_alloc_context();
3361 if (!file_oformat
) {
3362 file_oformat
= guess_format(NULL
, filename
, NULL
);
3363 if (!file_oformat
) {
3364 fprintf(stderr
, "Unable to find a suitable output format for '%s'\n",
3370 oc
->oformat
= file_oformat
;
3371 av_strlcpy(oc
->filename
, filename
, sizeof(oc
->filename
));
3373 if (!strcmp(file_oformat
->name
, "ffm") &&
3374 av_strstart(filename
, "http:", NULL
)) {
3375 /* special case for files sent to ffserver: we get the stream
3376 parameters from ffserver */
3377 int err
= read_ffserver_streams(oc
, filename
);
3379 print_error(filename
, err
);
3383 use_video
= file_oformat
->video_codec
!= CODEC_ID_NONE
|| video_stream_copy
|| video_codec_name
;
3384 use_audio
= file_oformat
->audio_codec
!= CODEC_ID_NONE
|| audio_stream_copy
|| audio_codec_name
;
3385 use_subtitle
= file_oformat
->subtitle_codec
!= CODEC_ID_NONE
|| subtitle_stream_copy
|| subtitle_codec_name
;
3387 /* disable if no corresponding type found and at least one
3389 if (nb_input_files
> 0) {
3390 check_audio_video_sub_inputs(&input_has_video
, &input_has_audio
,
3391 &input_has_subtitle
);
3392 if (!input_has_video
)
3394 if (!input_has_audio
)
3396 if (!input_has_subtitle
)
3400 /* manual disable */
3401 if (audio_disable
) {
3404 if (video_disable
) {
3407 if (subtitle_disable
) {
3412 new_video_stream(oc
);
3416 new_audio_stream(oc
);
3420 new_subtitle_stream(oc
);
3423 oc
->timestamp
= rec_timestamp
;
3425 for(; metadata_count
>0; metadata_count
--){
3426 av_metadata_set(&oc
->metadata
, metadata
[metadata_count
-1].key
,
3427 metadata
[metadata_count
-1].value
);
3429 av_metadata_conv(oc
, oc
->oformat
->metadata_conv
, NULL
);
3432 output_files
[nb_output_files
++] = oc
;
3434 /* check filename in case of an image number is expected */
3435 if (oc
->oformat
->flags
& AVFMT_NEEDNUMBER
) {
3436 if (!av_filename_number_test(oc
->filename
)) {
3437 print_error(oc
->filename
, AVERROR_NUMEXPECTED
);
3442 if (!(oc
->oformat
->flags
& AVFMT_NOFILE
)) {
3443 /* test if it already exists to avoid loosing precious files */
3444 if (!file_overwrite
&&
3445 (strchr(filename
, ':') == NULL
||
3446 filename
[1] == ':' ||
3447 av_strstart(filename
, "file:", NULL
))) {
3448 if (url_exist(filename
)) {
3450 fprintf(stderr
,"File '%s' already exists. Overwrite ? [y/N] ", filename
);
3452 if (!read_yesno()) {
3453 fprintf(stderr
, "Not overwriting - exiting\n");
3458 fprintf(stderr
,"File '%s' already exists. Exiting.\n", filename
);
3465 if (url_fopen(&oc
->pb
, filename
, URL_WRONLY
) < 0) {
3466 fprintf(stderr
, "Could not open '%s'\n", filename
);
3471 memset(ap
, 0, sizeof(*ap
));
3472 if (av_set_parameters(oc
, ap
) < 0) {
3473 fprintf(stderr
, "%s: Invalid encoding parameters\n",
3478 oc
->preload
= (int)(mux_preload
*AV_TIME_BASE
);
3479 oc
->max_delay
= (int)(mux_max_delay
*AV_TIME_BASE
);
3480 oc
->loop_output
= loop_output
;
3481 oc
->flags
|= AVFMT_FLAG_NONBLOCK
;
3483 set_context_opts(oc
, avformat_opts
, AV_OPT_FLAG_ENCODING_PARAM
);
3485 /* reset some options */
3486 file_oformat
= NULL
;
3487 file_iformat
= NULL
;
3490 /* same option as mencoder */
3491 static void opt_pass(const char *pass_str
)
3494 pass
= atoi(pass_str
);
3495 if (pass
!= 1 && pass
!= 2) {
3496 fprintf(stderr
, "pass number can be only 1 or 2\n");
3502 static int64_t getutime(void)
3505 struct rusage rusage
;
3507 getrusage(RUSAGE_SELF
, &rusage
);
3508 return (rusage
.ru_utime
.tv_sec
* 1000000LL) + rusage
.ru_utime
.tv_usec
;
3509 #elif HAVE_GETPROCESSTIMES
3511 FILETIME c
, e
, k
, u
;
3512 proc
= GetCurrentProcess();
3513 GetProcessTimes(proc
, &c
, &e
, &k
, &u
);
3514 return ((int64_t) u
.dwHighDateTime
<< 32 | u
.dwLowDateTime
) / 10;
3516 return av_gettime();
3520 static void parse_matrix_coeffs(uint16_t *dest
, const char *str
)
3523 const char *p
= str
;
3530 fprintf(stderr
, "Syntax error in matrix \"%s\" at coeff %d\n", str
, i
);
3537 static void opt_inter_matrix(const char *arg
)
3539 inter_matrix
= av_mallocz(sizeof(uint16_t) * 64);
3540 parse_matrix_coeffs(inter_matrix
, arg
);
3543 static void opt_intra_matrix(const char *arg
)
3545 intra_matrix
= av_mallocz(sizeof(uint16_t) * 64);
3546 parse_matrix_coeffs(intra_matrix
, arg
);
3550 * Trivial log callback.
3551 * Only suitable for show_help and similar since it lacks prefix handling.
3553 static void log_callback_help(void* ptr
, int level
, const char* fmt
, va_list vl
)
3555 vfprintf(stdout
, fmt
, vl
);
3558 static void show_help(void)
3560 av_log_set_callback(log_callback_help
);
3561 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3562 "Hyper fast Audio and Video encoder\n");
3564 show_help_options(options
, "Main options:\n",
3565 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_SUBTITLE
| OPT_GRAB
, 0);
3566 show_help_options(options
, "\nAdvanced options:\n",
3567 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_SUBTITLE
| OPT_GRAB
,
3569 show_help_options(options
, "\nVideo options:\n",
3570 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_GRAB
,
3572 show_help_options(options
, "\nAdvanced Video options:\n",
3573 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_GRAB
,
3574 OPT_VIDEO
| OPT_EXPERT
);
3575 show_help_options(options
, "\nAudio options:\n",
3576 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_GRAB
,
3578 show_help_options(options
, "\nAdvanced Audio options:\n",
3579 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_GRAB
,
3580 OPT_AUDIO
| OPT_EXPERT
);
3581 show_help_options(options
, "\nSubtitle options:\n",
3582 OPT_SUBTITLE
| OPT_GRAB
,
3584 show_help_options(options
, "\nAudio/Video grab options:\n",
3588 av_opt_show(avcodec_opts
[0], NULL
);
3590 av_opt_show(avformat_opts
, NULL
);
3592 av_opt_show(sws_opts
, NULL
);
3595 static void opt_target(const char *arg
)
3598 static const char *const frame_rates
[] = {"25", "30000/1001", "24000/1001"};
3600 if(!strncmp(arg
, "pal-", 4)) {
3603 } else if(!strncmp(arg
, "ntsc-", 5)) {
3606 } else if(!strncmp(arg
, "film-", 5)) {
3611 /* Calculate FR via float to avoid int overflow */
3612 fr
= (int)(frame_rate
.num
* 1000.0 / frame_rate
.den
);
3615 } else if((fr
== 29970) || (fr
== 23976)) {
3618 /* Try to determine PAL/NTSC by peeking in the input files */
3619 if(nb_input_files
) {
3621 for(j
= 0; j
< nb_input_files
; j
++) {
3622 for(i
= 0; i
< input_files
[j
]->nb_streams
; i
++) {
3623 AVCodecContext
*c
= input_files
[j
]->streams
[i
]->codec
;
3624 if(c
->codec_type
!= CODEC_TYPE_VIDEO
)
3626 fr
= c
->time_base
.den
* 1000 / c
->time_base
.num
;
3630 } else if((fr
== 29970) || (fr
== 23976)) {
3640 if(verbose
&& norm
>= 0)
3641 fprintf(stderr
, "Assuming %s for target.\n", norm
? "NTSC" : "PAL");
3645 fprintf(stderr
, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3646 fprintf(stderr
, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3647 fprintf(stderr
, "or set a framerate with \"-r xxx\".\n");
3651 if(!strcmp(arg
, "vcd")) {
3653 opt_video_codec("mpeg1video");
3654 opt_audio_codec("mp2");
3657 opt_frame_size(norm
? "352x240" : "352x288");
3658 opt_frame_rate(NULL
, frame_rates
[norm
]);
3659 opt_default("g", norm
? "18" : "15");
3661 opt_default("b", "1150000");
3662 opt_default("maxrate", "1150000");
3663 opt_default("minrate", "1150000");
3664 opt_default("bufsize", "327680"); // 40*1024*8;
3666 opt_default("ab", "224000");
3667 audio_sample_rate
= 44100;
3670 opt_default("packetsize", "2324");
3671 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3673 /* We have to offset the PTS, so that it is consistent with the SCR.
3674 SCR starts at 36000, but the first two packs contain only padding
3675 and the first pack from the other stream, respectively, may also have
3676 been written before.
3677 So the real data starts at SCR 36000+3*1200. */
3678 mux_preload
= (36000+3*1200) / 90000.0; //0.44
3679 } else if(!strcmp(arg
, "svcd")) {
3681 opt_video_codec("mpeg2video");
3682 opt_audio_codec("mp2");
3685 opt_frame_size(norm
? "480x480" : "480x576");
3686 opt_frame_rate(NULL
, frame_rates
[norm
]);
3687 opt_default("g", norm
? "18" : "15");
3689 opt_default("b", "2040000");
3690 opt_default("maxrate", "2516000");
3691 opt_default("minrate", "0"); //1145000;
3692 opt_default("bufsize", "1835008"); //224*1024*8;
3693 opt_default("flags", "+scan_offset");
3696 opt_default("ab", "224000");
3697 audio_sample_rate
= 44100;
3699 opt_default("packetsize", "2324");
3701 } else if(!strcmp(arg
, "dvd")) {
3703 opt_video_codec("mpeg2video");
3704 opt_audio_codec("ac3");
3707 opt_frame_size(norm
? "720x480" : "720x576");
3708 opt_frame_rate(NULL
, frame_rates
[norm
]);
3709 opt_default("g", norm
? "18" : "15");
3711 opt_default("b", "6000000");
3712 opt_default("maxrate", "9000000");
3713 opt_default("minrate", "0"); //1500000;
3714 opt_default("bufsize", "1835008"); //224*1024*8;
3716 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3717 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3719 opt_default("ab", "448000");
3720 audio_sample_rate
= 48000;
3722 } else if(!strncmp(arg
, "dv", 2)) {
3726 opt_frame_size(norm
? "720x480" : "720x576");
3727 opt_frame_pix_fmt(!strncmp(arg
, "dv50", 4) ? "yuv422p" :
3728 (norm
? "yuv411p" : "yuv420p"));
3729 opt_frame_rate(NULL
, frame_rates
[norm
]);
3731 audio_sample_rate
= 48000;
3735 fprintf(stderr
, "Unknown target: %s\n", arg
);
3740 static void opt_vstats_file (const char *arg
)
3742 av_free (vstats_filename
);
3743 vstats_filename
=av_strdup (arg
);
3746 static void opt_vstats (void)
3749 time_t today2
= time(NULL
);
3750 struct tm
*today
= localtime(&today2
);
3752 snprintf(filename
, sizeof(filename
), "vstats_%02d%02d%02d.log", today
->tm_hour
, today
->tm_min
,
3754 opt_vstats_file(filename
);
3757 static int opt_bsf(const char *opt
, const char *arg
)
3759 AVBitStreamFilterContext
*bsfc
= av_bitstream_filter_init(arg
); //FIXME split name and args for filter at '='
3760 AVBitStreamFilterContext
**bsfp
;
3763 fprintf(stderr
, "Unknown bitstream filter %s\n", arg
);
3767 bsfp
= *opt
== 'v' ? &video_bitstream_filters
:
3768 *opt
== 'a' ? &audio_bitstream_filters
:
3769 &subtitle_bitstream_filters
;
3771 bsfp
= &(*bsfp
)->next
;
3778 static int opt_preset(const char *opt
, const char *arg
)
3781 char filename
[1000], tmp
[1000], tmp2
[1000], line
[1000];
3783 const char *base
[2]= { getenv("HOME"),
3787 for(i
=!base
[0]; i
<2 && !f
; i
++){
3788 snprintf(filename
, sizeof(filename
), "%s%s/%s.ffpreset", base
[i
], i
? "" : "/.ffmpeg", arg
);
3789 f
= fopen(filename
, "r");
3791 char *codec_name
= *opt
== 'v' ? video_codec_name
:
3792 *opt
== 'a' ? audio_codec_name
:
3793 subtitle_codec_name
;
3794 snprintf(filename
, sizeof(filename
), "%s%s/%s-%s.ffpreset", base
[i
], i
? "" : "/.ffmpeg", codec_name
, arg
);
3795 f
= fopen(filename
, "r");
3798 if(!f
&& ((arg
[0]=='.' && arg
[1]=='/') || arg
[0]=='/' ||
3800 av_strlcpy(filename
, arg
, sizeof(filename
));
3801 f
= fopen(filename
, "r");
3805 fprintf(stderr
, "File for preset '%s' not found\n", arg
);
3810 int e
= fscanf(f
, "%999[^\n]\n", line
) - 1;
3811 if(line
[0] == '#' && !e
)
3813 e
|= sscanf(line
, "%999[^=]=%999[^\n]\n", tmp
, tmp2
) - 2;
3815 fprintf(stderr
, "%s: Invalid syntax: '%s'\n", filename
, line
);
3818 if(!strcmp(tmp
, "acodec")){
3819 opt_audio_codec(tmp2
);
3820 }else if(!strcmp(tmp
, "vcodec")){
3821 opt_video_codec(tmp2
);
3822 }else if(!strcmp(tmp
, "scodec")){
3823 opt_subtitle_codec(tmp2
);
3824 }else if(opt_default(tmp
, tmp2
) < 0){
3825 fprintf(stderr
, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename
, line
, tmp
, tmp2
);
3835 static const OptionDef options
[] = {
3837 { "L", OPT_EXIT
, {(void*)show_license
}, "show license" },
3838 { "h", OPT_EXIT
, {(void*)show_help
}, "show help" },
3839 { "version", OPT_EXIT
, {(void*)show_version
}, "show version" },
3840 { "formats", OPT_EXIT
, {(void*)show_formats
}, "show available formats, codecs, protocols, ..." },
3841 { "f", HAS_ARG
, {(void*)opt_format
}, "force format", "fmt" },
3842 { "i", HAS_ARG
, {(void*)opt_input_file
}, "input file name", "filename" },
3843 { "y", OPT_BOOL
, {(void*)&file_overwrite
}, "overwrite output files" },
3844 { "map", HAS_ARG
| OPT_EXPERT
, {(void*)opt_map
}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3845 { "map_meta_data", HAS_ARG
| OPT_EXPERT
, {(void*)opt_map_meta_data
}, "set meta data information of outfile from infile", "outfile:infile" },
3846 { "t", OPT_FUNC2
| HAS_ARG
, {(void*)opt_recording_time
}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3847 { "fs", HAS_ARG
| OPT_INT64
, {(void*)&limit_filesize
}, "set the limit file size in bytes", "limit_size" }, //
3848 { "ss", OPT_FUNC2
| HAS_ARG
, {(void*)opt_start_time
}, "set the start time offset", "time_off" },
3849 { "itsoffset", OPT_FUNC2
| HAS_ARG
, {(void*)opt_input_ts_offset
}, "set the input ts offset", "time_off" },
3850 { "itsscale", HAS_ARG
, {(void*)opt_input_ts_scale
}, "set the input ts scale", "stream:scale" },
3851 { "timestamp", OPT_FUNC2
| HAS_ARG
, {(void*)opt_rec_timestamp
}, "set the timestamp ('now' to set the current time)", "time" },
3852 { "metadata", OPT_FUNC2
| HAS_ARG
, {(void*)opt_metadata
}, "add metadata", "string=string" },
3853 { "dframes", OPT_INT
| HAS_ARG
, {(void*)&max_frames
[CODEC_TYPE_DATA
]}, "set the number of data frames to record", "number" },
3854 { "benchmark", OPT_BOOL
| OPT_EXPERT
, {(void*)&do_benchmark
},
3855 "add timings for benchmarking" },
3856 { "dump", OPT_BOOL
| OPT_EXPERT
, {(void*)&do_pkt_dump
},
3857 "dump each input packet" },
3858 { "hex", OPT_BOOL
| OPT_EXPERT
, {(void*)&do_hex_dump
},
3859 "when dumping packets, also dump the payload" },
3860 { "re", OPT_BOOL
| OPT_EXPERT
, {(void*)&rate_emu
}, "read input at native frame rate", "" },
3861 { "loop_input", OPT_BOOL
| OPT_EXPERT
, {(void*)&loop_input
}, "loop (current only works with images)" },
3862 { "loop_output", HAS_ARG
| OPT_INT
| OPT_EXPERT
, {(void*)&loop_output
}, "number of times to loop output in formats that support looping (0 loops forever)", "" },
3863 { "v", HAS_ARG
| OPT_FUNC2
, {(void*)opt_verbose
}, "set ffmpeg verbosity level", "number" },
3864 { "loglevel", HAS_ARG
| OPT_FUNC2
, {(void*)opt_loglevel
}, "set libav* logging level", "logging level number or string" },
3865 { "target", HAS_ARG
, {(void*)opt_target
}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3866 { "threads", OPT_FUNC2
| HAS_ARG
| OPT_EXPERT
, {(void*)opt_thread_count
}, "thread count", "count" },
3867 { "vsync", HAS_ARG
| OPT_INT
| OPT_EXPERT
, {(void*)&video_sync_method
}, "video sync method", "" },
3868 { "async", HAS_ARG
| OPT_INT
| OPT_EXPERT
, {(void*)&audio_sync_method
}, "audio sync method", "" },
3869 { "adrift_threshold", HAS_ARG
| OPT_FLOAT
| OPT_EXPERT
, {(void*)&audio_drift_threshold
}, "audio drift threshold", "threshold" },
3870 { "vglobal", HAS_ARG
| OPT_INT
| OPT_EXPERT
, {(void*)&video_global_header
}, "video global header storage type", "" },
3871 { "copyts", OPT_BOOL
| OPT_EXPERT
, {(void*)©_ts
}, "copy timestamps" },
3872 { "shortest", OPT_BOOL
| OPT_EXPERT
, {(void*)&opt_shortest
}, "finish encoding within shortest input" }, //
3873 { "dts_delta_threshold", HAS_ARG
| OPT_FLOAT
| OPT_EXPERT
, {(void*)&dts_delta_threshold
}, "timestamp discontinuity delta threshold", "threshold" },
3874 { "programid", HAS_ARG
| OPT_INT
| OPT_EXPERT
, {(void*)&opt_programid
}, "desired program number", "" },
3875 { "xerror", OPT_BOOL
, {(void*)&exit_on_error
}, "exit on error", "error" },
3876 { "copyinkf", OPT_BOOL
| OPT_EXPERT
, {(void*)©_initial_nonkeyframes
}, "copy initial non-keyframes" },
3879 { "b", OPT_FUNC2
| HAS_ARG
| OPT_VIDEO
, {(void*)opt_bitrate
}, "set bitrate (in bits/s)", "bitrate" },
3880 { "vb", OPT_FUNC2
| HAS_ARG
| OPT_VIDEO
, {(void*)opt_bitrate
}, "set bitrate (in bits/s)", "bitrate" },
3881 { "vframes", OPT_INT
| HAS_ARG
| OPT_VIDEO
, {(void*)&max_frames
[CODEC_TYPE_VIDEO
]}, "set the number of video frames to record", "number" },
3882 { "r", OPT_FUNC2
| HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_rate
}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3883 { "s", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_size
}, "set frame size (WxH or abbreviation)", "size" },
3884 { "aspect", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_aspect_ratio
}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3885 { "pix_fmt", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_frame_pix_fmt
}, "set pixel format, 'list' as argument shows all the pixel formats supported", "format" },
3886 { "croptop", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_crop_top
}, "set top crop band size (in pixels)", "size" },
3887 { "cropbottom", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_crop_bottom
}, "set bottom crop band size (in pixels)", "size" },
3888 { "cropleft", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_crop_left
}, "set left crop band size (in pixels)", "size" },
3889 { "cropright", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_crop_right
}, "set right crop band size (in pixels)", "size" },
3890 { "padtop", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_pad_top
}, "set top pad band size (in pixels)", "size" },
3891 { "padbottom", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_pad_bottom
}, "set bottom pad band size (in pixels)", "size" },
3892 { "padleft", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_pad_left
}, "set left pad band size (in pixels)", "size" },
3893 { "padright", HAS_ARG
| OPT_VIDEO
, {(void*)opt_frame_pad_right
}, "set right pad band size (in pixels)", "size" },
3894 { "padcolor", HAS_ARG
| OPT_VIDEO
, {(void*)opt_pad_color
}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3895 { "intra", OPT_BOOL
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&intra_only
}, "use only intra frames"},
3896 { "vn", OPT_BOOL
| OPT_VIDEO
, {(void*)&video_disable
}, "disable video" },
3897 { "vdt", OPT_INT
| HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&video_discard
}, "discard threshold", "n" },
3898 { "qscale", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_qscale
}, "use fixed video quantizer scale (VBR)", "q" },
3899 { "rc_override", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_video_rc_override_string
}, "rate control override for specific intervals", "override" },
3900 { "vcodec", HAS_ARG
| OPT_VIDEO
, {(void*)opt_video_codec
}, "force video codec ('copy' to copy stream)", "codec" },
3901 { "me_threshold", HAS_ARG
| OPT_FUNC2
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_me_threshold
}, "motion estimaton threshold", "threshold" },
3902 { "sameq", OPT_BOOL
| OPT_VIDEO
, {(void*)&same_quality
},
3903 "use same video quality as source (implies VBR)" },
3904 { "pass", HAS_ARG
| OPT_VIDEO
, {(void*)&opt_pass
}, "select the pass number (1 or 2)", "n" },
3905 { "passlogfile", HAS_ARG
| OPT_STRING
| OPT_VIDEO
, {(void*)&pass_logfilename_prefix
}, "select two pass log file name prefix", "prefix" },
3906 { "deinterlace", OPT_BOOL
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&do_deinterlace
},
3907 "deinterlace pictures" },
3908 { "psnr", OPT_BOOL
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&do_psnr
}, "calculate PSNR of compressed frames" },
3909 { "vstats", OPT_EXPERT
| OPT_VIDEO
, {(void*)&opt_vstats
}, "dump video coding statistics to file" },
3910 { "vstats_file", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_vstats_file
}, "dump video coding statistics to file", "file" },
3911 { "intra_matrix", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_intra_matrix
}, "specify intra matrix coeffs", "matrix" },
3912 { "inter_matrix", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_inter_matrix
}, "specify inter matrix coeffs", "matrix" },
3913 { "top", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_top_field_first
}, "top=1/bottom=0/auto=-1 field first", "" },
3914 { "dc", OPT_INT
| HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&intra_dc_precision
}, "intra_dc_precision", "precision" },
3915 { "vtag", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, {(void*)opt_video_tag
}, "force video tag/fourcc", "fourcc/tag" },
3916 { "newvideo", OPT_VIDEO
, {(void*)opt_new_video_stream
}, "add a new video stream to the current output stream" },
3917 { "qphist", OPT_BOOL
| OPT_EXPERT
| OPT_VIDEO
, { (void *)&qp_hist
}, "show QP histogram" },
3918 { "force_fps", OPT_BOOL
| OPT_EXPERT
| OPT_VIDEO
, {(void*)&force_fps
}, "force the selected framerate, disable the best supported framerate selection" },
3921 { "ab", OPT_FUNC2
| HAS_ARG
| OPT_AUDIO
, {(void*)opt_bitrate
}, "set bitrate (in bits/s)", "bitrate" },
3922 { "aframes", OPT_INT
| HAS_ARG
| OPT_AUDIO
, {(void*)&max_frames
[CODEC_TYPE_AUDIO
]}, "set the number of audio frames to record", "number" },
3923 { "aq", OPT_FLOAT
| HAS_ARG
| OPT_AUDIO
, {(void*)&audio_qscale
}, "set audio quality (codec-specific)", "quality", },
3924 { "ar", HAS_ARG
| OPT_FUNC2
| OPT_AUDIO
, {(void*)opt_audio_rate
}, "set audio sampling rate (in Hz)", "rate" },
3925 { "ac", HAS_ARG
| OPT_FUNC2
| OPT_AUDIO
, {(void*)opt_audio_channels
}, "set number of audio channels", "channels" },
3926 { "an", OPT_BOOL
| OPT_AUDIO
, {(void*)&audio_disable
}, "disable audio" },
3927 { "acodec", HAS_ARG
| OPT_AUDIO
, {(void*)opt_audio_codec
}, "force audio codec ('copy' to copy stream)", "codec" },
3928 { "atag", HAS_ARG
| OPT_EXPERT
| OPT_AUDIO
, {(void*)opt_audio_tag
}, "force audio tag/fourcc", "fourcc/tag" },
3929 { "vol", OPT_INT
| HAS_ARG
| OPT_AUDIO
, {(void*)&audio_volume
}, "change audio volume (256=normal)" , "volume" }, //
3930 { "newaudio", OPT_AUDIO
, {(void*)opt_new_audio_stream
}, "add a new audio stream to the current output stream" },
3931 { "alang", HAS_ARG
| OPT_STRING
| OPT_AUDIO
, {(void *)&audio_language
}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3932 { "sample_fmt", HAS_ARG
| OPT_EXPERT
| OPT_AUDIO
, {(void*)opt_audio_sample_fmt
}, "set sample format, 'list' as argument shows all the sample formats supported", "format" },
3934 /* subtitle options */
3935 { "sn", OPT_BOOL
| OPT_SUBTITLE
, {(void*)&subtitle_disable
}, "disable subtitle" },
3936 { "scodec", HAS_ARG
| OPT_SUBTITLE
, {(void*)opt_subtitle_codec
}, "force subtitle codec ('copy' to copy stream)", "codec" },
3937 { "newsubtitle", OPT_SUBTITLE
, {(void*)opt_new_subtitle_stream
}, "add a new subtitle stream to the current output stream" },
3938 { "slang", HAS_ARG
| OPT_STRING
| OPT_SUBTITLE
, {(void *)&subtitle_language
}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3939 { "stag", HAS_ARG
| OPT_EXPERT
| OPT_SUBTITLE
, {(void*)opt_subtitle_tag
}, "force subtitle tag/fourcc", "fourcc/tag" },
3942 { "vc", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
| OPT_GRAB
, {(void*)opt_video_channel
}, "set video grab channel (DV1394 only)", "channel" },
3943 { "tvstd", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
| OPT_GRAB
, {(void*)opt_video_standard
}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3944 { "isync", OPT_BOOL
| OPT_EXPERT
| OPT_GRAB
, {(void*)&input_sync
}, "sync read on input", "" },
3947 { "muxdelay", OPT_FLOAT
| HAS_ARG
| OPT_EXPERT
, {(void*)&mux_max_delay
}, "set the maximum demux-decode delay", "seconds" },
3948 { "muxpreload", OPT_FLOAT
| HAS_ARG
| OPT_EXPERT
, {(void*)&mux_preload
}, "set the initial demux-decode delay", "seconds" },
3950 { "absf", OPT_FUNC2
| HAS_ARG
| OPT_AUDIO
| OPT_EXPERT
, {(void*)opt_bsf
}, "", "bitstream_filter" },
3951 { "vbsf", OPT_FUNC2
| HAS_ARG
| OPT_VIDEO
| OPT_EXPERT
, {(void*)opt_bsf
}, "", "bitstream_filter" },
3952 { "sbsf", OPT_FUNC2
| HAS_ARG
| OPT_SUBTITLE
| OPT_EXPERT
, {(void*)opt_bsf
}, "", "bitstream_filter" },
3954 { "apre", OPT_FUNC2
| HAS_ARG
| OPT_AUDIO
| OPT_EXPERT
, {(void*)opt_preset
}, "set the audio options to the indicated preset", "preset" },
3955 { "vpre", OPT_FUNC2
| HAS_ARG
| OPT_VIDEO
| OPT_EXPERT
, {(void*)opt_preset
}, "set the video options to the indicated preset", "preset" },
3956 { "spre", OPT_FUNC2
| HAS_ARG
| OPT_SUBTITLE
| OPT_EXPERT
, {(void*)opt_preset
}, "set the subtitle options to the indicated preset", "preset" },
3958 { "default", OPT_FUNC2
| HAS_ARG
| OPT_AUDIO
| OPT_VIDEO
| OPT_EXPERT
, {(void*)opt_default
}, "generic catch all option", "" },
3962 int main(int argc
, char **argv
)
3967 avcodec_register_all();
3968 avdevice_register_all();
3972 if(isatty(STDIN_FILENO
))
3973 url_set_interrupt_cb(decode_interrupt_cb
);
3976 for(i
=0; i
<CODEC_TYPE_NB
; i
++){
3977 avcodec_opts
[i
]= avcodec_alloc_context2(i
);
3979 avformat_opts
= avformat_alloc_context();
3980 sws_opts
= sws_getContext(16,16,0, 16,16,0, sws_flags
, NULL
,NULL
,NULL
);
3985 parse_options(argc
, argv
, options
, opt_output_file
);
3987 /* file converter / grab */
3988 if (nb_output_files
<= 0) {
3989 fprintf(stderr
, "At least one output file must be specified\n");
3993 if (nb_input_files
== 0) {
3994 fprintf(stderr
, "At least one input file must be specified\n");
3999 if (av_encode(output_files
, nb_output_files
, input_files
, nb_input_files
,
4000 stream_maps
, nb_stream_maps
) < 0)
4002 ti
= getutime() - ti
;
4004 printf("bench: utime=%0.3fs\n", ti
/ 1000000.0);