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
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"
50 #include "libavformat/ffm.h" // not public API
53 # include "libavfilter/avcodec.h"
54 # include "libavfilter/avfilter.h"
55 # include "libavfilter/avfiltergraph.h"
56 # include "libavfilter/buffersink.h"
57 # include "libavfilter/buffersrc.h"
58 # include "libavfilter/vsrc_buffer.h"
61 #if HAVE_SYS_RESOURCE_H
62 #include <sys/types.h>
64 #include <sys/resource.h>
65 #elif HAVE_GETPROCESSTIMES
68 #if HAVE_GETPROCESSMEMORYINFO
74 #include <sys/select.h>
79 #include <sys/ioctl.h>
89 #include "libavutil/avassert.h"
92 #define VSYNC_PASSTHROUGH 0
96 const char program_name[] = "avconv";
97 const int program_birth_year = 2000;
99 /* select an input stream for an output stream */
100 typedef struct StreamMap {
101 int disabled; /** 1 is this mapping is disabled by a negative map */
105 int sync_stream_index;
109 * select an input file for an output file
111 typedef struct MetadataMap {
112 int file; ///< file index
113 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
114 int index; ///< stream/chapter/program number
117 static const OptionDef options[];
119 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
121 static int frame_bits_per_raw_sample = 0;
122 static int video_discard = 0;
123 static int same_quant = 0;
124 static int do_deinterlace = 0;
125 static int intra_dc_precision = 8;
126 static int qp_hist = 0;
128 static int file_overwrite = 0;
129 static int no_file_overwrite = 0;
130 static int do_benchmark = 0;
131 static int do_hex_dump = 0;
132 static int do_pkt_dump = 0;
133 static int do_pass = 0;
134 static const char *pass_logfilename_prefix;
135 static int video_sync_method = VSYNC_AUTO;
136 static int audio_sync_method = 0;
137 static float audio_drift_threshold = 0.1;
138 static int copy_ts = 0;
139 static int copy_tb = 1;
140 static int opt_shortest = 0;
141 static char *vstats_filename;
142 static FILE *vstats_file;
144 static int audio_volume = 256;
146 static int exit_on_error = 0;
147 static int using_stdin = 0;
148 static int run_as_daemon = 0;
149 static int q_pressed = 0;
150 static int64_t video_size = 0;
151 static int64_t audio_size = 0;
152 static int64_t extra_size = 0;
153 static int nb_frames_dup = 0;
154 static int nb_frames_drop = 0;
155 static int input_sync;
157 static float dts_delta_threshold = 10;
159 static int print_stats = 1;
161 static uint8_t *audio_buf;
162 static unsigned int allocated_audio_buf_size;
164 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
166 typedef struct FrameBuffer {
172 enum PixelFormat pix_fmt;
175 struct InputStream *ist;
176 struct FrameBuffer *next;
179 typedef struct InputStream {
182 int discard; /* true if stream data should be discarded */
183 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
185 AVFrame *decoded_frame;
186 AVFrame *filtered_frame;
188 int64_t start; /* time when read started */
189 int64_t next_pts; /* synthetic pts for cases where pkt.pts
191 int64_t pts; /* current pts */
193 int is_start; /* is 1 at the start and after a discontinuity */
194 int showed_multi_packet_warning;
197 /* a pool of free buffers for decoded data */
198 FrameBuffer *buffer_pool;
201 typedef struct InputFile {
202 AVFormatContext *ctx;
203 int eof_reached; /* true if eof reached */
204 int ist_index; /* index of first stream in ist_table */
205 int buffer_size; /* current total buffer size */
207 int nb_streams; /* number of stream that avconv is aware of; may be different
208 from ctx.nb_streams if new streams appear during av_read_frame() */
212 typedef struct OutputStream {
213 int file_index; /* file index */
214 int index; /* stream index in the output file */
215 int source_index; /* InputStream index */
216 AVStream *st; /* stream in the output file */
217 int encoding_needed; /* true if encoding needed for this stream */
219 /* input pts and corresponding output pts
221 // double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
222 struct InputStream *sync_ist; /* input stream to sync against */
223 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
224 AVBitStreamFilterContext *bitstream_filters;
227 AVFrame *output_frame;
231 AVFrame resample_frame; /* temporary frame for image resampling */
232 struct SwsContext *img_resample_ctx; /* for image resampling */
235 int resample_pix_fmt;
236 AVRational frame_rate;
240 float frame_aspect_ratio;
242 /* forced key frames */
243 int64_t *forced_kf_pts;
249 ReSampleContext *resample; /* for audio resampling */
250 int resample_sample_fmt;
251 int resample_channels;
252 int resample_sample_rate;
254 AVAudioConvert *reformat_ctx;
255 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
259 AVFilterContext *output_video_filter;
260 AVFilterContext *input_video_filter;
261 AVFilterBufferRef *picref;
263 AVFilterGraph *graph;
268 int is_past_recording_time;
270 const char *attachment_filename;
271 int copy_initial_nonkeyframes;
276 /* init terminal so that we can grab keys */
277 static struct termios oldtty;
280 typedef struct OutputFile {
281 AVFormatContext *ctx;
283 int ost_index; /* index of the first stream in output_streams */
284 int64_t recording_time; /* desired length of the resulting file in microseconds */
285 int64_t start_time; /* start time in microseconds */
286 uint64_t limit_filesize;
289 static InputStream *input_streams = NULL;
290 static int nb_input_streams = 0;
291 static InputFile *input_files = NULL;
292 static int nb_input_files = 0;
294 static OutputStream *output_streams = NULL;
295 static int nb_output_streams = 0;
296 static OutputFile *output_files = NULL;
297 static int nb_output_files = 0;
299 typedef struct OptionsContext {
300 /* input/output options */
304 SpecifierOpt *codec_names;
306 SpecifierOpt *audio_channels;
307 int nb_audio_channels;
308 SpecifierOpt *audio_sample_rate;
309 int nb_audio_sample_rate;
310 SpecifierOpt *frame_rates;
312 SpecifierOpt *frame_sizes;
314 SpecifierOpt *frame_pix_fmts;
315 int nb_frame_pix_fmts;
318 int64_t input_ts_offset;
321 SpecifierOpt *ts_scale;
323 SpecifierOpt *dump_attachment;
324 int nb_dump_attachment;
327 StreamMap *stream_maps;
329 /* first item specifies output metadata, second is input */
330 MetadataMap (*meta_data_maps)[2];
331 int nb_meta_data_maps;
332 int metadata_global_manual;
333 int metadata_streams_manual;
334 int metadata_chapters_manual;
335 const char **attachments;
338 int chapters_input_file;
340 int64_t recording_time;
341 uint64_t limit_filesize;
347 int subtitle_disable;
350 /* indexed by output file stream index */
354 SpecifierOpt *metadata;
356 SpecifierOpt *max_frames;
358 SpecifierOpt *bitstream_filters;
359 int nb_bitstream_filters;
360 SpecifierOpt *codec_tags;
362 SpecifierOpt *sample_fmts;
364 SpecifierOpt *qscale;
366 SpecifierOpt *forced_key_frames;
367 int nb_forced_key_frames;
368 SpecifierOpt *force_fps;
370 SpecifierOpt *frame_aspect_ratios;
371 int nb_frame_aspect_ratios;
372 SpecifierOpt *rc_overrides;
374 SpecifierOpt *intra_matrices;
375 int nb_intra_matrices;
376 SpecifierOpt *inter_matrices;
377 int nb_inter_matrices;
378 SpecifierOpt *top_field_first;
379 int nb_top_field_first;
380 SpecifierOpt *metadata_map;
382 SpecifierOpt *presets;
384 SpecifierOpt *copy_initial_nonkeyframes;
385 int nb_copy_initial_nonkeyframes;
387 SpecifierOpt *filters;
392 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
395 for (i = 0; i < o->nb_ ## name; i++) {\
396 char *spec = o->name[i].specifier;\
397 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
398 outvar = o->name[i].u.type;\
404 static void reset_options(OptionsContext *o)
406 const OptionDef *po = options;
408 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
410 void *dst = (uint8_t*)o + po->u.off;
412 if (po->flags & OPT_SPEC) {
413 SpecifierOpt **so = dst;
414 int i, *count = (int*)(so + 1);
415 for (i = 0; i < *count; i++) {
416 av_freep(&(*so)[i].specifier);
417 if (po->flags & OPT_STRING)
418 av_freep(&(*so)[i].u.str);
422 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
427 av_freep(&o->stream_maps);
428 av_freep(&o->meta_data_maps);
429 av_freep(&o->streamid_map);
431 memset(o, 0, sizeof(*o));
433 o->mux_max_delay = 0.7;
434 o->recording_time = INT64_MAX;
435 o->limit_filesize = UINT64_MAX;
436 o->chapters_input_file = INT_MAX;
442 static int alloc_buffer(InputStream *ist, FrameBuffer **pbuf)
444 AVCodecContext *s = ist->st->codec;
445 FrameBuffer *buf = av_mallocz(sizeof(*buf));
447 const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1;
448 int h_chroma_shift, v_chroma_shift;
449 int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
450 int w = s->width, h = s->height;
453 return AVERROR(ENOMEM);
455 if (!(s->flags & CODEC_FLAG_EMU_EDGE)) {
460 avcodec_align_dimensions(s, &w, &h);
461 if ((ret = av_image_alloc(buf->base, buf->linesize, w, h,
462 s->pix_fmt, 32)) < 0) {
466 /* XXX this shouldn't be needed, but some tests break without this line
467 * those decoders are buggy and need to be fixed.
468 * the following tests fail:
469 * bethsoft-vid, cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
471 memset(buf->base[0], 128, ret);
473 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
474 for (int i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
475 const int h_shift = i==0 ? 0 : h_chroma_shift;
476 const int v_shift = i==0 ? 0 : v_chroma_shift;
477 if (s->flags & CODEC_FLAG_EMU_EDGE)
478 buf->data[i] = buf->base[i];
480 buf->data[i] = buf->base[i] +
481 FFALIGN((buf->linesize[i]*edge >> v_shift) +
482 (pixel_size*edge >> h_shift), 32);
486 buf->pix_fmt = s->pix_fmt;
493 static void free_buffer_pool(InputStream *ist)
495 FrameBuffer *buf = ist->buffer_pool;
497 ist->buffer_pool = buf->next;
498 av_freep(&buf->base[0]);
500 buf = ist->buffer_pool;
504 static void unref_buffer(InputStream *ist, FrameBuffer *buf)
506 av_assert0(buf->refcount);
508 if (!buf->refcount) {
509 buf->next = ist->buffer_pool;
510 ist->buffer_pool = buf;
514 static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
516 InputStream *ist = s->opaque;
520 if (!ist->buffer_pool && (ret = alloc_buffer(ist, &ist->buffer_pool)) < 0)
523 buf = ist->buffer_pool;
524 ist->buffer_pool = buf->next;
526 if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) {
527 av_freep(&buf->base[0]);
529 if ((ret = alloc_buffer(ist, &buf)) < 0)
535 frame->type = FF_BUFFER_TYPE_USER;
536 frame->extended_data = frame->data;
537 frame->pkt_pts = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE;
539 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
540 frame->base[i] = buf->base[i]; // XXX h264.c uses base though it shouldn't
541 frame->data[i] = buf->data[i];
542 frame->linesize[i] = buf->linesize[i];
548 static void codec_release_buffer(AVCodecContext *s, AVFrame *frame)
550 InputStream *ist = s->opaque;
551 FrameBuffer *buf = frame->opaque;
554 for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++)
555 frame->data[i] = NULL;
557 unref_buffer(ist, buf);
560 static void filter_release_buffer(AVFilterBuffer *fb)
562 FrameBuffer *buf = fb->priv;
564 unref_buffer(buf->ist, buf);
569 static int configure_video_filters(InputStream *ist, OutputStream *ost)
571 AVFilterContext *last_filter, *filter;
572 /** filter graph containing all filters including input & output */
573 AVCodecContext *codec = ost->st->codec;
574 AVCodecContext *icodec = ist->st->codec;
575 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
576 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
577 AVRational sample_aspect_ratio;
581 ost->graph = avfilter_graph_alloc();
583 if (ist->st->sample_aspect_ratio.num) {
584 sample_aspect_ratio = ist->st->sample_aspect_ratio;
586 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
588 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
589 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
590 sample_aspect_ratio.num, sample_aspect_ratio.den);
592 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
593 "src", args, NULL, ost->graph);
596 #if FF_API_OLD_VSINK_API
597 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
598 "out", NULL, pix_fmts, ost->graph);
600 buffersink_params->pixel_fmts = pix_fmts;
601 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
602 "out", NULL, buffersink_params, ost->graph);
604 av_freep(&buffersink_params);
607 last_filter = ost->input_video_filter;
609 if (codec->width != icodec->width || codec->height != icodec->height) {
610 snprintf(args, 255, "%d:%d:flags=0x%X",
613 (unsigned)ost->sws_flags);
614 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
615 NULL, args, NULL, ost->graph)) < 0)
617 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
619 last_filter = filter;
622 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
623 ost->graph->scale_sws_opts = av_strdup(args);
626 AVFilterInOut *outputs = avfilter_inout_alloc();
627 AVFilterInOut *inputs = avfilter_inout_alloc();
629 outputs->name = av_strdup("in");
630 outputs->filter_ctx = last_filter;
631 outputs->pad_idx = 0;
632 outputs->next = NULL;
634 inputs->name = av_strdup("out");
635 inputs->filter_ctx = ost->output_video_filter;
639 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
642 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
646 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
649 codec->width = ost->output_video_filter->inputs[0]->w;
650 codec->height = ost->output_video_filter->inputs[0]->h;
651 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
652 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
653 av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
654 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
658 #endif /* CONFIG_AVFILTER */
660 static void term_exit(void)
662 av_log(NULL, AV_LOG_QUIET, "%s", "");
665 tcsetattr (0, TCSANOW, &oldtty);
669 static volatile int received_sigterm = 0;
672 sigterm_handler(int sig)
674 received_sigterm = sig;
679 static void term_init(void)
689 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
690 |INLCR|IGNCR|ICRNL|IXON);
691 tty.c_oflag |= OPOST;
692 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
693 tty.c_cflag &= ~(CSIZE|PARENB);
698 tcsetattr (0, TCSANOW, &tty);
699 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
703 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
704 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
706 signal(SIGXCPU, sigterm_handler);
710 /* read a key without blocking */
711 static int read_key(void)
726 n = select(1, &rfds, NULL, NULL, &tv);
741 static int decode_interrupt_cb(void *ctx)
743 q_pressed += read_key() == 'q';
744 return q_pressed > 1;
747 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
749 void exit_program(int ret)
754 for (i = 0; i < nb_output_files; i++) {
755 AVFormatContext *s = output_files[i].ctx;
756 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
758 avformat_free_context(s);
759 av_dict_free(&output_files[i].opts);
761 for (i = 0; i < nb_output_streams; i++) {
762 AVBitStreamFilterContext *bsfc = output_streams[i].bitstream_filters;
764 AVBitStreamFilterContext *next = bsfc->next;
765 av_bitstream_filter_close(bsfc);
768 output_streams[i].bitstream_filters = NULL;
770 if (output_streams[i].output_frame) {
771 AVFrame *frame = output_streams[i].output_frame;
772 if (frame->extended_data != frame->data)
773 av_freep(&frame->extended_data);
778 av_freep(&output_streams[i].avfilter);
781 for (i = 0; i < nb_input_files; i++) {
782 avformat_close_input(&input_files[i].ctx);
784 for (i = 0; i < nb_input_streams; i++) {
785 av_freep(&input_streams[i].decoded_frame);
786 av_freep(&input_streams[i].filtered_frame);
787 av_dict_free(&input_streams[i].opts);
788 free_buffer_pool(&input_streams[i]);
793 av_free(vstats_filename);
795 av_freep(&input_streams);
796 av_freep(&input_files);
797 av_freep(&output_streams);
798 av_freep(&output_files);
802 allocated_audio_buf_size = 0;
807 avformat_network_deinit();
809 if (received_sigterm) {
810 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
811 (int) received_sigterm);
818 static void assert_avoptions(AVDictionary *m)
820 AVDictionaryEntry *t;
821 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
822 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
827 static void assert_codec_experimental(AVCodecContext *c, int encoder)
829 const char *codec_string = encoder ? "encoder" : "decoder";
831 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
832 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
833 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
834 "results.\nAdd '-strict experimental' if you want to use it.\n",
835 codec_string, c->codec->name);
836 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
837 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
838 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
839 codec_string, codec->name);
844 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
846 if (codec && codec->sample_fmts) {
847 const enum AVSampleFormat *p = codec->sample_fmts;
848 for (; *p != -1; p++) {
849 if (*p == st->codec->sample_fmt)
853 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
854 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
855 if(av_get_sample_fmt_name(st->codec->sample_fmt))
856 av_log(NULL, AV_LOG_WARNING,
857 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
858 av_get_sample_fmt_name(st->codec->sample_fmt),
860 av_get_sample_fmt_name(codec->sample_fmts[0]));
861 st->codec->sample_fmt = codec->sample_fmts[0];
866 static void choose_sample_rate(AVStream *st, AVCodec *codec)
868 if (codec && codec->supported_samplerates) {
869 const int *p = codec->supported_samplerates;
871 int best_dist = INT_MAX;
873 int dist = abs(st->codec->sample_rate - *p);
874 if (dist < best_dist) {
880 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
882 st->codec->sample_rate = best;
886 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
888 if (codec && codec->pix_fmts) {
889 const enum PixelFormat *p = codec->pix_fmts;
890 if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
891 if (st->codec->codec_id == CODEC_ID_MJPEG) {
892 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
893 } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
894 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
895 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
898 for (; *p != PIX_FMT_NONE; p++) {
899 if (*p == st->codec->pix_fmt)
902 if (*p == PIX_FMT_NONE) {
903 if (st->codec->pix_fmt != PIX_FMT_NONE)
904 av_log(NULL, AV_LOG_WARNING,
905 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
906 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
908 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
909 st->codec->pix_fmt = codec->pix_fmts[0];
915 get_sync_ipts(const OutputStream *ost)
917 const InputStream *ist = ost->sync_ist;
918 OutputFile *of = &output_files[ost->file_index];
919 return (double)(ist->pts - of->start_time) / AV_TIME_BASE;
922 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
924 AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
925 AVCodecContext *avctx = ost->st->codec;
929 * Audio encoders may split the packets -- #frames in != #packets out.
930 * But there is no reordering, so we can limit the number of output packets
931 * by simply dropping them here.
932 * Counting encoded video frames needs to be done separately because of
933 * reordering, see do_video_out()
935 if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) {
936 if (ost->frame_number >= ost->max_frames)
942 AVPacket new_pkt = *pkt;
943 int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
944 &new_pkt.data, &new_pkt.size,
945 pkt->data, pkt->size,
946 pkt->flags & AV_PKT_FLAG_KEY);
949 new_pkt.destruct = av_destruct_packet;
951 av_log(NULL, AV_LOG_ERROR, "%s failed for stream %d, codec %s",
952 bsfc->filter->name, pkt->stream_index,
953 avctx->codec ? avctx->codec->name : "copy");
963 ret = av_interleaved_write_frame(s, pkt);
965 print_error("av_interleaved_write_frame()", ret);
970 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
972 int fill_char = 0x00;
973 if (sample_fmt == AV_SAMPLE_FMT_U8)
975 memset(buf, fill_char, size);
978 static int encode_audio_frame(AVFormatContext *s, OutputStream *ost,
979 const uint8_t *buf, int buf_size)
981 AVCodecContext *enc = ost->st->codec;
982 AVFrame *frame = NULL;
986 av_init_packet(&pkt);
991 if (!ost->output_frame) {
992 ost->output_frame = avcodec_alloc_frame();
993 if (!ost->output_frame) {
994 av_log(NULL, AV_LOG_FATAL, "out-of-memory in encode_audio_frame()\n");
998 frame = ost->output_frame;
999 if (frame->extended_data != frame->data)
1000 av_freep(&frame->extended_data);
1001 avcodec_get_frame_defaults(frame);
1003 frame->nb_samples = buf_size /
1004 (enc->channels * av_get_bytes_per_sample(enc->sample_fmt));
1005 if ((ret = avcodec_fill_audio_frame(frame, enc->channels, enc->sample_fmt,
1006 buf, buf_size, 1)) < 0) {
1007 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1013 if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
1014 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1019 pkt.stream_index = ost->index;
1020 if (pkt.pts != AV_NOPTS_VALUE)
1021 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1022 if (pkt.duration > 0)
1023 pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
1025 write_frame(s, &pkt, ost);
1027 audio_size += pkt.size;
1031 ost->sync_opts += frame->nb_samples;
1036 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
1037 InputStream *ist, AVFrame *decoded_frame)
1040 int64_t audio_buf_size;
1042 int size_out, frame_bytes, resample_changed;
1043 AVCodecContext *enc = ost->st->codec;
1044 AVCodecContext *dec = ist->st->codec;
1045 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1046 int isize = av_get_bytes_per_sample(dec->sample_fmt);
1047 uint8_t *buf = decoded_frame->data[0];
1048 int size = decoded_frame->nb_samples * dec->channels * isize;
1049 int64_t allocated_for_size = size;
1052 audio_buf_size = (allocated_for_size + isize * dec->channels - 1) / (isize * dec->channels);
1053 audio_buf_size = (audio_buf_size * enc->sample_rate + dec->sample_rate) / dec->sample_rate;
1054 audio_buf_size = audio_buf_size * 2 + 10000; // safety factors for the deprecated resampling API
1055 audio_buf_size = FFMAX(audio_buf_size, enc->frame_size);
1056 audio_buf_size *= osize * enc->channels;
1058 if (audio_buf_size > INT_MAX) {
1059 av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n");
1063 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
1065 av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
1069 if (enc->channels != dec->channels)
1070 ost->audio_resample = 1;
1072 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
1073 ost->resample_channels != dec->channels ||
1074 ost->resample_sample_rate != dec->sample_rate;
1076 if ((ost->audio_resample && !ost->resample) || resample_changed) {
1077 if (resample_changed) {
1078 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",
1079 ist->file_index, ist->st->index,
1080 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
1081 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
1082 ost->resample_sample_fmt = dec->sample_fmt;
1083 ost->resample_channels = dec->channels;
1084 ost->resample_sample_rate = dec->sample_rate;
1086 audio_resample_close(ost->resample);
1088 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
1089 if (audio_sync_method <= 1 &&
1090 ost->resample_sample_fmt == enc->sample_fmt &&
1091 ost->resample_channels == enc->channels &&
1092 ost->resample_sample_rate == enc->sample_rate) {
1093 ost->resample = NULL;
1094 ost->audio_resample = 0;
1096 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
1097 av_log(NULL, AV_LOG_WARNING, "Using s16 intermediate sample format for resampling\n");
1098 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
1099 enc->sample_rate, dec->sample_rate,
1100 enc->sample_fmt, dec->sample_fmt,
1102 if (!ost->resample) {
1103 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
1104 dec->channels, dec->sample_rate,
1105 enc->channels, enc->sample_rate);
1111 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
1112 if (!ost->audio_resample && dec->sample_fmt != enc->sample_fmt &&
1113 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt) != ost->reformat_pair) {
1114 if (ost->reformat_ctx)
1115 av_audio_convert_free(ost->reformat_ctx);
1116 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
1117 dec->sample_fmt, 1, NULL, 0);
1118 if (!ost->reformat_ctx) {
1119 av_log(NULL, AV_LOG_FATAL, "Cannot convert %s sample format to %s sample format\n",
1120 av_get_sample_fmt_name(dec->sample_fmt),
1121 av_get_sample_fmt_name(enc->sample_fmt));
1124 ost->reformat_pair = MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
1127 if (audio_sync_method) {
1128 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts -
1129 av_fifo_size(ost->fifo) / (enc->channels * osize);
1130 int idelta = delta * dec->sample_rate / enc->sample_rate;
1131 int byte_delta = idelta * isize * dec->channels;
1133 // FIXME resample delay
1134 if (fabs(delta) > 50) {
1135 if (ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate) {
1136 if (byte_delta < 0) {
1137 byte_delta = FFMAX(byte_delta, -size);
1140 av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n",
1141 -byte_delta / (isize * dec->channels));
1146 static uint8_t *input_tmp = NULL;
1147 input_tmp = av_realloc(input_tmp, byte_delta + size);
1149 if (byte_delta > allocated_for_size - size) {
1150 allocated_for_size = byte_delta + (int64_t)size;
1155 generate_silence(input_tmp, dec->sample_fmt, byte_delta);
1156 memcpy(input_tmp + byte_delta, buf, size);
1159 av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
1161 } else if (audio_sync_method > 1) {
1162 int comp = av_clip(delta, -audio_sync_method, audio_sync_method);
1163 av_assert0(ost->audio_resample);
1164 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
1165 delta, comp, enc->sample_rate);
1166 // 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));
1167 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
1171 ost->sync_opts = lrintf(get_sync_ipts(ost) * enc->sample_rate) -
1172 av_fifo_size(ost->fifo) / (enc->channels * osize); // FIXME wrong
1174 if (ost->audio_resample) {
1176 size_out = audio_resample(ost->resample,
1177 (short *)buftmp, (short *)buf,
1178 size / (dec->channels * isize));
1179 size_out = size_out * enc->channels * osize;
1185 if (!ost->audio_resample && dec->sample_fmt != enc->sample_fmt) {
1186 const void *ibuf[6] = { buftmp };
1187 void *obuf[6] = { audio_buf };
1188 int istride[6] = { isize };
1189 int ostride[6] = { osize };
1190 int len = size_out / istride[0];
1191 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len) < 0) {
1192 printf("av_audio_convert() failed\n");
1198 size_out = len * osize;
1201 /* now encode as many frames as possible */
1202 if (!(enc->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)) {
1203 /* output resampled raw samples */
1204 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
1205 av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
1208 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
1210 frame_bytes = enc->frame_size * osize * enc->channels;
1212 while (av_fifo_size(ost->fifo) >= frame_bytes) {
1213 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
1214 encode_audio_frame(s, ost, audio_buf, frame_bytes);
1217 encode_audio_frame(s, ost, buftmp, size_out);
1221 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1223 AVCodecContext *dec;
1224 AVPicture *picture2;
1225 AVPicture picture_tmp;
1228 dec = ist->st->codec;
1230 /* deinterlace : must be done before any resize */
1231 if (do_deinterlace) {
1234 /* create temporary picture */
1235 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1236 buf = av_malloc(size);
1240 picture2 = &picture_tmp;
1241 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1243 if (avpicture_deinterlace(picture2, picture,
1244 dec->pix_fmt, dec->width, dec->height) < 0) {
1245 /* if error, do not deinterlace */
1246 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1255 if (picture != picture2)
1256 *picture = *picture2;
1260 static void do_subtitle_out(AVFormatContext *s,
1266 static uint8_t *subtitle_out = NULL;
1267 int subtitle_out_max_size = 1024 * 1024;
1268 int subtitle_out_size, nb, i;
1269 AVCodecContext *enc;
1272 if (pts == AV_NOPTS_VALUE) {
1273 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1279 enc = ost->st->codec;
1281 if (!subtitle_out) {
1282 subtitle_out = av_malloc(subtitle_out_max_size);
1285 /* Note: DVB subtitle need one packet to draw them and one other
1286 packet to clear them */
1287 /* XXX: signal it in the codec context ? */
1288 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1293 for (i = 0; i < nb; i++) {
1294 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1295 // start_display_time is required to be 0
1296 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1297 sub->end_display_time -= sub->start_display_time;
1298 sub->start_display_time = 0;
1299 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1300 subtitle_out_max_size, sub);
1301 if (subtitle_out_size < 0) {
1302 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1306 av_init_packet(&pkt);
1307 pkt.stream_index = ost->index;
1308 pkt.data = subtitle_out;
1309 pkt.size = subtitle_out_size;
1310 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1311 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1312 /* XXX: the pts correction is handled here. Maybe handling
1313 it in the codec would be better */
1315 pkt.pts += 90 * sub->start_display_time;
1317 pkt.pts += 90 * sub->end_display_time;
1319 write_frame(s, &pkt, ost);
1323 static int bit_buffer_size = 1024 * 256;
1324 static uint8_t *bit_buffer = NULL;
1326 #if !CONFIG_AVFILTER
1327 static void do_video_resample(OutputStream *ost,
1329 AVFrame *in_picture,
1330 AVFrame **out_picture)
1332 int resample_changed = 0;
1333 AVCodecContext *dec = ist->st->codec;
1334 AVCodecContext *enc = ost->st->codec;
1335 *out_picture = in_picture;
1337 resample_changed = ost->resample_width != in_picture->width ||
1338 ost->resample_height != in_picture->height ||
1339 ost->resample_pix_fmt != in_picture->format;
1341 if (resample_changed) {
1342 av_log(NULL, AV_LOG_INFO,
1343 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s / frm size:%dx%d fmt:%s\n",
1344 ist->file_index, ist->st->index,
1345 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1346 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt),
1347 in_picture->width, in_picture->height, av_get_pix_fmt_name(in_picture->format));
1348 ost->resample_width = in_picture->width;
1349 ost->resample_height = in_picture->height;
1350 ost->resample_pix_fmt = in_picture->format;
1353 ost->video_resample = dec->width != enc->width ||
1354 dec->height != enc->height ||
1355 dec->pix_fmt != enc->pix_fmt;
1358 if (ost->video_resample) {
1359 *out_picture = &ost->resample_frame;
1360 if (!ost->img_resample_ctx || resample_changed) {
1361 /* initialize the destination picture */
1362 if (!ost->resample_frame.data[0]) {
1363 avcodec_get_frame_defaults(&ost->resample_frame);
1364 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1365 enc->width, enc->height)) {
1366 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1370 /* initialize a new scaler context */
1371 sws_freeContext(ost->img_resample_ctx);
1372 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1373 enc->width, enc->height, enc->pix_fmt,
1374 ost->sws_flags, NULL, NULL, NULL);
1375 if (ost->img_resample_ctx == NULL) {
1376 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1380 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1381 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1383 if (resample_changed) {
1384 ost->resample_width = in_picture->width;
1385 ost->resample_height = in_picture->height;
1386 ost->resample_pix_fmt = in_picture->format;
1392 static void do_video_out(AVFormatContext *s,
1395 AVFrame *in_picture,
1396 int *frame_size, float quality)
1398 int nb_frames, i, ret, format_video_sync;
1399 AVFrame *final_picture;
1400 AVCodecContext *enc;
1403 enc = ost->st->codec;
1405 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1407 /* by default, we output a single frame */
1412 format_video_sync = video_sync_method;
1413 if (format_video_sync == VSYNC_AUTO)
1414 format_video_sync = (s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH :
1415 (s->oformat->flags & AVFMT_VARIABLE_FPS) ? VSYNC_VFR : VSYNC_CFR;
1417 if (format_video_sync != VSYNC_PASSTHROUGH) {
1418 double vdelta = sync_ipts - ost->sync_opts;
1419 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1422 else if (format_video_sync == VSYNC_VFR) {
1423 if (vdelta <= -0.6) {
1425 } else if (vdelta > 0.6)
1426 ost->sync_opts = lrintf(sync_ipts);
1427 } else if (vdelta > 1.1)
1428 nb_frames = lrintf(vdelta);
1429 //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);
1430 if (nb_frames == 0) {
1432 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1433 } else if (nb_frames > 1) {
1434 nb_frames_dup += nb_frames - 1;
1435 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1438 ost->sync_opts = lrintf(sync_ipts);
1440 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1444 #if !CONFIG_AVFILTER
1445 do_video_resample(ost, ist, in_picture, &final_picture);
1447 final_picture = in_picture;
1450 /* duplicates frame if needed */
1451 for (i = 0; i < nb_frames; i++) {
1453 av_init_packet(&pkt);
1454 pkt.stream_index = ost->index;
1456 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1457 enc->codec->id == CODEC_ID_RAWVIDEO) {
1458 /* raw pictures are written as AVPicture structure to
1459 avoid any copies. We support temporarily the older
1461 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1462 enc->coded_frame->top_field_first = in_picture->top_field_first;
1463 pkt.data = (uint8_t *)final_picture;
1464 pkt.size = sizeof(AVPicture);
1465 pkt.pts = av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1466 pkt.flags |= AV_PKT_FLAG_KEY;
1468 write_frame(s, &pkt, ost);
1470 AVFrame big_picture;
1472 big_picture = *final_picture;
1473 /* better than nothing: use input picture interlaced
1475 big_picture.interlaced_frame = in_picture->interlaced_frame;
1476 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1477 if (ost->top_field_first == -1)
1478 big_picture.top_field_first = in_picture->top_field_first;
1480 big_picture.top_field_first = !!ost->top_field_first;
1483 /* handles same_quant here. This is not correct because it may
1484 not be a global option */
1485 big_picture.quality = quality;
1486 if (!enc->me_threshold)
1487 big_picture.pict_type = 0;
1488 // big_picture.pts = AV_NOPTS_VALUE;
1489 big_picture.pts = ost->sync_opts;
1490 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1491 // av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1492 if (ost->forced_kf_index < ost->forced_kf_count &&
1493 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1494 big_picture.pict_type = AV_PICTURE_TYPE_I;
1495 ost->forced_kf_index++;
1497 ret = avcodec_encode_video(enc,
1498 bit_buffer, bit_buffer_size,
1501 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1506 pkt.data = bit_buffer;
1508 if (enc->coded_frame->pts != AV_NOPTS_VALUE)
1509 pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1510 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1511 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1512 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1514 if (enc->coded_frame->key_frame)
1515 pkt.flags |= AV_PKT_FLAG_KEY;
1516 write_frame(s, &pkt, ost);
1519 // fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1520 // enc->frame_number-1, ret, enc->pict_type);
1521 /* if two pass, output log */
1522 if (ost->logfile && enc->stats_out) {
1523 fprintf(ost->logfile, "%s", enc->stats_out);
1529 * For video, number of frames in == number of packets out.
1530 * But there may be reordering, so we can't throw away frames on encoder
1531 * flush, we need to limit them here, before they go into encoder.
1533 ost->frame_number++;
1537 static double psnr(double d)
1539 return -10.0 * log(d) / log(10.0);
1542 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1545 AVCodecContext *enc;
1547 double ti1, bitrate, avg_bitrate;
1549 /* this is executed just the first time do_video_stats is called */
1551 vstats_file = fopen(vstats_filename, "w");
1558 enc = ost->st->codec;
1559 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1560 frame_number = ost->frame_number;
1561 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1562 if (enc->flags&CODEC_FLAG_PSNR)
1563 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1565 fprintf(vstats_file,"f_size= %6d ", frame_size);
1566 /* compute pts value */
1567 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1571 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1572 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1573 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1574 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1575 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1579 static void print_report(OutputFile *output_files,
1580 OutputStream *ost_table, int nb_ostreams,
1581 int is_last_report, int64_t timer_start)
1585 AVFormatContext *oc;
1587 AVCodecContext *enc;
1588 int frame_number, vid, i;
1590 int64_t pts = INT64_MAX;
1591 static int64_t last_time = -1;
1592 static int qp_histogram[52];
1593 int hours, mins, secs, us;
1595 if (!print_stats && !is_last_report)
1598 if (!is_last_report) {
1600 /* display the report every 0.5 seconds */
1601 cur_time = av_gettime();
1602 if (last_time == -1) {
1603 last_time = cur_time;
1606 if ((cur_time - last_time) < 500000)
1608 last_time = cur_time;
1612 oc = output_files[0].ctx;
1614 total_size = avio_size(oc->pb);
1615 if (total_size < 0) // FIXME improve avio_size() so it works with non seekable output too
1616 total_size = avio_tell(oc->pb);
1620 for (i = 0; i < nb_ostreams; i++) {
1622 ost = &ost_table[i];
1623 enc = ost->st->codec;
1624 if (!ost->stream_copy && enc->coded_frame)
1625 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
1626 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1627 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1629 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1630 float t = (av_gettime() - timer_start) / 1000000.0;
1632 frame_number = ost->frame_number;
1633 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1634 frame_number, (t > 1) ? (int)(frame_number / t + 0.5) : 0, q);
1636 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1640 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
1642 for (j = 0; j < 32; j++)
1643 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
1645 if (enc->flags&CODEC_FLAG_PSNR) {
1647 double error, error_sum = 0;
1648 double scale, scale_sum = 0;
1649 char type[3] = { 'Y','U','V' };
1650 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1651 for (j = 0; j < 3; j++) {
1652 if (is_last_report) {
1653 error = enc->error[j];
1654 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
1656 error = enc->coded_frame->error[j];
1657 scale = enc->width * enc->height * 255.0 * 255.0;
1663 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error / scale));
1665 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
1669 /* compute min output value */
1670 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1671 ost->st->time_base, AV_TIME_BASE_Q));
1674 secs = pts / AV_TIME_BASE;
1675 us = pts % AV_TIME_BASE;
1681 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1683 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1684 "size=%8.0fkB time=", total_size / 1024.0);
1685 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1686 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1687 (100 * us) / AV_TIME_BASE);
1688 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1689 "bitrate=%6.1fkbits/s", bitrate);
1691 if (nb_frames_dup || nb_frames_drop)
1692 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1693 nb_frames_dup, nb_frames_drop);
1695 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
1699 if (is_last_report) {
1700 int64_t raw= audio_size + video_size + extra_size;
1701 av_log(NULL, AV_LOG_INFO, "\n");
1702 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1703 video_size / 1024.0,
1704 audio_size / 1024.0,
1705 extra_size / 1024.0,
1706 100.0 * (total_size - raw) / raw
1711 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1715 for (i = 0; i < nb_ostreams; i++) {
1716 OutputStream *ost = &ost_table[i];
1717 AVCodecContext *enc = ost->st->codec;
1718 AVFormatContext *os = output_files[ost->file_index].ctx;
1719 int stop_encoding = 0;
1721 if (!ost->encoding_needed)
1724 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
1726 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
1732 av_init_packet(&pkt);
1736 switch (ost->st->codec->codec_type) {
1737 case AVMEDIA_TYPE_AUDIO:
1738 fifo_bytes = av_fifo_size(ost->fifo);
1739 if (fifo_bytes > 0) {
1740 /* encode any samples remaining in fifo */
1741 int frame_bytes = fifo_bytes;
1743 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1745 /* pad last frame with silence if needed */
1746 if (!(enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME)) {
1747 frame_bytes = enc->frame_size * enc->channels *
1748 av_get_bytes_per_sample(enc->sample_fmt);
1749 if (allocated_audio_buf_size < frame_bytes)
1751 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1753 encode_audio_frame(os, ost, audio_buf, frame_bytes);
1755 /* flush encoder with NULL frames until it is done
1756 returning packets */
1757 if (encode_audio_frame(os, ost, NULL, 0) == 0) {
1763 case AVMEDIA_TYPE_VIDEO:
1764 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1766 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1770 if (enc->coded_frame && enc->coded_frame->key_frame)
1771 pkt.flags |= AV_PKT_FLAG_KEY;
1772 if (ost->logfile && enc->stats_out) {
1773 fprintf(ost->logfile, "%s", enc->stats_out);
1779 pkt.stream_index = ost->index;
1780 pkt.data = bit_buffer;
1782 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1783 pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1784 write_frame(os, &pkt, ost);
1796 * Check whether a packet from ist should be written into ost at this time
1798 static int check_output_constraints(InputStream *ist, OutputStream *ost)
1800 OutputFile *of = &output_files[ost->file_index];
1801 int ist_index = ist - input_streams;
1803 if (ost->source_index != ist_index)
1806 if (of->start_time && ist->pts < of->start_time)
1809 if (of->recording_time != INT64_MAX &&
1810 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1811 (AVRational){ 1, 1000000 }) >= 0) {
1812 ost->is_past_recording_time = 1;
1819 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
1821 OutputFile *of = &output_files[ost->file_index];
1822 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1826 av_init_packet(&opkt);
1828 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
1829 !ost->copy_initial_nonkeyframes)
1832 /* force the input stream PTS */
1833 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1834 audio_size += pkt->size;
1835 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1836 video_size += pkt->size;
1840 opkt.stream_index = ost->index;
1841 if (pkt->pts != AV_NOPTS_VALUE)
1842 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1844 opkt.pts = AV_NOPTS_VALUE;
1846 if (pkt->dts == AV_NOPTS_VALUE)
1847 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1849 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1850 opkt.dts -= ost_tb_start_time;
1852 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1853 opkt.flags = pkt->flags;
1855 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1856 if ( ost->st->codec->codec_id != CODEC_ID_H264
1857 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1858 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1860 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
1861 opkt.destruct = av_destruct_packet;
1863 opkt.data = pkt->data;
1864 opkt.size = pkt->size;
1866 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
1867 /* store AVPicture in AVPacket, as expected by the output format */
1868 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1869 opkt.data = (uint8_t *)&pict;
1870 opkt.size = sizeof(AVPicture);
1871 opkt.flags |= AV_PKT_FLAG_KEY;
1874 write_frame(of->ctx, &opkt, ost);
1875 ost->st->codec->frame_number++;
1876 av_free_packet(&opkt);
1879 static void rate_emu_sleep(InputStream *ist)
1881 if (input_files[ist->file_index].rate_emu) {
1882 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1883 int64_t now = av_gettime() - ist->start;
1889 static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
1891 AVFrame *decoded_frame;
1892 AVCodecContext *avctx = ist->st->codec;
1893 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1896 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
1897 return AVERROR(ENOMEM);
1899 avcodec_get_frame_defaults(ist->decoded_frame);
1900 decoded_frame = ist->decoded_frame;
1902 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
1908 /* no audio frame */
1912 /* if the decoder provides a pts, use it instead of the last packet pts.
1913 the decoder could be delaying output by a packet or more. */
1914 if (decoded_frame->pts != AV_NOPTS_VALUE)
1915 ist->next_pts = decoded_frame->pts;
1917 /* increment next_pts to use for the case where the input stream does not
1918 have timestamps or there are multiple frames in the packet */
1919 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
1922 // preprocess audio (volume)
1923 if (audio_volume != 256) {
1924 int decoded_data_size = decoded_frame->nb_samples * avctx->channels * bps;
1925 void *samples = decoded_frame->data[0];
1926 switch (avctx->sample_fmt) {
1927 case AV_SAMPLE_FMT_U8:
1929 uint8_t *volp = samples;
1930 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1931 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
1932 *volp++ = av_clip_uint8(v);
1936 case AV_SAMPLE_FMT_S16:
1938 int16_t *volp = samples;
1939 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1940 int v = ((*volp) * audio_volume + 128) >> 8;
1941 *volp++ = av_clip_int16(v);
1945 case AV_SAMPLE_FMT_S32:
1947 int32_t *volp = samples;
1948 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1949 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
1950 *volp++ = av_clipl_int32(v);
1954 case AV_SAMPLE_FMT_FLT:
1956 float *volp = samples;
1957 float scale = audio_volume / 256.f;
1958 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1963 case AV_SAMPLE_FMT_DBL:
1965 double *volp = samples;
1966 double scale = audio_volume / 256.;
1967 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1973 av_log(NULL, AV_LOG_FATAL,
1974 "Audio volume adjustment on sample format %s is not supported.\n",
1975 av_get_sample_fmt_name(ist->st->codec->sample_fmt));
1980 rate_emu_sleep(ist);
1982 for (i = 0; i < nb_output_streams; i++) {
1983 OutputStream *ost = &output_streams[i];
1985 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1987 do_audio_out(output_files[ost->file_index].ctx, ost, ist, decoded_frame);
1993 static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *pkt_pts)
1995 AVFrame *decoded_frame, *filtered_frame = NULL;
1996 void *buffer_to_free = NULL;
2000 int frame_available = 1;
2003 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2004 return AVERROR(ENOMEM);
2006 avcodec_get_frame_defaults(ist->decoded_frame);
2007 decoded_frame = ist->decoded_frame;
2008 pkt->pts = *pkt_pts;
2009 pkt->dts = ist->pts;
2010 *pkt_pts = AV_NOPTS_VALUE;
2012 ret = avcodec_decode_video2(ist->st->codec,
2013 decoded_frame, got_output, pkt);
2017 quality = same_quant ? decoded_frame->quality : 0;
2019 /* no picture yet */
2022 ist->next_pts = ist->pts = decoded_frame->best_effort_timestamp;
2024 ist->next_pts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2025 else if (ist->st->codec->time_base.num != 0) {
2026 int ticks = ist->st->parser ? ist->st->parser->repeat_pict + 1 :
2027 ist->st->codec->ticks_per_frame;
2028 ist->next_pts += ((int64_t)AV_TIME_BASE *
2029 ist->st->codec->time_base.num * ticks) /
2030 ist->st->codec->time_base.den;
2033 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2035 rate_emu_sleep(ist);
2037 for (i = 0; i < nb_output_streams; i++) {
2038 OutputStream *ost = &output_streams[i];
2039 int frame_size, resample_changed;
2041 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2045 resample_changed = ost->resample_width != decoded_frame->width ||
2046 ost->resample_height != decoded_frame->height ||
2047 ost->resample_pix_fmt != decoded_frame->format;
2048 if (resample_changed) {
2049 av_log(NULL, AV_LOG_INFO,
2050 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
2051 ist->file_index, ist->st->index,
2052 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
2053 decoded_frame->width, decoded_frame->height, av_get_pix_fmt_name(decoded_frame->format));
2055 avfilter_graph_free(&ost->graph);
2056 if (configure_video_filters(ist, ost)) {
2057 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2061 ost->resample_width = decoded_frame->width;
2062 ost->resample_height = decoded_frame->height;
2063 ost->resample_pix_fmt = decoded_frame->format;
2066 if (!decoded_frame->sample_aspect_ratio.num)
2067 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
2068 decoded_frame->pts = ist->pts;
2069 if (ist->st->codec->codec->capabilities & CODEC_CAP_DR1) {
2070 FrameBuffer *buf = decoded_frame->opaque;
2071 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2072 decoded_frame->data, decoded_frame->linesize,
2073 AV_PERM_READ | AV_PERM_PRESERVE,
2074 ist->st->codec->width, ist->st->codec->height,
2075 ist->st->codec->pix_fmt);
2077 avfilter_copy_frame_props(fb, decoded_frame);
2079 fb->buf->priv = buf;
2080 fb->buf->free = filter_release_buffer;
2083 av_buffersrc_buffer(ost->input_video_filter, fb);
2085 av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame, AV_VSRC_BUF_FLAG_OVERWRITE);
2087 if (!ist->filtered_frame && !(ist->filtered_frame = avcodec_alloc_frame())) {
2088 av_free(buffer_to_free);
2089 return AVERROR(ENOMEM);
2091 avcodec_get_frame_defaults(ist->filtered_frame);
2092 filtered_frame = ist->filtered_frame;
2094 frame_available = avfilter_poll_frame(ost->output_video_filter->inputs[0]);
2095 while (frame_available) {
2096 if (ost->output_video_filter) {
2097 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
2098 if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
2101 avfilter_fill_frame_from_video_buffer_ref(filtered_frame, ost->picref);
2102 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
2105 if (ost->picref->video && !ost->frame_aspect_ratio)
2106 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
2108 filtered_frame = decoded_frame;
2111 do_video_out(output_files[ost->file_index].ctx, ost, ist, filtered_frame, &frame_size,
2112 same_quant ? quality : ost->st->codec->global_quality);
2113 if (vstats_filename && frame_size)
2114 do_video_stats(output_files[ost->file_index].ctx, ost, frame_size);
2117 frame_available = ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
2119 avfilter_unref_buffer(ost->picref);
2124 av_free(buffer_to_free);
2128 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2130 AVSubtitle subtitle;
2131 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2132 &subtitle, got_output, pkt);
2138 rate_emu_sleep(ist);
2140 for (i = 0; i < nb_output_streams; i++) {
2141 OutputStream *ost = &output_streams[i];
2143 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2146 do_subtitle_out(output_files[ost->file_index].ctx, ost, ist, &subtitle, pkt->pts);
2149 avsubtitle_free(&subtitle);
2153 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2154 static int output_packet(InputStream *ist,
2155 OutputStream *ost_table, int nb_ostreams,
2156 const AVPacket *pkt)
2160 int64_t pkt_pts = AV_NOPTS_VALUE;
2163 if (ist->next_pts == AV_NOPTS_VALUE)
2164 ist->next_pts = ist->pts;
2168 av_init_packet(&avpkt);
2176 if (pkt->dts != AV_NOPTS_VALUE)
2177 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2178 if (pkt->pts != AV_NOPTS_VALUE)
2179 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2181 // while we have more to decode or while the decoder did output something on EOF
2182 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2186 ist->pts = ist->next_pts;
2188 if (avpkt.size && avpkt.size != pkt->size) {
2189 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2190 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2191 ist->showed_multi_packet_warning = 1;
2194 switch (ist->st->codec->codec_type) {
2195 case AVMEDIA_TYPE_AUDIO:
2196 ret = transcode_audio (ist, &avpkt, &got_output);
2198 case AVMEDIA_TYPE_VIDEO:
2199 ret = transcode_video (ist, &avpkt, &got_output, &pkt_pts);
2201 case AVMEDIA_TYPE_SUBTITLE:
2202 ret = transcode_subtitles(ist, &avpkt, &got_output);
2210 // touch data and size only if not EOF
2220 /* handle stream copy */
2221 if (!ist->decoding_needed) {
2222 rate_emu_sleep(ist);
2223 ist->pts = ist->next_pts;
2224 switch (ist->st->codec->codec_type) {
2225 case AVMEDIA_TYPE_AUDIO:
2226 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2227 ist->st->codec->sample_rate;
2229 case AVMEDIA_TYPE_VIDEO:
2230 if (ist->st->codec->time_base.num != 0) {
2231 int ticks = ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2232 ist->next_pts += ((int64_t)AV_TIME_BASE *
2233 ist->st->codec->time_base.num * ticks) /
2234 ist->st->codec->time_base.den;
2239 for (i = 0; pkt && i < nb_ostreams; i++) {
2240 OutputStream *ost = &ost_table[i];
2242 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2245 do_streamcopy(ist, ost, pkt);
2251 static void print_sdp(OutputFile *output_files, int n)
2255 AVFormatContext **avc = av_malloc(sizeof(*avc) * n);
2259 for (i = 0; i < n; i++)
2260 avc[i] = output_files[i].ctx;
2262 av_sdp_create(avc, n, sdp, sizeof(sdp));
2263 printf("SDP:\n%s\n", sdp);
2268 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
2269 char *error, int error_len)
2272 InputStream *ist = &input_streams[ist_index];
2273 if (ist->decoding_needed) {
2274 AVCodec *codec = ist->dec;
2276 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d:%d",
2277 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2278 return AVERROR(EINVAL);
2281 if (codec->type == AVMEDIA_TYPE_VIDEO && codec->capabilities & CODEC_CAP_DR1) {
2282 ist->st->codec->get_buffer = codec_get_buffer;
2283 ist->st->codec->release_buffer = codec_release_buffer;
2284 ist->st->codec->opaque = ist;
2287 if (!av_dict_get(ist->opts, "threads", NULL, 0))
2288 av_dict_set(&ist->opts, "threads", "auto", 0);
2289 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2290 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2291 ist->file_index, ist->st->index);
2292 return AVERROR(EINVAL);
2294 assert_codec_experimental(ist->st->codec, 0);
2295 assert_avoptions(ist->opts);
2298 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;
2299 ist->next_pts = AV_NOPTS_VALUE;
2305 static int transcode_init(OutputFile *output_files,
2306 int nb_output_files,
2307 InputFile *input_files,
2310 int ret = 0, i, j, k;
2311 AVFormatContext *oc;
2312 AVCodecContext *codec, *icodec;
2318 /* init framerate emulation */
2319 for (i = 0; i < nb_input_files; i++) {
2320 InputFile *ifile = &input_files[i];
2321 if (ifile->rate_emu)
2322 for (j = 0; j < ifile->nb_streams; j++)
2323 input_streams[j + ifile->ist_index].start = av_gettime();
2326 /* output stream init */
2327 for (i = 0; i < nb_output_files; i++) {
2328 oc = output_files[i].ctx;
2329 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2330 av_dump_format(oc, i, oc->filename, 1);
2331 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2332 return AVERROR(EINVAL);
2336 /* for each output stream, we compute the right encoding parameters */
2337 for (i = 0; i < nb_output_streams; i++) {
2338 ost = &output_streams[i];
2339 oc = output_files[ost->file_index].ctx;
2340 ist = &input_streams[ost->source_index];
2342 if (ost->attachment_filename)
2345 codec = ost->st->codec;
2346 icodec = ist->st->codec;
2348 ost->st->disposition = ist->st->disposition;
2349 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2350 codec->chroma_sample_location = icodec->chroma_sample_location;
2352 if (ost->stream_copy) {
2353 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2355 if (extra_size > INT_MAX) {
2356 return AVERROR(EINVAL);
2359 /* if stream_copy is selected, no need to decode or encode */
2360 codec->codec_id = icodec->codec_id;
2361 codec->codec_type = icodec->codec_type;
2363 if (!codec->codec_tag) {
2364 if (!oc->oformat->codec_tag ||
2365 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2366 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2367 codec->codec_tag = icodec->codec_tag;
2370 codec->bit_rate = icodec->bit_rate;
2371 codec->rc_max_rate = icodec->rc_max_rate;
2372 codec->rc_buffer_size = icodec->rc_buffer_size;
2373 codec->field_order = icodec->field_order;
2374 codec->extradata = av_mallocz(extra_size);
2375 if (!codec->extradata) {
2376 return AVERROR(ENOMEM);
2378 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2380 codec->extradata_size = icodec->extradata_size;
2382 codec->time_base = icodec->time_base;
2383 codec->time_base.num *= icodec->ticks_per_frame;
2384 av_reduce(&codec->time_base.num, &codec->time_base.den,
2385 codec->time_base.num, codec->time_base.den, INT_MAX);
2387 codec->time_base = ist->st->time_base;
2389 switch (codec->codec_type) {
2390 case AVMEDIA_TYPE_AUDIO:
2391 if (audio_volume != 256) {
2392 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2395 codec->channel_layout = icodec->channel_layout;
2396 codec->sample_rate = icodec->sample_rate;
2397 codec->channels = icodec->channels;
2398 codec->frame_size = icodec->frame_size;
2399 codec->audio_service_type = icodec->audio_service_type;
2400 codec->block_align = icodec->block_align;
2402 case AVMEDIA_TYPE_VIDEO:
2403 codec->pix_fmt = icodec->pix_fmt;
2404 codec->width = icodec->width;
2405 codec->height = icodec->height;
2406 codec->has_b_frames = icodec->has_b_frames;
2407 if (!codec->sample_aspect_ratio.num) {
2408 codec->sample_aspect_ratio =
2409 ost->st->sample_aspect_ratio =
2410 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2411 ist->st->codec->sample_aspect_ratio.num ?
2412 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2415 case AVMEDIA_TYPE_SUBTITLE:
2416 codec->width = icodec->width;
2417 codec->height = icodec->height;
2419 case AVMEDIA_TYPE_DATA:
2420 case AVMEDIA_TYPE_ATTACHMENT:
2427 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2429 ist->decoding_needed = 1;
2430 ost->encoding_needed = 1;
2432 switch (codec->codec_type) {
2433 case AVMEDIA_TYPE_AUDIO:
2434 ost->fifo = av_fifo_alloc(1024);
2436 return AVERROR(ENOMEM);
2438 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2440 if (!codec->sample_rate)
2441 codec->sample_rate = icodec->sample_rate;
2442 choose_sample_rate(ost->st, ost->enc);
2443 codec->time_base = (AVRational){ 1, codec->sample_rate };
2445 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2446 codec->sample_fmt = icodec->sample_fmt;
2447 choose_sample_fmt(ost->st, ost->enc);
2449 if (!codec->channels) {
2450 codec->channels = icodec->channels;
2451 codec->channel_layout = icodec->channel_layout;
2453 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2454 codec->channel_layout = 0;
2456 ost->audio_resample = codec-> sample_rate != icodec->sample_rate || audio_sync_method > 1;
2457 icodec->request_channels = codec-> channels;
2458 ost->resample_sample_fmt = icodec->sample_fmt;
2459 ost->resample_sample_rate = icodec->sample_rate;
2460 ost->resample_channels = icodec->channels;
2462 case AVMEDIA_TYPE_VIDEO:
2463 if (codec->pix_fmt == PIX_FMT_NONE)
2464 codec->pix_fmt = icodec->pix_fmt;
2465 choose_pixel_fmt(ost->st, ost->enc);
2467 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2468 av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2472 if (!codec->width || !codec->height) {
2473 codec->width = icodec->width;
2474 codec->height = icodec->height;
2477 ost->video_resample = codec->width != icodec->width ||
2478 codec->height != icodec->height ||
2479 codec->pix_fmt != icodec->pix_fmt;
2480 if (ost->video_resample) {
2481 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2484 ost->resample_height = icodec->height;
2485 ost->resample_width = icodec->width;
2486 ost->resample_pix_fmt = icodec->pix_fmt;
2488 if (!ost->frame_rate.num)
2489 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational) { 25, 1 };
2490 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2491 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2492 ost->frame_rate = ost->enc->supported_framerates[idx];
2494 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2495 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2496 && (video_sync_method==1 || (video_sync_method<0 && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
2497 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2498 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2502 if (configure_video_filters(ist, ost)) {
2503 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2508 case AVMEDIA_TYPE_SUBTITLE:
2515 if (codec->codec_id != CODEC_ID_H264 &&
2516 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2517 char logfilename[1024];
2520 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2521 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2523 if (codec->flags & CODEC_FLAG_PASS1) {
2524 f = fopen(logfilename, "wb");
2526 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2527 logfilename, strerror(errno));
2533 size_t logbuffer_size;
2534 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2535 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2539 codec->stats_in = logbuffer;
2543 if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2544 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2545 int size = codec->width * codec->height;
2546 bit_buffer_size = FFMAX(bit_buffer_size, 6 * size + 1664);
2551 bit_buffer = av_malloc(bit_buffer_size);
2553 av_log(NULL, AV_LOG_ERROR, "Cannot allocate %d bytes output buffer\n",
2555 return AVERROR(ENOMEM);
2558 /* open each encoder */
2559 for (i = 0; i < nb_output_streams; i++) {
2560 ost = &output_streams[i];
2561 if (ost->encoding_needed) {
2562 AVCodec *codec = ost->enc;
2563 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2565 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d:%d",
2566 ost->st->codec->codec_id, ost->file_index, ost->index);
2567 ret = AVERROR(EINVAL);
2570 if (dec->subtitle_header) {
2571 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2572 if (!ost->st->codec->subtitle_header) {
2573 ret = AVERROR(ENOMEM);
2576 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2577 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2579 if (!av_dict_get(ost->opts, "threads", NULL, 0))
2580 av_dict_set(&ost->opts, "threads", "auto", 0);
2581 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2582 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2583 ost->file_index, ost->index);
2584 ret = AVERROR(EINVAL);
2587 assert_codec_experimental(ost->st->codec, 1);
2588 assert_avoptions(ost->opts);
2589 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2590 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2591 "It takes bits/s as argument, not kbits/s\n");
2592 extra_size += ost->st->codec->extradata_size;
2594 if (ost->st->codec->me_threshold)
2595 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2599 /* init input streams */
2600 for (i = 0; i < nb_input_streams; i++)
2601 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2604 /* discard unused programs */
2605 for (i = 0; i < nb_input_files; i++) {
2606 InputFile *ifile = &input_files[i];
2607 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2608 AVProgram *p = ifile->ctx->programs[j];
2609 int discard = AVDISCARD_ALL;
2611 for (k = 0; k < p->nb_stream_indexes; k++)
2612 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2613 discard = AVDISCARD_DEFAULT;
2616 p->discard = discard;
2620 /* open files and write file headers */
2621 for (i = 0; i < nb_output_files; i++) {
2622 oc = output_files[i].ctx;
2623 oc->interrupt_callback = int_cb;
2624 if (avformat_write_header(oc, &output_files[i].opts) < 0) {
2625 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2626 ret = AVERROR(EINVAL);
2629 // assert_avoptions(output_files[i].opts);
2630 if (strcmp(oc->oformat->name, "rtp")) {
2636 /* dump the file output parameters - cannot be done before in case
2638 for (i = 0; i < nb_output_files; i++) {
2639 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2642 /* dump the stream mapping */
2643 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2644 for (i = 0; i < nb_output_streams; i++) {
2645 ost = &output_streams[i];
2647 if (ost->attachment_filename) {
2648 /* an attached file */
2649 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
2650 ost->attachment_filename, ost->file_index, ost->index);
2653 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
2654 input_streams[ost->source_index].file_index,
2655 input_streams[ost->source_index].st->index,
2658 if (ost->sync_ist != &input_streams[ost->source_index])
2659 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2660 ost->sync_ist->file_index,
2661 ost->sync_ist->st->index);
2662 if (ost->stream_copy)
2663 av_log(NULL, AV_LOG_INFO, " (copy)");
2665 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2666 input_streams[ost->source_index].dec->name : "?",
2667 ost->enc ? ost->enc->name : "?");
2668 av_log(NULL, AV_LOG_INFO, "\n");
2672 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2677 print_sdp(output_files, nb_output_files);
2684 * The following code is the main loop of the file converter
2686 static int transcode(OutputFile *output_files,
2687 int nb_output_files,
2688 InputFile *input_files,
2692 AVFormatContext *is, *os;
2696 int no_packet_count = 0;
2697 int64_t timer_start;
2700 if (!(no_packet = av_mallocz(nb_input_files)))
2703 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2708 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
2709 avio_set_interrupt_cb(decode_interrupt_cb);
2713 timer_start = av_gettime();
2715 for (; received_sigterm == 0;) {
2716 int file_index, ist_index;
2721 ipts_min = INT64_MAX;
2723 /* if 'q' pressed, exits */
2727 /* read_key() returns 0 on EOF */
2731 if (key == '+') av_log_set_level(av_log_get_level()+10);
2732 if (key == '-') av_log_set_level(av_log_get_level()-10);
2733 if (key == 's') qp_hist ^= 1;
2736 do_hex_dump = do_pkt_dump = 0;
2737 } else if(do_pkt_dump){
2741 av_log_set_level(AV_LOG_DEBUG);
2743 if (key == 'd' || key == 'D'){
2746 debug = input_streams[0].st->codec->debug<<1;
2747 if(!debug) debug = 1;
2748 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2751 scanf("%d", &debug);
2752 for(i=0;i<nb_input_streams;i++) {
2753 input_streams[i].st->codec->debug = debug;
2755 for(i=0;i<nb_output_streams;i++) {
2756 ost = &output_streams[i];
2757 ost->st->codec->debug = debug;
2759 if(debug) av_log_set_level(AV_LOG_DEBUG);
2760 fprintf(stderr,"debug=%d\n", debug);
2763 fprintf(stderr, "key function\n"
2764 "? show this help\n"
2765 "+ increase verbosity\n"
2766 "- decrease verbosity\n"
2767 "D cycle through available debug modes\n"
2768 "h dump packets/hex press to cycle through the 3 states\n"
2770 "s Show QP histogram\n"
2775 /* select the stream that we must read now by looking at the
2776 smallest output pts */
2778 for (i = 0; i < nb_output_streams; i++) {
2782 ost = &output_streams[i];
2783 of = &output_files[ost->file_index];
2784 os = output_files[ost->file_index].ctx;
2785 ist = &input_streams[ost->source_index];
2786 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2787 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2789 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2791 if (!input_files[ist->file_index].eof_reached) {
2792 if (ipts < ipts_min) {
2795 file_index = ist->file_index;
2797 if (opts < opts_min) {
2799 if (!input_sync) file_index = ist->file_index;
2802 if (ost->frame_number >= ost->max_frames) {
2804 for (j = 0; j < of->ctx->nb_streams; j++)
2805 output_streams[of->ost_index + j].is_past_recording_time = 1;
2809 /* if none, if is finished */
2810 if (file_index < 0) {
2811 if (no_packet_count) {
2812 no_packet_count = 0;
2813 memset(no_packet, 0, nb_input_files);
2820 /* read a frame from it and output it in the fifo */
2821 is = input_files[file_index].ctx;
2822 ret = av_read_frame(is, &pkt);
2823 if (ret == AVERROR(EAGAIN)) {
2824 no_packet[file_index] = 1;
2829 input_files[file_index].eof_reached = 1;
2836 no_packet_count = 0;
2837 memset(no_packet, 0, nb_input_files);
2840 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2841 is->streams[pkt.stream_index]);
2843 /* the following test is needed in case new streams appear
2844 dynamically in stream : we ignore them */
2845 if (pkt.stream_index >= input_files[file_index].nb_streams)
2846 goto discard_packet;
2847 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2848 ist = &input_streams[ist_index];
2850 goto discard_packet;
2852 if (pkt.dts != AV_NOPTS_VALUE)
2853 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2854 if (pkt.pts != AV_NOPTS_VALUE)
2855 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2857 if (pkt.pts != AV_NOPTS_VALUE)
2858 pkt.pts *= ist->ts_scale;
2859 if (pkt.dts != AV_NOPTS_VALUE)
2860 pkt.dts *= ist->ts_scale;
2862 //fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n",
2864 // pkt.dts, input_files[ist->file_index].ts_offset,
2865 // ist->st->codec->codec_type);
2866 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2867 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2868 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2869 int64_t delta = pkt_dts - ist->next_pts;
2870 if ((FFABS(delta) > 1LL * dts_delta_threshold * AV_TIME_BASE || pkt_dts + 1 < ist->pts) && !copy_ts) {
2871 input_files[ist->file_index].ts_offset -= delta;
2872 av_log(NULL, AV_LOG_DEBUG,
2873 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2874 delta, input_files[ist->file_index].ts_offset);
2875 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2876 if (pkt.pts != AV_NOPTS_VALUE)
2877 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2881 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2882 if (output_packet(ist, output_streams, nb_output_streams, &pkt) < 0) {
2884 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
2885 ist->file_index, ist->st->index);
2888 av_free_packet(&pkt);
2893 av_free_packet(&pkt);
2895 /* dump report by using the output first video and audio streams */
2896 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2899 /* at the end of stream, we must flush the decoder buffers */
2900 for (i = 0; i < nb_input_streams; i++) {
2901 ist = &input_streams[i];
2902 if (ist->decoding_needed) {
2903 output_packet(ist, output_streams, nb_output_streams, NULL);
2906 flush_encoders(output_streams, nb_output_streams);
2910 /* write the trailer if needed and close file */
2911 for (i = 0; i < nb_output_files; i++) {
2912 os = output_files[i].ctx;
2913 av_write_trailer(os);
2916 /* dump report by using the first video and audio streams */
2917 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2919 /* close each encoder */
2920 for (i = 0; i < nb_output_streams; i++) {
2921 ost = &output_streams[i];
2922 if (ost->encoding_needed) {
2923 av_freep(&ost->st->codec->stats_in);
2924 avcodec_close(ost->st->codec);
2927 avfilter_graph_free(&ost->graph);
2931 /* close each decoder */
2932 for (i = 0; i < nb_input_streams; i++) {
2933 ist = &input_streams[i];
2934 if (ist->decoding_needed) {
2935 avcodec_close(ist->st->codec);
2943 av_freep(&bit_buffer);
2944 av_freep(&no_packet);
2946 if (output_streams) {
2947 for (i = 0; i < nb_output_streams; i++) {
2948 ost = &output_streams[i];
2950 if (ost->stream_copy)
2951 av_freep(&ost->st->codec->extradata);
2953 fclose(ost->logfile);
2954 ost->logfile = NULL;
2956 av_fifo_free(ost->fifo); /* works even if fifo is not
2957 initialized but set to zero */
2958 av_freep(&ost->st->codec->subtitle_header);
2959 av_free(ost->resample_frame.data[0]);
2960 av_free(ost->forced_kf_pts);
2961 if (ost->video_resample)
2962 sws_freeContext(ost->img_resample_ctx);
2964 audio_resample_close(ost->resample);
2965 if (ost->reformat_ctx)
2966 av_audio_convert_free(ost->reformat_ctx);
2967 av_dict_free(&ost->opts);
2974 static double parse_frame_aspect_ratio(const char *arg)
2981 p = strchr(arg, ':');
2983 x = strtol(arg, &end, 10);
2985 y = strtol(end + 1, &end, 10);
2987 ar = (double)x / (double)y;
2989 ar = strtod(arg, NULL);
2992 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
2998 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
3000 return parse_option(o, "codec:a", arg, options);
3003 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3005 return parse_option(o, "codec:v", arg, options);
3008 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3010 return parse_option(o, "codec:s", arg, options);
3013 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3015 return parse_option(o, "codec:d", arg, options);
3018 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
3020 StreamMap *m = NULL;
3021 int i, negative = 0, file_idx;
3022 int sync_file_idx = -1, sync_stream_idx;
3030 map = av_strdup(arg);
3032 /* parse sync stream first, just pick first matching stream */
3033 if (sync = strchr(map, ',')) {
3035 sync_file_idx = strtol(sync + 1, &sync, 0);
3036 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3037 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
3042 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
3043 if (check_stream_specifier(input_files[sync_file_idx].ctx,
3044 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
3045 sync_stream_idx = i;
3048 if (i == input_files[sync_file_idx].nb_streams) {
3049 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
3050 "match any streams.\n", arg);
3056 file_idx = strtol(map, &p, 0);
3057 if (file_idx >= nb_input_files || file_idx < 0) {
3058 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
3062 /* disable some already defined maps */
3063 for (i = 0; i < o->nb_stream_maps; i++) {
3064 m = &o->stream_maps[i];
3065 if (file_idx == m->file_index &&
3066 check_stream_specifier(input_files[m->file_index].ctx,
3067 input_files[m->file_index].ctx->streams[m->stream_index],
3068 *p == ':' ? p + 1 : p) > 0)
3072 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
3073 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
3074 *p == ':' ? p + 1 : p) <= 0)
3076 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3077 &o->nb_stream_maps, o->nb_stream_maps + 1);
3078 m = &o->stream_maps[o->nb_stream_maps - 1];
3080 m->file_index = file_idx;
3081 m->stream_index = i;
3083 if (sync_file_idx >= 0) {
3084 m->sync_file_index = sync_file_idx;
3085 m->sync_stream_index = sync_stream_idx;
3087 m->sync_file_index = file_idx;
3088 m->sync_stream_index = i;
3093 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3101 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3103 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3104 &o->nb_attachments, o->nb_attachments + 1);
3105 o->attachments[o->nb_attachments - 1] = arg;
3110 * Parse a metadata specifier in arg.
3111 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
3112 * @param index for type c/p, chapter/program index is written here
3113 * @param stream_spec for type s, the stream specifier is written here
3115 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
3123 if (*(++arg) && *arg != ':') {
3124 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
3127 *stream_spec = *arg == ':' ? arg + 1 : "";
3131 if (*(++arg) == ':')
3132 *index = strtol(++arg, NULL, 0);
3135 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
3142 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
3144 AVDictionary **meta_in = NULL;
3145 AVDictionary **meta_out;
3147 char type_in, type_out;
3148 const char *istream_spec = NULL, *ostream_spec = NULL;
3149 int idx_in = 0, idx_out = 0;
3151 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
3152 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
3154 if (type_in == 'g' || type_out == 'g')
3155 o->metadata_global_manual = 1;
3156 if (type_in == 's' || type_out == 's')
3157 o->metadata_streams_manual = 1;
3158 if (type_in == 'c' || type_out == 'c')
3159 o->metadata_chapters_manual = 1;
3161 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3162 if ((index) < 0 || (index) >= (nb_elems)) {\
3163 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
3168 #define SET_DICT(type, meta, context, index)\
3171 meta = &context->metadata;\
3174 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
3175 meta = &context->chapters[index]->metadata;\
3178 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
3179 meta = &context->programs[index]->metadata;\
3183 SET_DICT(type_in, meta_in, ic, idx_in);
3184 SET_DICT(type_out, meta_out, oc, idx_out);
3186 /* for input streams choose first matching stream */
3187 if (type_in == 's') {
3188 for (i = 0; i < ic->nb_streams; i++) {
3189 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
3190 meta_in = &ic->streams[i]->metadata;
3196 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
3201 if (type_out == 's') {
3202 for (i = 0; i < oc->nb_streams; i++) {
3203 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
3204 meta_out = &oc->streams[i]->metadata;
3205 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3210 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3215 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
3217 const char *codec_string = encoder ? "encoder" : "decoder";
3221 avcodec_find_encoder_by_name(name) :
3222 avcodec_find_decoder_by_name(name);
3224 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
3227 if (codec->type != type) {
3228 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
3234 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
3236 char *codec_name = NULL;
3238 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
3240 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
3241 st->codec->codec_id = codec->id;
3244 return avcodec_find_decoder(st->codec->codec_id);
3248 * Add all the streams from the given input file to the global
3249 * list of input streams.
3251 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
3255 for (i = 0; i < ic->nb_streams; i++) {
3256 AVStream *st = ic->streams[i];
3257 AVCodecContext *dec = st->codec;
3260 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3261 ist = &input_streams[nb_input_streams - 1];
3263 ist->file_index = nb_input_files;
3265 ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), ic, st);
3267 ist->ts_scale = 1.0;
3268 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
3270 ist->dec = choose_decoder(o, ic, st);
3272 switch (dec->codec_type) {
3273 case AVMEDIA_TYPE_AUDIO:
3275 ist->dec = avcodec_find_decoder(dec->codec_id);
3276 if(o->audio_disable)
3277 st->discard = AVDISCARD_ALL;
3279 case AVMEDIA_TYPE_VIDEO:
3281 ist->dec = avcodec_find_decoder(dec->codec_id);
3283 dec->flags |= CODEC_FLAG_EMU_EDGE;
3286 if (o->video_disable)
3287 st->discard = AVDISCARD_ALL;
3288 else if (video_discard)
3289 st->discard = video_discard;
3291 case AVMEDIA_TYPE_DATA:
3293 case AVMEDIA_TYPE_SUBTITLE:
3295 ist->dec = avcodec_find_decoder(dec->codec_id);
3296 if(o->subtitle_disable)
3297 st->discard = AVDISCARD_ALL;
3299 case AVMEDIA_TYPE_ATTACHMENT:
3300 case AVMEDIA_TYPE_UNKNOWN:
3308 static void assert_file_overwrite(const char *filename)
3310 if ((!file_overwrite || no_file_overwrite) &&
3311 (strchr(filename, ':') == NULL || filename[1] == ':' ||
3312 av_strstart(filename, "file:", NULL))) {
3313 if (avio_check(filename, 0) == 0) {
3314 if (!using_stdin && (!no_file_overwrite || file_overwrite)) {
3315 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3317 if (!read_yesno()) {
3318 fprintf(stderr, "Not overwriting - exiting\n");
3323 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3330 static void dump_attachment(AVStream *st, const char *filename)
3333 AVIOContext *out = NULL;
3334 AVDictionaryEntry *e;
3336 if (!st->codec->extradata_size) {
3337 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
3338 nb_input_files - 1, st->index);
3341 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
3342 filename = e->value;
3344 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
3345 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
3349 assert_file_overwrite(filename);
3351 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
3352 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
3357 avio_write(out, st->codec->extradata, st->codec->extradata_size);
3362 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
3364 AVFormatContext *ic;
3365 AVInputFormat *file_iformat = NULL;
3369 AVDictionary **opts;
3370 int orig_nb_streams; // number of streams before avformat_find_stream_info
3373 if (!(file_iformat = av_find_input_format(o->format))) {
3374 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
3379 if (!strcmp(filename, "-"))
3382 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3383 !strcmp(filename, "/dev/stdin");
3385 /* get default parameters from command line */
3386 ic = avformat_alloc_context();
3388 print_error(filename, AVERROR(ENOMEM));
3391 if (o->nb_audio_sample_rate) {
3392 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
3393 av_dict_set(&format_opts, "sample_rate", buf, 0);
3395 if (o->nb_audio_channels) {
3396 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
3397 av_dict_set(&format_opts, "channels", buf, 0);
3399 if (o->nb_frame_rates) {
3400 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
3402 if (o->nb_frame_sizes) {
3403 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
3405 if (o->nb_frame_pix_fmts)
3406 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
3408 ic->flags |= AVFMT_FLAG_NONBLOCK;
3409 ic->interrupt_callback = int_cb;
3411 /* open the input file with generic avformat function */
3412 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3414 print_error(filename, err);
3417 assert_avoptions(format_opts);
3419 /* apply forced codec ids */
3420 for (i = 0; i < ic->nb_streams; i++)
3421 choose_decoder(o, ic, ic->streams[i]);
3423 /* Set AVCodecContext options for avformat_find_stream_info */
3424 opts = setup_find_stream_info_opts(ic, codec_opts);
3425 orig_nb_streams = ic->nb_streams;
3427 /* If not enough info to get the stream parameters, we decode the
3428 first frames to get it. (used in mpeg case for example) */
3429 ret = avformat_find_stream_info(ic, opts);
3431 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
3432 avformat_close_input(&ic);
3436 timestamp = o->start_time;
3437 /* add the stream start time */
3438 if (ic->start_time != AV_NOPTS_VALUE)
3439 timestamp += ic->start_time;
3441 /* if seeking requested, we execute it */
3442 if (o->start_time != 0) {
3443 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3445 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
3446 filename, (double)timestamp / AV_TIME_BASE);
3450 /* update the current parameters so that they match the one of the input stream */
3451 add_input_streams(o, ic);
3453 /* dump the file content */
3454 av_dump_format(ic, nb_input_files, filename, 0);
3456 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3457 input_files[nb_input_files - 1].ctx = ic;
3458 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3459 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3460 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3461 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
3463 for (i = 0; i < o->nb_dump_attachment; i++) {
3466 for (j = 0; j < ic->nb_streams; j++) {
3467 AVStream *st = ic->streams[j];
3469 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
3470 dump_attachment(st, o->dump_attachment[i].u.str);
3474 for (i = 0; i < orig_nb_streams; i++)
3475 av_dict_free(&opts[i]);
3482 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3483 AVCodecContext *avctx)
3489 for (p = kf; *p; p++)
3492 ost->forced_kf_count = n;
3493 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3494 if (!ost->forced_kf_pts) {
3495 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3498 for (i = 0; i < n; i++) {
3499 p = i ? strchr(p, ',') + 1 : kf;
3500 t = parse_time_or_die("force_key_frames", p, 1);
3501 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3505 static uint8_t *get_line(AVIOContext *s)
3511 if (avio_open_dyn_buf(&line) < 0) {
3512 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
3516 while ((c = avio_r8(s)) && c != '\n')
3519 avio_close_dyn_buf(line, &buf);
3524 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
3527 char filename[1000];
3528 const char *base[3] = { getenv("AVCONV_DATADIR"),
3533 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
3537 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
3538 i != 1 ? "" : "/.avconv", codec_name, preset_name);
3539 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3542 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
3543 i != 1 ? "" : "/.avconv", preset_name);
3544 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3550 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
3552 char *codec_name = NULL;
3554 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
3556 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
3557 NULL, ost->st->codec->codec_type);
3558 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
3559 } else if (!strcmp(codec_name, "copy"))
3560 ost->stream_copy = 1;
3562 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
3563 ost->st->codec->codec_id = ost->enc->id;
3567 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3570 AVStream *st = avformat_new_stream(oc, NULL);
3571 int idx = oc->nb_streams - 1, ret = 0;
3572 char *bsf = NULL, *next, *codec_tag = NULL;
3573 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3575 char *buf = NULL, *arg = NULL, *preset = NULL;
3576 AVIOContext *s = NULL;
3579 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3583 if (oc->nb_streams - 1 < o->nb_streamid_map)
3584 st->id = o->streamid_map[oc->nb_streams - 1];
3586 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3587 nb_output_streams + 1);
3588 ost = &output_streams[nb_output_streams - 1];
3589 ost->file_index = nb_output_files;
3592 st->codec->codec_type = type;
3593 choose_encoder(o, oc, ost);
3595 ost->opts = filter_codec_opts(codec_opts, ost->enc, oc, st);
3598 avcodec_get_context_defaults3(st->codec, ost->enc);
3599 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3601 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
3602 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
3605 if (!buf[0] || buf[0] == '#') {
3609 if (!(arg = strchr(buf, '='))) {
3610 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
3614 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
3616 } while (!s->eof_reached);
3620 av_log(NULL, AV_LOG_FATAL,
3621 "Preset %s specified for stream %d:%d, but could not be opened.\n",
3622 preset, ost->file_index, ost->index);
3626 ost->max_frames = INT64_MAX;
3627 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
3629 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3631 if (next = strchr(bsf, ','))
3633 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3634 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3638 bsfc_prev->next = bsfc;
3640 ost->bitstream_filters = bsfc;
3646 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3648 uint32_t tag = strtol(codec_tag, &next, 0);
3650 tag = AV_RL32(codec_tag);
3651 st->codec->codec_tag = tag;
3654 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3655 if (qscale >= 0 || same_quant) {
3656 st->codec->flags |= CODEC_FLAG_QSCALE;
3657 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3660 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
3661 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3663 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3667 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3670 const char *p = str;
3677 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3684 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3688 AVCodecContext *video_enc;
3690 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3692 video_enc = st->codec;
3694 if (!ost->stream_copy) {
3695 const char *p = NULL;
3696 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3697 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3698 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3701 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3702 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3703 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3707 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3708 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3709 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3713 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3714 if (frame_aspect_ratio)
3715 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3717 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3718 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3719 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3722 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3724 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3726 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3727 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
3730 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3732 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3734 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3735 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
3738 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
3741 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
3742 for (i = 0; p; i++) {
3744 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
3746 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
3749 video_enc->rc_override =
3750 av_realloc(video_enc->rc_override,
3751 sizeof(RcOverride) * (i + 1));
3752 video_enc->rc_override[i].start_frame = start;
3753 video_enc->rc_override[i].end_frame = end;
3755 video_enc->rc_override[i].qscale = q;
3756 video_enc->rc_override[i].quality_factor = 1.0;
3759 video_enc->rc_override[i].qscale = 0;
3760 video_enc->rc_override[i].quality_factor = -q/100.0;
3765 video_enc->rc_override_count = i;
3766 if (!video_enc->rc_initial_buffer_occupancy)
3767 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
3768 video_enc->intra_dc_precision = intra_dc_precision - 8;
3773 video_enc->flags |= CODEC_FLAG_PASS1;
3775 video_enc->flags |= CODEC_FLAG_PASS2;
3779 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
3780 if (forced_key_frames)
3781 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3783 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
3785 ost->top_field_first = -1;
3786 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
3789 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
3791 ost->avfilter = av_strdup(filters);
3794 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
3800 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3804 AVCodecContext *audio_enc;
3806 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3809 audio_enc = st->codec;
3810 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3812 if (!ost->stream_copy) {
3813 char *sample_fmt = NULL;
3815 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3817 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
3819 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
3820 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
3824 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
3830 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3834 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3835 if (!ost->stream_copy) {
3836 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
3843 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
3845 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
3846 ost->stream_copy = 1;
3850 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3854 AVCodecContext *subtitle_enc;
3856 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3858 subtitle_enc = st->codec;
3860 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3865 /* arg format is "output-stream-index:streamid-value". */
3866 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
3872 av_strlcpy(idx_str, arg, sizeof(idx_str));
3873 p = strchr(idx_str, ':');
3875 av_log(NULL, AV_LOG_FATAL,
3876 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3881 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3882 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
3883 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3887 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3889 AVFormatContext *is = ifile->ctx;
3890 AVFormatContext *os = ofile->ctx;
3893 for (i = 0; i < is->nb_chapters; i++) {
3894 AVChapter *in_ch = is->chapters[i], *out_ch;
3895 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3896 AV_TIME_BASE_Q, in_ch->time_base);
3897 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3898 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3901 if (in_ch->end < ts_off)
3903 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3906 out_ch = av_mallocz(sizeof(AVChapter));
3908 return AVERROR(ENOMEM);
3910 out_ch->id = in_ch->id;
3911 out_ch->time_base = in_ch->time_base;
3912 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3913 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3916 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3919 os->chapters = av_realloc(os->chapters, sizeof(AVChapter) * os->nb_chapters);
3921 return AVERROR(ENOMEM);
3922 os->chapters[os->nb_chapters - 1] = out_ch;
3927 static void opt_output_file(void *optctx, const char *filename)
3929 OptionsContext *o = optctx;
3930 AVFormatContext *oc;
3932 AVOutputFormat *file_oformat;
3936 if (!strcmp(filename, "-"))
3939 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
3941 print_error(filename, err);
3945 file_oformat= oc->oformat;
3946 oc->interrupt_callback = int_cb;
3948 if (!o->nb_stream_maps) {
3949 /* pick the "best" stream of each type */
3950 #define NEW_STREAM(type, index)\
3952 ost = new_ ## type ## _stream(o, oc);\
3953 ost->source_index = index;\
3954 ost->sync_ist = &input_streams[index];\
3955 input_streams[index].discard = 0;\
3958 /* video: highest resolution */
3959 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3960 int area = 0, idx = -1;
3961 for (i = 0; i < nb_input_streams; i++) {
3962 ist = &input_streams[i];
3963 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3964 ist->st->codec->width * ist->st->codec->height > area) {
3965 area = ist->st->codec->width * ist->st->codec->height;
3969 NEW_STREAM(video, idx);
3972 /* audio: most channels */
3973 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3974 int channels = 0, idx = -1;
3975 for (i = 0; i < nb_input_streams; i++) {
3976 ist = &input_streams[i];
3977 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3978 ist->st->codec->channels > channels) {
3979 channels = ist->st->codec->channels;
3983 NEW_STREAM(audio, idx);
3986 /* subtitles: pick first */
3987 if (!o->subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3988 for (i = 0; i < nb_input_streams; i++)
3989 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3990 NEW_STREAM(subtitle, i);
3994 /* do something with data? */
3996 for (i = 0; i < o->nb_stream_maps; i++) {
3997 StreamMap *map = &o->stream_maps[i];
4002 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
4003 switch (ist->st->codec->codec_type) {
4004 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
4005 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
4006 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
4007 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
4008 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
4010 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
4011 map->file_index, map->stream_index);
4015 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
4016 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
4017 map->sync_stream_index];
4022 /* handle attached files */
4023 for (i = 0; i < o->nb_attachments; i++) {
4025 uint8_t *attachment;
4029 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
4030 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
4034 if ((len = avio_size(pb)) <= 0) {
4035 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
4039 if (!(attachment = av_malloc(len))) {
4040 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
4044 avio_read(pb, attachment, len);
4046 ost = new_attachment_stream(o, oc);
4047 ost->stream_copy = 0;
4048 ost->source_index = -1;
4049 ost->attachment_filename = o->attachments[i];
4050 ost->st->codec->extradata = attachment;
4051 ost->st->codec->extradata_size = len;
4053 p = strrchr(o->attachments[i], '/');
4054 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
4058 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
4059 output_files[nb_output_files - 1].ctx = oc;
4060 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
4061 output_files[nb_output_files - 1].recording_time = o->recording_time;
4062 output_files[nb_output_files - 1].start_time = o->start_time;
4063 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
4064 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
4066 /* check filename in case of an image number is expected */
4067 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
4068 if (!av_filename_number_test(oc->filename)) {
4069 print_error(oc->filename, AVERROR(EINVAL));
4074 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
4075 /* test if it already exists to avoid losing precious files */
4076 assert_file_overwrite(filename);
4079 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
4080 &oc->interrupt_callback,
4081 &output_files[nb_output_files - 1].opts)) < 0) {
4082 print_error(filename, err);
4087 if (o->mux_preload) {
4089 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
4090 av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
4092 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
4095 for (i = 0; i < o->nb_metadata_map; i++) {
4097 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
4099 if (in_file_index < 0)
4101 if (in_file_index >= nb_input_files) {
4102 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
4105 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, input_files[in_file_index].ctx, o);
4109 if (o->chapters_input_file >= nb_input_files) {
4110 if (o->chapters_input_file == INT_MAX) {
4111 /* copy chapters from the first input file that has them*/
4112 o->chapters_input_file = -1;
4113 for (i = 0; i < nb_input_files; i++)
4114 if (input_files[i].ctx->nb_chapters) {
4115 o->chapters_input_file = i;
4119 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
4120 o->chapters_input_file);
4124 if (o->chapters_input_file >= 0)
4125 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
4126 !o->metadata_chapters_manual);
4128 /* copy global metadata by default */
4129 if (!o->metadata_global_manual && nb_input_files)
4130 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
4131 AV_DICT_DONT_OVERWRITE);
4132 if (!o->metadata_streams_manual)
4133 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
4135 if (output_streams[i].source_index < 0) /* this is true e.g. for attached files */
4137 ist = &input_streams[output_streams[i].source_index];
4138 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
4141 /* process manually set metadata */
4142 for (i = 0; i < o->nb_metadata; i++) {
4145 const char *stream_spec;
4146 int index = 0, j, ret;
4148 val = strchr(o->metadata[i].u.str, '=');
4150 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
4151 o->metadata[i].u.str);
4156 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
4158 for (j = 0; j < oc->nb_streams; j++) {
4159 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
4160 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
4164 printf("ret %d, stream_spec %s\n", ret, stream_spec);
4172 if (index < 0 || index >= oc->nb_chapters) {
4173 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
4176 m = &oc->chapters[index]->metadata;
4179 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
4182 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
4189 /* same option as mencoder */
4190 static int opt_pass(const char *opt, const char *arg)
4192 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
4196 static int64_t getutime(void)
4199 struct rusage rusage;
4201 getrusage(RUSAGE_SELF, &rusage);
4202 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4203 #elif HAVE_GETPROCESSTIMES
4205 FILETIME c, e, k, u;
4206 proc = GetCurrentProcess();
4207 GetProcessTimes(proc, &c, &e, &k, &u);
4208 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4210 return av_gettime();
4214 static int64_t getmaxrss(void)
4216 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4217 struct rusage rusage;
4218 getrusage(RUSAGE_SELF, &rusage);
4219 return (int64_t)rusage.ru_maxrss * 1024;
4220 #elif HAVE_GETPROCESSMEMORYINFO
4222 PROCESS_MEMORY_COUNTERS memcounters;
4223 proc = GetCurrentProcess();
4224 memcounters.cb = sizeof(memcounters);
4225 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4226 return memcounters.PeakPagefileUsage;
4232 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
4234 return parse_option(o, "q:a", arg, options);
4237 static void show_usage(void)
4239 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
4240 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
4241 av_log(NULL, AV_LOG_INFO, "\n");
4244 static int opt_help(const char *opt, const char *arg)
4246 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
4247 av_log_set_callback(log_callback_help);
4249 show_help_options(options, "Main options:\n",
4250 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4251 show_help_options(options, "\nAdvanced options:\n",
4252 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4254 show_help_options(options, "\nVideo options:\n",
4255 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4257 show_help_options(options, "\nAdvanced Video options:\n",
4258 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4259 OPT_VIDEO | OPT_EXPERT);
4260 show_help_options(options, "\nAudio options:\n",
4261 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4263 show_help_options(options, "\nAdvanced Audio options:\n",
4264 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4265 OPT_AUDIO | OPT_EXPERT);
4266 show_help_options(options, "\nSubtitle options:\n",
4267 OPT_SUBTITLE | OPT_GRAB,
4269 show_help_options(options, "\nAudio/Video grab options:\n",
4273 show_help_children(avcodec_get_class(), flags);
4274 show_help_children(avformat_get_class(), flags);
4275 show_help_children(sws_get_class(), flags);
4280 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
4282 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4283 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
4285 if (!strncmp(arg, "pal-", 4)) {
4288 } else if (!strncmp(arg, "ntsc-", 5)) {
4291 } else if (!strncmp(arg, "film-", 5)) {
4295 /* Try to determine PAL/NTSC by peeking in the input files */
4296 if (nb_input_files) {
4298 for (j = 0; j < nb_input_files; j++) {
4299 for (i = 0; i < input_files[j].nb_streams; i++) {
4300 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4301 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
4303 fr = c->time_base.den * 1000 / c->time_base.num;
4307 } else if ((fr == 29970) || (fr == 23976)) {
4312 if (norm != UNKNOWN)
4316 if (norm != UNKNOWN)
4317 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4320 if (norm == UNKNOWN) {
4321 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4322 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4323 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
4327 if (!strcmp(arg, "vcd")) {
4328 opt_video_codec(o, "c:v", "mpeg1video");
4329 opt_audio_codec(o, "c:a", "mp2");
4330 parse_option(o, "f", "vcd", options);
4332 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
4333 parse_option(o, "r", frame_rates[norm], options);
4334 opt_default("g", norm == PAL ? "15" : "18");
4336 opt_default("b", "1150000");
4337 opt_default("maxrate", "1150000");
4338 opt_default("minrate", "1150000");
4339 opt_default("bufsize", "327680"); // 40*1024*8;
4341 opt_default("b:a", "224000");
4342 parse_option(o, "ar", "44100", options);
4343 parse_option(o, "ac", "2", options);
4345 opt_default("packetsize", "2324");
4346 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4348 /* We have to offset the PTS, so that it is consistent with the SCR.
4349 SCR starts at 36000, but the first two packs contain only padding
4350 and the first pack from the other stream, respectively, may also have
4351 been written before.
4352 So the real data starts at SCR 36000+3*1200. */
4353 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
4354 } else if (!strcmp(arg, "svcd")) {
4356 opt_video_codec(o, "c:v", "mpeg2video");
4357 opt_audio_codec(o, "c:a", "mp2");
4358 parse_option(o, "f", "svcd", options);
4360 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
4361 parse_option(o, "r", frame_rates[norm], options);
4362 opt_default("g", norm == PAL ? "15" : "18");
4364 opt_default("b", "2040000");
4365 opt_default("maxrate", "2516000");
4366 opt_default("minrate", "0"); // 1145000;
4367 opt_default("bufsize", "1835008"); // 224*1024*8;
4368 opt_default("flags", "+scan_offset");
4371 opt_default("b:a", "224000");
4372 parse_option(o, "ar", "44100", options);
4374 opt_default("packetsize", "2324");
4376 } else if (!strcmp(arg, "dvd")) {
4378 opt_video_codec(o, "c:v", "mpeg2video");
4379 opt_audio_codec(o, "c:a", "ac3");
4380 parse_option(o, "f", "dvd", options);
4382 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4383 parse_option(o, "r", frame_rates[norm], options);
4384 opt_default("g", norm == PAL ? "15" : "18");
4386 opt_default("b", "6000000");
4387 opt_default("maxrate", "9000000");
4388 opt_default("minrate", "0"); // 1500000;
4389 opt_default("bufsize", "1835008"); // 224*1024*8;
4391 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4392 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4394 opt_default("b:a", "448000");
4395 parse_option(o, "ar", "48000", options);
4397 } else if (!strncmp(arg, "dv", 2)) {
4399 parse_option(o, "f", "dv", options);
4401 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4402 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4403 norm == PAL ? "yuv420p" : "yuv411p", options);
4404 parse_option(o, "r", frame_rates[norm], options);
4406 parse_option(o, "ar", "48000", options);
4407 parse_option(o, "ac", "2", options);
4410 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
4411 return AVERROR(EINVAL);
4416 static int opt_vstats_file(const char *opt, const char *arg)
4418 av_free (vstats_filename);
4419 vstats_filename = av_strdup (arg);
4423 static int opt_vstats(const char *opt, const char *arg)
4426 time_t today2 = time(NULL);
4427 struct tm *today = localtime(&today2);
4429 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4431 return opt_vstats_file(opt, filename);
4434 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4436 return parse_option(o, "frames:v", arg, options);
4439 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4441 return parse_option(o, "frames:a", arg, options);
4444 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4446 return parse_option(o, "frames:d", arg, options);
4449 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4453 static int opt_passlogfile(const char *opt, const char *arg)
4455 pass_logfilename_prefix = arg;
4456 #if CONFIG_LIBX264_ENCODER
4457 return opt_default("passlogfile", arg);
4463 static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg)
4465 return parse_option(o, "tag:v", arg, options);
4468 static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg)
4470 return parse_option(o, "tag:a", arg, options);
4473 static int opt_subtitle_tag(OptionsContext *o, const char *opt, const char *arg)
4475 return parse_option(o, "tag:s", arg, options);
4478 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4480 return parse_option(o, "filter:v", arg, options);
4483 static int opt_vsync(const char *opt, const char *arg)
4485 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
4486 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
4487 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
4489 if (video_sync_method == VSYNC_AUTO)
4490 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
4494 #define OFFSET(x) offsetof(OptionsContext, x)
4495 static const OptionDef options[] = {
4497 #include "cmdutils_common_opts.h"
4498 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4499 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4500 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4501 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
4502 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4503 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4504 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
4505 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
4506 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
4507 "outfile[,metadata]:infile[,metadata]" },
4508 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4509 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4510 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4511 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4512 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4513 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4514 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4515 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4516 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4517 "add timings for benchmarking" },
4518 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4519 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4520 "dump each input packet" },
4521 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4522 "when dumping packets, also dump the payload" },
4523 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4524 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4525 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
4526 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4527 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4528 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4529 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4530 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4531 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4532 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4533 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
4534 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4535 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4536 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4537 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4539 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4541 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
4542 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
4543 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
4546 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4547 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4548 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4549 { "aspect", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_aspect_ratios)}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4550 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4551 { "bits_per_raw_sample", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&frame_bits_per_raw_sample}, "set the number of bits per raw sample", "number" },
4552 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4553 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4554 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4555 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4556 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4557 "use same quantizer as source (implies VBR)" },
4558 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4559 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4560 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4561 "deinterlace pictures" },
4562 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4563 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4565 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
4567 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
4568 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
4569 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
4570 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4571 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4572 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4573 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
4574 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4575 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(forced_key_frames)}, "force key frames at specified timestamps", "timestamps" },
4578 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4579 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
4580 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
4581 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
4582 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
4583 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4584 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4585 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4586 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
4588 /* subtitle options */
4589 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
4590 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4591 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4594 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4597 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4598 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4600 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4602 /* data codec support */
4603 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4605 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4609 int main(int argc, char **argv)
4611 OptionsContext o = { 0 };
4616 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4617 parse_loglevel(argc, argv, options);
4619 if(argc>1 && !strcmp(argv[1], "-d")){
4621 av_log_set_callback(log_callback_null);
4626 avcodec_register_all();
4628 avdevice_register_all();
4631 avfilter_register_all();
4634 avformat_network_init();
4636 show_banner(argc, argv, options);
4639 parse_options(&o, argc, argv, options, opt_output_file);
4641 if (nb_output_files <= 0 && nb_input_files == 0) {
4643 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4647 /* file converter / grab */
4648 if (nb_output_files <= 0) {
4649 fprintf(stderr, "At least one output file must be specified\n");
4653 if (nb_input_files == 0) {
4654 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
4659 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4661 ti = getutime() - ti;
4663 int maxrss = getmaxrss() / 1024;
4664 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);