3 * Copyright (c) 2000-2011 The libav developers.
5 * This file is part of Libav.
7 * Libav 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 * Libav 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 Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/dict.h"
43 #include "libavutil/mathematics.h"
44 #include "libavutil/pixdesc.h"
45 #include "libavutil/avstring.h"
46 #include "libavutil/libm.h"
47 #include "libavutil/imgutils.h"
48 #include "libavformat/os_support.h"
51 # include "libavfilter/avfilter.h"
52 # include "libavfilter/avfiltergraph.h"
53 # include "libavfilter/buffersrc.h"
54 # include "libavfilter/vsrc_buffer.h"
57 #if HAVE_SYS_RESOURCE_H
58 #include <sys/types.h>
60 #include <sys/resource.h>
61 #elif HAVE_GETPROCESSTIMES
64 #if HAVE_GETPROCESSMEMORYINFO
70 #include <sys/select.h>
77 #include "libavutil/avassert.h"
79 const char program_name
[] = "avconv";
80 const int program_birth_year
= 2000;
82 /* select an input stream for an output stream */
83 typedef struct StreamMap
{
84 int disabled
; /** 1 is this mapping is disabled by a negative map */
88 int sync_stream_index
;
92 * select an input file for an output file
94 typedef struct MetadataMap
{
95 int file
; ///< file index
96 char type
; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
97 int index
; ///< stream/chapter/program number
100 static const OptionDef options
[];
102 static int video_discard
= 0;
103 static int same_quant
= 0;
104 static int do_deinterlace
= 0;
105 static int intra_dc_precision
= 8;
106 static int qp_hist
= 0;
108 static int file_overwrite
= 0;
109 static int do_benchmark
= 0;
110 static int do_hex_dump
= 0;
111 static int do_pkt_dump
= 0;
112 static int do_pass
= 0;
113 static char *pass_logfilename_prefix
= NULL
;
114 static int video_sync_method
= -1;
115 static int audio_sync_method
= 0;
116 static float audio_drift_threshold
= 0.1;
117 static int copy_ts
= 0;
118 static int copy_tb
= 1;
119 static int opt_shortest
= 0;
120 static char *vstats_filename
;
121 static FILE *vstats_file
;
123 static int audio_volume
= 256;
125 static int exit_on_error
= 0;
126 static int using_stdin
= 0;
127 static int64_t video_size
= 0;
128 static int64_t audio_size
= 0;
129 static int64_t extra_size
= 0;
130 static int nb_frames_dup
= 0;
131 static int nb_frames_drop
= 0;
132 static int input_sync
;
134 static float dts_delta_threshold
= 10;
136 static int print_stats
= 1;
138 static uint8_t *audio_buf
;
139 static uint8_t *audio_out
;
140 static unsigned int allocated_audio_out_size
, allocated_audio_buf_size
;
142 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
144 typedef struct FrameBuffer
{
150 enum PixelFormat pix_fmt
;
153 struct InputStream
*ist
;
154 struct FrameBuffer
*next
;
157 typedef struct InputStream
{
160 int discard
; /* true if stream data should be discarded */
161 int decoding_needed
; /* true if the packets must be decoded in 'raw_fifo' */
163 AVFrame
*decoded_frame
;
164 AVFrame
*filtered_frame
;
166 int64_t start
; /* time when read started */
167 int64_t next_pts
; /* synthetic pts for cases where pkt.pts
169 int64_t pts
; /* current pts */
170 PtsCorrectionContext pts_ctx
;
172 int is_start
; /* is 1 at the start and after a discontinuity */
173 int showed_multi_packet_warning
;
176 /* a pool of free buffers for decoded data */
177 FrameBuffer
*buffer_pool
;
180 typedef struct InputFile
{
181 AVFormatContext
*ctx
;
182 int eof_reached
; /* true if eof reached */
183 int ist_index
; /* index of first stream in ist_table */
184 int buffer_size
; /* current total buffer size */
186 int nb_streams
; /* number of stream that avconv is aware of; may be different
187 from ctx.nb_streams if new streams appear during av_read_frame() */
191 typedef struct OutputStream
{
192 int file_index
; /* file index */
193 int index
; /* stream index in the output file */
194 int source_index
; /* InputStream index */
195 AVStream
*st
; /* stream in the output file */
196 int encoding_needed
; /* true if encoding needed for this stream */
198 /* input pts and corresponding output pts
200 // double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
201 struct InputStream
*sync_ist
; /* input stream to sync against */
202 int64_t sync_opts
; /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
203 AVBitStreamFilterContext
*bitstream_filters
;
209 AVFrame pict_tmp
; /* temporary image for resampling */
210 struct SwsContext
*img_resample_ctx
; /* for image resampling */
213 int resample_pix_fmt
;
214 AVRational frame_rate
;
218 float frame_aspect_ratio
;
220 /* forced key frames */
221 int64_t *forced_kf_pts
;
227 ReSampleContext
*resample
; /* for audio resampling */
228 int resample_sample_fmt
;
229 int resample_channels
;
230 int resample_sample_rate
;
232 AVAudioConvert
*reformat_ctx
;
233 AVFifoBuffer
*fifo
; /* for compression: one audio fifo per codec */
237 AVFilterContext
*output_video_filter
;
238 AVFilterContext
*input_video_filter
;
239 AVFilterBufferRef
*picref
;
241 AVFilterGraph
*graph
;
246 int is_past_recording_time
;
248 const char *attachment_filename
;
249 int copy_initial_nonkeyframes
;
253 typedef struct OutputFile
{
254 AVFormatContext
*ctx
;
256 int ost_index
; /* index of the first stream in output_streams */
257 int64_t recording_time
; /* desired length of the resulting file in microseconds */
258 int64_t start_time
; /* start time in microseconds */
259 uint64_t limit_filesize
;
262 static InputStream
*input_streams
= NULL
;
263 static int nb_input_streams
= 0;
264 static InputFile
*input_files
= NULL
;
265 static int nb_input_files
= 0;
267 static OutputStream
*output_streams
= NULL
;
268 static int nb_output_streams
= 0;
269 static OutputFile
*output_files
= NULL
;
270 static int nb_output_files
= 0;
272 typedef struct OptionsContext
{
273 /* input/output options */
277 SpecifierOpt
*codec_names
;
279 SpecifierOpt
*audio_channels
;
280 int nb_audio_channels
;
281 SpecifierOpt
*audio_sample_rate
;
282 int nb_audio_sample_rate
;
283 SpecifierOpt
*frame_rates
;
285 SpecifierOpt
*frame_sizes
;
287 SpecifierOpt
*frame_pix_fmts
;
288 int nb_frame_pix_fmts
;
291 int64_t input_ts_offset
;
294 SpecifierOpt
*ts_scale
;
296 SpecifierOpt
*dump_attachment
;
297 int nb_dump_attachment
;
300 StreamMap
*stream_maps
;
302 /* first item specifies output metadata, second is input */
303 MetadataMap (*meta_data_maps
)[2];
304 int nb_meta_data_maps
;
305 int metadata_global_manual
;
306 int metadata_streams_manual
;
307 int metadata_chapters_manual
;
308 const char **attachments
;
311 int chapters_input_file
;
313 int64_t recording_time
;
314 uint64_t limit_filesize
;
320 int subtitle_disable
;
323 /* indexed by output file stream index */
327 SpecifierOpt
*metadata
;
329 SpecifierOpt
*max_frames
;
331 SpecifierOpt
*bitstream_filters
;
332 int nb_bitstream_filters
;
333 SpecifierOpt
*codec_tags
;
335 SpecifierOpt
*sample_fmts
;
337 SpecifierOpt
*qscale
;
339 SpecifierOpt
*forced_key_frames
;
340 int nb_forced_key_frames
;
341 SpecifierOpt
*force_fps
;
343 SpecifierOpt
*frame_aspect_ratios
;
344 int nb_frame_aspect_ratios
;
345 SpecifierOpt
*rc_overrides
;
347 SpecifierOpt
*intra_matrices
;
348 int nb_intra_matrices
;
349 SpecifierOpt
*inter_matrices
;
350 int nb_inter_matrices
;
351 SpecifierOpt
*top_field_first
;
352 int nb_top_field_first
;
353 SpecifierOpt
*metadata_map
;
355 SpecifierOpt
*presets
;
357 SpecifierOpt
*copy_initial_nonkeyframes
;
358 int nb_copy_initial_nonkeyframes
;
360 SpecifierOpt
*filters
;
365 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
368 for (i = 0; i < o->nb_ ## name; i++) {\
369 char *spec = o->name[i].specifier;\
370 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
371 outvar = o->name[i].u.type;\
377 static void reset_options(OptionsContext
*o
)
379 const OptionDef
*po
= options
;
381 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
383 void *dst
= (uint8_t*)o
+ po
->u
.off
;
385 if (po
->flags
& OPT_SPEC
) {
386 SpecifierOpt
**so
= dst
;
387 int i
, *count
= (int*)(so
+ 1);
388 for (i
= 0; i
< *count
; i
++) {
389 av_freep(&(*so
)[i
].specifier
);
390 if (po
->flags
& OPT_STRING
)
391 av_freep(&(*so
)[i
].u
.str
);
395 } else if (po
->flags
& OPT_OFFSET
&& po
->flags
& OPT_STRING
)
400 av_freep(&o
->stream_maps
);
401 av_freep(&o
->meta_data_maps
);
402 av_freep(&o
->streamid_map
);
404 memset(o
, 0, sizeof(*o
));
406 o
->mux_max_delay
= 0.7;
407 o
->recording_time
= INT64_MAX
;
408 o
->limit_filesize
= UINT64_MAX
;
409 o
->chapters_input_file
= INT_MAX
;
415 static int alloc_buffer(InputStream
*ist
, FrameBuffer
**pbuf
)
417 AVCodecContext
*s
= ist
->st
->codec
;
418 FrameBuffer
*buf
= av_mallocz(sizeof(*buf
));
420 const int pixel_size
= av_pix_fmt_descriptors
[s
->pix_fmt
].comp
[0].step_minus1
+1;
421 int h_chroma_shift
, v_chroma_shift
;
422 int edge
= 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
423 int w
= s
->width
, h
= s
->height
;
426 return AVERROR(ENOMEM
);
428 if (!(s
->flags
& CODEC_FLAG_EMU_EDGE
)) {
433 avcodec_align_dimensions(s
, &w
, &h
);
434 if ((ret
= av_image_alloc(buf
->base
, buf
->linesize
, w
, h
,
435 s
->pix_fmt
, 32)) < 0) {
439 /* XXX this shouldn't be needed, but some tests break without this line
440 * those decoders are buggy and need to be fixed.
441 * the following tests fail:
442 * bethsoft-vid, cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
444 memset(buf
->base
[0], 128, ret
);
446 avcodec_get_chroma_sub_sample(s
->pix_fmt
, &h_chroma_shift
, &v_chroma_shift
);
447 for (int i
= 0; i
< FF_ARRAY_ELEMS(buf
->data
); i
++) {
448 const int h_shift
= i
==0 ?
0 : h_chroma_shift
;
449 const int v_shift
= i
==0 ?
0 : v_chroma_shift
;
450 if (s
->flags
& CODEC_FLAG_EMU_EDGE
)
451 buf
->data
[i
] = buf
->base
[i
];
453 buf
->data
[i
] = buf
->base
[i
] +
454 FFALIGN((buf
->linesize
[i
]*edge
>> v_shift
) +
455 (pixel_size
*edge
>> h_shift
), 32);
459 buf
->pix_fmt
= s
->pix_fmt
;
466 static void free_buffer_pool(InputStream
*ist
)
468 FrameBuffer
*buf
= ist
->buffer_pool
;
470 ist
->buffer_pool
= buf
->next
;
471 av_freep(&buf
->base
[0]);
473 buf
= ist
->buffer_pool
;
477 static void unref_buffer(InputStream
*ist
, FrameBuffer
*buf
)
479 av_assert0(buf
->refcount
);
481 if (!buf
->refcount
) {
482 buf
->next
= ist
->buffer_pool
;
483 ist
->buffer_pool
= buf
;
487 static int codec_get_buffer(AVCodecContext
*s
, AVFrame
*frame
)
489 InputStream
*ist
= s
->opaque
;
493 if (!ist
->buffer_pool
&& (ret
= alloc_buffer(ist
, &ist
->buffer_pool
)) < 0)
496 buf
= ist
->buffer_pool
;
497 ist
->buffer_pool
= buf
->next
;
499 if (buf
->w
!= s
->width
|| buf
->h
!= s
->height
|| buf
->pix_fmt
!= s
->pix_fmt
) {
500 av_freep(&buf
->base
[0]);
502 if ((ret
= alloc_buffer(ist
, &buf
)) < 0)
508 frame
->type
= FF_BUFFER_TYPE_USER
;
509 frame
->extended_data
= frame
->data
;
510 frame
->pkt_pts
= s
->pkt ? s
->pkt
->pts
: AV_NOPTS_VALUE
;
512 for (i
= 0; i
< FF_ARRAY_ELEMS(buf
->data
); i
++) {
513 frame
->base
[i
] = buf
->base
[i
]; // XXX h264.c uses base though it shouldn't
514 frame
->data
[i
] = buf
->data
[i
];
515 frame
->linesize
[i
] = buf
->linesize
[i
];
521 static void codec_release_buffer(AVCodecContext
*s
, AVFrame
*frame
)
523 InputStream
*ist
= s
->opaque
;
524 FrameBuffer
*buf
= frame
->opaque
;
527 for (i
= 0; i
< FF_ARRAY_ELEMS(frame
->data
); i
++)
528 frame
->data
[i
] = NULL
;
530 unref_buffer(ist
, buf
);
533 static void filter_release_buffer(AVFilterBuffer
*fb
)
535 FrameBuffer
*buf
= fb
->priv
;
537 unref_buffer(buf
->ist
, buf
);
542 static int configure_video_filters(InputStream
*ist
, OutputStream
*ost
)
544 AVFilterContext
*last_filter
, *filter
;
545 /** filter graph containing all filters including input & output */
546 AVCodecContext
*codec
= ost
->st
->codec
;
547 AVCodecContext
*icodec
= ist
->st
->codec
;
548 FFSinkContext ffsink_ctx
= { .pix_fmt
= codec
->pix_fmt
};
549 AVRational sample_aspect_ratio
;
553 ost
->graph
= avfilter_graph_alloc();
555 if (ist
->st
->sample_aspect_ratio
.num
) {
556 sample_aspect_ratio
= ist
->st
->sample_aspect_ratio
;
558 sample_aspect_ratio
= ist
->st
->codec
->sample_aspect_ratio
;
560 snprintf(args
, 255, "%d:%d:%d:%d:%d:%d:%d", ist
->st
->codec
->width
,
561 ist
->st
->codec
->height
, ist
->st
->codec
->pix_fmt
, 1, AV_TIME_BASE
,
562 sample_aspect_ratio
.num
, sample_aspect_ratio
.den
);
564 ret
= avfilter_graph_create_filter(&ost
->input_video_filter
, avfilter_get_by_name("buffer"),
565 "src", args
, NULL
, ost
->graph
);
568 ret
= avfilter_graph_create_filter(&ost
->output_video_filter
, &ffsink
,
569 "out", NULL
, &ffsink_ctx
, ost
->graph
);
572 last_filter
= ost
->input_video_filter
;
574 if (codec
->width
!= icodec
->width
|| codec
->height
!= icodec
->height
) {
575 snprintf(args
, 255, "%d:%d:flags=0x%X",
578 (unsigned)ost
->sws_flags
);
579 if ((ret
= avfilter_graph_create_filter(&filter
, avfilter_get_by_name("scale"),
580 NULL
, args
, NULL
, ost
->graph
)) < 0)
582 if ((ret
= avfilter_link(last_filter
, 0, filter
, 0)) < 0)
584 last_filter
= filter
;
587 snprintf(args
, sizeof(args
), "flags=0x%X", (unsigned)ost
->sws_flags
);
588 ost
->graph
->scale_sws_opts
= av_strdup(args
);
591 AVFilterInOut
*outputs
= av_malloc(sizeof(AVFilterInOut
));
592 AVFilterInOut
*inputs
= av_malloc(sizeof(AVFilterInOut
));
594 outputs
->name
= av_strdup("in");
595 outputs
->filter_ctx
= last_filter
;
596 outputs
->pad_idx
= 0;
597 outputs
->next
= NULL
;
599 inputs
->name
= av_strdup("out");
600 inputs
->filter_ctx
= ost
->output_video_filter
;
604 if ((ret
= avfilter_graph_parse(ost
->graph
, ost
->avfilter
, inputs
, outputs
, NULL
)) < 0)
606 av_freep(&ost
->avfilter
);
608 if ((ret
= avfilter_link(last_filter
, 0, ost
->output_video_filter
, 0)) < 0)
612 if ((ret
= avfilter_graph_config(ost
->graph
, NULL
)) < 0)
615 codec
->width
= ost
->output_video_filter
->inputs
[0]->w
;
616 codec
->height
= ost
->output_video_filter
->inputs
[0]->h
;
617 codec
->sample_aspect_ratio
= ost
->st
->sample_aspect_ratio
=
618 ost
->frame_aspect_ratio ?
// overridden by the -aspect cli option
619 av_d2q(ost
->frame_aspect_ratio
* codec
->height
/codec
->width
, 255) :
620 ost
->output_video_filter
->inputs
[0]->sample_aspect_ratio
;
624 #endif /* CONFIG_AVFILTER */
626 static void term_exit(void)
628 av_log(NULL
, AV_LOG_QUIET
, "");
631 static volatile int received_sigterm
= 0;
632 static volatile int received_nb_signals
= 0;
635 sigterm_handler(int sig
)
637 received_sigterm
= sig
;
638 received_nb_signals
++;
642 static void term_init(void)
644 signal(SIGINT
, sigterm_handler
); /* Interrupt (ANSI). */
645 signal(SIGTERM
, sigterm_handler
); /* Termination (ANSI). */
647 signal(SIGXCPU
, sigterm_handler
);
651 static int decode_interrupt_cb(void *ctx
)
653 return received_nb_signals
> 1;
656 static const AVIOInterruptCB int_cb
= { decode_interrupt_cb
, NULL
};
658 void exit_program(int ret
)
663 for (i
= 0; i
< nb_output_files
; i
++) {
664 AVFormatContext
*s
= output_files
[i
].ctx
;
665 if (!(s
->oformat
->flags
& AVFMT_NOFILE
) && s
->pb
)
667 avformat_free_context(s
);
668 av_dict_free(&output_files
[i
].opts
);
670 for (i
= 0; i
< nb_input_files
; i
++) {
671 avformat_close_input(&input_files
[i
].ctx
);
673 for (i
= 0; i
< nb_input_streams
; i
++) {
674 av_freep(&input_streams
[i
].decoded_frame
);
675 av_freep(&input_streams
[i
].filtered_frame
);
676 av_dict_free(&input_streams
[i
].opts
);
677 free_buffer_pool(&input_streams
[i
]);
682 av_free(vstats_filename
);
684 av_freep(&input_streams
);
685 av_freep(&input_files
);
686 av_freep(&output_streams
);
687 av_freep(&output_files
);
692 allocated_audio_buf_size
= allocated_audio_out_size
= 0;
697 avformat_network_deinit();
699 if (received_sigterm
) {
700 av_log(NULL
, AV_LOG_INFO
, "Received signal %d: terminating.\n",
701 (int) received_sigterm
);
708 static void assert_avoptions(AVDictionary
*m
)
710 AVDictionaryEntry
*t
;
711 if ((t
= av_dict_get(m
, "", NULL
, AV_DICT_IGNORE_SUFFIX
))) {
712 av_log(NULL
, AV_LOG_FATAL
, "Option %s not found.\n", t
->key
);
717 static void assert_codec_experimental(AVCodecContext
*c
, int encoder
)
719 const char *codec_string
= encoder ?
"encoder" : "decoder";
721 if (c
->codec
->capabilities
& CODEC_CAP_EXPERIMENTAL
&&
722 c
->strict_std_compliance
> FF_COMPLIANCE_EXPERIMENTAL
) {
723 av_log(NULL
, AV_LOG_FATAL
, "%s '%s' is experimental and might produce bad "
724 "results.\nAdd '-strict experimental' if you want to use it.\n",
725 codec_string
, c
->codec
->name
);
726 codec
= encoder ?
avcodec_find_encoder(c
->codec
->id
) : avcodec_find_decoder(c
->codec
->id
);
727 if (!(codec
->capabilities
& CODEC_CAP_EXPERIMENTAL
))
728 av_log(NULL
, AV_LOG_FATAL
, "Or use the non experimental %s '%s'.\n",
729 codec_string
, codec
->name
);
734 static void choose_sample_fmt(AVStream
*st
, AVCodec
*codec
)
736 if (codec
&& codec
->sample_fmts
) {
737 const enum AVSampleFormat
*p
= codec
->sample_fmts
;
738 for (; *p
!= -1; p
++) {
739 if (*p
== st
->codec
->sample_fmt
)
743 av_log(NULL
, AV_LOG_WARNING
,
744 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
745 av_get_sample_fmt_name(st
->codec
->sample_fmt
),
747 av_get_sample_fmt_name(codec
->sample_fmts
[0]));
748 st
->codec
->sample_fmt
= codec
->sample_fmts
[0];
754 * Update the requested input sample format based on the output sample format.
755 * This is currently only used to request float output from decoders which
756 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
757 * Ideally this will be removed in the future when decoders do not do format
758 * conversion and only output in their native format.
760 static void update_sample_fmt(AVCodecContext
*dec
, AVCodec
*dec_codec
,
763 /* if sample formats match or a decoder sample format has already been
764 requested, just return */
765 if (enc
->sample_fmt
== dec
->sample_fmt
||
766 dec
->request_sample_fmt
> AV_SAMPLE_FMT_NONE
)
769 /* if decoder supports more than one output format */
770 if (dec_codec
&& dec_codec
->sample_fmts
&&
771 dec_codec
->sample_fmts
[0] != AV_SAMPLE_FMT_NONE
&&
772 dec_codec
->sample_fmts
[1] != AV_SAMPLE_FMT_NONE
) {
773 const enum AVSampleFormat
*p
;
774 int min_dec
= -1, min_inc
= -1;
776 /* find a matching sample format in the encoder */
777 for (p
= dec_codec
->sample_fmts
; *p
!= AV_SAMPLE_FMT_NONE
; p
++) {
778 if (*p
== enc
->sample_fmt
) {
779 dec
->request_sample_fmt
= *p
;
781 } else if (*p
> enc
->sample_fmt
) {
782 min_inc
= FFMIN(min_inc
, *p
- enc
->sample_fmt
);
784 min_dec
= FFMIN(min_dec
, enc
->sample_fmt
- *p
);
787 /* if none match, provide the one that matches quality closest */
788 dec
->request_sample_fmt
= min_inc
> 0 ? enc
->sample_fmt
+ min_inc
:
789 enc
->sample_fmt
- min_dec
;
793 static void choose_sample_rate(AVStream
*st
, AVCodec
*codec
)
795 if (codec
&& codec
->supported_samplerates
) {
796 const int *p
= codec
->supported_samplerates
;
798 int best_dist
= INT_MAX
;
800 int dist
= abs(st
->codec
->sample_rate
- *p
);
801 if (dist
< best_dist
) {
807 av_log(st
->codec
, AV_LOG_WARNING
, "Requested sampling rate unsupported using closest supported (%d)\n", best
);
809 st
->codec
->sample_rate
= best
;
813 static void choose_pixel_fmt(AVStream
*st
, AVCodec
*codec
)
815 if (codec
&& codec
->pix_fmts
) {
816 const enum PixelFormat
*p
= codec
->pix_fmts
;
817 if (st
->codec
->strict_std_compliance
<= FF_COMPLIANCE_UNOFFICIAL
) {
818 if (st
->codec
->codec_id
== CODEC_ID_MJPEG
) {
819 p
= (const enum PixelFormat
[]) { PIX_FMT_YUVJ420P
, PIX_FMT_YUVJ422P
, PIX_FMT_YUV420P
, PIX_FMT_YUV422P
, PIX_FMT_NONE
};
820 } else if (st
->codec
->codec_id
== CODEC_ID_LJPEG
) {
821 p
= (const enum PixelFormat
[]) { PIX_FMT_YUVJ420P
, PIX_FMT_YUVJ422P
, PIX_FMT_YUVJ444P
, PIX_FMT_YUV420P
,
822 PIX_FMT_YUV422P
, PIX_FMT_YUV444P
, PIX_FMT_BGRA
, PIX_FMT_NONE
};
825 for (; *p
!= PIX_FMT_NONE
; p
++) {
826 if (*p
== st
->codec
->pix_fmt
)
829 if (*p
== PIX_FMT_NONE
) {
830 if (st
->codec
->pix_fmt
!= PIX_FMT_NONE
)
831 av_log(NULL
, AV_LOG_WARNING
,
832 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
833 av_pix_fmt_descriptors
[st
->codec
->pix_fmt
].name
,
835 av_pix_fmt_descriptors
[codec
->pix_fmts
[0]].name
);
836 st
->codec
->pix_fmt
= codec
->pix_fmts
[0];
842 get_sync_ipts(const OutputStream
*ost
)
844 const InputStream
*ist
= ost
->sync_ist
;
845 OutputFile
*of
= &output_files
[ost
->file_index
];
846 return (double)(ist
->pts
- of
->start_time
) / AV_TIME_BASE
;
849 static void write_frame(AVFormatContext
*s
, AVPacket
*pkt
, AVCodecContext
*avctx
, AVBitStreamFilterContext
*bsfc
)
854 AVPacket new_pkt
= *pkt
;
855 int a
= av_bitstream_filter_filter(bsfc
, avctx
, NULL
,
856 &new_pkt
.data
, &new_pkt
.size
,
857 pkt
->data
, pkt
->size
,
858 pkt
->flags
& AV_PKT_FLAG_KEY
);
861 new_pkt
.destruct
= av_destruct_packet
;
863 av_log(NULL
, AV_LOG_ERROR
, "%s failed for stream %d, codec %s",
864 bsfc
->filter
->name
, pkt
->stream_index
,
865 avctx
->codec ? avctx
->codec
->name
: "copy");
875 ret
= av_interleaved_write_frame(s
, pkt
);
877 print_error("av_interleaved_write_frame()", ret
);
882 static void generate_silence(uint8_t* buf
, enum AVSampleFormat sample_fmt
, size_t size
)
884 int fill_char
= 0x00;
885 if (sample_fmt
== AV_SAMPLE_FMT_U8
)
887 memset(buf
, fill_char
, size
);
890 static void do_audio_out(AVFormatContext
*s
, OutputStream
*ost
,
891 InputStream
*ist
, AVFrame
*decoded_frame
)
894 int64_t audio_out_size
, audio_buf_size
;
896 int size_out
, frame_bytes
, ret
, resample_changed
;
897 AVCodecContext
*enc
= ost
->st
->codec
;
898 AVCodecContext
*dec
= ist
->st
->codec
;
899 int osize
= av_get_bytes_per_sample(enc
->sample_fmt
);
900 int isize
= av_get_bytes_per_sample(dec
->sample_fmt
);
901 const int coded_bps
= av_get_bits_per_sample(enc
->codec
->id
);
902 uint8_t *buf
= decoded_frame
->data
[0];
903 int size
= decoded_frame
->nb_samples
* dec
->channels
* isize
;
904 int64_t allocated_for_size
= size
;
907 audio_buf_size
= (allocated_for_size
+ isize
* dec
->channels
- 1) / (isize
* dec
->channels
);
908 audio_buf_size
= (audio_buf_size
* enc
->sample_rate
+ dec
->sample_rate
) / dec
->sample_rate
;
909 audio_buf_size
= audio_buf_size
* 2 + 10000; // safety factors for the deprecated resampling API
910 audio_buf_size
= FFMAX(audio_buf_size
, enc
->frame_size
);
911 audio_buf_size
*= osize
* enc
->channels
;
913 audio_out_size
= FFMAX(audio_buf_size
, enc
->frame_size
* osize
* enc
->channels
);
914 if (coded_bps
> 8 * osize
)
915 audio_out_size
= audio_out_size
* coded_bps
/ (8*osize
);
916 audio_out_size
+= FF_MIN_BUFFER_SIZE
;
918 if (audio_out_size
> INT_MAX
|| audio_buf_size
> INT_MAX
) {
919 av_log(NULL
, AV_LOG_FATAL
, "Buffer sizes too large\n");
923 av_fast_malloc(&audio_buf
, &allocated_audio_buf_size
, audio_buf_size
);
924 av_fast_malloc(&audio_out
, &allocated_audio_out_size
, audio_out_size
);
925 if (!audio_buf
|| !audio_out
) {
926 av_log(NULL
, AV_LOG_FATAL
, "Out of memory in do_audio_out\n");
930 if (enc
->channels
!= dec
->channels
|| enc
->sample_rate
!= dec
->sample_rate
)
931 ost
->audio_resample
= 1;
933 resample_changed
= ost
->resample_sample_fmt
!= dec
->sample_fmt
||
934 ost
->resample_channels
!= dec
->channels
||
935 ost
->resample_sample_rate
!= dec
->sample_rate
;
937 if ((ost
->audio_resample
&& !ost
->resample
) || resample_changed
) {
938 if (resample_changed
) {
939 av_log(NULL
, AV_LOG_INFO
, "Input stream #%d:%d frame changed from rate:%d fmt:%s ch:%d to rate:%d fmt:%s ch:%d\n",
940 ist
->file_index
, ist
->st
->index
,
941 ost
->resample_sample_rate
, av_get_sample_fmt_name(ost
->resample_sample_fmt
), ost
->resample_channels
,
942 dec
->sample_rate
, av_get_sample_fmt_name(dec
->sample_fmt
), dec
->channels
);
943 ost
->resample_sample_fmt
= dec
->sample_fmt
;
944 ost
->resample_channels
= dec
->channels
;
945 ost
->resample_sample_rate
= dec
->sample_rate
;
947 audio_resample_close(ost
->resample
);
949 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
950 if (audio_sync_method
<= 1 &&
951 ost
->resample_sample_fmt
== enc
->sample_fmt
&&
952 ost
->resample_channels
== enc
->channels
&&
953 ost
->resample_sample_rate
== enc
->sample_rate
) {
954 ost
->resample
= NULL
;
955 ost
->audio_resample
= 0;
956 } else if (ost
->audio_resample
) {
957 if (dec
->sample_fmt
!= AV_SAMPLE_FMT_S16
)
958 av_log(NULL
, AV_LOG_WARNING
, "Using s16 intermediate sample format for resampling\n");
959 ost
->resample
= av_audio_resample_init(enc
->channels
, dec
->channels
,
960 enc
->sample_rate
, dec
->sample_rate
,
961 enc
->sample_fmt
, dec
->sample_fmt
,
963 if (!ost
->resample
) {
964 av_log(NULL
, AV_LOG_FATAL
, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
965 dec
->channels
, dec
->sample_rate
,
966 enc
->channels
, enc
->sample_rate
);
972 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
973 if (!ost
->audio_resample
&& dec
->sample_fmt
!= enc
->sample_fmt
&&
974 MAKE_SFMT_PAIR(enc
->sample_fmt
,dec
->sample_fmt
) != ost
->reformat_pair
) {
975 if (ost
->reformat_ctx
)
976 av_audio_convert_free(ost
->reformat_ctx
);
977 ost
->reformat_ctx
= av_audio_convert_alloc(enc
->sample_fmt
, 1,
978 dec
->sample_fmt
, 1, NULL
, 0);
979 if (!ost
->reformat_ctx
) {
980 av_log(NULL
, AV_LOG_FATAL
, "Cannot convert %s sample format to %s sample format\n",
981 av_get_sample_fmt_name(dec
->sample_fmt
),
982 av_get_sample_fmt_name(enc
->sample_fmt
));
985 ost
->reformat_pair
= MAKE_SFMT_PAIR(enc
->sample_fmt
,dec
->sample_fmt
);
988 if (audio_sync_method
) {
989 double delta
= get_sync_ipts(ost
) * enc
->sample_rate
- ost
->sync_opts
-
990 av_fifo_size(ost
->fifo
) / (enc
->channels
* osize
);
991 int idelta
= delta
* dec
->sample_rate
/ enc
->sample_rate
;
992 int byte_delta
= idelta
* isize
* dec
->channels
;
994 // FIXME resample delay
995 if (fabs(delta
) > 50) {
996 if (ist
->is_start
|| fabs(delta
) > audio_drift_threshold
*enc
->sample_rate
) {
997 if (byte_delta
< 0) {
998 byte_delta
= FFMAX(byte_delta
, -size
);
1001 av_log(NULL
, AV_LOG_VERBOSE
, "discarding %d audio samples\n",
1002 -byte_delta
/ (isize
* dec
->channels
));
1007 static uint8_t *input_tmp
= NULL
;
1008 input_tmp
= av_realloc(input_tmp
, byte_delta
+ size
);
1010 if (byte_delta
> allocated_for_size
- size
) {
1011 allocated_for_size
= byte_delta
+ (int64_t)size
;
1016 generate_silence(input_tmp
, dec
->sample_fmt
, byte_delta
);
1017 memcpy(input_tmp
+ byte_delta
, buf
, size
);
1020 av_log(NULL
, AV_LOG_VERBOSE
, "adding %d audio samples of silence\n", idelta
);
1022 } else if (audio_sync_method
> 1) {
1023 int comp
= av_clip(delta
, -audio_sync_method
, audio_sync_method
);
1024 av_assert0(ost
->audio_resample
);
1025 av_log(NULL
, AV_LOG_VERBOSE
, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
1026 delta
, comp
, enc
->sample_rate
);
1027 // 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));
1028 av_resample_compensate(*(struct AVResampleContext
**)ost
->resample
, comp
, enc
->sample_rate
);
1032 ost
->sync_opts
= lrintf(get_sync_ipts(ost
) * enc
->sample_rate
) -
1033 av_fifo_size(ost
->fifo
) / (enc
->channels
* osize
); // FIXME wrong
1035 if (ost
->audio_resample
) {
1037 size_out
= audio_resample(ost
->resample
,
1038 (short *)buftmp
, (short *)buf
,
1039 size
/ (dec
->channels
* isize
));
1040 size_out
= size_out
* enc
->channels
* osize
;
1046 if (!ost
->audio_resample
&& dec
->sample_fmt
!= enc
->sample_fmt
) {
1047 const void *ibuf
[6] = { buftmp
};
1048 void *obuf
[6] = { audio_buf
};
1049 int istride
[6] = { isize
};
1050 int ostride
[6] = { osize
};
1051 int len
= size_out
/ istride
[0];
1052 if (av_audio_convert(ost
->reformat_ctx
, obuf
, ostride
, ibuf
, istride
, len
) < 0) {
1053 printf("av_audio_convert() failed\n");
1059 size_out
= len
* osize
;
1062 /* now encode as many frames as possible */
1063 if (enc
->frame_size
> 1) {
1064 /* output resampled raw samples */
1065 if (av_fifo_realloc2(ost
->fifo
, av_fifo_size(ost
->fifo
) + size_out
) < 0) {
1066 av_log(NULL
, AV_LOG_FATAL
, "av_fifo_realloc2() failed\n");
1069 av_fifo_generic_write(ost
->fifo
, buftmp
, size_out
, NULL
);
1071 frame_bytes
= enc
->frame_size
* osize
* enc
->channels
;
1073 while (av_fifo_size(ost
->fifo
) >= frame_bytes
) {
1075 av_init_packet(&pkt
);
1077 av_fifo_generic_read(ost
->fifo
, audio_buf
, frame_bytes
, NULL
);
1079 // FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1081 ret
= avcodec_encode_audio(enc
, audio_out
, audio_out_size
,
1082 (short *)audio_buf
);
1084 av_log(NULL
, AV_LOG_FATAL
, "Audio encoding failed\n");
1088 pkt
.stream_index
= ost
->index
;
1089 pkt
.data
= audio_out
;
1091 if (enc
->coded_frame
&& enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
1092 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
1093 pkt
.flags
|= AV_PKT_FLAG_KEY
;
1094 write_frame(s
, &pkt
, enc
, ost
->bitstream_filters
);
1096 ost
->sync_opts
+= enc
->frame_size
;
1100 av_init_packet(&pkt
);
1102 ost
->sync_opts
+= size_out
/ (osize
* enc
->channels
);
1104 /* output a pcm frame */
1105 /* determine the size of the coded buffer */
1108 size_out
= size_out
* coded_bps
/ 8;
1110 if (size_out
> audio_out_size
) {
1111 av_log(NULL
, AV_LOG_FATAL
, "Internal error, buffer size too small\n");
1115 // FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1116 ret
= avcodec_encode_audio(enc
, audio_out
, size_out
,
1119 av_log(NULL
, AV_LOG_FATAL
, "Audio encoding failed\n");
1123 pkt
.stream_index
= ost
->index
;
1124 pkt
.data
= audio_out
;
1126 if (enc
->coded_frame
&& enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
1127 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
1128 pkt
.flags
|= AV_PKT_FLAG_KEY
;
1129 write_frame(s
, &pkt
, enc
, ost
->bitstream_filters
);
1133 static void pre_process_video_frame(InputStream
*ist
, AVPicture
*picture
, void **bufp
)
1135 AVCodecContext
*dec
;
1136 AVPicture
*picture2
;
1137 AVPicture picture_tmp
;
1140 dec
= ist
->st
->codec
;
1142 /* deinterlace : must be done before any resize */
1143 if (do_deinterlace
) {
1146 /* create temporary picture */
1147 size
= avpicture_get_size(dec
->pix_fmt
, dec
->width
, dec
->height
);
1148 buf
= av_malloc(size
);
1152 picture2
= &picture_tmp
;
1153 avpicture_fill(picture2
, buf
, dec
->pix_fmt
, dec
->width
, dec
->height
);
1155 if (avpicture_deinterlace(picture2
, picture
,
1156 dec
->pix_fmt
, dec
->width
, dec
->height
) < 0) {
1157 /* if error, do not deinterlace */
1158 av_log(NULL
, AV_LOG_WARNING
, "Deinterlacing failed\n");
1167 if (picture
!= picture2
)
1168 *picture
= *picture2
;
1172 static void do_subtitle_out(AVFormatContext
*s
,
1178 static uint8_t *subtitle_out
= NULL
;
1179 int subtitle_out_max_size
= 1024 * 1024;
1180 int subtitle_out_size
, nb
, i
;
1181 AVCodecContext
*enc
;
1184 if (pts
== AV_NOPTS_VALUE
) {
1185 av_log(NULL
, AV_LOG_ERROR
, "Subtitle packets must have a pts\n");
1191 enc
= ost
->st
->codec
;
1193 if (!subtitle_out
) {
1194 subtitle_out
= av_malloc(subtitle_out_max_size
);
1197 /* Note: DVB subtitle need one packet to draw them and one other
1198 packet to clear them */
1199 /* XXX: signal it in the codec context ? */
1200 if (enc
->codec_id
== CODEC_ID_DVB_SUBTITLE
)
1205 for (i
= 0; i
< nb
; i
++) {
1206 sub
->pts
= av_rescale_q(pts
, ist
->st
->time_base
, AV_TIME_BASE_Q
);
1207 // start_display_time is required to be 0
1208 sub
->pts
+= av_rescale_q(sub
->start_display_time
, (AVRational
){ 1, 1000 }, AV_TIME_BASE_Q
);
1209 sub
->end_display_time
-= sub
->start_display_time
;
1210 sub
->start_display_time
= 0;
1211 subtitle_out_size
= avcodec_encode_subtitle(enc
, subtitle_out
,
1212 subtitle_out_max_size
, sub
);
1213 if (subtitle_out_size
< 0) {
1214 av_log(NULL
, AV_LOG_FATAL
, "Subtitle encoding failed\n");
1218 av_init_packet(&pkt
);
1219 pkt
.stream_index
= ost
->index
;
1220 pkt
.data
= subtitle_out
;
1221 pkt
.size
= subtitle_out_size
;
1222 pkt
.pts
= av_rescale_q(sub
->pts
, AV_TIME_BASE_Q
, ost
->st
->time_base
);
1223 if (enc
->codec_id
== CODEC_ID_DVB_SUBTITLE
) {
1224 /* XXX: the pts correction is handled here. Maybe handling
1225 it in the codec would be better */
1227 pkt
.pts
+= 90 * sub
->start_display_time
;
1229 pkt
.pts
+= 90 * sub
->end_display_time
;
1231 write_frame(s
, &pkt
, ost
->st
->codec
, ost
->bitstream_filters
);
1235 static int bit_buffer_size
= 1024 * 256;
1236 static uint8_t *bit_buffer
= NULL
;
1238 static void do_video_resample(OutputStream
*ost
,
1240 AVFrame
*in_picture
,
1241 AVFrame
**out_picture
)
1243 int resample_changed
= 0;
1244 AVCodecContext
*dec
= ist
->st
->codec
;
1245 *out_picture
= in_picture
;
1247 resample_changed
= ost
->resample_width
!= dec
->width
||
1248 ost
->resample_height
!= dec
->height
||
1249 ost
->resample_pix_fmt
!= dec
->pix_fmt
;
1251 if (resample_changed
) {
1252 av_log(NULL
, AV_LOG_INFO
,
1253 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1254 ist
->file_index
, ist
->st
->index
,
1255 ost
->resample_width
, ost
->resample_height
, av_get_pix_fmt_name(ost
->resample_pix_fmt
),
1256 dec
->width
, dec
->height
, av_get_pix_fmt_name(dec
->pix_fmt
));
1257 if (!ost
->video_resample
)
1258 ost
->video_resample
= 1;
1261 #if !CONFIG_AVFILTER
1262 if (ost
->video_resample
) {
1263 *out_picture
= &ost
->pict_tmp
;
1264 if (resample_changed
) {
1265 /* initialize a new scaler context */
1266 sws_freeContext(ost
->img_resample_ctx
);
1267 ost
->img_resample_ctx
= sws_getContext(
1268 ist
->st
->codec
->width
,
1269 ist
->st
->codec
->height
,
1270 ist
->st
->codec
->pix_fmt
,
1271 ost
->st
->codec
->width
,
1272 ost
->st
->codec
->height
,
1273 ost
->st
->codec
->pix_fmt
,
1274 ost
->sws_flags
, NULL
, NULL
, NULL
);
1275 if (ost
->img_resample_ctx
== NULL
) {
1276 av_log(NULL
, AV_LOG_FATAL
, "Cannot get resampling context\n");
1280 sws_scale(ost
->img_resample_ctx
, in_picture
->data
, in_picture
->linesize
,
1281 0, ost
->resample_height
, (*out_picture
)->data
, (*out_picture
)->linesize
);
1284 if (resample_changed
) {
1285 avfilter_graph_free(&ost
->graph
);
1286 if (configure_video_filters(ist
, ost
)) {
1287 av_log(NULL
, AV_LOG_FATAL
, "Error reinitializing filters!\n");
1292 if (resample_changed
) {
1293 ost
->resample_width
= dec
->width
;
1294 ost
->resample_height
= dec
->height
;
1295 ost
->resample_pix_fmt
= dec
->pix_fmt
;
1300 static void do_video_out(AVFormatContext
*s
,
1303 AVFrame
*in_picture
,
1304 int *frame_size
, float quality
)
1306 int nb_frames
, i
, ret
, format_video_sync
;
1307 AVFrame
*final_picture
;
1308 AVCodecContext
*enc
;
1311 enc
= ost
->st
->codec
;
1313 sync_ipts
= get_sync_ipts(ost
) / av_q2d(enc
->time_base
);
1315 /* by default, we output a single frame */
1320 format_video_sync
= video_sync_method
;
1321 if (format_video_sync
< 0)
1322 format_video_sync
= (s
->oformat
->flags
& AVFMT_NOTIMESTAMPS
) ?
0 :
1323 (s
->oformat
->flags
& AVFMT_VARIABLE_FPS
) ?
2 : 1;
1325 if (format_video_sync
) {
1326 double vdelta
= sync_ipts
- ost
->sync_opts
;
1327 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1330 else if (format_video_sync
== 2) {
1331 if (vdelta
<= -0.6) {
1333 } else if (vdelta
> 0.6)
1334 ost
->sync_opts
= lrintf(sync_ipts
);
1335 } else if (vdelta
> 1.1)
1336 nb_frames
= lrintf(vdelta
);
1337 //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);
1338 if (nb_frames
== 0) {
1340 av_log(NULL
, AV_LOG_VERBOSE
, "*** drop!\n");
1341 } else if (nb_frames
> 1) {
1342 nb_frames_dup
+= nb_frames
- 1;
1343 av_log(NULL
, AV_LOG_VERBOSE
, "*** %d dup!\n", nb_frames
- 1);
1346 ost
->sync_opts
= lrintf(sync_ipts
);
1348 nb_frames
= FFMIN(nb_frames
, ost
->max_frames
- ost
->frame_number
);
1352 do_video_resample(ost
, ist
, in_picture
, &final_picture
);
1354 /* duplicates frame if needed */
1355 for (i
= 0; i
< nb_frames
; i
++) {
1357 av_init_packet(&pkt
);
1358 pkt
.stream_index
= ost
->index
;
1360 if (s
->oformat
->flags
& AVFMT_RAWPICTURE
&&
1361 enc
->codec
->id
== CODEC_ID_RAWVIDEO
) {
1362 /* raw pictures are written as AVPicture structure to
1363 avoid any copies. We support temporarily the older
1365 enc
->coded_frame
->interlaced_frame
= in_picture
->interlaced_frame
;
1366 enc
->coded_frame
->top_field_first
= in_picture
->top_field_first
;
1367 pkt
.data
= (uint8_t *)final_picture
;
1368 pkt
.size
= sizeof(AVPicture
);
1369 pkt
.pts
= av_rescale_q(ost
->sync_opts
, enc
->time_base
, ost
->st
->time_base
);
1370 pkt
.flags
|= AV_PKT_FLAG_KEY
;
1372 write_frame(s
, &pkt
, ost
->st
->codec
, ost
->bitstream_filters
);
1374 AVFrame big_picture
;
1376 big_picture
= *final_picture
;
1377 /* better than nothing: use input picture interlaced
1379 big_picture
.interlaced_frame
= in_picture
->interlaced_frame
;
1380 if (ost
->st
->codec
->flags
& (CODEC_FLAG_INTERLACED_DCT
|CODEC_FLAG_INTERLACED_ME
)) {
1381 if (ost
->top_field_first
== -1)
1382 big_picture
.top_field_first
= in_picture
->top_field_first
;
1384 big_picture
.top_field_first
= !!ost
->top_field_first
;
1387 /* handles same_quant here. This is not correct because it may
1388 not be a global option */
1389 big_picture
.quality
= quality
;
1390 if (!enc
->me_threshold
)
1391 big_picture
.pict_type
= 0;
1392 // big_picture.pts = AV_NOPTS_VALUE;
1393 big_picture
.pts
= ost
->sync_opts
;
1394 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1395 // av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1396 if (ost
->forced_kf_index
< ost
->forced_kf_count
&&
1397 big_picture
.pts
>= ost
->forced_kf_pts
[ost
->forced_kf_index
]) {
1398 big_picture
.pict_type
= AV_PICTURE_TYPE_I
;
1399 ost
->forced_kf_index
++;
1401 ret
= avcodec_encode_video(enc
,
1402 bit_buffer
, bit_buffer_size
,
1405 av_log(NULL
, AV_LOG_FATAL
, "Video encoding failed\n");
1410 pkt
.data
= bit_buffer
;
1412 if (enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
1413 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
1414 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1415 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1416 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1418 if (enc
->coded_frame
->key_frame
)
1419 pkt
.flags
|= AV_PKT_FLAG_KEY
;
1420 write_frame(s
, &pkt
, ost
->st
->codec
, ost
->bitstream_filters
);
1423 // fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1424 // enc->frame_number-1, ret, enc->pict_type);
1425 /* if two pass, output log */
1426 if (ost
->logfile
&& enc
->stats_out
) {
1427 fprintf(ost
->logfile
, "%s", enc
->stats_out
);
1432 ost
->frame_number
++;
1436 static double psnr(double d
)
1438 return -10.0 * log(d
) / log(10.0);
1441 static void do_video_stats(AVFormatContext
*os
, OutputStream
*ost
,
1444 AVCodecContext
*enc
;
1446 double ti1
, bitrate
, avg_bitrate
;
1448 /* this is executed just the first time do_video_stats is called */
1450 vstats_file
= fopen(vstats_filename
, "w");
1457 enc
= ost
->st
->codec
;
1458 if (enc
->codec_type
== AVMEDIA_TYPE_VIDEO
) {
1459 frame_number
= ost
->frame_number
;
1460 fprintf(vstats_file
, "frame= %5d q= %2.1f ", frame_number
, enc
->coded_frame
->quality
/ (float)FF_QP2LAMBDA
);
1461 if (enc
->flags
&CODEC_FLAG_PSNR
)
1462 fprintf(vstats_file
, "PSNR= %6.2f ", psnr(enc
->coded_frame
->error
[0] / (enc
->width
* enc
->height
* 255.0 * 255.0)));
1464 fprintf(vstats_file
,"f_size= %6d ", frame_size
);
1465 /* compute pts value */
1466 ti1
= ost
->sync_opts
* av_q2d(enc
->time_base
);
1470 bitrate
= (frame_size
* 8) / av_q2d(enc
->time_base
) / 1000.0;
1471 avg_bitrate
= (double)(video_size
* 8) / ti1
/ 1000.0;
1472 fprintf(vstats_file
, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1473 (double)video_size
/ 1024, ti1
, bitrate
, avg_bitrate
);
1474 fprintf(vstats_file
, "type= %c\n", av_get_picture_type_char(enc
->coded_frame
->pict_type
));
1478 static void print_report(OutputFile
*output_files
,
1479 OutputStream
*ost_table
, int nb_ostreams
,
1480 int is_last_report
, int64_t timer_start
)
1484 AVFormatContext
*oc
;
1486 AVCodecContext
*enc
;
1487 int frame_number
, vid
, i
;
1488 double bitrate
, ti1
, pts
;
1489 static int64_t last_time
= -1;
1490 static int qp_histogram
[52];
1492 if (!print_stats
&& !is_last_report
)
1495 if (!is_last_report
) {
1497 /* display the report every 0.5 seconds */
1498 cur_time
= av_gettime();
1499 if (last_time
== -1) {
1500 last_time
= cur_time
;
1503 if ((cur_time
- last_time
) < 500000)
1505 last_time
= cur_time
;
1509 oc
= output_files
[0].ctx
;
1511 total_size
= avio_size(oc
->pb
);
1512 if (total_size
< 0) // FIXME improve avio_size() so it works with non seekable output too
1513 total_size
= avio_tell(oc
->pb
);
1518 for (i
= 0; i
< nb_ostreams
; i
++) {
1520 ost
= &ost_table
[i
];
1521 enc
= ost
->st
->codec
;
1522 if (!ost
->stream_copy
&& enc
->coded_frame
)
1523 q
= enc
->coded_frame
->quality
/ (float)FF_QP2LAMBDA
;
1524 if (vid
&& enc
->codec_type
== AVMEDIA_TYPE_VIDEO
) {
1525 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "q=%2.1f ", q
);
1527 if (!vid
&& enc
->codec_type
== AVMEDIA_TYPE_VIDEO
) {
1528 float t
= (av_gettime() - timer_start
) / 1000000.0;
1530 frame_number
= ost
->frame_number
;
1531 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "frame=%5d fps=%3d q=%3.1f ",
1532 frame_number
, (t
> 1) ?
(int)(frame_number
/ t
+ 0.5) : 0, q
);
1534 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "L");
1538 if (qp
>= 0 && qp
< FF_ARRAY_ELEMS(qp_histogram
))
1540 for (j
= 0; j
< 32; j
++)
1541 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "%X", (int)lrintf(log(qp_histogram
[j
] + 1) / log(2)));
1543 if (enc
->flags
&CODEC_FLAG_PSNR
) {
1545 double error
, error_sum
= 0;
1546 double scale
, scale_sum
= 0;
1547 char type
[3] = { 'Y','U','V' };
1548 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "PSNR=");
1549 for (j
= 0; j
< 3; j
++) {
1550 if (is_last_report
) {
1551 error
= enc
->error
[j
];
1552 scale
= enc
->width
* enc
->height
* 255.0 * 255.0 * frame_number
;
1554 error
= enc
->coded_frame
->error
[j
];
1555 scale
= enc
->width
* enc
->height
* 255.0 * 255.0;
1561 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "%c:%2.2f ", type
[j
], psnr(error
/ scale
));
1563 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), "*:%2.2f ", psnr(error_sum
/ scale_sum
));
1567 /* compute min output value */
1568 pts
= (double)ost
->st
->pts
.val
* av_q2d(ost
->st
->time_base
);
1569 if ((pts
< ti1
) && (pts
> 0))
1575 bitrate
= (double)(total_size
* 8) / ti1
/ 1000.0;
1577 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
),
1578 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1579 (double)total_size
/ 1024, ti1
, bitrate
);
1581 if (nb_frames_dup
|| nb_frames_drop
)
1582 snprintf(buf
+ strlen(buf
), sizeof(buf
) - strlen(buf
), " dup=%d drop=%d",
1583 nb_frames_dup
, nb_frames_drop
);
1585 av_log(NULL
, AV_LOG_INFO
, "%s \r", buf
);
1589 if (is_last_report
) {
1590 int64_t raw
= audio_size
+ video_size
+ extra_size
;
1591 av_log(NULL
, AV_LOG_INFO
, "\n");
1592 av_log(NULL
, AV_LOG_INFO
, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1593 video_size
/ 1024.0,
1594 audio_size
/ 1024.0,
1595 extra_size
/ 1024.0,
1596 100.0 * (total_size
- raw
) / raw
1601 static void flush_encoders(OutputStream
*ost_table
, int nb_ostreams
)
1605 for (i
= 0; i
< nb_ostreams
; i
++) {
1606 OutputStream
*ost
= &ost_table
[i
];
1607 AVCodecContext
*enc
= ost
->st
->codec
;
1608 AVFormatContext
*os
= output_files
[ost
->file_index
].ctx
;
1610 if (!ost
->encoding_needed
)
1613 if (ost
->st
->codec
->codec_type
== AVMEDIA_TYPE_AUDIO
&& enc
->frame_size
<= 1)
1615 if (ost
->st
->codec
->codec_type
== AVMEDIA_TYPE_VIDEO
&& (os
->oformat
->flags
& AVFMT_RAWPICTURE
) && enc
->codec
->id
== CODEC_ID_RAWVIDEO
)
1621 av_init_packet(&pkt
);
1622 pkt
.stream_index
= ost
->index
;
1624 switch (ost
->st
->codec
->codec_type
) {
1625 case AVMEDIA_TYPE_AUDIO
:
1626 fifo_bytes
= av_fifo_size(ost
->fifo
);
1628 /* encode any samples remaining in fifo */
1629 if (fifo_bytes
> 0) {
1630 int osize
= av_get_bytes_per_sample(enc
->sample_fmt
);
1631 int fs_tmp
= enc
->frame_size
;
1633 av_fifo_generic_read(ost
->fifo
, audio_buf
, fifo_bytes
, NULL
);
1634 if (enc
->codec
->capabilities
& CODEC_CAP_SMALL_LAST_FRAME
) {
1635 enc
->frame_size
= fifo_bytes
/ (osize
* enc
->channels
);
1637 int frame_bytes
= enc
->frame_size
*osize
*enc
->channels
;
1638 if (allocated_audio_buf_size
< frame_bytes
)
1640 generate_silence(audio_buf
+fifo_bytes
, enc
->sample_fmt
, frame_bytes
- fifo_bytes
);
1643 ret
= avcodec_encode_audio(enc
, bit_buffer
, bit_buffer_size
, (short *)audio_buf
);
1644 pkt
.duration
= av_rescale((int64_t)enc
->frame_size
*ost
->st
->time_base
.den
,
1645 ost
->st
->time_base
.num
, enc
->sample_rate
);
1646 enc
->frame_size
= fs_tmp
;
1649 ret
= avcodec_encode_audio(enc
, bit_buffer
, bit_buffer_size
, NULL
);
1652 av_log(NULL
, AV_LOG_FATAL
, "Audio encoding failed\n");
1656 pkt
.flags
|= AV_PKT_FLAG_KEY
;
1658 case AVMEDIA_TYPE_VIDEO
:
1659 ret
= avcodec_encode_video(enc
, bit_buffer
, bit_buffer_size
, NULL
);
1661 av_log(NULL
, AV_LOG_FATAL
, "Video encoding failed\n");
1665 if (enc
->coded_frame
&& enc
->coded_frame
->key_frame
)
1666 pkt
.flags
|= AV_PKT_FLAG_KEY
;
1667 if (ost
->logfile
&& enc
->stats_out
) {
1668 fprintf(ost
->logfile
, "%s", enc
->stats_out
);
1677 pkt
.data
= bit_buffer
;
1679 if (enc
->coded_frame
&& enc
->coded_frame
->pts
!= AV_NOPTS_VALUE
)
1680 pkt
.pts
= av_rescale_q(enc
->coded_frame
->pts
, enc
->time_base
, ost
->st
->time_base
);
1681 write_frame(os
, &pkt
, ost
->st
->codec
, ost
->bitstream_filters
);
1687 * Check whether a packet from ist should be written into ost at this time
1689 static int check_output_constraints(InputStream
*ist
, OutputStream
*ost
)
1691 OutputFile
*of
= &output_files
[ost
->file_index
];
1692 int ist_index
= ist
- input_streams
;
1694 if (ost
->source_index
!= ist_index
)
1697 if (of
->start_time
&& ist
->pts
< of
->start_time
)
1700 if (of
->recording_time
!= INT64_MAX
&&
1701 av_compare_ts(ist
->pts
, AV_TIME_BASE_Q
, of
->recording_time
+ of
->start_time
,
1702 (AVRational
){ 1, 1000000 }) >= 0) {
1703 ost
->is_past_recording_time
= 1;
1710 static void do_streamcopy(InputStream
*ist
, OutputStream
*ost
, const AVPacket
*pkt
)
1712 OutputFile
*of
= &output_files
[ost
->file_index
];
1713 int64_t ost_tb_start_time
= av_rescale_q(of
->start_time
, AV_TIME_BASE_Q
, ost
->st
->time_base
);
1716 av_init_packet(&opkt
);
1718 if ((!ost
->frame_number
&& !(pkt
->flags
& AV_PKT_FLAG_KEY
)) &&
1719 !ost
->copy_initial_nonkeyframes
)
1722 /* force the input stream PTS */
1723 if (ost
->st
->codec
->codec_type
== AVMEDIA_TYPE_AUDIO
)
1724 audio_size
+= pkt
->size
;
1725 else if (ost
->st
->codec
->codec_type
== AVMEDIA_TYPE_VIDEO
) {
1726 video_size
+= pkt
->size
;
1730 opkt
.stream_index
= ost
->index
;
1731 if (pkt
->pts
!= AV_NOPTS_VALUE
)
1732 opkt
.pts
= av_rescale_q(pkt
->pts
, ist
->st
->time_base
, ost
->st
->time_base
) - ost_tb_start_time
;
1734 opkt
.pts
= AV_NOPTS_VALUE
;
1736 if (pkt
->dts
== AV_NOPTS_VALUE
)
1737 opkt
.dts
= av_rescale_q(ist
->pts
, AV_TIME_BASE_Q
, ost
->st
->time_base
);
1739 opkt
.dts
= av_rescale_q(pkt
->dts
, ist
->st
->time_base
, ost
->st
->time_base
);
1740 opkt
.dts
-= ost_tb_start_time
;
1742 opkt
.duration
= av_rescale_q(pkt
->duration
, ist
->st
->time_base
, ost
->st
->time_base
);
1743 opkt
.flags
= pkt
->flags
;
1745 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1746 if ( ost
->st
->codec
->codec_id
!= CODEC_ID_H264
1747 && ost
->st
->codec
->codec_id
!= CODEC_ID_MPEG1VIDEO
1748 && ost
->st
->codec
->codec_id
!= CODEC_ID_MPEG2VIDEO
1750 if (av_parser_change(ist
->st
->parser
, ost
->st
->codec
, &opkt
.data
, &opkt
.size
, pkt
->data
, pkt
->size
, pkt
->flags
& AV_PKT_FLAG_KEY
))
1751 opkt
.destruct
= av_destruct_packet
;
1753 opkt
.data
= pkt
->data
;
1754 opkt
.size
= pkt
->size
;
1757 write_frame(of
->ctx
, &opkt
, ost
->st
->codec
, ost
->bitstream_filters
);
1758 ost
->st
->codec
->frame_number
++;
1759 ost
->frame_number
++;
1760 av_free_packet(&opkt
);
1763 static void rate_emu_sleep(InputStream
*ist
)
1765 if (input_files
[ist
->file_index
].rate_emu
) {
1766 int64_t pts
= av_rescale(ist
->pts
, 1000000, AV_TIME_BASE
);
1767 int64_t now
= av_gettime() - ist
->start
;
1773 static int transcode_audio(InputStream
*ist
, AVPacket
*pkt
, int *got_output
)
1775 AVFrame
*decoded_frame
;
1776 AVCodecContext
*avctx
= ist
->st
->codec
;
1777 int bps
= av_get_bytes_per_sample(ist
->st
->codec
->sample_fmt
);
1780 if (!ist
->decoded_frame
&& !(ist
->decoded_frame
= avcodec_alloc_frame()))
1781 return AVERROR(ENOMEM
);
1783 avcodec_get_frame_defaults(ist
->decoded_frame
);
1784 decoded_frame
= ist
->decoded_frame
;
1786 ret
= avcodec_decode_audio4(avctx
, decoded_frame
, got_output
, pkt
);
1792 /* no audio frame */
1796 /* if the decoder provides a pts, use it instead of the last packet pts.
1797 the decoder could be delaying output by a packet or more. */
1798 if (decoded_frame
->pts
!= AV_NOPTS_VALUE
)
1799 ist
->next_pts
= decoded_frame
->pts
;
1801 /* increment next_pts to use for the case where the input stream does not
1802 have timestamps or there are multiple frames in the packet */
1803 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
* decoded_frame
->nb_samples
) /
1806 // preprocess audio (volume)
1807 if (audio_volume
!= 256) {
1808 int decoded_data_size
= decoded_frame
->nb_samples
* avctx
->channels
* bps
;
1809 void *samples
= decoded_frame
->data
[0];
1810 switch (avctx
->sample_fmt
) {
1811 case AV_SAMPLE_FMT_U8
:
1813 uint8_t *volp
= samples
;
1814 for (i
= 0; i
< (decoded_data_size
/ sizeof(*volp
)); i
++) {
1815 int v
= (((*volp
- 128) * audio_volume
+ 128) >> 8) + 128;
1816 *volp
++ = av_clip_uint8(v
);
1820 case AV_SAMPLE_FMT_S16
:
1822 int16_t *volp
= samples
;
1823 for (i
= 0; i
< (decoded_data_size
/ sizeof(*volp
)); i
++) {
1824 int v
= ((*volp
) * audio_volume
+ 128) >> 8;
1825 *volp
++ = av_clip_int16(v
);
1829 case AV_SAMPLE_FMT_S32
:
1831 int32_t *volp
= samples
;
1832 for (i
= 0; i
< (decoded_data_size
/ sizeof(*volp
)); i
++) {
1833 int64_t v
= (((int64_t)*volp
* audio_volume
+ 128) >> 8);
1834 *volp
++ = av_clipl_int32(v
);
1838 case AV_SAMPLE_FMT_FLT
:
1840 float *volp
= samples
;
1841 float scale
= audio_volume
/ 256.f
;
1842 for (i
= 0; i
< (decoded_data_size
/ sizeof(*volp
)); i
++) {
1847 case AV_SAMPLE_FMT_DBL
:
1849 double *volp
= samples
;
1850 double scale
= audio_volume
/ 256.;
1851 for (i
= 0; i
< (decoded_data_size
/ sizeof(*volp
)); i
++) {
1857 av_log(NULL
, AV_LOG_FATAL
,
1858 "Audio volume adjustment on sample format %s is not supported.\n",
1859 av_get_sample_fmt_name(ist
->st
->codec
->sample_fmt
));
1864 rate_emu_sleep(ist
);
1866 for (i
= 0; i
< nb_output_streams
; i
++) {
1867 OutputStream
*ost
= &output_streams
[i
];
1869 if (!check_output_constraints(ist
, ost
) || !ost
->encoding_needed
)
1871 do_audio_out(output_files
[ost
->file_index
].ctx
, ost
, ist
, decoded_frame
);
1877 static int transcode_video(InputStream
*ist
, AVPacket
*pkt
, int *got_output
, int64_t *pkt_pts
)
1879 AVFrame
*decoded_frame
, *filtered_frame
= NULL
;
1880 void *buffer_to_free
= NULL
;
1884 int frame_available
= 1;
1887 if (!ist
->decoded_frame
&& !(ist
->decoded_frame
= avcodec_alloc_frame()))
1888 return AVERROR(ENOMEM
);
1890 avcodec_get_frame_defaults(ist
->decoded_frame
);
1891 decoded_frame
= ist
->decoded_frame
;
1892 pkt
->pts
= *pkt_pts
;
1893 pkt
->dts
= ist
->pts
;
1894 *pkt_pts
= AV_NOPTS_VALUE
;
1896 ret
= avcodec_decode_video2(ist
->st
->codec
,
1897 decoded_frame
, got_output
, pkt
);
1901 quality
= same_quant ? decoded_frame
->quality
: 0;
1903 /* no picture yet */
1906 ist
->next_pts
= ist
->pts
= guess_correct_pts(&ist
->pts_ctx
, decoded_frame
->pkt_pts
,
1907 decoded_frame
->pkt_dts
);
1909 ist
->next_pts
+= av_rescale_q(pkt
->duration
, ist
->st
->time_base
, AV_TIME_BASE_Q
);
1910 else if (ist
->st
->codec
->time_base
.num
!= 0) {
1911 int ticks
= ist
->st
->parser ? ist
->st
->parser
->repeat_pict
+ 1 :
1912 ist
->st
->codec
->ticks_per_frame
;
1913 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
*
1914 ist
->st
->codec
->time_base
.num
* ticks
) /
1915 ist
->st
->codec
->time_base
.den
;
1918 pre_process_video_frame(ist
, (AVPicture
*)decoded_frame
, &buffer_to_free
);
1920 rate_emu_sleep(ist
);
1922 for (i
= 0; i
< nb_output_streams
; i
++) {
1923 OutputStream
*ost
= &output_streams
[i
];
1926 if (!check_output_constraints(ist
, ost
) || !ost
->encoding_needed
)
1930 if (ist
->st
->sample_aspect_ratio
.num
)
1931 decoded_frame
->sample_aspect_ratio
= ist
->st
->sample_aspect_ratio
;
1932 if (ist
->st
->codec
->codec
->capabilities
& CODEC_CAP_DR1
) {
1933 FrameBuffer
*buf
= decoded_frame
->opaque
;
1934 AVFilterBufferRef
*fb
= avfilter_get_video_buffer_ref_from_arrays(
1935 decoded_frame
->data
, decoded_frame
->linesize
,
1936 AV_PERM_READ
| AV_PERM_PRESERVE
,
1937 ist
->st
->codec
->width
, ist
->st
->codec
->height
,
1938 ist
->st
->codec
->pix_fmt
);
1940 avfilter_copy_frame_props(fb
, decoded_frame
);
1942 fb
->buf
->priv
= buf
;
1943 fb
->buf
->free
= filter_release_buffer
;
1946 av_buffersrc_buffer(ost
->input_video_filter
, fb
);
1948 av_vsrc_buffer_add_frame(ost
->input_video_filter
, decoded_frame
,
1949 ist
->pts
, decoded_frame
->sample_aspect_ratio
);
1951 if (!ist
->filtered_frame
&& !(ist
->filtered_frame
= avcodec_alloc_frame())) {
1952 av_free(buffer_to_free
);
1953 return AVERROR(ENOMEM
);
1955 avcodec_get_frame_defaults(ist
->filtered_frame
);
1956 filtered_frame
= ist
->filtered_frame
;
1958 frame_available
= avfilter_poll_frame(ost
->output_video_filter
->inputs
[0]);
1959 while (frame_available
) {
1960 AVRational ist_pts_tb
;
1961 if (ost
->output_video_filter
)
1962 get_filtered_video_frame(ost
->output_video_filter
, filtered_frame
, &ost
->picref
, &ist_pts_tb
);
1964 ist
->pts
= av_rescale_q(ost
->picref
->pts
, ist_pts_tb
, AV_TIME_BASE_Q
);
1965 if (ost
->picref
->video
&& !ost
->frame_aspect_ratio
)
1966 ost
->st
->codec
->sample_aspect_ratio
= ost
->picref
->video
->pixel_aspect
;
1968 filtered_frame
= decoded_frame
;
1971 do_video_out(output_files
[ost
->file_index
].ctx
, ost
, ist
, filtered_frame
, &frame_size
,
1972 same_quant ? quality
: ost
->st
->codec
->global_quality
);
1973 if (vstats_filename
&& frame_size
)
1974 do_video_stats(output_files
[ost
->file_index
].ctx
, ost
, frame_size
);
1976 frame_available
= ost
->output_video_filter
&& avfilter_poll_frame(ost
->output_video_filter
->inputs
[0]);
1978 avfilter_unref_buffer(ost
->picref
);
1983 av_free(buffer_to_free
);
1987 static int transcode_subtitles(InputStream
*ist
, AVPacket
*pkt
, int *got_output
)
1989 AVSubtitle subtitle
;
1990 int i
, ret
= avcodec_decode_subtitle2(ist
->st
->codec
,
1991 &subtitle
, got_output
, pkt
);
1997 rate_emu_sleep(ist
);
1999 for (i
= 0; i
< nb_output_streams
; i
++) {
2000 OutputStream
*ost
= &output_streams
[i
];
2002 if (!check_output_constraints(ist
, ost
) || !ost
->encoding_needed
)
2005 do_subtitle_out(output_files
[ost
->file_index
].ctx
, ost
, ist
, &subtitle
, pkt
->pts
);
2008 avsubtitle_free(&subtitle
);
2012 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2013 static int output_packet(InputStream
*ist
,
2014 OutputStream
*ost_table
, int nb_ostreams
,
2015 const AVPacket
*pkt
)
2019 int64_t pkt_pts
= AV_NOPTS_VALUE
;
2022 if (ist
->next_pts
== AV_NOPTS_VALUE
)
2023 ist
->next_pts
= ist
->pts
;
2027 av_init_packet(&avpkt
);
2035 if (pkt
->dts
!= AV_NOPTS_VALUE
)
2036 ist
->next_pts
= ist
->pts
= av_rescale_q(pkt
->dts
, ist
->st
->time_base
, AV_TIME_BASE_Q
);
2037 if (pkt
->pts
!= AV_NOPTS_VALUE
)
2038 pkt_pts
= av_rescale_q(pkt
->pts
, ist
->st
->time_base
, AV_TIME_BASE_Q
);
2040 // while we have more to decode or while the decoder did output something on EOF
2041 while (ist
->decoding_needed
&& (avpkt
.size
> 0 || (!pkt
&& got_output
))) {
2045 ist
->pts
= ist
->next_pts
;
2047 if (avpkt
.size
&& avpkt
.size
!= pkt
->size
) {
2048 av_log(NULL
, ist
->showed_multi_packet_warning ? AV_LOG_VERBOSE
: AV_LOG_WARNING
,
2049 "Multiple frames in a packet from stream %d\n", pkt
->stream_index
);
2050 ist
->showed_multi_packet_warning
= 1;
2053 switch (ist
->st
->codec
->codec_type
) {
2054 case AVMEDIA_TYPE_AUDIO
:
2055 ret
= transcode_audio (ist
, &avpkt
, &got_output
);
2057 case AVMEDIA_TYPE_VIDEO
:
2058 ret
= transcode_video (ist
, &avpkt
, &got_output
, &pkt_pts
);
2060 case AVMEDIA_TYPE_SUBTITLE
:
2061 ret
= transcode_subtitles(ist
, &avpkt
, &got_output
);
2069 // touch data and size only if not EOF
2079 /* handle stream copy */
2080 if (!ist
->decoding_needed
) {
2081 rate_emu_sleep(ist
);
2082 ist
->pts
= ist
->next_pts
;
2083 switch (ist
->st
->codec
->codec_type
) {
2084 case AVMEDIA_TYPE_AUDIO
:
2085 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
* ist
->st
->codec
->frame_size
) /
2086 ist
->st
->codec
->sample_rate
;
2088 case AVMEDIA_TYPE_VIDEO
:
2089 if (ist
->st
->codec
->time_base
.num
!= 0) {
2090 int ticks
= ist
->st
->parser ? ist
->st
->parser
->repeat_pict
+ 1 : ist
->st
->codec
->ticks_per_frame
;
2091 ist
->next_pts
+= ((int64_t)AV_TIME_BASE
*
2092 ist
->st
->codec
->time_base
.num
* ticks
) /
2093 ist
->st
->codec
->time_base
.den
;
2098 for (i
= 0; pkt
&& i
< nb_ostreams
; i
++) {
2099 OutputStream
*ost
= &ost_table
[i
];
2101 if (!check_output_constraints(ist
, ost
) || ost
->encoding_needed
)
2104 do_streamcopy(ist
, ost
, pkt
);
2110 static void print_sdp(OutputFile
*output_files
, int n
)
2114 AVFormatContext
**avc
= av_malloc(sizeof(*avc
) * n
);
2118 for (i
= 0; i
< n
; i
++)
2119 avc
[i
] = output_files
[i
].ctx
;
2121 av_sdp_create(avc
, n
, sdp
, sizeof(sdp
));
2122 printf("SDP:\n%s\n", sdp
);
2127 static int init_input_stream(int ist_index
, OutputStream
*output_streams
, int nb_output_streams
,
2128 char *error
, int error_len
)
2131 InputStream
*ist
= &input_streams
[ist_index
];
2132 if (ist
->decoding_needed
) {
2133 AVCodec
*codec
= ist
->dec
;
2135 snprintf(error
, error_len
, "Decoder (codec id %d) not found for input stream #%d:%d",
2136 ist
->st
->codec
->codec_id
, ist
->file_index
, ist
->st
->index
);
2137 return AVERROR(EINVAL
);
2140 /* update requested sample format for the decoder based on the
2141 corresponding encoder sample format */
2142 for (i
= 0; i
< nb_output_streams
; i
++) {
2143 OutputStream
*ost
= &output_streams
[i
];
2144 if (ost
->source_index
== ist_index
) {
2145 update_sample_fmt(ist
->st
->codec
, codec
, ost
->st
->codec
);
2150 if (codec
->type
== AVMEDIA_TYPE_VIDEO
&& codec
->capabilities
& CODEC_CAP_DR1
) {
2151 ist
->st
->codec
->get_buffer
= codec_get_buffer
;
2152 ist
->st
->codec
->release_buffer
= codec_release_buffer
;
2153 ist
->st
->codec
->opaque
= ist
;
2156 if (avcodec_open2(ist
->st
->codec
, codec
, &ist
->opts
) < 0) {
2157 snprintf(error
, error_len
, "Error while opening decoder for input stream #%d:%d",
2158 ist
->file_index
, ist
->st
->index
);
2159 return AVERROR(EINVAL
);
2161 assert_codec_experimental(ist
->st
->codec
, 0);
2162 assert_avoptions(ist
->opts
);
2165 ist
->pts
= ist
->st
->avg_frame_rate
.num ?
- ist
->st
->codec
->has_b_frames
* AV_TIME_BASE
/ av_q2d(ist
->st
->avg_frame_rate
) : 0;
2166 ist
->next_pts
= AV_NOPTS_VALUE
;
2167 init_pts_correction(&ist
->pts_ctx
);
2173 static int transcode_init(OutputFile
*output_files
,
2174 int nb_output_files
,
2175 InputFile
*input_files
,
2178 int ret
= 0, i
, j
, k
;
2179 AVFormatContext
*oc
;
2180 AVCodecContext
*codec
, *icodec
;
2186 /* init framerate emulation */
2187 for (i
= 0; i
< nb_input_files
; i
++) {
2188 InputFile
*ifile
= &input_files
[i
];
2189 if (ifile
->rate_emu
)
2190 for (j
= 0; j
< ifile
->nb_streams
; j
++)
2191 input_streams
[j
+ ifile
->ist_index
].start
= av_gettime();
2194 /* output stream init */
2195 for (i
= 0; i
< nb_output_files
; i
++) {
2196 oc
= output_files
[i
].ctx
;
2197 if (!oc
->nb_streams
&& !(oc
->oformat
->flags
& AVFMT_NOSTREAMS
)) {
2198 av_dump_format(oc
, i
, oc
->filename
, 1);
2199 av_log(NULL
, AV_LOG_ERROR
, "Output file #%d does not contain any stream\n", i
);
2200 return AVERROR(EINVAL
);
2204 /* for each output stream, we compute the right encoding parameters */
2205 for (i
= 0; i
< nb_output_streams
; i
++) {
2206 ost
= &output_streams
[i
];
2207 oc
= output_files
[ost
->file_index
].ctx
;
2208 ist
= &input_streams
[ost
->source_index
];
2210 if (ost
->attachment_filename
)
2213 codec
= ost
->st
->codec
;
2214 icodec
= ist
->st
->codec
;
2216 ost
->st
->disposition
= ist
->st
->disposition
;
2217 codec
->bits_per_raw_sample
= icodec
->bits_per_raw_sample
;
2218 codec
->chroma_sample_location
= icodec
->chroma_sample_location
;
2220 if (ost
->stream_copy
) {
2221 uint64_t extra_size
= (uint64_t)icodec
->extradata_size
+ FF_INPUT_BUFFER_PADDING_SIZE
;
2223 if (extra_size
> INT_MAX
) {
2224 return AVERROR(EINVAL
);
2227 /* if stream_copy is selected, no need to decode or encode */
2228 codec
->codec_id
= icodec
->codec_id
;
2229 codec
->codec_type
= icodec
->codec_type
;
2231 if (!codec
->codec_tag
) {
2232 if (!oc
->oformat
->codec_tag
||
2233 av_codec_get_id (oc
->oformat
->codec_tag
, icodec
->codec_tag
) == codec
->codec_id
||
2234 av_codec_get_tag(oc
->oformat
->codec_tag
, icodec
->codec_id
) <= 0)
2235 codec
->codec_tag
= icodec
->codec_tag
;
2238 codec
->bit_rate
= icodec
->bit_rate
;
2239 codec
->rc_max_rate
= icodec
->rc_max_rate
;
2240 codec
->rc_buffer_size
= icodec
->rc_buffer_size
;
2241 codec
->field_order
= icodec
->field_order
;
2242 codec
->extradata
= av_mallocz(extra_size
);
2243 if (!codec
->extradata
) {
2244 return AVERROR(ENOMEM
);
2246 memcpy(codec
->extradata
, icodec
->extradata
, icodec
->extradata_size
);
2247 codec
->extradata_size
= icodec
->extradata_size
;
2249 codec
->time_base
= icodec
->time_base
;
2250 codec
->time_base
.num
*= icodec
->ticks_per_frame
;
2251 av_reduce(&codec
->time_base
.num
, &codec
->time_base
.den
,
2252 codec
->time_base
.num
, codec
->time_base
.den
, INT_MAX
);
2254 codec
->time_base
= ist
->st
->time_base
;
2256 switch (codec
->codec_type
) {
2257 case AVMEDIA_TYPE_AUDIO
:
2258 if (audio_volume
!= 256) {
2259 av_log(NULL
, AV_LOG_FATAL
, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2262 codec
->channel_layout
= icodec
->channel_layout
;
2263 codec
->sample_rate
= icodec
->sample_rate
;
2264 codec
->channels
= icodec
->channels
;
2265 codec
->frame_size
= icodec
->frame_size
;
2266 codec
->audio_service_type
= icodec
->audio_service_type
;
2267 codec
->block_align
= icodec
->block_align
;
2269 case AVMEDIA_TYPE_VIDEO
:
2270 codec
->pix_fmt
= icodec
->pix_fmt
;
2271 codec
->width
= icodec
->width
;
2272 codec
->height
= icodec
->height
;
2273 codec
->has_b_frames
= icodec
->has_b_frames
;
2274 if (!codec
->sample_aspect_ratio
.num
) {
2275 codec
->sample_aspect_ratio
=
2276 ost
->st
->sample_aspect_ratio
=
2277 ist
->st
->sample_aspect_ratio
.num ? ist
->st
->sample_aspect_ratio
:
2278 ist
->st
->codec
->sample_aspect_ratio
.num ?
2279 ist
->st
->codec
->sample_aspect_ratio
: (AVRational
){0, 1};
2282 case AVMEDIA_TYPE_SUBTITLE
:
2283 codec
->width
= icodec
->width
;
2284 codec
->height
= icodec
->height
;
2286 case AVMEDIA_TYPE_DATA
:
2287 case AVMEDIA_TYPE_ATTACHMENT
:
2294 ost
->enc
= avcodec_find_encoder(ost
->st
->codec
->codec_id
);
2296 ist
->decoding_needed
= 1;
2297 ost
->encoding_needed
= 1;
2299 switch (codec
->codec_type
) {
2300 case AVMEDIA_TYPE_AUDIO
:
2301 ost
->fifo
= av_fifo_alloc(1024);
2303 return AVERROR(ENOMEM
);
2305 ost
->reformat_pair
= MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE
,AV_SAMPLE_FMT_NONE
);
2307 if (!codec
->sample_rate
)
2308 codec
->sample_rate
= icodec
->sample_rate
;
2309 choose_sample_rate(ost
->st
, ost
->enc
);
2310 codec
->time_base
= (AVRational
){ 1, codec
->sample_rate
};
2312 if (codec
->sample_fmt
== AV_SAMPLE_FMT_NONE
)
2313 codec
->sample_fmt
= icodec
->sample_fmt
;
2314 choose_sample_fmt(ost
->st
, ost
->enc
);
2316 if (!codec
->channels
)
2317 codec
->channels
= icodec
->channels
;
2318 codec
->channel_layout
= icodec
->channel_layout
;
2319 if (av_get_channel_layout_nb_channels(codec
->channel_layout
) != codec
->channels
)
2320 codec
->channel_layout
= 0;
2322 ost
->audio_resample
= codec
-> sample_rate
!= icodec
->sample_rate
|| audio_sync_method
> 1;
2323 icodec
->request_channels
= codec
-> channels
;
2324 ost
->resample_sample_fmt
= icodec
->sample_fmt
;
2325 ost
->resample_sample_rate
= icodec
->sample_rate
;
2326 ost
->resample_channels
= icodec
->channels
;
2328 case AVMEDIA_TYPE_VIDEO
:
2329 if (codec
->pix_fmt
== PIX_FMT_NONE
)
2330 codec
->pix_fmt
= icodec
->pix_fmt
;
2331 choose_pixel_fmt(ost
->st
, ost
->enc
);
2333 if (ost
->st
->codec
->pix_fmt
== PIX_FMT_NONE
) {
2334 av_log(NULL
, AV_LOG_FATAL
, "Video pixel format is unknown, stream cannot be encoded\n");
2338 if (!codec
->width
|| !codec
->height
) {
2339 codec
->width
= icodec
->width
;
2340 codec
->height
= icodec
->height
;
2343 ost
->video_resample
= codec
->width
!= icodec
->width
||
2344 codec
->height
!= icodec
->height
||
2345 codec
->pix_fmt
!= icodec
->pix_fmt
;
2346 if (ost
->video_resample
) {
2347 #if !CONFIG_AVFILTER
2348 avcodec_get_frame_defaults(&ost
->pict_tmp
);
2349 if (avpicture_alloc((AVPicture
*)&ost
->pict_tmp
, codec
->pix_fmt
,
2350 codec
->width
, codec
->height
)) {
2351 av_log(NULL
, AV_LOG_FATAL
, "Cannot allocate temp picture, check pix fmt\n");
2354 ost
->img_resample_ctx
= sws_getContext(
2361 ost
->sws_flags
, NULL
, NULL
, NULL
);
2362 if (ost
->img_resample_ctx
== NULL
) {
2363 av_log(NULL
, AV_LOG_FATAL
, "Cannot get resampling context\n");
2367 codec
->bits_per_raw_sample
= 0;
2370 ost
->resample_height
= icodec
->height
;
2371 ost
->resample_width
= icodec
->width
;
2372 ost
->resample_pix_fmt
= icodec
->pix_fmt
;
2374 if (!ost
->frame_rate
.num
)
2375 ost
->frame_rate
= ist
->st
->r_frame_rate
.num ? ist
->st
->r_frame_rate
: (AVRational
) { 25, 1 };
2376 if (ost
->enc
&& ost
->enc
->supported_framerates
&& !ost
->force_fps
) {
2377 int idx
= av_find_nearest_q_idx(ost
->frame_rate
, ost
->enc
->supported_framerates
);
2378 ost
->frame_rate
= ost
->enc
->supported_framerates
[idx
];
2380 codec
->time_base
= (AVRational
){ost
->frame_rate
.den
, ost
->frame_rate
.num
};
2383 if (configure_video_filters(ist
, ost
)) {
2384 av_log(NULL
, AV_LOG_FATAL
, "Error opening filters!\n");
2389 case AVMEDIA_TYPE_SUBTITLE
:
2396 if ((codec
->flags
& (CODEC_FLAG_PASS1
| CODEC_FLAG_PASS2
))) {
2397 char logfilename
[1024];
2400 snprintf(logfilename
, sizeof(logfilename
), "%s-%d.log",
2401 pass_logfilename_prefix ? pass_logfilename_prefix
: DEFAULT_PASS_LOGFILENAME_PREFIX
,
2403 if (codec
->flags
& CODEC_FLAG_PASS1
) {
2404 f
= fopen(logfilename
, "wb");
2406 av_log(NULL
, AV_LOG_FATAL
, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2407 logfilename
, strerror(errno
));
2413 size_t logbuffer_size
;
2414 if (cmdutils_read_file(logfilename
, &logbuffer
, &logbuffer_size
) < 0) {
2415 av_log(NULL
, AV_LOG_FATAL
, "Error reading log file '%s' for pass-2 encoding\n",
2419 codec
->stats_in
= logbuffer
;
2423 if (codec
->codec_type
== AVMEDIA_TYPE_VIDEO
) {
2424 int size
= codec
->width
* codec
->height
;
2425 bit_buffer_size
= FFMAX(bit_buffer_size
, 6 * size
+ 200);
2430 bit_buffer
= av_malloc(bit_buffer_size
);
2432 av_log(NULL
, AV_LOG_ERROR
, "Cannot allocate %d bytes output buffer\n",
2434 return AVERROR(ENOMEM
);
2437 /* open each encoder */
2438 for (i
= 0; i
< nb_output_streams
; i
++) {
2439 ost
= &output_streams
[i
];
2440 if (ost
->encoding_needed
) {
2441 AVCodec
*codec
= ost
->enc
;
2442 AVCodecContext
*dec
= input_streams
[ost
->source_index
].st
->codec
;
2444 snprintf(error
, sizeof(error
), "Encoder (codec id %d) not found for output stream #%d:%d",
2445 ost
->st
->codec
->codec_id
, ost
->file_index
, ost
->index
);
2446 ret
= AVERROR(EINVAL
);
2449 if (dec
->subtitle_header
) {
2450 ost
->st
->codec
->subtitle_header
= av_malloc(dec
->subtitle_header_size
);
2451 if (!ost
->st
->codec
->subtitle_header
) {
2452 ret
= AVERROR(ENOMEM
);
2455 memcpy(ost
->st
->codec
->subtitle_header
, dec
->subtitle_header
, dec
->subtitle_header_size
);
2456 ost
->st
->codec
->subtitle_header_size
= dec
->subtitle_header_size
;
2458 if (avcodec_open2(ost
->st
->codec
, codec
, &ost
->opts
) < 0) {
2459 snprintf(error
, sizeof(error
), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2460 ost
->file_index
, ost
->index
);
2461 ret
= AVERROR(EINVAL
);
2464 assert_codec_experimental(ost
->st
->codec
, 1);
2465 assert_avoptions(ost
->opts
);
2466 if (ost
->st
->codec
->bit_rate
&& ost
->st
->codec
->bit_rate
< 1000)
2467 av_log(NULL
, AV_LOG_WARNING
, "The bitrate parameter is set too low."
2468 "It takes bits/s as argument, not kbits/s\n");
2469 extra_size
+= ost
->st
->codec
->extradata_size
;
2471 if (ost
->st
->codec
->me_threshold
)
2472 input_streams
[ost
->source_index
].st
->codec
->debug
|= FF_DEBUG_MV
;
2476 /* init input streams */
2477 for (i
= 0; i
< nb_input_streams
; i
++)
2478 if ((ret
= init_input_stream(i
, output_streams
, nb_output_streams
, error
, sizeof(error
))) < 0)
2481 /* discard unused programs */
2482 for (i
= 0; i
< nb_input_files
; i
++) {
2483 InputFile
*ifile
= &input_files
[i
];
2484 for (j
= 0; j
< ifile
->ctx
->nb_programs
; j
++) {
2485 AVProgram
*p
= ifile
->ctx
->programs
[j
];
2486 int discard
= AVDISCARD_ALL
;
2488 for (k
= 0; k
< p
->nb_stream_indexes
; k
++)
2489 if (!input_streams
[ifile
->ist_index
+ p
->stream_index
[k
]].discard
) {
2490 discard
= AVDISCARD_DEFAULT
;
2493 p
->discard
= discard
;
2497 /* open files and write file headers */
2498 for (i
= 0; i
< nb_output_files
; i
++) {
2499 oc
= output_files
[i
].ctx
;
2500 oc
->interrupt_callback
= int_cb
;
2501 if (avformat_write_header(oc
, &output_files
[i
].opts
) < 0) {
2502 snprintf(error
, sizeof(error
), "Could not write header for output file #%d (incorrect codec parameters ?)", i
);
2503 ret
= AVERROR(EINVAL
);
2506 assert_avoptions(output_files
[i
].opts
);
2507 if (strcmp(oc
->oformat
->name
, "rtp")) {
2513 /* dump the file output parameters - cannot be done before in case
2515 for (i
= 0; i
< nb_output_files
; i
++) {
2516 av_dump_format(output_files
[i
].ctx
, i
, output_files
[i
].ctx
->filename
, 1);
2519 /* dump the stream mapping */
2520 av_log(NULL
, AV_LOG_INFO
, "Stream mapping:\n");
2521 for (i
= 0; i
< nb_output_streams
; i
++) {
2522 ost
= &output_streams
[i
];
2524 if (ost
->attachment_filename
) {
2525 /* an attached file */
2526 av_log(NULL
, AV_LOG_INFO
, " File %s -> Stream #%d:%d\n",
2527 ost
->attachment_filename
, ost
->file_index
, ost
->index
);
2530 av_log(NULL
, AV_LOG_INFO
, " Stream #%d:%d -> #%d:%d",
2531 input_streams
[ost
->source_index
].file_index
,
2532 input_streams
[ost
->source_index
].st
->index
,
2535 if (ost
->sync_ist
!= &input_streams
[ost
->source_index
])
2536 av_log(NULL
, AV_LOG_INFO
, " [sync #%d:%d]",
2537 ost
->sync_ist
->file_index
,
2538 ost
->sync_ist
->st
->index
);
2539 if (ost
->stream_copy
)
2540 av_log(NULL
, AV_LOG_INFO
, " (copy)");
2542 av_log(NULL
, AV_LOG_INFO
, " (%s -> %s)", input_streams
[ost
->source_index
].dec ?
2543 input_streams
[ost
->source_index
].dec
->name
: "?",
2544 ost
->enc ? ost
->enc
->name
: "?");
2545 av_log(NULL
, AV_LOG_INFO
, "\n");
2549 av_log(NULL
, AV_LOG_ERROR
, "%s\n", error
);
2554 print_sdp(output_files
, nb_output_files
);
2561 * The following code is the main loop of the file converter
2563 static int transcode(OutputFile
*output_files
,
2564 int nb_output_files
,
2565 InputFile
*input_files
,
2569 AVFormatContext
*is
, *os
;
2573 int no_packet_count
= 0;
2574 int64_t timer_start
;
2576 if (!(no_packet
= av_mallocz(nb_input_files
)))
2579 ret
= transcode_init(output_files
, nb_output_files
, input_files
, nb_input_files
);
2583 av_log(NULL
, AV_LOG_INFO
, "Press ctrl-c to stop encoding\n");
2586 timer_start
= av_gettime();
2588 for (; received_sigterm
== 0;) {
2589 int file_index
, ist_index
;
2594 ipts_min
= INT64_MAX
;
2597 /* select the stream that we must read now by looking at the
2598 smallest output pts */
2600 for (i
= 0; i
< nb_output_streams
; i
++) {
2604 ost
= &output_streams
[i
];
2605 of
= &output_files
[ost
->file_index
];
2606 os
= output_files
[ost
->file_index
].ctx
;
2607 ist
= &input_streams
[ost
->source_index
];
2608 if (ost
->is_past_recording_time
|| no_packet
[ist
->file_index
] ||
2609 (os
->pb
&& avio_tell(os
->pb
) >= of
->limit_filesize
))
2611 opts
= ost
->st
->pts
.val
* av_q2d(ost
->st
->time_base
);
2613 if (!input_files
[ist
->file_index
].eof_reached
) {
2614 if (ipts
< ipts_min
) {
2617 file_index
= ist
->file_index
;
2619 if (opts
< opts_min
) {
2621 if (!input_sync
) file_index
= ist
->file_index
;
2624 if (ost
->frame_number
>= ost
->max_frames
) {
2626 for (j
= 0; j
< of
->ctx
->nb_streams
; j
++)
2627 output_streams
[of
->ost_index
+ j
].is_past_recording_time
= 1;
2631 /* if none, if is finished */
2632 if (file_index
< 0) {
2633 if (no_packet_count
) {
2634 no_packet_count
= 0;
2635 memset(no_packet
, 0, nb_input_files
);
2642 /* read a frame from it and output it in the fifo */
2643 is
= input_files
[file_index
].ctx
;
2644 ret
= av_read_frame(is
, &pkt
);
2645 if (ret
== AVERROR(EAGAIN
)) {
2646 no_packet
[file_index
] = 1;
2651 input_files
[file_index
].eof_reached
= 1;
2658 no_packet_count
= 0;
2659 memset(no_packet
, 0, nb_input_files
);
2662 av_pkt_dump_log2(NULL
, AV_LOG_DEBUG
, &pkt
, do_hex_dump
,
2663 is
->streams
[pkt
.stream_index
]);
2665 /* the following test is needed in case new streams appear
2666 dynamically in stream : we ignore them */
2667 if (pkt
.stream_index
>= input_files
[file_index
].nb_streams
)
2668 goto discard_packet
;
2669 ist_index
= input_files
[file_index
].ist_index
+ pkt
.stream_index
;
2670 ist
= &input_streams
[ist_index
];
2672 goto discard_packet
;
2674 if (pkt
.dts
!= AV_NOPTS_VALUE
)
2675 pkt
.dts
+= av_rescale_q(input_files
[ist
->file_index
].ts_offset
, AV_TIME_BASE_Q
, ist
->st
->time_base
);
2676 if (pkt
.pts
!= AV_NOPTS_VALUE
)
2677 pkt
.pts
+= av_rescale_q(input_files
[ist
->file_index
].ts_offset
, AV_TIME_BASE_Q
, ist
->st
->time_base
);
2679 if (pkt
.pts
!= AV_NOPTS_VALUE
)
2680 pkt
.pts
*= ist
->ts_scale
;
2681 if (pkt
.dts
!= AV_NOPTS_VALUE
)
2682 pkt
.dts
*= ist
->ts_scale
;
2684 //fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n",
2686 // pkt.dts, input_files[ist->file_index].ts_offset,
2687 // ist->st->codec->codec_type);
2688 if (pkt
.dts
!= AV_NOPTS_VALUE
&& ist
->next_pts
!= AV_NOPTS_VALUE
2689 && (is
->iformat
->flags
& AVFMT_TS_DISCONT
)) {
2690 int64_t pkt_dts
= av_rescale_q(pkt
.dts
, ist
->st
->time_base
, AV_TIME_BASE_Q
);
2691 int64_t delta
= pkt_dts
- ist
->next_pts
;
2692 if ((FFABS(delta
) > 1LL * dts_delta_threshold
* AV_TIME_BASE
|| pkt_dts
+ 1 < ist
->pts
) && !copy_ts
) {
2693 input_files
[ist
->file_index
].ts_offset
-= delta
;
2694 av_log(NULL
, AV_LOG_DEBUG
,
2695 "timestamp discontinuity %"PRId64
", new offset= %"PRId64
"\n",
2696 delta
, input_files
[ist
->file_index
].ts_offset
);
2697 pkt
.dts
-= av_rescale_q(delta
, AV_TIME_BASE_Q
, ist
->st
->time_base
);
2698 if (pkt
.pts
!= AV_NOPTS_VALUE
)
2699 pkt
.pts
-= av_rescale_q(delta
, AV_TIME_BASE_Q
, ist
->st
->time_base
);
2703 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2704 if (output_packet(ist
, output_streams
, nb_output_streams
, &pkt
) < 0) {
2706 av_log(NULL
, AV_LOG_ERROR
, "Error while decoding stream #%d:%d\n",
2707 ist
->file_index
, ist
->st
->index
);
2710 av_free_packet(&pkt
);
2715 av_free_packet(&pkt
);
2717 /* dump report by using the output first video and audio streams */
2718 print_report(output_files
, output_streams
, nb_output_streams
, 0, timer_start
);
2721 /* at the end of stream, we must flush the decoder buffers */
2722 for (i
= 0; i
< nb_input_streams
; i
++) {
2723 ist
= &input_streams
[i
];
2724 if (ist
->decoding_needed
) {
2725 output_packet(ist
, output_streams
, nb_output_streams
, NULL
);
2728 flush_encoders(output_streams
, nb_output_streams
);
2732 /* write the trailer if needed and close file */
2733 for (i
= 0; i
< nb_output_files
; i
++) {
2734 os
= output_files
[i
].ctx
;
2735 av_write_trailer(os
);
2738 /* dump report by using the first video and audio streams */
2739 print_report(output_files
, output_streams
, nb_output_streams
, 1, timer_start
);
2741 /* close each encoder */
2742 for (i
= 0; i
< nb_output_streams
; i
++) {
2743 ost
= &output_streams
[i
];
2744 if (ost
->encoding_needed
) {
2745 av_freep(&ost
->st
->codec
->stats_in
);
2746 avcodec_close(ost
->st
->codec
);
2749 avfilter_graph_free(&ost
->graph
);
2753 /* close each decoder */
2754 for (i
= 0; i
< nb_input_streams
; i
++) {
2755 ist
= &input_streams
[i
];
2756 if (ist
->decoding_needed
) {
2757 avcodec_close(ist
->st
->codec
);
2765 av_freep(&bit_buffer
);
2766 av_freep(&no_packet
);
2768 if (output_streams
) {
2769 for (i
= 0; i
< nb_output_streams
; i
++) {
2770 ost
= &output_streams
[i
];
2772 if (ost
->stream_copy
)
2773 av_freep(&ost
->st
->codec
->extradata
);
2775 fclose(ost
->logfile
);
2776 ost
->logfile
= NULL
;
2778 av_fifo_free(ost
->fifo
); /* works even if fifo is not
2779 initialized but set to zero */
2780 av_freep(&ost
->st
->codec
->subtitle_header
);
2781 av_free(ost
->pict_tmp
.data
[0]);
2782 av_free(ost
->forced_kf_pts
);
2783 if (ost
->video_resample
)
2784 sws_freeContext(ost
->img_resample_ctx
);
2786 audio_resample_close(ost
->resample
);
2787 if (ost
->reformat_ctx
)
2788 av_audio_convert_free(ost
->reformat_ctx
);
2789 av_dict_free(&ost
->opts
);
2796 static double parse_frame_aspect_ratio(const char *arg
)
2803 p
= strchr(arg
, ':');
2805 x
= strtol(arg
, &end
, 10);
2807 y
= strtol(end
+ 1, &end
, 10);
2809 ar
= (double)x
/ (double)y
;
2811 ar
= strtod(arg
, NULL
);
2814 av_log(NULL
, AV_LOG_FATAL
, "Incorrect aspect ratio specification.\n");
2820 static int opt_audio_codec(OptionsContext
*o
, const char *opt
, const char *arg
)
2822 return parse_option(o
, "codec:a", arg
, options
);
2825 static int opt_video_codec(OptionsContext
*o
, const char *opt
, const char *arg
)
2827 return parse_option(o
, "codec:v", arg
, options
);
2830 static int opt_subtitle_codec(OptionsContext
*o
, const char *opt
, const char *arg
)
2832 return parse_option(o
, "codec:s", arg
, options
);
2835 static int opt_data_codec(OptionsContext
*o
, const char *opt
, const char *arg
)
2837 return parse_option(o
, "codec:d", arg
, options
);
2840 static int opt_map(OptionsContext
*o
, const char *opt
, const char *arg
)
2842 StreamMap
*m
= NULL
;
2843 int i
, negative
= 0, file_idx
;
2844 int sync_file_idx
= -1, sync_stream_idx
;
2852 map
= av_strdup(arg
);
2854 /* parse sync stream first, just pick first matching stream */
2855 if (sync
= strchr(map
, ',')) {
2857 sync_file_idx
= strtol(sync
+ 1, &sync
, 0);
2858 if (sync_file_idx
>= nb_input_files
|| sync_file_idx
< 0) {
2859 av_log(NULL
, AV_LOG_FATAL
, "Invalid sync file index: %d.\n", sync_file_idx
);
2864 for (i
= 0; i
< input_files
[sync_file_idx
].nb_streams
; i
++)
2865 if (check_stream_specifier(input_files
[sync_file_idx
].ctx
,
2866 input_files
[sync_file_idx
].ctx
->streams
[i
], sync
) == 1) {
2867 sync_stream_idx
= i
;
2870 if (i
== input_files
[sync_file_idx
].nb_streams
) {
2871 av_log(NULL
, AV_LOG_FATAL
, "Sync stream specification in map %s does not "
2872 "match any streams.\n", arg
);
2878 file_idx
= strtol(map
, &p
, 0);
2879 if (file_idx
>= nb_input_files
|| file_idx
< 0) {
2880 av_log(NULL
, AV_LOG_FATAL
, "Invalid input file index: %d.\n", file_idx
);
2884 /* disable some already defined maps */
2885 for (i
= 0; i
< o
->nb_stream_maps
; i
++) {
2886 m
= &o
->stream_maps
[i
];
2887 if (file_idx
== m
->file_index
&&
2888 check_stream_specifier(input_files
[m
->file_index
].ctx
,
2889 input_files
[m
->file_index
].ctx
->streams
[m
->stream_index
],
2890 *p
== ':' ? p
+ 1 : p
) > 0)
2894 for (i
= 0; i
< input_files
[file_idx
].nb_streams
; i
++) {
2895 if (check_stream_specifier(input_files
[file_idx
].ctx
, input_files
[file_idx
].ctx
->streams
[i
],
2896 *p
== ':' ? p
+ 1 : p
) <= 0)
2898 o
->stream_maps
= grow_array(o
->stream_maps
, sizeof(*o
->stream_maps
),
2899 &o
->nb_stream_maps
, o
->nb_stream_maps
+ 1);
2900 m
= &o
->stream_maps
[o
->nb_stream_maps
- 1];
2902 m
->file_index
= file_idx
;
2903 m
->stream_index
= i
;
2905 if (sync_file_idx
>= 0) {
2906 m
->sync_file_index
= sync_file_idx
;
2907 m
->sync_stream_index
= sync_stream_idx
;
2909 m
->sync_file_index
= file_idx
;
2910 m
->sync_stream_index
= i
;
2915 av_log(NULL
, AV_LOG_FATAL
, "Stream map '%s' matches no streams.\n", arg
);
2923 static int opt_attach(OptionsContext
*o
, const char *opt
, const char *arg
)
2925 o
->attachments
= grow_array(o
->attachments
, sizeof(*o
->attachments
),
2926 &o
->nb_attachments
, o
->nb_attachments
+ 1);
2927 o
->attachments
[o
->nb_attachments
- 1] = arg
;
2932 * Parse a metadata specifier in arg.
2933 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
2934 * @param index for type c/p, chapter/program index is written here
2935 * @param stream_spec for type s, the stream specifier is written here
2937 static void parse_meta_type(char *arg
, char *type
, int *index
, const char **stream_spec
)
2945 if (*(++arg
) && *arg
!= ':') {
2946 av_log(NULL
, AV_LOG_FATAL
, "Invalid metadata specifier %s.\n", arg
);
2949 *stream_spec
= *arg
== ':' ? arg
+ 1 : "";
2953 if (*(++arg
) == ':')
2954 *index
= strtol(++arg
, NULL
, 0);
2957 av_log(NULL
, AV_LOG_FATAL
, "Invalid metadata type %c.\n", *arg
);
2964 static int copy_metadata(char *outspec
, char *inspec
, AVFormatContext
*oc
, AVFormatContext
*ic
, OptionsContext
*o
)
2966 AVDictionary
**meta_in
= NULL
;
2967 AVDictionary
**meta_out
;
2969 char type_in
, type_out
;
2970 const char *istream_spec
= NULL
, *ostream_spec
= NULL
;
2971 int idx_in
= 0, idx_out
= 0;
2973 parse_meta_type(inspec
, &type_in
, &idx_in
, &istream_spec
);
2974 parse_meta_type(outspec
, &type_out
, &idx_out
, &ostream_spec
);
2976 if (type_in
== 'g' || type_out
== 'g')
2977 o
->metadata_global_manual
= 1;
2978 if (type_in
== 's' || type_out
== 's')
2979 o
->metadata_streams_manual
= 1;
2980 if (type_in
== 'c' || type_out
== 'c')
2981 o
->metadata_chapters_manual
= 1;
2983 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2984 if ((index) < 0 || (index) >= (nb_elems)) {\
2985 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
2990 #define SET_DICT(type, meta, context, index)\
2993 meta = &context->metadata;\
2996 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
2997 meta = &context->chapters[index]->metadata;\
3000 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
3001 meta = &context->programs[index]->metadata;\
3005 SET_DICT(type_in, meta_in, ic, idx_in);
3006 SET_DICT(type_out
, meta_out
, oc
, idx_out
);
3008 /* for input streams choose first matching stream */
3009 if (type_in
== 's') {
3010 for (i
= 0; i
< ic
->nb_streams
; i
++) {
3011 if ((ret
= check_stream_specifier(ic
, ic
->streams
[i
], istream_spec
)) > 0) {
3012 meta_in
= &ic
->streams
[i
]->metadata
;
3018 av_log(NULL
, AV_LOG_FATAL
, "Stream specifier %s does not match any streams.\n", istream_spec
);
3023 if (type_out
== 's') {
3024 for (i
= 0; i
< oc
->nb_streams
; i
++) {
3025 if ((ret
= check_stream_specifier(oc
, oc
->streams
[i
], ostream_spec
)) > 0) {
3026 meta_out
= &oc
->streams
[i
]->metadata
;
3027 av_dict_copy(meta_out
, *meta_in
, AV_DICT_DONT_OVERWRITE
);
3032 av_dict_copy(meta_out
, *meta_in
, AV_DICT_DONT_OVERWRITE
);
3037 static AVCodec
*find_codec_or_die(const char *name
, enum AVMediaType type
, int encoder
)
3039 const char *codec_string
= encoder ?
"encoder" : "decoder";
3043 avcodec_find_encoder_by_name(name
) :
3044 avcodec_find_decoder_by_name(name
);
3046 av_log(NULL
, AV_LOG_FATAL
, "Unknown %s '%s'\n", codec_string
, name
);
3049 if (codec
->type
!= type
) {
3050 av_log(NULL
, AV_LOG_FATAL
, "Invalid %s type '%s'\n", codec_string
, name
);
3056 static AVCodec
*choose_decoder(OptionsContext
*o
, AVFormatContext
*s
, AVStream
*st
)
3058 char *codec_name
= NULL
;
3060 MATCH_PER_STREAM_OPT(codec_names
, str
, codec_name
, s
, st
);
3062 AVCodec
*codec
= find_codec_or_die(codec_name
, st
->codec
->codec_type
, 0);
3063 st
->codec
->codec_id
= codec
->id
;
3066 return avcodec_find_decoder(st
->codec
->codec_id
);
3070 * Add all the streams from the given input file to the global
3071 * list of input streams.
3073 static void add_input_streams(OptionsContext
*o
, AVFormatContext
*ic
)
3075 int i
, rfps
, rfps_base
;
3077 for (i
= 0; i
< ic
->nb_streams
; i
++) {
3078 AVStream
*st
= ic
->streams
[i
];
3079 AVCodecContext
*dec
= st
->codec
;
3082 input_streams
= grow_array(input_streams
, sizeof(*input_streams
), &nb_input_streams
, nb_input_streams
+ 1);
3083 ist
= &input_streams
[nb_input_streams
- 1];
3085 ist
->file_index
= nb_input_files
;
3087 ist
->opts
= filter_codec_opts(codec_opts
, ist
->st
->codec
->codec_id
, ic
, st
);
3089 ist
->ts_scale
= 1.0;
3090 MATCH_PER_STREAM_OPT(ts_scale
, dbl
, ist
->ts_scale
, ic
, st
);
3092 ist
->dec
= choose_decoder(o
, ic
, st
);
3094 switch (dec
->codec_type
) {
3095 case AVMEDIA_TYPE_AUDIO
:
3096 if (o
->audio_disable
)
3097 st
->discard
= AVDISCARD_ALL
;
3099 case AVMEDIA_TYPE_VIDEO
:
3100 rfps
= ic
->streams
[i
]->r_frame_rate
.num
;
3101 rfps_base
= ic
->streams
[i
]->r_frame_rate
.den
;
3103 dec
->flags
|= CODEC_FLAG_EMU_EDGE
;
3104 dec
->height
>>= dec
->lowres
;
3105 dec
->width
>>= dec
->lowres
;
3108 if (dec
->time_base
.den
!= rfps
* dec
->ticks_per_frame
|| dec
->time_base
.num
!= rfps_base
) {
3110 av_log(NULL
, AV_LOG_INFO
,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3111 i
, (float)dec
->time_base
.den
/ dec
->time_base
.num
, dec
->time_base
.den
, dec
->time_base
.num
,
3112 (float)rfps
/ rfps_base
, rfps
, rfps_base
);
3115 if (o
->video_disable
)
3116 st
->discard
= AVDISCARD_ALL
;
3117 else if (video_discard
)
3118 st
->discard
= video_discard
;
3120 case AVMEDIA_TYPE_DATA
:
3122 case AVMEDIA_TYPE_SUBTITLE
:
3123 if (o
->subtitle_disable
)
3124 st
->discard
= AVDISCARD_ALL
;
3126 case AVMEDIA_TYPE_ATTACHMENT
:
3127 case AVMEDIA_TYPE_UNKNOWN
:
3135 static void assert_file_overwrite(const char *filename
)
3137 if (!file_overwrite
&&
3138 (strchr(filename
, ':') == NULL
|| filename
[1] == ':' ||
3139 av_strstart(filename
, "file:", NULL
))) {
3140 if (avio_check(filename
, 0) == 0) {
3142 fprintf(stderr
,"File '%s' already exists. Overwrite ? [y/N] ", filename
);
3144 if (!read_yesno()) {
3145 fprintf(stderr
, "Not overwriting - exiting\n");
3150 fprintf(stderr
,"File '%s' already exists. Exiting.\n", filename
);
3157 static void dump_attachment(AVStream
*st
, const char *filename
)
3160 AVIOContext
*out
= NULL
;
3161 AVDictionaryEntry
*e
;
3163 if (!st
->codec
->extradata_size
) {
3164 av_log(NULL
, AV_LOG_WARNING
, "No extradata to dump in stream #%d:%d.\n",
3165 nb_input_files
- 1, st
->index
);
3168 if (!*filename
&& (e
= av_dict_get(st
->metadata
, "filename", NULL
, 0)))
3169 filename
= e
->value
;
3171 av_log(NULL
, AV_LOG_FATAL
, "No filename specified and no 'filename' tag"
3172 "in stream #%d:%d.\n", nb_input_files
- 1, st
->index
);
3176 assert_file_overwrite(filename
);
3178 if ((ret
= avio_open2(&out
, filename
, AVIO_FLAG_WRITE
, &int_cb
, NULL
)) < 0) {
3179 av_log(NULL
, AV_LOG_FATAL
, "Could not open file %s for writing.\n",
3184 avio_write(out
, st
->codec
->extradata
, st
->codec
->extradata_size
);
3189 static int opt_input_file(OptionsContext
*o
, const char *opt
, const char *filename
)
3191 AVFormatContext
*ic
;
3192 AVInputFormat
*file_iformat
= NULL
;
3196 AVDictionary
**opts
;
3197 int orig_nb_streams
; // number of streams before avformat