avconv: add a wrapper for output AVFormatContexts and merge output_opts into it
[libav.git] / avconv.c
CommitLineData
6291d7e4
AK
1/*
2 * avconv main
3 * Copyright (c) 2000-2011 The libav developers.
4 *
5 * This file is part of Libav.
6 *
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#include "config.h"
23#include <ctype.h>
24#include <string.h>
25#include <math.h>
26#include <stdlib.h>
27#include <errno.h>
28#include <signal.h>
29#include <limits.h>
30#include <unistd.h>
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 "libavformat/os_support.h"
48
49#if CONFIG_AVFILTER
50# include "libavfilter/avfilter.h"
51# include "libavfilter/avfiltergraph.h"
52# include "libavfilter/vsrc_buffer.h"
53#endif
54
55#if HAVE_SYS_RESOURCE_H
56#include <sys/types.h>
57#include <sys/time.h>
58#include <sys/resource.h>
59#elif HAVE_GETPROCESSTIMES
60#include <windows.h>
61#endif
62#if HAVE_GETPROCESSMEMORYINFO
63#include <windows.h>
64#include <psapi.h>
65#endif
66
67#if HAVE_SYS_SELECT_H
68#include <sys/select.h>
69#endif
70
71#include <time.h>
72
73#include "cmdutils.h"
74
75#include "libavutil/avassert.h"
76
77const char program_name[] = "avconv";
78const int program_birth_year = 2000;
79
80/* select an input stream for an output stream */
81typedef struct StreamMap {
8d2e4a7e 82 int disabled; /** 1 is this mapping is disabled by a negative map */
6291d7e4
AK
83 int file_index;
84 int stream_index;
85 int sync_file_index;
86 int sync_stream_index;
87} StreamMap;
88
89/**
90 * select an input file for an output file
91 */
92typedef struct MetadataMap {
93 int file; //< file index
94 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
95 int index; //< stream/chapter/program number
96} MetadataMap;
97
6291d7e4
AK
98static const OptionDef options[];
99
100#define MAX_FILES 100
101
102static const char *last_asked_format = NULL;
09af7fb3 103static AVDictionary *ts_scale;
6291d7e4 104
6291d7e4
AK
105static StreamMap *stream_maps = NULL;
106static int nb_stream_maps;
107
92f1940e
AK
108static AVDictionary *codec_names;
109
6291d7e4
AK
110/* first item specifies output metadata, second is input */
111static MetadataMap (*meta_data_maps)[2] = NULL;
112static int nb_meta_data_maps;
113static int metadata_global_autocopy = 1;
114static int metadata_streams_autocopy = 1;
115static int metadata_chapters_autocopy = 1;
116
b9aac90b 117static int chapters_input_file = INT_MAX;
6291d7e4
AK
118
119/* indexed by output file stream index */
120static int *streamid_map = NULL;
121static int nb_streamid_map = 0;
122
123static int frame_width = 0;
124static int frame_height = 0;
125static float frame_aspect_ratio = 0;
126static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
127static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
128static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
129static AVRational frame_rate;
130static float video_qscale = 0;
131static uint16_t *intra_matrix = NULL;
132static uint16_t *inter_matrix = NULL;
133static const char *video_rc_override_string=NULL;
134static int video_disable = 0;
135static int video_discard = 0;
6291d7e4
AK
136static unsigned int video_codec_tag = 0;
137static char *video_language = NULL;
f4ad238c 138static int same_quant = 0;
6291d7e4
AK
139static int do_deinterlace = 0;
140static int top_field_first = -1;
141static int me_threshold = 0;
142static int intra_dc_precision = 8;
6291d7e4
AK
143static int qp_hist = 0;
144#if CONFIG_AVFILTER
145static char *vfilters = NULL;
146#endif
147
148static int intra_only = 0;
149static int audio_sample_rate = 0;
150#define QSCALE_NONE -99999
151static float audio_qscale = QSCALE_NONE;
152static int audio_disable = 0;
153static int audio_channels = 0;
6291d7e4
AK
154static unsigned int audio_codec_tag = 0;
155static char *audio_language = NULL;
156
157static int subtitle_disable = 0;
6291d7e4
AK
158static char *subtitle_language = NULL;
159static unsigned int subtitle_codec_tag = 0;
160
161static int data_disable = 0;
6291d7e4
AK
162static unsigned int data_codec_tag = 0;
163
164static float mux_preload= 0.5;
165static float mux_max_delay= 0.7;
166
167static int64_t recording_time = INT64_MAX;
168static int64_t start_time = 0;
169static int64_t input_ts_offset = 0;
170static int file_overwrite = 0;
171static AVDictionary *metadata;
172static int do_benchmark = 0;
173static int do_hex_dump = 0;
174static int do_pkt_dump = 0;
175static int do_psnr = 0;
176static int do_pass = 0;
177static char *pass_logfilename_prefix = NULL;
6291d7e4
AK
178static int video_sync_method= -1;
179static int audio_sync_method= 0;
180static float audio_drift_threshold= 0.1;
181static int copy_ts= 0;
182static int copy_tb;
183static int opt_shortest = 0;
184static char *vstats_filename;
185static FILE *vstats_file;
186static int opt_programid = 0;
187static int copy_initial_nonkeyframes = 0;
188
189static int rate_emu = 0;
190
191static int audio_volume = 256;
192
193static int exit_on_error = 0;
194static int using_stdin = 0;
195static int verbose = 1;
196static int thread_count= 1;
197static int64_t video_size = 0;
198static int64_t audio_size = 0;
199static int64_t extra_size = 0;
200static int nb_frames_dup = 0;
201static int nb_frames_drop = 0;
202static int input_sync;
203static uint64_t limit_filesize = 0;
204static int force_fps = 0;
205static char *forced_key_frames = NULL;
206
207static float dts_delta_threshold = 10;
208
209static int64_t timer_start;
210
211static uint8_t *audio_buf;
212static uint8_t *audio_out;
213static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
214
215static short *samples;
216
217static AVBitStreamFilterContext *video_bitstream_filters=NULL;
218static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
219static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
220
221#define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
222
223struct InputStream;
224
225typedef struct OutputStream {
226 int file_index; /* file index */
227 int index; /* stream index in the output file */
228 int source_index; /* InputStream index */
229 AVStream *st; /* stream in the output file */
230 int encoding_needed; /* true if encoding needed for this stream */
231 int frame_number;
232 /* input pts and corresponding output pts
233 for A/V sync */
234 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
235 struct InputStream *sync_ist; /* input stream to sync against */
236 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
237 AVBitStreamFilterContext *bitstream_filters;
238 AVCodec *enc;
239
240 /* video only */
241 int video_resample;
242 AVFrame pict_tmp; /* temporary image for resampling */
243 struct SwsContext *img_resample_ctx; /* for image resampling */
244 int resample_height;
245 int resample_width;
246 int resample_pix_fmt;
247 AVRational frame_rate;
248
249 float frame_aspect_ratio;
250
251 /* forced key frames */
252 int64_t *forced_kf_pts;
253 int forced_kf_count;
254 int forced_kf_index;
255
256 /* audio only */
257 int audio_resample;
258 ReSampleContext *resample; /* for audio resampling */
259 int resample_sample_fmt;
260 int resample_channels;
261 int resample_sample_rate;
262 int reformat_pair;
263 AVAudioConvert *reformat_ctx;
264 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
265 FILE *logfile;
266
267#if CONFIG_AVFILTER
268 AVFilterContext *output_video_filter;
269 AVFilterContext *input_video_filter;
270 AVFilterBufferRef *picref;
271 char *avfilter;
272 AVFilterGraph *graph;
273#endif
274
275 int sws_flags;
276 AVDictionary *opts;
277} OutputStream;
278
279static OutputStream **output_streams_for_file[MAX_FILES] = { NULL };
280static int nb_output_streams_for_file[MAX_FILES] = { 0 };
281
282typedef struct InputStream {
283 int file_index;
284 AVStream *st;
285 int discard; /* true if stream data should be discarded */
286 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
287 AVCodec *dec;
288
289 int64_t start; /* time when read started */
290 int64_t next_pts; /* synthetic pts for cases where pkt.pts
291 is not defined */
292 int64_t pts; /* current pts */
293 PtsCorrectionContext pts_ctx;
294 double ts_scale;
295 int is_start; /* is 1 at the start and after a discontinuity */
296 int showed_multi_packet_warning;
297 int is_past_recording_time;
298 AVDictionary *opts;
299} InputStream;
300
301typedef struct InputFile {
302 AVFormatContext *ctx;
303 int eof_reached; /* true if eof reached */
304 int ist_index; /* index of first stream in ist_table */
305 int buffer_size; /* current total buffer size */
306 int64_t ts_offset;
307} InputFile;
308
af70aa45
AK
309typedef struct OutputFile {
310 AVFormatContext *ctx;
311 AVDictionary *opts;
312} OutputFile;
313
6291d7e4
AK
314static InputStream *input_streams = NULL;
315static int nb_input_streams = 0;
316static InputFile *input_files = NULL;
317static int nb_input_files = 0;
318
af70aa45
AK
319static OutputFile *output_files = NULL;
320static int nb_output_files = 0;
321
6291d7e4
AK
322#if CONFIG_AVFILTER
323
324static int configure_video_filters(InputStream *ist, OutputStream *ost)
325{
326 AVFilterContext *last_filter, *filter;
327 /** filter graph containing all filters including input & output */
328 AVCodecContext *codec = ost->st->codec;
329 AVCodecContext *icodec = ist->st->codec;
330 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
331 AVRational sample_aspect_ratio;
332 char args[255];
333 int ret;
334
335 ost->graph = avfilter_graph_alloc();
336
337 if (ist->st->sample_aspect_ratio.num){
338 sample_aspect_ratio = ist->st->sample_aspect_ratio;
339 }else
340 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
341
342 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
343 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
344 sample_aspect_ratio.num, sample_aspect_ratio.den);
345
346 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
347 "src", args, NULL, ost->graph);
348 if (ret < 0)
349 return ret;
350 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
351 "out", NULL, &ffsink_ctx, ost->graph);
352 if (ret < 0)
353 return ret;
354 last_filter = ost->input_video_filter;
355
356 if (codec->width != icodec->width || codec->height != icodec->height) {
357 snprintf(args, 255, "%d:%d:flags=0x%X",
358 codec->width,
359 codec->height,
360 ost->sws_flags);
361 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
362 NULL, args, NULL, ost->graph)) < 0)
363 return ret;
364 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
365 return ret;
366 last_filter = filter;
367 }
368
369 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
370 ost->graph->scale_sws_opts = av_strdup(args);
371
372 if (ost->avfilter) {
373 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
374 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
375
376 outputs->name = av_strdup("in");
377 outputs->filter_ctx = last_filter;
378 outputs->pad_idx = 0;
379 outputs->next = NULL;
380
381 inputs->name = av_strdup("out");
382 inputs->filter_ctx = ost->output_video_filter;
383 inputs->pad_idx = 0;
384 inputs->next = NULL;
385
386 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
387 return ret;
388 av_freep(&ost->avfilter);
389 } else {
390 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
391 return ret;
392 }
393
394 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
395 return ret;
396
397 codec->width = ost->output_video_filter->inputs[0]->w;
398 codec->height = ost->output_video_filter->inputs[0]->h;
399 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
400 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
401 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
402 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
403
404 return 0;
405}
406#endif /* CONFIG_AVFILTER */
407
408static void term_exit(void)
409{
410 av_log(NULL, AV_LOG_QUIET, "");
411}
412
413static volatile int received_sigterm = 0;
414static volatile int received_nb_signals = 0;
415
416static void
417sigterm_handler(int sig)
418{
419 received_sigterm = sig;
420 received_nb_signals++;
421 term_exit();
422}
423
424static void term_init(void)
425{
426 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
427 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
428#ifdef SIGXCPU
429 signal(SIGXCPU, sigterm_handler);
430#endif
431}
432
433static int decode_interrupt_cb(void)
434{
435 return received_nb_signals > 1;
436}
437
438static int exit_program(int ret)
439{
440 int i;
441
442 /* close files */
443 for(i=0;i<nb_output_files;i++) {
af70aa45 444 AVFormatContext *s = output_files[i].ctx;
6291d7e4
AK
445 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
446 avio_close(s->pb);
447 avformat_free_context(s);
448 av_free(output_streams_for_file[i]);
af70aa45 449 av_dict_free(&output_files[i].opts);
6291d7e4
AK
450 }
451 for(i=0;i<nb_input_files;i++) {
452 av_close_input_file(input_files[i].ctx);
453 }
454 for (i = 0; i < nb_input_streams; i++)
455 av_dict_free(&input_streams[i].opts);
456
457 av_free(intra_matrix);
458 av_free(inter_matrix);
459
460 if (vstats_file)
461 fclose(vstats_file);
462 av_free(vstats_filename);
463
464 av_free(streamid_map);
6291d7e4
AK
465 av_free(meta_data_maps);
466
467 av_freep(&input_streams);
468 av_freep(&input_files);
af70aa45 469 av_freep(&output_files);
6291d7e4 470
6291d7e4
AK
471 uninit_opts();
472 av_free(audio_buf);
473 av_free(audio_out);
474 allocated_audio_buf_size= allocated_audio_out_size= 0;
475 av_free(samples);
476
477#if CONFIG_AVFILTER
478 avfilter_uninit();
479#endif
480
481 if (received_sigterm) {
482 fprintf(stderr,
483 "Received signal %d: terminating.\n",
484 (int) received_sigterm);
485 exit (255);
486 }
487
488 exit(ret); /* not all OS-es handle main() return value */
489 return ret;
490}
491
492static void assert_avoptions(AVDictionary *m)
493{
494 AVDictionaryEntry *t;
495 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
496 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
497 exit_program(1);
498 }
499}
500
501static void assert_codec_experimental(AVCodecContext *c, int encoder)
502{
503 const char *codec_string = encoder ? "encoder" : "decoder";
504 AVCodec *codec;
505 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
506 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
507 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
508 "results.\nAdd '-strict experimental' if you want to use it.\n",
509 codec_string, c->codec->name);
510 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
511 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
512 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
513 codec_string, codec->name);
514 exit_program(1);
515 }
516}
517
518/* similar to ff_dynarray_add() and av_fast_realloc() */
519static void *grow_array(void *array, int elem_size, int *size, int new_size)
520{
521 if (new_size >= INT_MAX / elem_size) {
522 fprintf(stderr, "Array too big.\n");
523 exit_program(1);
524 }
525 if (*size < new_size) {
526 uint8_t *tmp = av_realloc(array, new_size*elem_size);
527 if (!tmp) {
528 fprintf(stderr, "Could not alloc buffer.\n");
529 exit_program(1);
530 }
531 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
532 *size = new_size;
533 return tmp;
534 }
535 return array;
536}
537
538static void choose_sample_fmt(AVStream *st, AVCodec *codec)
539{
540 if(codec && codec->sample_fmts){
541 const enum AVSampleFormat *p= codec->sample_fmts;
542 for(; *p!=-1; p++){
543 if(*p == st->codec->sample_fmt)
544 break;
545 }
546 if (*p == -1) {
547 av_log(NULL, AV_LOG_WARNING,
548 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
549 av_get_sample_fmt_name(st->codec->sample_fmt),
550 codec->name,
551 av_get_sample_fmt_name(codec->sample_fmts[0]));
552 st->codec->sample_fmt = codec->sample_fmts[0];
553 }
554 }
555}
556
557/**
558 * Update the requested input sample format based on the output sample format.
559 * This is currently only used to request float output from decoders which
560 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
561 * Ideally this will be removed in the future when decoders do not do format
562 * conversion and only output in their native format.
563 */
564static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
565 AVCodecContext *enc)
566{
567 /* if sample formats match or a decoder sample format has already been
568 requested, just return */
569 if (enc->sample_fmt == dec->sample_fmt ||
570 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
571 return;
572
573 /* if decoder supports more than one output format */
574 if (dec_codec && dec_codec->sample_fmts &&
575 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
576 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
577 const enum AVSampleFormat *p;
578 int min_dec = -1, min_inc = -1;
579
580 /* find a matching sample format in the encoder */
581 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
582 if (*p == enc->sample_fmt) {
583 dec->request_sample_fmt = *p;
584 return;
585 } else if (*p > enc->sample_fmt) {
586 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
587 } else
588 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
589 }
590
591 /* if none match, provide the one that matches quality closest */
592 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
593 enc->sample_fmt - min_dec;
594 }
595}
596
597static void choose_sample_rate(AVStream *st, AVCodec *codec)
598{
599 if(codec && codec->supported_samplerates){
600 const int *p= codec->supported_samplerates;
601 int best=0;
602 int best_dist=INT_MAX;
603 for(; *p; p++){
604 int dist= abs(st->codec->sample_rate - *p);
605 if(dist < best_dist){
606 best_dist= dist;
607 best= *p;
608 }
609 }
610 if(best_dist){
611 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
612 }
613 st->codec->sample_rate= best;
614 }
615}
616
617static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
618{
619 if(codec && codec->pix_fmts){
620 const enum PixelFormat *p= codec->pix_fmts;
621 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
622 if(st->codec->codec_id==CODEC_ID_MJPEG){
623 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
624 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
625 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE};
626 }
627 }
628 for(; *p!=-1; p++){
629 if(*p == st->codec->pix_fmt)
630 break;
631 }
632 if (*p == -1) {
633 if(st->codec->pix_fmt != PIX_FMT_NONE)
634 av_log(NULL, AV_LOG_WARNING,
635 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
636 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
637 codec->name,
638 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
639 st->codec->pix_fmt = codec->pix_fmts[0];
640 }
641 }
642}
643
6291d7e4
AK
644static double
645get_sync_ipts(const OutputStream *ost)
646{
647 const InputStream *ist = ost->sync_ist;
648 return (double)(ist->pts - start_time)/AV_TIME_BASE;
649}
650
651static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
652 int ret;
653
654 while(bsfc){
655 AVPacket new_pkt= *pkt;
656 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
657 &new_pkt.data, &new_pkt.size,
658 pkt->data, pkt->size,
659 pkt->flags & AV_PKT_FLAG_KEY);
660 if(a>0){
661 av_free_packet(pkt);
662 new_pkt.destruct= av_destruct_packet;
663 } else if(a<0){
664 fprintf(stderr, "%s failed for stream %d, codec %s",
665 bsfc->filter->name, pkt->stream_index,
666 avctx->codec ? avctx->codec->name : "copy");
667 print_error("", a);
668 if (exit_on_error)
669 exit_program(1);
670 }
671 *pkt= new_pkt;
672
673 bsfc= bsfc->next;
674 }
675
676 ret= av_interleaved_write_frame(s, pkt);
677 if(ret < 0){
678 print_error("av_interleaved_write_frame()", ret);
679 exit_program(1);
680 }
681}
682
683#define MAX_AUDIO_PACKET_SIZE (128 * 1024)
684
685static void do_audio_out(AVFormatContext *s,
686 OutputStream *ost,
687 InputStream *ist,
688 unsigned char *buf, int size)
689{
690 uint8_t *buftmp;
691 int64_t audio_out_size, audio_buf_size;
692 int64_t allocated_for_size= size;
693
694 int size_out, frame_bytes, ret, resample_changed;
695 AVCodecContext *enc= ost->st->codec;
696 AVCodecContext *dec= ist->st->codec;
697 int osize = av_get_bytes_per_sample(enc->sample_fmt);
698 int isize = av_get_bytes_per_sample(dec->sample_fmt);
699 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
700
701need_realloc:
702 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
703 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
704 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
705 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
706 audio_buf_size*= osize*enc->channels;
707
708 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
709 if(coded_bps > 8*osize)
710 audio_out_size= audio_out_size * coded_bps / (8*osize);
711 audio_out_size += FF_MIN_BUFFER_SIZE;
712
713 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
714 fprintf(stderr, "Buffer sizes too large\n");
715 exit_program(1);
716 }
717
718 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
719 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
720 if (!audio_buf || !audio_out){
721 fprintf(stderr, "Out of memory in do_audio_out\n");
722 exit_program(1);
723 }
724
725 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
726 ost->audio_resample = 1;
727
728 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
729 ost->resample_channels != dec->channels ||
730 ost->resample_sample_rate != dec->sample_rate;
731
732 if ((ost->audio_resample && !ost->resample) || resample_changed) {
733 if (resample_changed) {
734 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",
735 ist->file_index, ist->st->index,
736 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
737 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
738 ost->resample_sample_fmt = dec->sample_fmt;
739 ost->resample_channels = dec->channels;
740 ost->resample_sample_rate = dec->sample_rate;
741 if (ost->resample)
742 audio_resample_close(ost->resample);
743 }
744 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
745 if (audio_sync_method <= 1 &&
746 ost->resample_sample_fmt == enc->sample_fmt &&
747 ost->resample_channels == enc->channels &&
748 ost->resample_sample_rate == enc->sample_rate) {
749 ost->resample = NULL;
750 ost->audio_resample = 0;
751 } else if (ost->audio_resample) {
752 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
753 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
754 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
755 enc->sample_rate, dec->sample_rate,
756 enc->sample_fmt, dec->sample_fmt,
757 16, 10, 0, 0.8);
758 if (!ost->resample) {
759 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
760 dec->channels, dec->sample_rate,
761 enc->channels, enc->sample_rate);
762 exit_program(1);
763 }
764 }
765 }
766
767#define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
768 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
769 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
770 if (ost->reformat_ctx)
771 av_audio_convert_free(ost->reformat_ctx);
772 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
773 dec->sample_fmt, 1, NULL, 0);
774 if (!ost->reformat_ctx) {
775 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
776 av_get_sample_fmt_name(dec->sample_fmt),
777 av_get_sample_fmt_name(enc->sample_fmt));
778 exit_program(1);
779 }
780 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
781 }
782
783 if(audio_sync_method){
784 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
785 - av_fifo_size(ost->fifo)/(enc->channels * 2);
786 double idelta= delta*dec->sample_rate / enc->sample_rate;
787 int byte_delta= ((int)idelta)*2*dec->channels;
788
789 //FIXME resample delay
790 if(fabs(delta) > 50){
791 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
792 if(byte_delta < 0){
793 byte_delta= FFMAX(byte_delta, -size);
794 size += byte_delta;
795 buf -= byte_delta;
796 if(verbose > 2)
797 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
798 if(!size)
799 return;
800 ist->is_start=0;
801 }else{
802 static uint8_t *input_tmp= NULL;
803 input_tmp= av_realloc(input_tmp, byte_delta + size);
804
805 if(byte_delta > allocated_for_size - size){
806 allocated_for_size= byte_delta + (int64_t)size;
807 goto need_realloc;
808 }
809 ist->is_start=0;
810
811 memset(input_tmp, 0, byte_delta);
812 memcpy(input_tmp + byte_delta, buf, size);
813 buf= input_tmp;
814 size += byte_delta;
815 if(verbose > 2)
816 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
817 }
818 }else if(audio_sync_method>1){
819 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
820 av_assert0(ost->audio_resample);
821 if(verbose > 2)
822 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
823// 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));
824 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
825 }
826 }
827 }else
828 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
829 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
830
831 if (ost->audio_resample) {
832 buftmp = audio_buf;
833 size_out = audio_resample(ost->resample,
834 (short *)buftmp, (short *)buf,
835 size / (dec->channels * isize));
836 size_out = size_out * enc->channels * osize;
837 } else {
838 buftmp = buf;
839 size_out = size;
840 }
841
842 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
843 const void *ibuf[6]= {buftmp};
844 void *obuf[6]= {audio_buf};
845 int istride[6]= {isize};
846 int ostride[6]= {osize};
847 int len= size_out/istride[0];
848 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
849 printf("av_audio_convert() failed\n");
850 if (exit_on_error)
851 exit_program(1);
852 return;
853 }
854 buftmp = audio_buf;
855 size_out = len*osize;
856 }
857
858 /* now encode as many frames as possible */
859 if (enc->frame_size > 1) {
860 /* output resampled raw samples */
861 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
862 fprintf(stderr, "av_fifo_realloc2() failed\n");
863 exit_program(1);
864 }
865 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
866
867 frame_bytes = enc->frame_size * osize * enc->channels;
868
869 while (av_fifo_size(ost->fifo) >= frame_bytes) {
870 AVPacket pkt;
871 av_init_packet(&pkt);
872
873 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
874
875 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
876
877 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
878 (short *)audio_buf);
879 if (ret < 0) {
880 fprintf(stderr, "Audio encoding failed\n");
881 exit_program(1);
882 }
883 audio_size += ret;
884 pkt.stream_index= ost->index;
885 pkt.data= audio_out;
886 pkt.size= ret;
887 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
888 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
889 pkt.flags |= AV_PKT_FLAG_KEY;
890 write_frame(s, &pkt, enc, ost->bitstream_filters);
891
892 ost->sync_opts += enc->frame_size;
893 }
894 } else {
895 AVPacket pkt;
896 av_init_packet(&pkt);
897
898 ost->sync_opts += size_out / (osize * enc->channels);
899
900 /* output a pcm frame */
901 /* determine the size of the coded buffer */
902 size_out /= osize;
903 if (coded_bps)
904 size_out = size_out*coded_bps/8;
905
906 if(size_out > audio_out_size){
907 fprintf(stderr, "Internal error, buffer size too small\n");
908 exit_program(1);
909 }
910
911 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
912 ret = avcodec_encode_audio(enc, audio_out, size_out,
913 (short *)buftmp);
914 if (ret < 0) {
915 fprintf(stderr, "Audio encoding failed\n");
916 exit_program(1);
917 }
918 audio_size += ret;
919 pkt.stream_index= ost->index;
920 pkt.data= audio_out;
921 pkt.size= ret;
922 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
923 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
924 pkt.flags |= AV_PKT_FLAG_KEY;
925 write_frame(s, &pkt, enc, ost->bitstream_filters);
926 }
927}
928
929static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
930{
931 AVCodecContext *dec;
932 AVPicture *picture2;
933 AVPicture picture_tmp;
934 uint8_t *buf = 0;
935
936 dec = ist->st->codec;
937
938 /* deinterlace : must be done before any resize */
939 if (do_deinterlace) {
940 int size;
941
942 /* create temporary picture */
943 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
944 buf = av_malloc(size);
945 if (!buf)
946 return;
947
948 picture2 = &picture_tmp;
949 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
950
951 if(avpicture_deinterlace(picture2, picture,
952 dec->pix_fmt, dec->width, dec->height) < 0) {
953 /* if error, do not deinterlace */
954 fprintf(stderr, "Deinterlacing failed\n");
955 av_free(buf);
956 buf = NULL;
957 picture2 = picture;
958 }
959 } else {
960 picture2 = picture;
961 }
962
963 if (picture != picture2)
964 *picture = *picture2;
965 *bufp = buf;
966}
967
968/* we begin to correct av delay at this threshold */
969#define AV_DELAY_MAX 0.100
970
971static void do_subtitle_out(AVFormatContext *s,
972 OutputStream *ost,
973 InputStream *ist,
974 AVSubtitle *sub,
975 int64_t pts)
976{
977 static uint8_t *subtitle_out = NULL;
978 int subtitle_out_max_size = 1024 * 1024;
979 int subtitle_out_size, nb, i;
980 AVCodecContext *enc;
981 AVPacket pkt;
982
983 if (pts == AV_NOPTS_VALUE) {
984 fprintf(stderr, "Subtitle packets must have a pts\n");
985 if (exit_on_error)
986 exit_program(1);
987 return;
988 }
989
990 enc = ost->st->codec;
991
992 if (!subtitle_out) {
993 subtitle_out = av_malloc(subtitle_out_max_size);
994 }
995
996 /* Note: DVB subtitle need one packet to draw them and one other
997 packet to clear them */
998 /* XXX: signal it in the codec context ? */
999 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1000 nb = 2;
1001 else
1002 nb = 1;
1003
1004 for(i = 0; i < nb; i++) {
1005 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1006 // start_display_time is required to be 0
1007 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1008 sub->end_display_time -= sub->start_display_time;
1009 sub->start_display_time = 0;
1010 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1011 subtitle_out_max_size, sub);
1012 if (subtitle_out_size < 0) {
1013 fprintf(stderr, "Subtitle encoding failed\n");
1014 exit_program(1);
1015 }
1016
1017 av_init_packet(&pkt);
1018 pkt.stream_index = ost->index;
1019 pkt.data = subtitle_out;
1020 pkt.size = subtitle_out_size;
1021 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1022 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1023 /* XXX: the pts correction is handled here. Maybe handling
1024 it in the codec would be better */
1025 if (i == 0)
1026 pkt.pts += 90 * sub->start_display_time;
1027 else
1028 pkt.pts += 90 * sub->end_display_time;
1029 }
1030 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1031 }
1032}
1033
1034static int bit_buffer_size= 1024*256;
1035static uint8_t *bit_buffer= NULL;
1036
87ef060c
AC
1037static void do_video_resample(OutputStream *ost,
1038 InputStream *ist,
1039 AVFrame *in_picture,
1040 AVFrame **out_picture)
6291d7e4 1041{
87ef060c
AC
1042 int resample_changed = 0;
1043 AVCodecContext *dec = ist->st->codec;
1044 *out_picture = in_picture;
6291d7e4
AK
1045
1046 resample_changed = ost->resample_width != dec->width ||
1047 ost->resample_height != dec->height ||
1048 ost->resample_pix_fmt != dec->pix_fmt;
1049
1050 if (resample_changed) {
1051 av_log(NULL, AV_LOG_INFO,
1052 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1053 ist->file_index, ist->st->index,
1054 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1055 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1056 if(!ost->video_resample)
5c59fa56 1057 ost->video_resample = 1;
6291d7e4
AK
1058 }
1059
1060#if !CONFIG_AVFILTER
1061 if (ost->video_resample) {
87ef060c 1062 *out_picture = &ost->pict_tmp;
6291d7e4
AK
1063 if (resample_changed) {
1064 /* initialize a new scaler context */
1065 sws_freeContext(ost->img_resample_ctx);
1066 ost->img_resample_ctx = sws_getContext(
1067 ist->st->codec->width,
1068 ist->st->codec->height,
1069 ist->st->codec->pix_fmt,
1070 ost->st->codec->width,
1071 ost->st->codec->height,
1072 ost->st->codec->pix_fmt,
1073 ost->sws_flags, NULL, NULL, NULL);
1074 if (ost->img_resample_ctx == NULL) {
1075 fprintf(stderr, "Cannot get resampling context\n");
1076 exit_program(1);
1077 }
1078 }
87ef060c
AC
1079 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1080 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
6291d7e4 1081 }
428c59d9
K
1082#else
1083 if (resample_changed) {
1084 avfilter_graph_free(&ost->graph);
1085 if (configure_video_filters(ist, ost)) {
1086 fprintf(stderr, "Error reinitialising filters!\n");
1087 exit_program(1);
1088 }
1089 }
6291d7e4 1090#endif
428c59d9
K
1091 if (resample_changed) {
1092 ost->resample_width = dec->width;
1093 ost->resample_height = dec->height;
1094 ost->resample_pix_fmt = dec->pix_fmt;
1095 }
87ef060c
AC
1096}
1097
1098
1099static void do_video_out(AVFormatContext *s,
1100 OutputStream *ost,
1101 InputStream *ist,
1102 AVFrame *in_picture,
1103 int *frame_size, float quality)
1104{
553735f5 1105 int nb_frames, i, ret, format_video_sync;
87ef060c
AC
1106 AVFrame *final_picture;
1107 AVCodecContext *enc, *dec;
1108 double sync_ipts;
1109
1110 enc = ost->st->codec;
1111 dec = ist->st->codec;
1112
1113 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1114
1115 /* by default, we output a single frame */
1116 nb_frames = 1;
1117
1118 *frame_size = 0;
1119
553735f5
AC
1120 format_video_sync = video_sync_method;
1121 if (format_video_sync < 0)
1122 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1123
1124 if (format_video_sync) {
87ef060c
AC
1125 double vdelta = sync_ipts - ost->sync_opts;
1126 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1127 if (vdelta < -1.1)
1128 nb_frames = 0;
553735f5 1129 else if (format_video_sync == 2) {
87ef060c
AC
1130 if(vdelta<=-0.6){
1131 nb_frames=0;
1132 }else if(vdelta>0.6)
1133 ost->sync_opts= lrintf(sync_ipts);
1134 }else if (vdelta > 1.1)
1135 nb_frames = lrintf(vdelta);
1136//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);
1137 if (nb_frames == 0){
1138 ++nb_frames_drop;
1139 if (verbose>2)
1140 fprintf(stderr, "*** drop!\n");
1141 }else if (nb_frames > 1) {
1142 nb_frames_dup += nb_frames - 1;
1143 if (verbose>2)
1144 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1145 }
1146 }else
1147 ost->sync_opts= lrintf(sync_ipts);
1148
1149 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1150 if (nb_frames <= 0)
1151 return;
1152
1153 do_video_resample(ost, ist, in_picture, &final_picture);
6291d7e4
AK
1154
1155 /* duplicates frame if needed */
1156 for(i=0;i<nb_frames;i++) {
1157 AVPacket pkt;
1158 av_init_packet(&pkt);
1159 pkt.stream_index= ost->index;
1160
1161 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1162 /* raw pictures are written as AVPicture structure to
1163 avoid any copies. We support temorarily the older
1164 method. */
1165 AVFrame* old_frame = enc->coded_frame;
1166 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1167 pkt.data= (uint8_t *)final_picture;
1168 pkt.size= sizeof(AVPicture);
1169 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1170 pkt.flags |= AV_PKT_FLAG_KEY;
1171
1172 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1173 enc->coded_frame = old_frame;
1174 } else {
1175 AVFrame big_picture;
1176
1177 big_picture= *final_picture;
1178 /* better than nothing: use input picture interlaced
1179 settings */
1180 big_picture.interlaced_frame = in_picture->interlaced_frame;
1181 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1182 if(top_field_first == -1)
1183 big_picture.top_field_first = in_picture->top_field_first;
1184 else
1185 big_picture.top_field_first = top_field_first;
1186 }
1187
f4ad238c 1188 /* handles same_quant here. This is not correct because it may
6291d7e4
AK
1189 not be a global option */
1190 big_picture.quality = quality;
1191 if(!me_threshold)
1192 big_picture.pict_type = 0;
1193// big_picture.pts = AV_NOPTS_VALUE;
1194 big_picture.pts= ost->sync_opts;
1195// big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1196//av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1197 if (ost->forced_kf_index < ost->forced_kf_count &&
1198 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1199 big_picture.pict_type = AV_PICTURE_TYPE_I;
1200 ost->forced_kf_index++;
1201 }
1202 ret = avcodec_encode_video(enc,
1203 bit_buffer, bit_buffer_size,
1204 &big_picture);
1205 if (ret < 0) {
1206 fprintf(stderr, "Video encoding failed\n");
1207 exit_program(1);
1208 }
1209
1210 if(ret>0){
1211 pkt.data= bit_buffer;
1212 pkt.size= ret;
1213 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1214 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1215/*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1216 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1217 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1218
1219 if(enc->coded_frame->key_frame)
1220 pkt.flags |= AV_PKT_FLAG_KEY;
1221 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1222 *frame_size = ret;
1223 video_size += ret;
1224 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1225 // enc->frame_number-1, ret, enc->pict_type);
1226 /* if two pass, output log */
1227 if (ost->logfile && enc->stats_out) {
1228 fprintf(ost->logfile, "%s", enc->stats_out);
1229 }
1230 }
1231 }
1232 ost->sync_opts++;
1233 ost->frame_number++;
1234 }
1235}
1236
1237static double psnr(double d){
1238 return -10.0*log(d)/log(10.0);
1239}
1240
1241static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1242 int frame_size)
1243{
1244 AVCodecContext *enc;
1245 int frame_number;
1246 double ti1, bitrate, avg_bitrate;
1247
1248 /* this is executed just the first time do_video_stats is called */
1249 if (!vstats_file) {
1250 vstats_file = fopen(vstats_filename, "w");
1251 if (!vstats_file) {
1252 perror("fopen");
1253 exit_program(1);
1254 }
1255 }
1256
1257 enc = ost->st->codec;
1258 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1259 frame_number = ost->frame_number;
1260 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1261 if (enc->flags&CODEC_FLAG_PSNR)
1262 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1263
1264 fprintf(vstats_file,"f_size= %6d ", frame_size);
1265 /* compute pts value */
1266 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1267 if (ti1 < 0.01)
1268 ti1 = 0.01;
1269
1270 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1271 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1272 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1273 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1274 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1275 }
1276}
1277
af70aa45 1278static void print_report(OutputFile *output_files,
6291d7e4
AK
1279 OutputStream **ost_table, int nb_ostreams,
1280 int is_last_report)
1281{
1282 char buf[1024];
1283 OutputStream *ost;
1284 AVFormatContext *oc;
1285 int64_t total_size;
1286 AVCodecContext *enc;
1287 int frame_number, vid, i;
1288 double bitrate, ti1, pts;
1289 static int64_t last_time = -1;
1290 static int qp_histogram[52];
1291
1292 if (!is_last_report) {
1293 int64_t cur_time;
1294 /* display the report every 0.5 seconds */
1295 cur_time = av_gettime();
1296 if (last_time == -1) {
1297 last_time = cur_time;
1298 return;
1299 }
1300 if ((cur_time - last_time) < 500000)
1301 return;
1302 last_time = cur_time;
1303 }
1304
1305
af70aa45 1306 oc = output_files[0].ctx;
6291d7e4
AK
1307
1308 total_size = avio_size(oc->pb);
1309 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1310 total_size= avio_tell(oc->pb);
1311
1312 buf[0] = '\0';
1313 ti1 = 1e10;
1314 vid = 0;
1315 for(i=0;i<nb_ostreams;i++) {
1316 float q = -1;
1317 ost = ost_table[i];
1318 enc = ost->st->codec;
1319 if (!ost->st->stream_copy && enc->coded_frame)
1320 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1321 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1322 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1323 }
1324 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1325 float t = (av_gettime()-timer_start) / 1000000.0;
1326
1327 frame_number = ost->frame_number;
1328 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1329 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1330 if(is_last_report)
1331 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1332 if(qp_hist){
1333 int j;
1334 int qp = lrintf(q);
1335 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1336 qp_histogram[qp]++;
1337 for(j=0; j<32; j++)
1338 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1339 }
1340 if (enc->flags&CODEC_FLAG_PSNR){
1341 int j;
1342 double error, error_sum=0;
1343 double scale, scale_sum=0;
1344 char type[3]= {'Y','U','V'};
1345 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1346 for(j=0; j<3; j++){
1347 if(is_last_report){
1348 error= enc->error[j];
1349 scale= enc->width*enc->height*255.0*255.0*frame_number;
1350 }else{
1351 error= enc->coded_frame->error[j];
1352 scale= enc->width*enc->height*255.0*255.0;
1353 }
1354 if(j) scale/=4;
1355 error_sum += error;
1356 scale_sum += scale;
1357 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1358 }
1359 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1360 }
1361 vid = 1;
1362 }
1363 /* compute min output value */
1364 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1365 if ((pts < ti1) && (pts > 0))
1366 ti1 = pts;
1367 }
1368 if (ti1 < 0.01)
1369 ti1 = 0.01;
1370
1371 if (verbose > 0 || is_last_report) {
1372 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1373
1374 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1375 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1376 (double)total_size / 1024, ti1, bitrate);
1377
1378 if (nb_frames_dup || nb_frames_drop)
1379 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1380 nb_frames_dup, nb_frames_drop);
1381
1382 if (verbose >= 0)
1383 fprintf(stderr, "%s \r", buf);
1384
1385 fflush(stderr);
1386 }
1387
1388 if (is_last_report && verbose >= 0){
1389 int64_t raw= audio_size + video_size + extra_size;
1390 fprintf(stderr, "\n");
1391 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1392 video_size/1024.0,
1393 audio_size/1024.0,
1394 extra_size/1024.0,
1395 100.0*(total_size - raw)/raw
1396 );
1397 }
1398}
1399
1400static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1401{
1402 int fill_char = 0x00;
1403 if (sample_fmt == AV_SAMPLE_FMT_U8)
1404 fill_char = 0x80;
1405 memset(buf, fill_char, size);
1406}
1407
1408/* pkt = NULL means EOF (needed to flush decoder buffers) */
1409static int output_packet(InputStream *ist, int ist_index,
1410 OutputStream **ost_table, int nb_ostreams,
1411 const AVPacket *pkt)
1412{
1413 AVFormatContext *os;
1414 OutputStream *ost;
1415 int ret, i;
1416 int got_output;
1417 AVFrame picture;
1418 void *buffer_to_free = NULL;
1419 static unsigned int samples_size= 0;
1420 AVSubtitle subtitle, *subtitle_to_free;
1421 int64_t pkt_pts = AV_NOPTS_VALUE;
1422#if CONFIG_AVFILTER
1423 int frame_available;
1424#endif
1425 float quality;
1426
1427 AVPacket avpkt;
1428 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1429
1430 if(ist->next_pts == AV_NOPTS_VALUE)
1431 ist->next_pts= ist->pts;
1432
1433 if (pkt == NULL) {
1434 /* EOF handling */
1435 av_init_packet(&avpkt);
1436 avpkt.data = NULL;
1437 avpkt.size = 0;
1438 goto handle_eof;
1439 } else {
1440 avpkt = *pkt;
1441 }
1442
1443 if(pkt->dts != AV_NOPTS_VALUE)
1444 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1445 if(pkt->pts != AV_NOPTS_VALUE)
1446 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1447
1448 //while we have more to decode or while the decoder did output something on EOF
1449 while (avpkt.size > 0 || (!pkt && got_output)) {
1450 uint8_t *data_buf, *decoded_data_buf;
1451 int data_size, decoded_data_size;
1452 handle_eof:
1453 ist->pts= ist->next_pts;
1454
1455 if(avpkt.size && avpkt.size != pkt->size &&
1456 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1457 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1458 ist->showed_multi_packet_warning=1;
1459 }
1460
1461 /* decode the packet if needed */
1462 decoded_data_buf = NULL; /* fail safe */
1463 decoded_data_size= 0;
1464 data_buf = avpkt.data;
1465 data_size = avpkt.size;
1466 subtitle_to_free = NULL;
1467 if (ist->decoding_needed) {
1468 switch(ist->st->codec->codec_type) {
1469 case AVMEDIA_TYPE_AUDIO:{
1470 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1471 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1472 av_free(samples);
1473 samples= av_malloc(samples_size);
1474 }
1475 decoded_data_size= samples_size;
1476 /* XXX: could avoid copy if PCM 16 bits with same
1477 endianness as CPU */
1478 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1479 &avpkt);
1480 if (ret < 0)
1481 return ret;
1482 avpkt.data += ret;
1483 avpkt.size -= ret;
1484 data_size = ret;
1485 got_output = decoded_data_size > 0;
1486 /* Some bug in mpeg audio decoder gives */
1487 /* decoded_data_size < 0, it seems they are overflows */
1488 if (!got_output) {
1489 /* no audio frame */
1490 continue;
1491 }
1492 decoded_data_buf = (uint8_t *)samples;
1493 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1494 (ist->st->codec->sample_rate * ist->st->codec->channels);
1495 break;}
1496 case AVMEDIA_TYPE_VIDEO:
1497 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1498 /* XXX: allocate picture correctly */
1499 avcodec_get_frame_defaults(&picture);
1500 avpkt.pts = pkt_pts;
1501 avpkt.dts = ist->pts;
1502 pkt_pts = AV_NOPTS_VALUE;
1503
1504 ret = avcodec_decode_video2(ist->st->codec,
1505 &picture, &got_output, &avpkt);
f4ad238c 1506 quality = same_quant ? picture.quality : 0;
6291d7e4
AK
1507 if (ret < 0)
1508 return ret;
1509 if (!got_output) {
1510 /* no picture yet */
1511 goto discard_packet;
1512 }
1513 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1514 if (ist->st->codec->time_base.num != 0) {
1515 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1516 ist->next_pts += ((int64_t)AV_TIME_BASE *
1517 ist->st->codec->time_base.num * ticks) /
1518 ist->st->codec->time_base.den;
1519 }
1520 avpkt.size = 0;
1521 buffer_to_free = NULL;
1522 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1523 break;
1524 case AVMEDIA_TYPE_SUBTITLE:
1525 ret = avcodec_decode_subtitle2(ist->st->codec,
1526 &subtitle, &got_output, &avpkt);
1527 if (ret < 0)
1528 return ret;
1529 if (!got_output) {
1530 goto discard_packet;
1531 }
1532 subtitle_to_free = &subtitle;
1533 avpkt.size = 0;
1534 break;
1535 default:
1536 return -1;
1537 }
1538 } else {
1539 switch(ist->st->codec->codec_type) {
1540 case AVMEDIA_TYPE_AUDIO:
1541 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1542 ist->st->codec->sample_rate;
1543 break;
1544 case AVMEDIA_TYPE_VIDEO:
1545 if (ist->st->codec->time_base.num != 0) {
1546 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1547 ist->next_pts += ((int64_t)AV_TIME_BASE *
1548 ist->st->codec->time_base.num * ticks) /
1549 ist->st->codec->time_base.den;
1550 }
1551 break;
1552 }
1553 ret = avpkt.size;
1554 avpkt.size = 0;
1555 }
1556
1557#if CONFIG_AVFILTER
1558 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1559 for (i = 0; i < nb_ostreams; i++) {
1560 ost = ost_table[i];
1561 if (ost->input_video_filter && ost->source_index == ist_index) {
1562 AVRational sar;
1563 if (ist->st->sample_aspect_ratio.num)
1564 sar = ist->st->sample_aspect_ratio;
1565 else
1566 sar = ist->st->codec->sample_aspect_ratio;
1567 // add it to be filtered
1568 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture,
1569 ist->pts,
1570 sar);
1571 }
1572 }
1573 }
1574#endif
1575
1576 // preprocess audio (volume)
1577 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1578 if (audio_volume != 256) {
1579 short *volp;
1580 volp = samples;
1581 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1582 int v = ((*volp) * audio_volume + 128) >> 8;
1583 if (v < -32768) v = -32768;
1584 if (v > 32767) v = 32767;
1585 *volp++ = v;
1586 }
1587 }
1588 }
1589
1590 /* frame rate emulation */
1591 if (rate_emu) {
1592 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1593 int64_t now = av_gettime() - ist->start;
1594 if (pts > now)
1595 usleep(pts - now);
1596 }
1597 /* if output time reached then transcode raw format,
1598 encode packets and output them */
1599 if (start_time == 0 || ist->pts >= start_time)
1600 for(i=0;i<nb_ostreams;i++) {
1601 int frame_size;
1602
1603 ost = ost_table[i];
1604 if (ost->source_index == ist_index) {
1605#if CONFIG_AVFILTER
1606 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1607 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1608 while (frame_available) {
1609 AVRational ist_pts_tb;
1610 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1611 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1612 if (ost->picref)
1613 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1614#endif
af70aa45 1615 os = output_files[ost->file_index].ctx;
6291d7e4
AK
1616
1617 /* set the input output pts pairs */
1618 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1619
1620 if (ost->encoding_needed) {
1621 av_assert0(ist->decoding_needed);
1622 switch(ost->st->codec->codec_type) {
1623 case AVMEDIA_TYPE_AUDIO:
1624 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1625 break;
1626 case AVMEDIA_TYPE_VIDEO:
1627#if CONFIG_AVFILTER
1628 if (ost->picref->video && !ost->frame_aspect_ratio)
1629 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1630#endif
1631 do_video_out(os, ost, ist, &picture, &frame_size,
f4ad238c 1632 same_quant ? quality : ost->st->codec->global_quality);
6291d7e4
AK
1633 if (vstats_filename && frame_size)
1634 do_video_stats(os, ost, frame_size);
1635 break;
1636 case AVMEDIA_TYPE_SUBTITLE:
1637 do_subtitle_out(os, ost, ist, &subtitle,
1638 pkt->pts);
1639 break;
1640 default:
1641 abort();
1642 }
1643 } else {
1644 AVFrame avframe; //FIXME/XXX remove this
1645 AVPacket opkt;
1646 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1647
1648 av_init_packet(&opkt);
1649
1650 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1651#if !CONFIG_AVFILTER
1652 continue;
1653#else
1654 goto cont;
1655#endif
1656
1657 /* no reencoding needed : output the packet directly */
1658 /* force the input stream PTS */
1659
1660 avcodec_get_frame_defaults(&avframe);
1661 ost->st->codec->coded_frame= &avframe;
1662 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1663
1664 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1665 audio_size += data_size;
1666 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1667 video_size += data_size;
1668 ost->sync_opts++;
1669 }
1670
1671 opkt.stream_index= ost->index;
1672 if(pkt->pts != AV_NOPTS_VALUE)
1673 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1674 else
1675 opkt.pts= AV_NOPTS_VALUE;
1676
1677 if (pkt->dts == AV_NOPTS_VALUE)
1678 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1679 else
1680 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1681 opkt.dts -= ost_tb_start_time;
1682
1683 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1684 opkt.flags= pkt->flags;
1685
1686 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1687 if( ost->st->codec->codec_id != CODEC_ID_H264
1688 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1689 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1690 ) {
1691 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1692 opkt.destruct= av_destruct_packet;
1693 } else {
1694 opkt.data = data_buf;
1695 opkt.size = data_size;
1696 }
1697
1698 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1699 ost->st->codec->frame_number++;
1700 ost->frame_number++;
1701 av_free_packet(&opkt);
1702 }
1703#if CONFIG_AVFILTER
1704 cont:
1705 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1706 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1707 if (ost->picref)
1708 avfilter_unref_buffer(ost->picref);
1709 }
1710#endif
1711 }
1712 }
1713
1714 av_free(buffer_to_free);
1715 /* XXX: allocate the subtitles in the codec ? */
1716 if (subtitle_to_free) {
1717 avsubtitle_free(subtitle_to_free);
1718 subtitle_to_free = NULL;
1719 }
1720 }
1721 discard_packet:
1722 if (pkt == NULL) {
1723 /* EOF handling */
1724
1725 for(i=0;i<nb_ostreams;i++) {
1726 ost = ost_table[i];
1727 if (ost->source_index == ist_index) {
1728 AVCodecContext *enc= ost->st->codec;
af70aa45 1729 os = output_files[ost->file_index].ctx;
6291d7e4
AK
1730
1731 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1732 continue;
1733 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1734 continue;
1735
1736 if (ost->encoding_needed) {
1737 for(;;) {
1738 AVPacket pkt;
1739 int fifo_bytes;
1740 av_init_packet(&pkt);
1741 pkt.stream_index= ost->index;
1742
1743 switch(ost->st->codec->codec_type) {
1744 case AVMEDIA_TYPE_AUDIO:
1745 fifo_bytes = av_fifo_size(ost->fifo);
1746 ret = 0;
1747 /* encode any samples remaining in fifo */
1748 if (fifo_bytes > 0) {
1749 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1750 int fs_tmp = enc->frame_size;
1751
1752 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1753 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1754 enc->frame_size = fifo_bytes / (osize * enc->channels);
1755 } else { /* pad */
1756 int frame_bytes = enc->frame_size*osize*enc->channels;
1757 if (allocated_audio_buf_size < frame_bytes)
1758 exit_program(1);
1759 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1760 }
1761
1762 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1763 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1764 ost->st->time_base.num, enc->sample_rate);
1765 enc->frame_size = fs_tmp;
1766 }
1767 if(ret <= 0) {
1768 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1769 }
1770 if (ret < 0) {
1771 fprintf(stderr, "Audio encoding failed\n");
1772 exit_program(1);
1773 }
1774 audio_size += ret;
1775 pkt.flags |= AV_PKT_FLAG_KEY;
1776 break;
1777 case AVMEDIA_TYPE_VIDEO:
1778 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1779 if (ret < 0) {
1780 fprintf(stderr, "Video encoding failed\n");
1781 exit_program(1);
1782 }
1783 video_size += ret;
1784 if(enc->coded_frame && enc->coded_frame->key_frame)
1785 pkt.flags |= AV_PKT_FLAG_KEY;
1786 if (ost->logfile && enc->stats_out) {
1787 fprintf(ost->logfile, "%s", enc->stats_out);
1788 }
1789 break;
1790 default:
1791 ret=-1;
1792 }
1793
1794 if(ret<=0)
1795 break;
1796 pkt.data= bit_buffer;
1797 pkt.size= ret;
1798 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1799 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1800 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1801 }
1802 }
1803 }
1804 }
1805 }
1806
1807 return 0;
1808}
1809
af70aa45 1810static void print_sdp(OutputFile *output_files, int n)
6291d7e4
AK
1811{
1812 char sdp[2048];
af70aa45
AK
1813 int i;
1814 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1815
1816 if (!avc)
1817 exit_program(1);
1818 for (i = 0; i < n; i++)
1819 avc[i] = output_files[i].ctx;
6291d7e4
AK
1820
1821 av_sdp_create(avc, n, sdp, sizeof(sdp));
1822 printf("SDP:\n%s\n", sdp);
1823 fflush(stdout);
af70aa45 1824 av_freep(&avc);
6291d7e4
AK
1825}
1826
6291d7e4
AK
1827/*
1828 * The following code is the main loop of the file converter
1829 */
af70aa45 1830static int transcode(OutputFile *output_files,
6291d7e4
AK
1831 int nb_output_files,
1832 InputFile *input_files,
3d4f0dab 1833 int nb_input_files)
6291d7e4
AK
1834{
1835 int ret = 0, i, j, k, n, nb_ostreams = 0;
1836 AVFormatContext *is, *os;
1837 AVCodecContext *codec, *icodec;
1838 OutputStream *ost, **ost_table = NULL;
1839 InputStream *ist;
1840 char error[1024];
1841 int want_sdp = 1;
1842 uint8_t no_packet[MAX_FILES]={0};
1843 int no_packet_count=0;
1844
1845 if (rate_emu)
1846 for (i = 0; i < nb_input_streams; i++)
1847 input_streams[i].start = av_gettime();
1848
1849 /* output stream init */
1850 nb_ostreams = 0;
1851 for(i=0;i<nb_output_files;i++) {
af70aa45 1852 os = output_files[i].ctx;
6291d7e4 1853 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
af70aa45 1854 av_dump_format(os, i, os->filename, 1);
6291d7e4
AK
1855 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1856 ret = AVERROR(EINVAL);
1857 goto fail;
1858 }
1859 nb_ostreams += os->nb_streams;
1860 }
6291d7e4
AK
1861
1862 ost_table = av_mallocz(sizeof(OutputStream *) * nb_ostreams);
1863 if (!ost_table)
1864 goto fail;
1865 n = 0;
1866 for(k=0;k<nb_output_files;k++) {
af70aa45 1867 os = output_files[k].ctx;
3d4f0dab
AK
1868 for (i = 0; i < os->nb_streams; i++, n++)
1869 ost_table[n] = output_streams_for_file[k][i];
6291d7e4
AK
1870 }
1871
1872 /* for each output stream, we compute the right encoding parameters */
1873 for(i=0;i<nb_ostreams;i++) {
1874 ost = ost_table[i];
af70aa45 1875 os = output_files[ost->file_index].ctx;
6291d7e4
AK
1876 ist = &input_streams[ost->source_index];
1877
1878 codec = ost->st->codec;
1879 icodec = ist->st->codec;
1880
6291d7e4
AK
1881 ost->st->disposition = ist->st->disposition;
1882 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1883 codec->chroma_sample_location = icodec->chroma_sample_location;
1884
1885 if (ost->st->stream_copy) {
1886 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1887
1888 if (extra_size > INT_MAX)
1889 goto fail;
1890
1891 /* if stream_copy is selected, no need to decode or encode */
1892 codec->codec_id = icodec->codec_id;
1893 codec->codec_type = icodec->codec_type;
1894
1895 if(!codec->codec_tag){
1896 if( !os->oformat->codec_tag
1897 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1898 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1899 codec->codec_tag = icodec->codec_tag;
1900 }
1901
1902 codec->bit_rate = icodec->bit_rate;
1903 codec->rc_max_rate = icodec->rc_max_rate;
1904 codec->rc_buffer_size = icodec->rc_buffer_size;
1905 codec->extradata= av_mallocz(extra_size);
1906 if (!codec->extradata)
1907 goto fail;
1908 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
1909 codec->extradata_size= icodec->extradata_size;
1910 if(!copy_tb && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/500){
1911 codec->time_base = icodec->time_base;
1912 codec->time_base.num *= icodec->ticks_per_frame;
1913 av_reduce(&codec->time_base.num, &codec->time_base.den,
1914 codec->time_base.num, codec->time_base.den, INT_MAX);
1915 }else
1916 codec->time_base = ist->st->time_base;
1917 switch(codec->codec_type) {
1918 case AVMEDIA_TYPE_AUDIO:
1919 if(audio_volume != 256) {
1920 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1921 exit_program(1);
1922 }
1923 codec->channel_layout = icodec->channel_layout;
1924 codec->sample_rate = icodec->sample_rate;
1925 codec->channels = icodec->channels;
1926 codec->frame_size = icodec->frame_size;
1927 codec->audio_service_type = icodec->audio_service_type;
1928 codec->block_align= icodec->block_align;
1929 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1930 codec->block_align= 0;
1931 if(codec->codec_id == CODEC_ID_AC3)
1932 codec->block_align= 0;
1933 break;
1934 case AVMEDIA_TYPE_VIDEO:
1935 codec->pix_fmt = icodec->pix_fmt;
1936 codec->width = icodec->width;
1937 codec->height = icodec->height;
1938 codec->has_b_frames = icodec->has_b_frames;
1939 if (!codec->sample_aspect_ratio.num) {
1940 codec->sample_aspect_ratio =
1941 ost->st->sample_aspect_ratio =
1942 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
1943 ist->st->codec->sample_aspect_ratio.num ?
1944 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
1945 }
1946 break;
1947 case AVMEDIA_TYPE_SUBTITLE:
1948 codec->width = icodec->width;
1949 codec->height = icodec->height;
1950 break;
1951 case AVMEDIA_TYPE_DATA:
1952 break;
1953 default:
1954 abort();
1955 }
1956 } else {
1957 if (!ost->enc)
1958 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
1959 switch(codec->codec_type) {
1960 case AVMEDIA_TYPE_AUDIO:
1961 ost->fifo= av_fifo_alloc(1024);
1962 if(!ost->fifo)
1963 goto fail;
1964 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
1965 if (!codec->sample_rate) {
1966 codec->sample_rate = icodec->sample_rate;
1967 if (icodec->lowres)
1968 codec->sample_rate >>= icodec->lowres;
1969 }
1970 choose_sample_rate(ost->st, ost->enc);
1971 codec->time_base = (AVRational){1, codec->sample_rate};
1972 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
1973 codec->sample_fmt = icodec->sample_fmt;
1974 choose_sample_fmt(ost->st, ost->enc);
1975 if (!codec->channels)
1976 codec->channels = icodec->channels;
1977 codec->channel_layout = icodec->channel_layout;
1978 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
1979 codec->channel_layout = 0;
1980 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1981 icodec->request_channels = codec->channels;
1982 ist->decoding_needed = 1;
1983 ost->encoding_needed = 1;
1984 ost->resample_sample_fmt = icodec->sample_fmt;
1985 ost->resample_sample_rate = icodec->sample_rate;
1986 ost->resample_channels = icodec->channels;
1987 break;
1988 case AVMEDIA_TYPE_VIDEO:
1989 if (codec->pix_fmt == PIX_FMT_NONE)
1990 codec->pix_fmt = icodec->pix_fmt;
1991 choose_pixel_fmt(ost->st, ost->enc);
1992
1993 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
1994 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
1995 exit_program(1);
1996 }
1997
1998 if (!codec->width || !codec->height) {
1999 codec->width = icodec->width;
2000 codec->height = icodec->height;
2001 }
2002
2003 ost->video_resample = codec->width != icodec->width ||
2004 codec->height != icodec->height ||
2005 codec->pix_fmt != icodec->pix_fmt;
2006 if (ost->video_resample) {
2007#if !CONFIG_AVFILTER
2008 avcodec_get_frame_defaults(&ost->pict_tmp);
2009 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2010 codec->width, codec->height)) {
2011 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2012 exit_program(1);
2013 }
2014 ost->img_resample_ctx = sws_getContext(
2015 icodec->width,
2016 icodec->height,
2017 icodec->pix_fmt,
2018 codec->width,
2019 codec->height,
2020 codec->pix_fmt,
2021 ost->sws_flags, NULL, NULL, NULL);
2022 if (ost->img_resample_ctx == NULL) {
2023 fprintf(stderr, "Cannot get resampling context\n");
2024 exit_program(1);
2025 }
2026#endif
2027 codec->bits_per_raw_sample= 0;
2028 }
2029
2030 ost->resample_height = icodec->height;
2031 ost->resample_width = icodec->width;
2032 ost->resample_pix_fmt= icodec->pix_fmt;
2033 ost->encoding_needed = 1;
2034 ist->decoding_needed = 1;
2035
2036 if (!ost->frame_rate.num)
2037 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2038 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2039 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2040 ost->frame_rate = ost->enc->supported_framerates[idx];
2041 }
2042 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2043
2044#if CONFIG_AVFILTER
2045 if (configure_video_filters(ist, ost)) {
2046 fprintf(stderr, "Error opening filters!\n");
2047 exit(1);
2048 }
2049#endif
2050 break;
2051 case AVMEDIA_TYPE_SUBTITLE:
2052 ost->encoding_needed = 1;
2053 ist->decoding_needed = 1;
2054 break;
2055 default:
2056 abort();
2057 break;
2058 }
2059 /* two pass mode */
2060 if (ost->encoding_needed &&
2061 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2062 char logfilename[1024];
2063 FILE *f;
2064
2065 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2066 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2067 i);
2068 if (codec->flags & CODEC_FLAG_PASS1) {
2069 f = fopen(logfilename, "wb");
2070 if (!f) {
2071 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2072 exit_program(1);
2073 }
2074 ost->logfile = f;
2075 } else {
2076 char *logbuffer;
2077 size_t logbuffer_size;
2078 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2079 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2080 exit_program(1);
2081 }
2082 codec->stats_in = logbuffer;
2083 }
2084 }
2085 }
2086 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2087 int size= codec->width * codec->height;
2088 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2089 }
2090 }
2091
2092 if (!bit_buffer)
2093 bit_buffer = av_malloc(bit_buffer_size);
2094 if (!bit_buffer) {
2095 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2096 bit_buffer_size);
2097 ret = AVERROR(ENOMEM);
2098 goto fail;
2099 }
2100
2101 /* open each encoder */
2102 for(i=0;i<nb_ostreams;i++) {
2103 ost = ost_table[i];
2104 if (ost->encoding_needed) {
2105 AVCodec *codec = ost->enc;
2106 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2107 if (!codec) {
2108 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2109 ost->st->codec->codec_id, ost->file_index, ost->index);
2110 ret = AVERROR(EINVAL);
2111 goto dump_format;
2112 }
2113 if (dec->subtitle_header) {
2114 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2115 if (!ost->st->codec->subtitle_header) {
2116 ret = AVERROR(ENOMEM);
2117 goto dump_format;
2118 }
2119 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2120 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2121 }
2122 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2123 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2124 ost->file_index, ost->index);
2125 ret = AVERROR(EINVAL);
2126 goto dump_format;
2127 }
2128 assert_codec_experimental(ost->st->codec, 1);
2129 assert_avoptions(ost->opts);
2130 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2131 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2132 "It takes bits/s as argument, not kbits/s\n");
2133 extra_size += ost->st->codec->extradata_size;
2134 }
2135 }
2136
2137 /* open each decoder */
2138 for (i = 0; i < nb_input_streams; i++) {
2139 ist = &input_streams[i];
2140 if (ist->decoding_needed) {
2141 AVCodec *codec = ist->dec;
2142 if (!codec)
2143 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2144 if (!codec) {
2145 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2146 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2147 ret = AVERROR(EINVAL);
2148 goto dump_format;
2149 }
2150
2151 /* update requested sample format for the decoder based on the
2152 corresponding encoder sample format */
2153 for (j = 0; j < nb_ostreams; j++) {
2154 ost = ost_table[j];
2155 if (ost->source_index == i) {
2156 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
2157 break;
2158 }
2159 }
2160
2161 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2162 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2163 ist->file_index, ist->st->index);
2164 ret = AVERROR(EINVAL);
2165 goto dump_format;
2166 }
2167 assert_codec_experimental(ist->st->codec, 0);
2168 assert_avoptions(ost->opts);
6291d7e4
AK
2169 }
2170 }
2171
2172 /* init pts */
2173 for (i = 0; i < nb_input_streams; i++) {
2174 AVStream *st;
2175 ist = &input_streams[i];
2176 st= ist->st;
2177 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2178 ist->next_pts = AV_NOPTS_VALUE;
2179 init_pts_correction(&ist->pts_ctx);
2180 ist->is_start = 1;
2181 }
2182
6291d7e4 2183 /* open files and write file headers */
af70aa45
AK
2184 for (i = 0; i < nb_output_files; i++) {
2185 os = output_files[i].ctx;
2186 if (avformat_write_header(os, &output_files[i].opts) < 0) {
6291d7e4
AK
2187 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2188 ret = AVERROR(EINVAL);
2189 goto dump_format;
2190 }
af70aa45
AK
2191 assert_avoptions(output_files[i].opts);
2192 if (strcmp(os->oformat->name, "rtp")) {
6291d7e4
AK
2193 want_sdp = 0;
2194 }
2195 }
2196
2197 dump_format:
2198 /* dump the file output parameters - cannot be done before in case
2199 of stream copy */
2200 for(i=0;i<nb_output_files;i++) {
af70aa45 2201 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
6291d7e4
AK
2202 }
2203
2204 /* dump the stream mapping */
2205 if (verbose >= 0) {
2206 fprintf(stderr, "Stream mapping:\n");
2207 for(i=0;i<nb_ostreams;i++) {
2208 ost = ost_table[i];
2209 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2210 input_streams[ost->source_index].file_index,
2211 input_streams[ost->source_index].st->index,
2212 ost->file_index,
2213 ost->index);
2214 if (ost->sync_ist != &input_streams[ost->source_index])
2215 fprintf(stderr, " [sync #%d.%d]",
2216 ost->sync_ist->file_index,
2217 ost->sync_ist->st->index);
ad42126a
AK
2218 if (ost->st->stream_copy)
2219 fprintf(stderr, " (copy)");
6291d7e4
AK
2220 fprintf(stderr, "\n");
2221 }
2222 }
2223
2224 if (ret) {
2225 fprintf(stderr, "%s\n", error);
2226 goto fail;
2227 }
2228
2229 if (want_sdp) {
2230 print_sdp(output_files, nb_output_files);
2231 }
2232
2233 if (verbose >= 0)
2234 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2235 term_init();
2236
2237 timer_start = av_gettime();
2238
2239 for(; received_sigterm == 0;) {
2240 int file_index, ist_index;
2241 AVPacket pkt;
9be3c124 2242 int64_t ipts_min;
6291d7e4
AK
2243 double opts_min;
2244
2245 redo:
9be3c124 2246 ipts_min = INT64_MAX;
6291d7e4
AK
2247 opts_min= 1e100;
2248
2249 /* select the stream that we must read now by looking at the
2250 smallest output pts */
2251 file_index = -1;
2252 for(i=0;i<nb_ostreams;i++) {
9be3c124
AC
2253 int64_t ipts;
2254 double opts;
6291d7e4 2255 ost = ost_table[i];
af70aa45 2256 os = output_files[ost->file_index].ctx;
6291d7e4
AK
2257 ist = &input_streams[ost->source_index];
2258 if(ist->is_past_recording_time || no_packet[ist->file_index])
2259 continue;
2260 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
9be3c124 2261 ipts = ist->pts;
6291d7e4
AK
2262 if (!input_files[ist->file_index].eof_reached){
2263 if(ipts < ipts_min) {
2264 ipts_min = ipts;
2265 if(input_sync ) file_index = ist->file_index;
2266 }
2267 if(opts < opts_min) {
2268 opts_min = opts;
2269 if(!input_sync) file_index = ist->file_index;
2270 }
2271 }
2272 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2273 file_index= -1;
2274 break;
2275 }
2276 }
2277 /* if none, if is finished */
2278 if (file_index < 0) {
2279 if(no_packet_count){
2280 no_packet_count=0;
2281 memset(no_packet, 0, sizeof(no_packet));
2282 usleep(10000);
2283 continue;
2284 }
2285 break;
2286 }
2287
2288 /* finish if limit size exhausted */
af70aa45 2289 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0].ctx->pb))
6291d7e4
AK
2290 break;
2291
2292 /* read a frame from it and output it in the fifo */
2293 is = input_files[file_index].ctx;
2294 ret= av_read_frame(is, &pkt);
2295 if(ret == AVERROR(EAGAIN)){
2296 no_packet[file_index]=1;
2297 no_packet_count++;
2298 continue;
2299 }
2300 if (ret < 0) {
2301 input_files[file_index].eof_reached = 1;
2302 if (opt_shortest)
2303 break;
2304 else
2305 continue;
2306 }
2307
2308 no_packet_count=0;
2309 memset(no_packet, 0, sizeof(no_packet));
2310
2311 if (do_pkt_dump) {
2312 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2313 is->streams[pkt.stream_index]);
2314 }
2315 /* the following test is needed in case new streams appear
2316 dynamically in stream : we ignore them */
2317 if (pkt.stream_index >= input_files[file_index].ctx->nb_streams)
2318 goto discard_packet;
2319 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2320 ist = &input_streams[ist_index];
2321 if (ist->discard)
2322 goto discard_packet;
2323
2324 if (pkt.dts != AV_NOPTS_VALUE)
2325 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2326 if (pkt.pts != AV_NOPTS_VALUE)
2327 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2328
2329 if (ist->ts_scale) {
2330 if(pkt.pts != AV_NOPTS_VALUE)
2331 pkt.pts *= ist->ts_scale;
2332 if(pkt.dts != AV_NOPTS_VALUE)
2333 pkt.dts *= ist->ts_scale;
2334 }
2335
2336// fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files[ist->file_index].ts_offset, ist->st->codec->codec_type);
2337 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2338 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2339 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2340 int64_t delta= pkt_dts - ist->next_pts;
2341 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2342 input_files[ist->file_index].ts_offset -= delta;
2343 if (verbose > 2)
2344 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2345 delta, input_files[ist->file_index].ts_offset);
2346 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2347 if(pkt.pts != AV_NOPTS_VALUE)
2348 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2349 }
2350 }
2351
2352 /* finish if recording time exhausted */
2353 if (recording_time != INT64_MAX &&
2354 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2355 ist->is_past_recording_time = 1;
2356 goto discard_packet;
2357 }
2358
2359 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2360 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2361
2362 if (verbose >= 0)
2363 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2364 ist->file_index, ist->st->index);
2365 if (exit_on_error)
2366 exit_program(1);
2367 av_free_packet(&pkt);
2368 goto redo;
2369 }
2370
2371 discard_packet:
2372 av_free_packet(&pkt);
2373
2374 /* dump report by using the output first video and audio streams */
2375 print_report(output_files, ost_table, nb_ostreams, 0);
2376 }
2377
2378 /* at the end of stream, we must flush the decoder buffers */
2379 for (i = 0; i < nb_input_streams; i++) {
2380 ist = &input_streams[i];
2381 if (ist->decoding_needed) {
2382 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2383 }
2384 }
2385
2386 term_exit();
2387
2388 /* write the trailer if needed and close file */
2389 for(i=0;i<nb_output_files;i++) {
af70aa45 2390 os = output_files[i].ctx;
6291d7e4
AK
2391 av_write_trailer(os);
2392 }
2393
2394 /* dump report by using the first video and audio streams */
2395 print_report(output_files, ost_table, nb_ostreams, 1);
2396
2397 /* close each encoder */
2398 for(i=0;i<nb_ostreams;i++) {
2399 ost = ost_table[i];
2400 if (ost->encoding_needed) {
2401 av_freep(&ost->st->codec->stats_in);
2402 avcodec_close(ost->st->codec);
2403 }
2404#if CONFIG_AVFILTER
2405 avfilter_graph_free(&ost->graph);
2406#endif
2407 }
2408
2409 /* close each decoder */
2410 for (i = 0; i < nb_input_streams; i++) {
2411 ist = &input_streams[i];
2412 if (ist->decoding_needed) {
2413 avcodec_close(ist->st->codec);
2414 }
2415 }
2416
2417 /* finished ! */
2418 ret = 0;
2419
2420 fail:
2421 av_freep(&bit_buffer);
2422
2423 if (ost_table) {
2424 for(i=0;i<nb_ostreams;i++) {
2425 ost = ost_table[i];
2426 if (ost) {
2427 if (ost->st->stream_copy)
2428 av_freep(&ost->st->codec->extradata);
2429 if (ost->logfile) {
2430 fclose(ost->logfile);
2431 ost->logfile = NULL;
2432 }
2433 av_fifo_free(ost->fifo); /* works even if fifo is not
2434 initialized but set to zero */
2435 av_freep(&ost->st->codec->subtitle_header);
2436 av_free(ost->pict_tmp.data[0]);
2437 av_free(ost->forced_kf_pts);
2438 if (ost->video_resample)
2439 sws_freeContext(ost->img_resample_ctx);
2440 if (ost->resample)
2441 audio_resample_close(ost->resample);
2442 if (ost->reformat_ctx)
2443 av_audio_convert_free(ost->reformat_ctx);
2444 av_dict_free(&ost->opts);
2445 av_free(ost);
2446 }
2447 }
2448 av_free(ost_table);
2449 }
2450 return ret;
2451}
2452
2453static int opt_format(const char *opt, const char *arg)
2454{
2455 last_asked_format = arg;
2456 return 0;
2457}
2458
2459static int opt_video_rc_override_string(const char *opt, const char *arg)
2460{
2461 video_rc_override_string = arg;
2462 return 0;
2463}
2464
2465static int opt_me_threshold(const char *opt, const char *arg)
2466{
2467 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2468 return 0;
2469}
2470
2471static int opt_verbose(const char *opt, const char *arg)
2472{
2473 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2474 return 0;
2475}
2476
2477static int opt_frame_rate(const char *opt, const char *arg)
2478{
2479 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2480 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2481 exit_program(1);
2482 }
2483 return 0;
2484}
2485
2486static int opt_frame_crop(const char *opt, const char *arg)
2487{
2488 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2489 return AVERROR(EINVAL);
2490}
2491
2492static int opt_frame_size(const char *opt, const char *arg)
2493{
2494 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2495 fprintf(stderr, "Incorrect frame size\n");
2496 return AVERROR(EINVAL);
2497 }
2498 return 0;
2499}
2500
2501static int opt_pad(const char *opt, const char *arg) {
2502 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2503 return -1;
2504}
2505
2506static int opt_frame_pix_fmt(const char *opt, const char *arg)
2507{
2508 if (strcmp(arg, "list")) {
2509 frame_pix_fmt = av_get_pix_fmt(arg);
2510 if (frame_pix_fmt == PIX_FMT_NONE) {
2511 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2512 return AVERROR(EINVAL);
2513 }
2514 } else {
2515 show_pix_fmts();
2516 exit_program(0);
2517 }
2518 return 0;
2519}
2520
2521static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2522{
2523 int x = 0, y = 0;
2524 double ar = 0;
2525 const char *p;
2526 char *end;
2527
2528 p = strchr(arg, ':');
2529 if (p) {
2530 x = strtol(arg, &end, 10);
2531 if (end == p)
2532 y = strtol(end+1, &end, 10);
2533 if (x > 0 && y > 0)
2534 ar = (double)x / (double)y;
2535 } else
2536 ar = strtod(arg, NULL);
2537
2538 if (!ar) {
2539 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2540 return AVERROR(EINVAL);
2541 }
2542 frame_aspect_ratio = ar;
2543 return 0;
2544}
2545
2546static int opt_metadata(const char *opt, const char *arg)
2547{
2548 char *mid= strchr(arg, '=');
2549
2550 if(!mid){
2551 fprintf(stderr, "Missing =\n");
2552 exit_program(1);
2553 }
2554 *mid++= 0;
2555
2556 av_dict_set(&metadata, arg, mid, 0);
2557
2558 return 0;
2559}
2560
2561static int opt_qscale(const char *opt, const char *arg)
2562{
2563 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2564 if (video_qscale == 0) {
2565 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2566 return AVERROR(EINVAL);
2567 }
2568 return 0;
2569}
2570
2571static int opt_top_field_first(const char *opt, const char *arg)
2572{
2573 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2574 return 0;
2575}
2576
2577static int opt_thread_count(const char *opt, const char *arg)
2578{
2579 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2580#if !HAVE_THREADS
2581 if (verbose >= 0)
2582 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2583#endif
2584 return 0;
2585}
2586
2587static int opt_audio_sample_fmt(const char *opt, const char *arg)
2588{
2589 if (strcmp(arg, "list")) {
2590 audio_sample_fmt = av_get_sample_fmt(arg);
2591 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2592 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2593 return AVERROR(EINVAL);
2594 }
2595 } else {
2596 int i;
2597 char fmt_str[128];
2598 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2599 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2600 exit_program(0);
2601 }
2602 return 0;
2603}
2604
2605static int opt_audio_rate(const char *opt, const char *arg)
2606{
2607 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2608 return 0;
2609}
2610
2611static int opt_audio_channels(const char *opt, const char *arg)
2612{
2613 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2614 return 0;
2615}
2616
92f1940e 2617static int opt_codec(const char *opt, const char *arg)
6291d7e4 2618{
92f1940e 2619 return av_dict_set(&codec_names, opt, arg, 0);
6291d7e4
AK
2620}
2621
2622static int opt_audio_codec(const char *opt, const char *arg)
2623{
92f1940e 2624 return opt_codec("codec:a", arg);
6291d7e4
AK
2625}
2626
2627static int opt_video_codec(const char *opt, const char *arg)
2628{
92f1940e 2629 return opt_codec("codec:v", arg);
6291d7e4
AK
2630}
2631
2632static int opt_subtitle_codec(const char *opt, const char *arg)
2633{
92f1940e 2634 return opt_codec("codec:s", arg);
6291d7e4
AK
2635}
2636
2637static int opt_data_codec(const char *opt, const char *arg)
2638{
92f1940e 2639 return opt_codec("codec:d", arg);
6291d7e4
AK
2640}
2641
2642static int opt_codec_tag(const char *opt, const char *arg)
2643{
2644 char *tail;
2645 uint32_t *codec_tag;
2646
2647 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2648 !strcmp(opt, "vtag") ? &video_codec_tag :
2649 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2650 if (!codec_tag)
2651 return -1;
2652
2653 *codec_tag = strtol(arg, &tail, 0);
2654 if (!tail || *tail)
2655 *codec_tag = AV_RL32(arg);
2656
2657 return 0;
2658}
2659
2660static int opt_map(const char *opt, const char *arg)
2661{
8d2e4a7e
AK
2662 StreamMap *m = NULL;
2663 int i, negative = 0, file_idx;
2664 int sync_file_idx = -1, sync_stream_idx;
2665 char *p, *sync;
2666 char *map;
6291d7e4 2667
8d2e4a7e
AK
2668 if (*arg == '-') {
2669 negative = 1;
2670 arg++;
2671 }
2672 map = av_strdup(arg);
6291d7e4 2673
8d2e4a7e
AK
2674 /* parse sync stream first, just pick first matching stream */
2675 if (sync = strchr(map, ',')) {
2676 *sync = 0;
2677 sync_file_idx = strtol(sync + 1, &sync, 0);
2678 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2679 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2680 exit_program(1);
2681 }
2682 if (*sync)
2683 sync++;
2684 for (i = 0; i < input_files[sync_file_idx].ctx->nb_streams; i++)
2685 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2686 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2687 sync_stream_idx = i;
2688 break;
2689 }
2690 if (i == input_files[sync_file_idx].ctx->nb_streams) {
2691 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2692 "match any streams.\n", arg);
2693 exit_program(1);
2694 }
2695 }
6291d7e4 2696
8d2e4a7e
AK
2697
2698 file_idx = strtol(map, &p, 0);
2699 if (file_idx >= nb_input_files || file_idx < 0) {
2700 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2701 exit_program(1);
6291d7e4 2702 }
8d2e4a7e
AK
2703 if (negative)
2704 /* disable some already defined maps */
2705 for (i = 0; i < nb_stream_maps; i++) {
2706 m = &stream_maps[i];
2707 if (check_stream_specifier(input_files[m->file_index].ctx,
2708 input_files[m->file_index].ctx->streams[m->stream_index],
2709 *p == ':' ? p + 1 : p) > 0)
2710 m->disabled = 1;
2711 }
2712 else
2713 for (i = 0; i < input_files[file_idx].ctx->nb_streams; i++) {
2714 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2715 *p == ':' ? p + 1 : p) <= 0)
2716 continue;
2717 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2718 m = &stream_maps[nb_stream_maps - 1];
2719
2720 m->file_index = file_idx;
2721 m->stream_index = i;
2722
2723 if (sync_file_idx >= 0) {
2724 m->sync_file_index = sync_file_idx;
2725 m->sync_stream_index = sync_stream_idx;
2726 } else {
2727 m->sync_file_index = file_idx;
2728 m->sync_stream_index = i;
2729 }
2730 }
2731
2732 if (!m) {
2733 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2734 exit_program(1);
2735 }
2736
2737 av_freep(&map);
6291d7e4
AK
2738 return 0;
2739}
2740
e6e6060c 2741static void parse_meta_type(char *arg, char *type, int *index)
6291d7e4 2742{
e6e6060c 2743 if (*arg == ':') {
6291d7e4
AK
2744 *type = *(++arg);
2745 switch (*arg) {
2746 case 'g':
2747 break;
2748 case 's':
2749 case 'c':
2750 case 'p':
e6e6060c
AK
2751 if (*(++arg) == ':')
2752 *index = strtol(++arg, NULL, 0);
6291d7e4
AK
2753 break;
2754 default:
2755 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2756 exit_program(1);
2757 }
2758 } else
2759 *type = 'g';
2760}
2761
2762static int opt_map_metadata(const char *opt, const char *arg)
2763{
2764 MetadataMap *m, *m1;
2765 char *p;
2766
2767 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2768 &nb_meta_data_maps, nb_meta_data_maps + 1);
2769
e6e6060c 2770 m = &meta_data_maps[nb_meta_data_maps - 1][1];
6291d7e4 2771 m->file = strtol(arg, &p, 0);
e6e6060c 2772 parse_meta_type(p, &m->type, &m->index);
6291d7e4 2773
e6e6060c
AK
2774 m1 = &meta_data_maps[nb_meta_data_maps - 1][0];
2775 if (p = strchr(opt, ':'))
2776 parse_meta_type(p, &m1->type, &m1->index);
2777 else
2778 m1->type = 'g';
6291d7e4
AK
2779
2780 if (m->type == 'g' || m1->type == 'g')
2781 metadata_global_autocopy = 0;
2782 if (m->type == 's' || m1->type == 's')
2783 metadata_streams_autocopy = 0;
2784 if (m->type == 'c' || m1->type == 'c')
2785 metadata_chapters_autocopy = 0;
2786
2787 return 0;
2788}
2789
6291d7e4
AK
2790static int opt_input_ts_scale(const char *opt, const char *arg)
2791{
09af7fb3 2792 return av_dict_set(&ts_scale, opt, arg, 0);
6291d7e4
AK
2793}
2794
2795static int opt_recording_time(const char *opt, const char *arg)
2796{
2797 recording_time = parse_time_or_die(opt, arg, 1);
2798 return 0;
2799}
2800
2801static int opt_start_time(const char *opt, const char *arg)
2802{
2803 start_time = parse_time_or_die(opt, arg, 1);
2804 return 0;
2805}
2806
6291d7e4
AK
2807static int opt_input_ts_offset(const char *opt, const char *arg)
2808{
2809 input_ts_offset = parse_time_or_die(opt, arg, 1);
2810 return 0;
2811}
2812
169f0647
AK
2813static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2814{
2815 const char *codec_string = encoder ? "encoder" : "decoder";
2816 AVCodec *codec;
2817
2818 if(!name)
2819 return CODEC_ID_NONE;
2820 codec = encoder ?
2821 avcodec_find_encoder_by_name(name) :
2822 avcodec_find_decoder_by_name(name);
2823 if(!codec) {
2824 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2825 exit_program(1);
2826 }
2827 if(codec->type != type) {
2828 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2829 exit_program(1);
2830 }
2831 return codec->id;
2832}
2833
2834static AVCodec *choose_codec(AVFormatContext *s, AVStream *st, enum AVMediaType type, AVDictionary *codec_names)
2835{
2836 AVDictionaryEntry *e = NULL;
2837 char *codec_name = NULL;
2838 int ret;
2839
2840 while (e = av_dict_get(codec_names, "", e, AV_DICT_IGNORE_SUFFIX)) {
2841 char *p = strchr(e->key, ':');
2842
2843 if ((ret = check_stream_specifier(s, st, p ? p + 1 : "")) > 0)
2844 codec_name = e->value;
2845 else if (ret < 0)
2846 exit_program(1);
2847 }
2848
2849 if (!codec_name) {
6cd9d0f7
AK
2850 if (s->oformat) {
2851 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2852 return avcodec_find_encoder(st->codec->codec_id);
2853 }
169f0647
AK
2854 } else if (!strcmp(codec_name, "copy"))
2855 st->stream_copy = 1;
2856 else {
2857 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
2858 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
2859 avcodec_find_decoder_by_name(codec_name);
2860 }
2861
2862 return NULL;
2863}
6291d7e4 2864
88867844
AK
2865/**
2866 * Add all the streams from the given input file to the global
2867 * list of input streams.
2868 */
2869static void add_input_streams(AVFormatContext *ic)
2870{
09af7fb3 2871 int i, rfps, rfps_base, ret;
88867844
AK
2872
2873 for (i = 0; i < ic->nb_streams; i++) {
2874 AVStream *st = ic->streams[i];
2875 AVCodecContext *dec = st->codec;
09af7fb3 2876 AVDictionaryEntry *e = NULL;
88867844 2877 InputStream *ist;
09af7fb3 2878 char *scale = NULL;
88867844
AK
2879
2880 dec->thread_count = thread_count;
2881
2882 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2883 ist = &input_streams[nb_input_streams - 1];
2884 ist->st = st;
2885 ist->file_index = nb_input_files;
2886 ist->discard = 1;
2887 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2888
09af7fb3
AK
2889 while (e = av_dict_get(ts_scale, "", e, AV_DICT_IGNORE_SUFFIX)) {
2890 char *p = strchr(e->key, ':');
2891
2892 if ((ret = check_stream_specifier(ic, st, p ? p + 1 : "")) > 0)
2893 scale = e->value;
2894 else if (ret < 0)
2895 exit_program(1);
2896 }
2897 if (scale)
2898 ist->ts_scale = strtod(scale, NULL);
88867844
AK
2899
2900 ist->dec = choose_codec(ic, st, dec->codec_type, codec_names);
2901
2902 switch (dec->codec_type) {
2903 case AVMEDIA_TYPE_AUDIO:
2904 if(audio_disable)
2905 st->discard= AVDISCARD_ALL;
2906 break;
2907 case AVMEDIA_TYPE_VIDEO:
2908 rfps = ic->streams[i]->r_frame_rate.num;
2909 rfps_base = ic->streams[i]->r_frame_rate.den;
2910 if (dec->lowres) {
2911 dec->flags |= CODEC_FLAG_EMU_EDGE;
2912 dec->height >>= dec->lowres;
2913 dec->width >>= dec->lowres;
2914 }
2915 if(me_threshold)
2916 dec->debug |= FF_DEBUG_MV;
2917
2918 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2919
2920 if (verbose >= 0)
2921 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2922 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2923
2924 (float)rfps / rfps_base, rfps, rfps_base);
2925 }
2926
2927 if(video_disable)
2928 st->discard= AVDISCARD_ALL;
2929 else if(video_discard)
2930 st->discard= video_discard;
2931 break;
2932 case AVMEDIA_TYPE_DATA:
2933 break;
2934 case AVMEDIA_TYPE_SUBTITLE:
2935 if(subtitle_disable)
2936 st->discard = AVDISCARD_ALL;
2937 break;
2938 case AVMEDIA_TYPE_ATTACHMENT:
2939 case AVMEDIA_TYPE_UNKNOWN:
2940 break;
2941 default:
2942 abort();
2943 }
2944 }
2945}
2946
6291d7e4
AK
2947static int opt_input_file(const char *opt, const char *filename)
2948{
2949 AVFormatContext *ic;
2950 AVInputFormat *file_iformat = NULL;
88867844 2951 int err, i, ret;
6291d7e4
AK
2952 int64_t timestamp;
2953 uint8_t buf[128];
2954 AVDictionary **opts;
2955 int orig_nb_streams; // number of streams before avformat_find_stream_info
2956
2957 if (last_asked_format) {
2958 if (!(file_iformat = av_find_input_format(last_asked_format))) {
2959 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
2960 exit_program(1);
2961 }
2962 last_asked_format = NULL;
2963 }
2964
2965 if (!strcmp(filename, "-"))
2966 filename = "pipe:";
2967
2968 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2969 !strcmp(filename, "/dev/stdin");
2970
2971 /* get default parameters from command line */
2972 ic = avformat_alloc_context();
2973 if (!ic) {
2974 print_error(filename, AVERROR(ENOMEM));
2975 exit_program(1);
2976 }
2977 if (audio_sample_rate) {
2978 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
2979 av_dict_set(&format_opts, "sample_rate", buf, 0);
2980 }
2981 if (audio_channels) {
2982 snprintf(buf, sizeof(buf), "%d", audio_channels);
2983 av_dict_set(&format_opts, "channels", buf, 0);
2984 }
2985 if (frame_rate.num) {
2986 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
2987 av_dict_set(&format_opts, "framerate", buf, 0);
2988 }
2989 if (frame_width && frame_height) {
2990 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
2991 av_dict_set(&format_opts, "video_size", buf, 0);
2992 }
2993 if (frame_pix_fmt != PIX_FMT_NONE)
2994 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
2995
6291d7e4
AK
2996 ic->flags |= AVFMT_FLAG_NONBLOCK;
2997
2998 /* open the input file with generic libav function */
2999 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3000 if (err < 0) {
3001 print_error(filename, err);
3002 exit_program(1);
3003 }
3004 assert_avoptions(format_opts);
3005
3006 if(opt_programid) {
3007 int i, j;
3008 int found=0;
3009 for(i=0; i<ic->nb_streams; i++){
3010 ic->streams[i]->discard= AVDISCARD_ALL;
3011 }
3012 for(i=0; i<ic->nb_programs; i++){
3013 AVProgram *p= ic->programs[i];
3014 if(p->id != opt_programid){
3015 p->discard = AVDISCARD_ALL;
3016 }else{
3017 found=1;
3018 for(j=0; j<p->nb_stream_indexes; j++){
3019 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3020 }
3021 }
3022 }
3023 if(!found){
3024 fprintf(stderr, "Specified program id not found\n");
3025 exit_program(1);
3026 }
3027 opt_programid=0;
3028 }
3029
92f1940e
AK
3030 /* apply forced codec ids */
3031 for (i = 0; i < ic->nb_streams; i++)
3032 choose_codec(ic, ic->streams[i], ic->streams[i]->codec->codec_type, codec_names);
3033
6291d7e4
AK
3034 /* Set AVCodecContext options for avformat_find_stream_info */
3035 opts = setup_find_stream_info_opts(ic, codec_opts);
3036 orig_nb_streams = ic->nb_streams;
3037
3038 /* If not enough info to get the stream parameters, we decode the
3039 first frames to get it. (used in mpeg case for example) */
3040 ret = avformat_find_stream_info(ic, opts);
3041 if (ret < 0 && verbose >= 0) {
3042 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3043 av_close_input_file(ic);
3044 exit_program(1);
3045 }
3046
3047 timestamp = start_time;
3048 /* add the stream start time */
3049 if (ic->start_time != AV_NOPTS_VALUE)
3050 timestamp += ic->start_time;
3051
3052 /* if seeking requested, we execute it */
3053 if (start_time != 0) {
3054 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3055 if (ret < 0) {
3056 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3057 filename, (double)timestamp / AV_TIME_BASE);
3058 }
3059 /* reset seek info */
3060 start_time = 0;
3061 }
3062
3063 /* update the current parameters so that they match the one of the input stream */
88867844 3064 add_input_streams(ic);
6291d7e4
AK
3065
3066 /* dump the file content */
3067 if (verbose >= 0)
3068 av_dump_format(ic, nb_input_files, filename, 0);
3069
3070 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3071 input_files[nb_input_files - 1].ctx = ic;
3072 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3073 input_files[nb_input_files - 1].ts_offset = input_ts_offset - (copy_ts ? 0 : timestamp);
3074
3075 frame_rate = (AVRational){0, 0};
3076 frame_pix_fmt = PIX_FMT_NONE;
3077 frame_height = 0;
3078 frame_width = 0;
3079 audio_sample_rate = 0;
3080 audio_channels = 0;
3081 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
09af7fb3 3082 av_dict_free(&ts_scale);
6291d7e4
AK
3083
3084 for (i = 0; i < orig_nb_streams; i++)
3085 av_dict_free(&opts[i]);
3086 av_freep(&opts);
92f1940e 3087 av_dict_free(&codec_names);
6291d7e4
AK
3088 uninit_opts();
3089 init_opts();
3090 return 0;
3091}
3092
f233cfed
AK
3093static void parse_forced_key_frames(char *kf, OutputStream *ost,
3094 AVCodecContext *avctx)
3095{
3096 char *p;
3097 int n = 1, i;
3098 int64_t t;
3099
3100 for (p = kf; *p; p++)
3101 if (*p == ',')
3102 n++;
3103 ost->forced_kf_count = n;
3104 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3105 if (!ost->forced_kf_pts) {
3106 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3107 exit_program(1);
3108 }
3109 for (i = 0; i < n; i++) {
3110 p = i ? strchr(p, ',') + 1 : kf;
3111 t = parse_time_or_die("force_key_frames", p, 1);
3112 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3113 }
3114}
3115
6cd9d0f7 3116static OutputStream *new_output_stream(AVFormatContext *oc, enum AVMediaType type)
169f0647
AK
3117{
3118 OutputStream *ost;
3119 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3120 int idx = oc->nb_streams - 1;
3121
3122 if (!st) {
3123 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3124 exit_program(1);
3125 }
3126
40fc2810
AK
3127 output_streams_for_file[nb_output_files] =
3128 grow_array(output_streams_for_file[nb_output_files],
3129 sizeof(*output_streams_for_file[nb_output_files]),
3130 &nb_output_streams_for_file[nb_output_files],
169f0647 3131 oc->nb_streams);
40fc2810 3132 ost = output_streams_for_file[nb_output_files][idx] =
169f0647
AK
3133 av_mallocz(sizeof(OutputStream));
3134 if (!ost) {
3135 fprintf(stderr, "Could not alloc output stream\n");
3136 exit_program(1);
3137 }
40fc2810 3138 ost->file_index = nb_output_files;
169f0647
AK
3139 ost->index = idx;
3140 ost->st = st;
3141 st->codec->codec_type = type;
3142 ost->enc = choose_codec(oc, st, type, codec_names);
3143 if (ost->enc) {
3144 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3145 }
3146
3147 avcodec_get_context_defaults3(st->codec, ost->enc);
3148 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3149
3150 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3151 return ost;
3152}
3153
6cd9d0f7 3154static OutputStream *new_video_stream(AVFormatContext *oc)
6291d7e4
AK
3155{
3156 AVStream *st;
3157 OutputStream *ost;
3158 AVCodecContext *video_enc;
6291d7e4 3159
6cd9d0f7 3160 ost = new_output_stream(oc, AVMEDIA_TYPE_VIDEO);
6291d7e4 3161 st = ost->st;
92f1940e 3162 if (!st->stream_copy) {
6291d7e4
AK
3163 ost->frame_aspect_ratio = frame_aspect_ratio;
3164 frame_aspect_ratio = 0;
3165#if CONFIG_AVFILTER
3166 ost->avfilter= vfilters;
3167 vfilters = NULL;
3168#endif
3169 }
3170
3171 ost->bitstream_filters = video_bitstream_filters;
3172 video_bitstream_filters= NULL;
3173
3174 st->codec->thread_count= thread_count;
3175
3176 video_enc = st->codec;
3177
3178 if(video_codec_tag)
3179 video_enc->codec_tag= video_codec_tag;
3180
3181 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3182 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3183 }
3184
92f1940e 3185 if (st->stream_copy) {
6291d7e4
AK
3186 video_enc->sample_aspect_ratio =
3187 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3188 } else {
3189 const char *p;
3190 int i;
3191
3192 if (frame_rate.num)
3193 ost->frame_rate = frame_rate;
6291d7e4
AK
3194
3195 video_enc->width = frame_width;
3196 video_enc->height = frame_height;
3197 video_enc->pix_fmt = frame_pix_fmt;
3198 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3199
3200 if (intra_only)
3201 video_enc->gop_size = 0;
f4ad238c 3202 if (video_qscale || same_quant) {
6291d7e4
AK
3203 video_enc->flags |= CODEC_FLAG_QSCALE;
3204 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3205 }
3206
3207 if(intra_matrix)
3208 video_enc->intra_matrix = intra_matrix;
3209 if(inter_matrix)
3210 video_enc->inter_matrix = inter_matrix;
3211
3212 p= video_rc_override_string;
3213 for(i=0; p; i++){
3214 int start, end, q;
3215 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3216 if(e!=3){
3217 fprintf(stderr, "error parsing rc_override\n");
3218 exit_program(1);
3219 }
3220 video_enc->rc_override=
3221 av_realloc(video_enc->rc_override,
3222 sizeof(RcOverride)*(i+1));
3223 video_enc->rc_override[i].start_frame= start;
3224 video_enc->rc_override[i].end_frame = end;
3225 if(q>0){
3226 video_enc->rc_override[i].qscale= q;
3227 video_enc->rc_override[i].quality_factor= 1.0;
3228 }
3229 else{
3230 video_enc->rc_override[i].qscale= 0;
3231 video_enc->rc_override[i].quality_factor= -q/100.0;
3232 }
3233 p= strchr(p, '/');
3234 if(p) p++;
3235 }
3236 video_enc->rc_override_count=i;
3237 if (!video_enc->rc_initial_buffer_occupancy)
3238 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3239 video_enc->me_threshold= me_threshold;
3240 video_enc->intra_dc_precision= intra_dc_precision - 8;
3241
3242 if (do_psnr)
3243 video_enc->flags|= CODEC_FLAG_PSNR;
3244
3245 /* two pass mode */
3246 if (do_pass) {
3247 if (do_pass == 1) {
3248 video_enc->flags |= CODEC_FLAG_PASS1;
3249 } else {
3250 video_enc->flags |= CODEC_FLAG_PASS2;
3251 }
3252 }
3253
3254 if (forced_key_frames)
3255 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3256 }
3257 if (video_language) {
3258 av_dict_set(&st->metadata, "language", video_language, 0);
3259 av_freep(&video_language);
3260 }
3261
3262 /* reset some key parameters */
3263 video_disable = 0;
6291d7e4 3264 av_freep(&forced_key_frames);
6291d7e4 3265 frame_pix_fmt = PIX_FMT_NONE;
3d4f0dab 3266 return ost;
6291d7e4
AK
3267}
3268
6cd9d0f7 3269static OutputStream *new_audio_stream(AVFormatContext *oc)
6291d7e4
AK
3270{
3271 AVStream *st;
3272 OutputStream *ost;
6291d7e4 3273 AVCodecContext *audio_enc;
6291d7e4 3274
6cd9d0f7 3275 ost = new_output_stream(oc, AVMEDIA_TYPE_AUDIO);
6291d7e4
AK
3276 st = ost->st;
3277
3278 ost->bitstream_filters = audio_bitstream_filters;
3279 audio_bitstream_filters= NULL;
3280
3281 st->codec->thread_count= thread_count;
3282
3283 audio_enc = st->codec;
3284 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3285
3286 if(audio_codec_tag)
3287 audio_enc->codec_tag= audio_codec_tag;
3288
3289 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3290 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3291 }
92f1940e 3292 if (!st->stream_copy) {
6291d7e4
AK
3293 if (audio_qscale > QSCALE_NONE) {
3294 audio_enc->flags |= CODEC_FLAG_QSCALE;
3295 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3296 }
3297 if (audio_channels)
3298 audio_enc->channels = audio_channels;
3299 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3300 audio_enc->sample_fmt = audio_sample_fmt;
3301 if (audio_sample_rate)
3302 audio_enc->sample_rate = audio_sample_rate;
3303 }
3304 if (audio_language) {
3305 av_dict_set(&st->metadata, "language", audio_language, 0);
3306 av_freep(&audio_language);
3307 }
3308
3309 /* reset some key parameters */
3310 audio_disable = 0;
3d4f0dab
AK
3311
3312 return ost;
6291d7e4
AK
3313}
3314
6cd9d0f7 3315static OutputStream *new_data_stream(AVFormatContext *oc)
6291d7e4
AK
3316{
3317 AVStream *st;
3318 OutputStream *ost;
3319 AVCodecContext *data_enc;
3320
6cd9d0f7 3321 ost = new_output_stream(oc, AVMEDIA_TYPE_DATA);
6291d7e4
AK
3322 st = ost->st;
3323 data_enc = st->codec;
92f1940e 3324 if (!st->stream_copy) {
6291d7e4
AK
3325 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3326 exit_program(1);
3327 }
3328
6291d7e4
AK
3329 if (data_codec_tag)
3330 data_enc->codec_tag= data_codec_tag;
3331
3332 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3333 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3334 }
6291d7e4
AK
3335
3336 data_disable = 0;
3d4f0dab 3337 return ost;
6291d7e4
AK
3338}
3339
6cd9d0f7 3340static OutputStream *new_subtitle_stream(AVFormatContext *oc)
6291d7e4
AK
3341{
3342 AVStream *st;
3343 OutputStream *ost;
6291d7e4 3344 AVCodecContext *subtitle_enc;
6291d7e4 3345
6cd9d0f7 3346 ost = new_output_stream(oc, AVMEDIA_TYPE_SUBTITLE);
6291d7e4
AK
3347 st = ost->st;
3348 subtitle_enc = st->codec;
3349
3350 ost->bitstream_filters = subtitle_bitstream_filters;
3351 subtitle_bitstream_filters= NULL;
3352
3353 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3354
3355 if(subtitle_codec_tag)
3356 subtitle_enc->codec_tag= subtitle_codec_tag;
3357
3358 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3359 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3360 }
6291d7e4
AK
3361
3362 if (subtitle_language) {
3363 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3364 av_freep(&subtitle_language);
3365 }
3366
3367 subtitle_disable = 0;
3d4f0dab 3368 return ost;
6291d7e4
AK
3369}
3370
3371/* arg format is "output-stream-index:streamid-value". */
3372static int opt_streamid(const char *opt, const char *arg)
3373{
3374 int idx;
3375 char *p;
3376 char idx_str[16];
3377
3378 av_strlcpy(idx_str, arg, sizeof(idx_str));
3379 p = strchr(idx_str, ':');
3380 if (!p) {
3381 fprintf(stderr,
3382 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3383 arg, opt);
3384 exit_program(1);
3385 }
3386 *p++ = '\0';
3387 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3388 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3389 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3390 return 0;
3391}
3392
86530f41
AK
3393static int copy_chapters(int infile, int outfile)
3394{
3395 AVFormatContext *is = input_files[infile].ctx;
af70aa45 3396 AVFormatContext *os = output_files[outfile].ctx;
86530f41
AK
3397 int i;
3398
3399 for (i = 0; i < is->nb_chapters; i++) {
3400 AVChapter *in_ch = is->chapters[i], *out_ch;
3401 int64_t ts_off = av_rescale_q(start_time - input_files[infile].ts_offset,
3402 AV_TIME_BASE_Q, in_ch->time_base);
3403 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
3404 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3405
3406
3407 if (in_ch->end < ts_off)
3408 continue;
3409 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3410 break;
3411
3412 out_ch = av_mallocz(sizeof(AVChapter));
3413 if (!out_ch)
3414 return AVERROR(ENOMEM);
3415
3416 out_ch->id = in_ch->id;
3417 out_ch->time_base = in_ch->time_base;
3418 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3419 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3420
3421 if (metadata_chapters_autocopy)
3422 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3423
3424 os->nb_chapters++;
3425 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3426 if (!os->chapters)
3427 return AVERROR(ENOMEM);
3428 os->chapters[os->nb_chapters - 1] = out_ch;
3429 }
3430 return 0;
3431}
3432
169f0647
AK
3433static int read_avserver_streams(AVFormatContext *s, const char *filename)
3434{
3435 int i, err;
3436 AVFormatContext *ic = NULL;
169f0647
AK
3437
3438 err = avformat_open_input(&ic, filename, NULL, NULL);
3439 if (err < 0)
3440 return err;
3441 /* copy stream format */
3442 for(i=0;i<ic->nb_streams;i++) {
3443 AVStream *st;
3444 OutputStream *ost;
3445 AVCodec *codec;
3446
3447 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
6cd9d0f7 3448 ost = new_output_stream(s, codec->type);
169f0647
AK
3449 st = ost->st;
3450
3451 // FIXME: a more elegant solution is needed
3452 memcpy(st, ic->streams[i], sizeof(AVStream));
3453 st->info = NULL;
3454 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3455
3456 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3457 choose_sample_fmt(st, codec);
3458 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3459 choose_pixel_fmt(st, codec);
169f0647
AK
3460 }
3461
3462 av_close_input_file(ic);
3463 return 0;
3464}
3465
6291d7e4
AK
3466static void opt_output_file(const char *filename)
3467{
3468 AVFormatContext *oc;
3d4f0dab 3469 int i, err;
6291d7e4 3470 AVOutputFormat *file_oformat;
3d4f0dab
AK
3471 OutputStream *ost;
3472 InputStream *ist;
6291d7e4
AK
3473
3474 if (!strcmp(filename, "-"))
3475 filename = "pipe:";
3476
3477 oc = avformat_alloc_context();
3478 if (!oc) {
3479 print_error(filename, AVERROR(ENOMEM));
3480 exit_program(1);
3481 }
3482
3483 if (last_asked_format) {
3484 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3485 if (!file_oformat) {
3486 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3487 exit_program(1);
3488 }
3489 last_asked_format = NULL;
3490 } else {
3491 file_oformat = av_guess_format(NULL, filename, NULL);
3492 if (!file_oformat) {
3493 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3494 filename);
3495 exit_program(1);
3496 }
3497 }
3498
3499 oc->oformat = file_oformat;
3500 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3501
3502 if (!strcmp(file_oformat->name, "ffm") &&
3503 av_strstart(filename, "http:", NULL)) {
3504 /* special case for files sent to avserver: we get the stream
3505 parameters from avserver */
3506 int err = read_avserver_streams(oc, filename);
3507 if (err < 0) {
3508 print_error(filename, err);
3509 exit_program(1);
3510 }
3d4f0dab
AK
3511 } else if (!nb_stream_maps) {
3512 /* pick the "best" stream of each type */
3513#define NEW_STREAM(type, index)\
3514 if (index >= 0) {\
6cd9d0f7 3515 ost = new_ ## type ## _stream(oc);\
3d4f0dab
AK
3516 ost->source_index = index;\
3517 ost->sync_ist = &input_streams[index];\
3518 input_streams[index].discard = 0;\
3519 }
3520
3521 /* video: highest resolution */
3522 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3523 int area = 0, idx = -1;
3524 for (i = 0; i < nb_input_streams; i++) {
3525 ist = &input_streams[i];
3526 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3527 ist->st->codec->width * ist->st->codec->height > area) {
3528 area = ist->st->codec->width * ist->st->codec->height;
3529 idx = i;
3530 }
3531 }
3532 NEW_STREAM(video, idx);
3533 }
3534
3535 /* audio: most channels */
3536 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3537 int channels = 0, idx = -1;
3538 for (i = 0; i < nb_input_streams; i++) {
3539 ist = &input_streams[i];
3540 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3541 ist->st->codec->channels > channels) {
3542 channels = ist->st->codec->channels;
3543 idx = i;
3544 }
3545 }
3546 NEW_STREAM(audio, idx);
3547 }
3548
3549 /* subtitles: pick first */
3550 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3551 for (i = 0; i < nb_input_streams; i++)
3552 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3553 NEW_STREAM(subtitle, i);
3554 break;
3555 }
3556 }
3557 /* do something with data? */
6291d7e4 3558 } else {
3d4f0dab
AK
3559 for (i = 0; i < nb_stream_maps; i++) {
3560 StreamMap *map = &stream_maps[i];
3d4f0dab 3561
8d2e4a7e
AK
3562 if (map->disabled)
3563 continue;
3d4f0dab 3564
6cd9d0f7 3565 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3d4f0dab 3566 switch (ist->st->codec->codec_type) {
6cd9d0f7
AK
3567 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(oc); break;
3568 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(oc); break;
3569 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(oc); break;
3570 case AVMEDIA_TYPE_DATA: ost = new_data_stream(oc); break;
3d4f0dab
AK
3571 default:
3572 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3573 map->file_index, map->stream_index);
3574 exit_program(1);
3575 }
3576
6cd9d0f7 3577 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3d4f0dab
AK
3578 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3579 map->sync_stream_index];
3580 ist->discard = 0;
3581 }
6291d7e4
AK
3582 }
3583
3d4f0dab
AK
3584 av_dict_copy(&oc->metadata, metadata, 0);
3585 av_dict_free(&metadata);
3586
af70aa45
AK
3587
3588 if (nb_output_files == MAX_FILES)
3589 exit_program(1); /* a temporary hack until all the other MAX_FILES-sized arrays are removed */
3590 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3591 output_files[nb_output_files - 1].ctx = oc;
3592 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
6291d7e4
AK
3593
3594 /* check filename in case of an image number is expected */
3595 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3596 if (!av_filename_number_test(oc->filename)) {
3597 print_error(oc->filename, AVERROR(EINVAL));
3598 exit_program(1);
3599 }
3600 }
3601
3602 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3603 /* test if it already exists to avoid loosing precious files */
3604 if (!file_overwrite &&
3605 (strchr(filename, ':') == NULL ||
3606 filename[1] == ':' ||
3607 av_strstart(filename, "file:", NULL))) {
3608 if (avio_check(filename, 0) == 0) {
3609 if (!using_stdin) {
3610 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3611 fflush(stderr);
3612 if (!read_yesno()) {
3613 fprintf(stderr, "Not overwriting - exiting\n");
3614 exit_program(1);
3615 }
3616 }
3617 else {
3618 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3619 exit_program(1);
3620 }
3621 }
3622 }
3623
3624 /* open the file */
3625 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3626 print_error(filename, err);
3627 exit_program(1);
3628 }
3629 }
3630
3631 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3632 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
6291d7e4
AK
3633 oc->flags |= AVFMT_FLAG_NONBLOCK;
3634
b9aac90b
AK
3635 /* copy chapters */
3636 if (chapters_input_file >= nb_input_files) {
3637 if (chapters_input_file == INT_MAX) {
3638 /* copy chapters from the first input file that has them*/
3639 chapters_input_file = -1;
3640 for (i = 0; i < nb_input_files; i++)
3641 if (input_files[i].ctx->nb_chapters) {
3642 chapters_input_file = i;
3643 break;
3644 }
3645 } else {
3646 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3647 chapters_input_file);
3648 exit_program(1);
3649 }
3650 }
3651 if (chapters_input_file >= 0)
3652 copy_chapters(chapters_input_file, nb_output_files - 1);
3653
e6e6060c
AK
3654 /* copy metadata */
3655 for (i = 0; i < nb_meta_data_maps; i++) {
3656 AVFormatContext *files[2];
3657 AVDictionary **meta[2];
3658 int j;
3659
3660#define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3661 if ((index) < 0 || (index) >= (nb_elems)) {\
3662 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3663 (desc), (index));\
3664 exit_program(1);\
3665 }
3666
3667 int in_file_index = meta_data_maps[i][1].file;
3668 if (in_file_index < 0)
3669 continue;
3670 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3671
3672 files[0] = oc;
3673 files[1] = input_files[in_file_index].ctx;
3674
3675 for (j = 0; j < 2; j++) {
3676 MetadataMap *map = &meta_data_maps[i][j];
3677
3678 switch (map->type) {
3679 case 'g':
3680 meta[j] = &files[j]->metadata;
3681 break;
3682 case 's':
3683 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3684 meta[j] = &files[j]->streams[map->index]->metadata;
3685 break;
3686 case 'c':
3687 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3688 meta[j] = &files[j]->chapters[map->index]->metadata;
3689 break;
3690 case 'p':
3691 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3692 meta[j] = &files[j]->programs[map->index]->metadata;
3693 break;
3694 }
3695 }
3696
3697 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3698 }
3699
3700 /* copy global metadata by default */
5759cce7 3701 if (metadata_global_autocopy && nb_input_files)
e6e6060c
AK
3702 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3703 AV_DICT_DONT_OVERWRITE);
3704 if (metadata_streams_autocopy)
3705 for (i = 0; i < oc->nb_streams; i++) {
3706 InputStream *ist = &input_streams[output_streams_for_file[nb_output_files-1][i]->source_index];
3707 av_dict_copy(&oc->streams[i]->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3708 }
3709
6291d7e4
AK
3710 frame_rate = (AVRational){0, 0};
3711 frame_width = 0;
3712 frame_height = 0;
3713 audio_sample_rate = 0;
3714 audio_channels = 0;
3715 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
b9aac90b 3716 chapters_input_file = INT_MAX;
6291d7e4 3717
e6e6060c
AK
3718 av_freep(&meta_data_maps);
3719 nb_meta_data_maps = 0;
3720 metadata_global_autocopy = 1;
3721 metadata_streams_autocopy = 1;
3722 metadata_chapters_autocopy = 1;
3d4f0dab
AK
3723 av_freep(&stream_maps);
3724 nb_stream_maps = 0;
e6e6060c 3725
92f1940e
AK
3726 av_dict_free(&codec_names);
3727
6291d7e4
AK
3728 av_freep(&forced_key_frames);
3729 uninit_opts();
3730 init_opts();
3731}
3732
3733/* same option as mencoder */
3734static int opt_pass(const char *opt, const char *arg)
3735{
3736 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3737 return 0;
3738}
3739
3740static int64_t getutime(void)
3741{
3742#if HAVE_GETRUSAGE
3743 struct rusage rusage;
3744
3745 getrusage(RUSAGE_SELF, &rusage);
3746 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3747#elif HAVE_GETPROCESSTIMES
3748 HANDLE proc;
3749 FILETIME c, e, k, u;
3750 proc = GetCurrentProcess();
3751 GetProcessTimes(proc, &c, &e, &k, &u);
3752 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3753#else
3754 return av_gettime();
3755#endif
3756}
3757
3758static int64_t getmaxrss(void)
3759{
3760#if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3761 struct rusage rusage;
3762 getrusage(RUSAGE_SELF, &rusage);
3763 return (int64_t)rusage.ru_maxrss * 1024;
3764#elif HAVE_GETPROCESSMEMORYINFO
3765 HANDLE proc;
3766 PROCESS_MEMORY_COUNTERS memcounters;
3767 proc = GetCurrentProcess();
3768 memcounters.cb = sizeof(memcounters);
3769 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3770 return memcounters.PeakPagefileUsage;
3771#else
3772 return 0;
3773#endif
3774}
3775
3776static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3777{
3778 int i;
3779 const char *p = str;
3780 for(i = 0;; i++) {
3781 dest[i] = atoi(p);
3782 if(i == 63)
3783 break;
3784 p = strchr(p, ',');
3785 if(!p) {
3786 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3787 exit_program(1);
3788 }
3789 p++;
3790 }
3791}
3792
3793static void opt_inter_matrix(const char *arg)
3794{
3795 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3796 parse_matrix_coeffs(inter_matrix, arg);
3797}
3798
3799static void opt_intra_matrix(const char *arg)
3800{
3801 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3802 parse_matrix_coeffs(intra_matrix, arg);
3803}
3804
3805static void show_usage(void)
3806{
3807 printf("Hyper fast Audio and Video encoder\n");
3808 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3809 printf("\n");
3810}
3811
3812static void show_help(void)
3813{
3814 AVCodec *c;
3815 AVOutputFormat *oformat = NULL;
3816 AVInputFormat *iformat = NULL;
3817
3818 av_log_set_callback(log_callback_help);
3819 show_usage();
3820 show_help_options(options, "Main options:\n",
3821 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3822 show_help_options(options, "\nAdvanced options:\n",
3823 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3824 OPT_EXPERT);
3825 show_help_options(options, "\nVideo options:\n",
3826 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3827 OPT_VIDEO);
3828 show_help_options(options, "\nAdvanced Video options:\n",
3829 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3830 OPT_VIDEO | OPT_EXPERT);
3831 show_help_options(options, "\nAudio options:\n",
3832 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3833 OPT_AUDIO);
3834 show_help_options(options, "\nAdvanced Audio options:\n",
3835 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3836 OPT_AUDIO | OPT_EXPERT);
3837 show_help_options(options, "\nSubtitle options:\n",
3838 OPT_SUBTITLE | OPT_GRAB,
3839 OPT_SUBTITLE);
3840 show_help_options(options, "\nAudio/Video grab options:\n",
3841 OPT_GRAB,
3842 OPT_GRAB);
3843 printf("\n");
3844 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3845 printf("\n");
3846
3847 /* individual codec options */
3848 c = NULL;
3849 while ((c = av_codec_next(c))) {
3850 if (c->priv_class) {
3851 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3852 printf("\n");
3853 }
3854 }
3855
3856 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3857 printf("\n");
3858
3859 /* individual muxer options */
3860 while ((oformat = av_oformat_next(oformat))) {
3861 if (oformat->priv_class) {
3862 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3863 printf("\n");
3864 }
3865 }
3866
3867 /* individual demuxer options */
3868 while ((iformat = av_iformat_next(iformat))) {
3869 if (iformat->priv_class) {
3870 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3871 printf("\n");
3872 }
3873 }
3874
3875 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3876}
3877
3878static int opt_target(const char *opt, const char *arg)
3879{
3880 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3881 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3882
3883 if(!strncmp(arg, "pal-", 4)) {
3884 norm = PAL;
3885 arg += 4;
3886 } else if(!strncmp(arg, "ntsc-", 5)) {
3887 norm = NTSC;
3888 arg += 5;
3889 } else if(!strncmp(arg, "film-", 5)) {
3890 norm = FILM;
3891 arg += 5;
3892 } else {
3893 int fr;
3894 /* Calculate FR via float to avoid int overflow */
3895 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3896 if(fr == 25000) {
3897 norm = PAL;
3898 } else if((fr == 29970) || (fr == 23976)) {
3899 norm = NTSC;
3900 } else {
3901 /* Try to determine PAL/NTSC by peeking in the input files */
3902 if(nb_input_files) {
3903 int i, j;
3904 for (j = 0; j < nb_input_files; j++) {
3905 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
3906 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3907 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3908 continue;
3909 fr = c->time_base.den * 1000 / c->time_base.num;
3910 if(fr == 25000) {
3911 norm = PAL;
3912 break;
3913 } else if((fr == 29970) || (fr == 23976)) {
3914 norm = NTSC;
3915 break;
3916 }
3917 }
3918 if(norm != UNKNOWN)
3919 break;
3920 }
3921 }
3922 }
3923 if(verbose > 0 && norm != UNKNOWN)
3924 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3925 }
3926
3927 if(norm == UNKNOWN) {
3928 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3929 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3930 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3931 exit_program(1);
3932 }
3933
3934 if(!strcmp(arg, "vcd")) {
92f1940e
AK
3935 opt_codec("c:v", "mpeg1video");
3936 opt_codec("c:a", "mp2");
6291d7e4
AK
3937 opt_format("f", "vcd");
3938
3939 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
3940 opt_frame_rate("r", frame_rates[norm]);
3941 opt_default("g", norm == PAL ? "15" : "18");
3942
3943 opt_default("b", "1150000");
3944 opt_default("maxrate", "1150000");
3945 opt_default("minrate", "1150000");
3946 opt_default("bufsize", "327680"); // 40*1024*8;
3947
64db1a82 3948 opt_default("b:a", "224000");
6291d7e4
AK
3949 audio_sample_rate = 44100;
3950 audio_channels = 2;
3951
3952 opt_default("packetsize", "2324");
3953 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3954
3955 /* We have to offset the PTS, so that it is consistent with the SCR.
3956 SCR starts at 36000, but the first two packs contain only padding
3957 and the first pack from the other stream, respectively, may also have
3958 been written before.
3959 So the real data starts at SCR 36000+3*1200. */
3960 mux_preload= (36000+3*1200) / 90000.0; //0.44
3961 } else if(!strcmp(arg, "svcd")) {
3962
92f1940e
AK
3963 opt_codec("c:v", "mpeg2video");
3964 opt_codec("c:a", "mp2");
6291d7e4
AK
3965 opt_format("f", "svcd");
3966
3967 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
3968 opt_frame_rate("r", frame_rates[norm]);
3969 opt_default("g", norm == PAL ? "15" : "18");
3970
3971 opt_default("b", "2040000");
3972 opt_default("maxrate", "2516000");
3973 opt_default("minrate", "0"); //1145000;
3974 opt_default("bufsize", "1835008"); //224*1024*8;
3975 opt_default("flags", "+scan_offset");
3976
3977
64db1a82 3978 opt_default("b:a", "224000");
6291d7e4
AK
3979 audio_sample_rate = 44100;
3980
3981 opt_default("packetsize", "2324");
3982
3983 } else if(!strcmp(arg, "dvd")) {
3984
92f1940e
AK
3985 opt_codec("c:v", "mpeg2video");
3986 opt_codec("c:a", "ac3");
6291d7e4
AK
3987 opt_format("f", "dvd");
3988
3989 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
3990 opt_frame_rate("r", frame_rates[norm]);
3991 opt_default("g", norm == PAL ? "15" : "18");
3992
3993 opt_default("b", "6000000");
3994 opt_default("maxrate", "9000000");
3995 opt_default("minrate", "0"); //1500000;
3996 opt_default("bufsize", "1835008"); //224*1024*8;
3997
3998 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3999 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4000
64db1a82 4001 opt_default("b:a", "448000");
6291d7e4
AK
4002 audio_sample_rate = 48000;
4003
4004 } else if(!strncmp(arg, "dv", 2)) {
4005
4006 opt_format("f", "dv");
4007
4008 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4009 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4010 norm == PAL ? "yuv420p" : "yuv411p");
4011 opt_frame_rate("r", frame_rates[norm]);
4012
4013 audio_sample_rate = 48000;
4014 audio_channels = 2;
4015
4016 } else {
4017 fprintf(stderr, "Unknown target: %s\n", arg);
4018 return AVERROR(EINVAL);
4019 }
4020 return 0;
4021}
4022
4023static int opt_vstats_file(const char *opt, const char *arg)
4024{
4025 av_free (vstats_filename);
4026 vstats_filename=av_strdup (arg);
4027 return 0;
4028}
4029
4030static int opt_vstats(const char *opt, const char *arg)
4031{
4032 char filename[40];
4033 time_t today2 = time(NULL);
4034 struct tm *today = localtime(&today2);
4035
4036 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4037 today->tm_sec);
4038 return opt_vstats_file(opt, filename);
4039}
4040
4041static int opt_bsf(const char *opt, const char *arg)
4042{
4043 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4044 AVBitStreamFilterContext **bsfp;
4045
4046 if(!bsfc){
4047 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4048 exit_program(1);
4049 }
4050
4051 bsfp= *opt == 'v' ? &video_bitstream_filters :
4052 *opt == 'a' ? &audio_bitstream_filters :
4053 &subtitle_bitstream_filters;
4054 while(*bsfp)
4055 bsfp= &(*bsfp)->next;
4056
4057 *bsfp= bsfc;
4058
4059 return 0;
4060}
4061
6291d7e4
AK
4062static const OptionDef options[] = {
4063 /* main options */
4064#include "cmdutils_common_opts.h"
4065 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4066 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4067 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
92f1940e
AK
4068 { "c", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },