ffmpeg.c 108 KB
Newer Older
Fabrice Bellard's avatar
Fabrice Bellard committed
1
/*
Fabrice Bellard's avatar
Fabrice Bellard committed
2
 * Copyright (c) 2000-2003 Fabrice Bellard
Fabrice Bellard's avatar
Fabrice Bellard committed
3
 *
4 5 6
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
7 8
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
Fabrice Bellard's avatar
Fabrice Bellard committed
10
 *
11
 * FFmpeg is distributed in the hope that it will be useful,
Fabrice Bellard's avatar
Fabrice Bellard committed
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
Fabrice Bellard's avatar
Fabrice Bellard committed
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with FFmpeg; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Fabrice Bellard's avatar
Fabrice Bellard committed
19
 */
20

21 22 23 24 25
/**
 * @file
 * multimedia converter based on the FFmpeg libraries
 */

26 27 28 29 30 31
#include "config.h"
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <errno.h>
32
#include <limits.h>
33
#if HAVE_ISATTY
34 35 36 37
#if HAVE_IO_H
#include <io.h>
#endif
#if HAVE_UNISTD_H
38
#include <unistd.h>
39
#endif
40
#endif
41 42 43
#include "libavformat/avformat.h"
#include "libavdevice/avdevice.h"
#include "libswscale/swscale.h"
44
#include "libswresample/swresample.h"
45
#include "libavutil/opt.h"
46 47 48
#include "libavutil/audioconvert.h"
#include "libavutil/parseutils.h"
#include "libavutil/samplefmt.h"
49
#include "libavutil/colorspace.h"
50
#include "libavutil/fifo.h"
51
#include "libavutil/intreadwrite.h"
52
#include "libavutil/dict.h"
53
#include "libavutil/mathematics.h"
54
#include "libavutil/pixdesc.h"
55
#include "libavutil/avstring.h"
56
#include "libavutil/libm.h"
57
#include "libavutil/imgutils.h"
58
#include "libavutil/timestamp.h"
59
#include "libavutil/bprint.h"
60
#include "libavutil/time.h"
61
#include "libavformat/os_support.h"
62

63 64
#include "libavformat/ffm.h" // not public API

65
# include "libavfilter/avcodec.h"
66 67
# include "libavfilter/avfilter.h"
# include "libavfilter/avfiltergraph.h"
68
# include "libavfilter/buffersrc.h"
69
# include "libavfilter/buffersink.h"
70

71
#if HAVE_SYS_RESOURCE_H
72
#include <sys/time.h>
73
#include <sys/types.h>
74
#include <sys/resource.h>
75
#elif HAVE_GETPROCESSTIMES
76 77
#include <windows.h>
#endif
78 79 80 81
#if HAVE_GETPROCESSMEMORYINFO
#include <windows.h>
#include <psapi.h>
#endif
82

83
#if HAVE_SYS_SELECT_H
84 85 86
#include <sys/select.h>
#endif

87 88 89 90 91 92
#if HAVE_TERMIOS_H
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <termios.h>
#elif HAVE_KBHIT
93
#include <conio.h>
Fabrice Bellard's avatar
Fabrice Bellard committed
94
#endif
95

96 97 98 99
#if HAVE_PTHREADS
#include <pthread.h>
#endif

100
#include <time.h>
Fabrice Bellard's avatar
Fabrice Bellard committed
101

102
#include "ffmpeg.h"
Fabrice Bellard's avatar
Fabrice Bellard committed
103 104
#include "cmdutils.h"

105
#include "libavutil/avassert.h"
106

107
const char program_name[] = "ffmpeg";
108
const int program_birth_year = 2000;
109

110
static FILE *vstats_file;
111

112
static void do_video_stats(OutputStream *ost, int frame_size);
113
static int64_t getutime(void);
114

115
static int run_as_daemon  = 0;
116 117
static int64_t video_size = 0;
static int64_t audio_size = 0;
118
static int64_t subtitle_size = 0;
119
static int64_t extra_size = 0;
120 121
static int nb_frames_dup = 0;
static int nb_frames_drop = 0;
122

123
static int current_time;
124
AVIOContext *progress_avio = NULL;
125

126 127
static uint8_t *subtitle_out;

128
#if HAVE_PTHREADS
129 130 131 132
/* signal to input threads that they should exit; set by the main thread */
static int transcoding_finished;
#endif

Stefano Sabatini's avatar
Stefano Sabatini committed
133
#define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
Fabrice Bellard's avatar
Fabrice Bellard committed
134

135 136 137 138
InputStream **input_streams = NULL;
int        nb_input_streams = 0;
InputFile   **input_files   = NULL;
int        nb_input_files   = 0;
139

140 141 142 143
OutputStream **output_streams = NULL;
int         nb_output_streams = 0;
OutputFile   **output_files   = NULL;
int         nb_output_files   = 0;
Fabrice Bellard's avatar
Fabrice Bellard committed
144

145 146
FilterGraph **filtergraphs;
int        nb_filtergraphs;
Fabrice Bellard's avatar
Fabrice Bellard committed
147

148 149 150 151
#if HAVE_TERMIOS_H

/* init terminal so that we can grab keys */
static struct termios oldtty;
152
static int restore_tty;
153 154
#endif

155

156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
/* sub2video hack:
   Convert subtitles to video with alpha to insert them in filter graphs.
   This is a temporary solution until libavfilter gets real subtitles support.
 */



static void sub2video_copy_rect(uint8_t *dst, int dst_linesize, int w, int h,
                                AVSubtitleRect *r)
{
    uint32_t *pal, *dst2;
    uint8_t *src, *src2;
    int x, y;

    if (r->type != SUBTITLE_BITMAP) {
        av_log(NULL, AV_LOG_WARNING, "sub2video: non-bitmap subtitle\n");
        return;
    }
    if (r->x < 0 || r->x + r->w > w || r->y < 0 || r->y + r->h > h) {
        av_log(NULL, AV_LOG_WARNING, "sub2video: rectangle overflowing\n");
        return;
    }

    dst += r->y * dst_linesize + r->x * 4;
    src = r->pict.data[0];
    pal = (uint32_t *)r->pict.data[1];
    for (y = 0; y < r->h; y++) {
        dst2 = (uint32_t *)dst;
        src2 = src;
        for (x = 0; x < r->w; x++)
            *(dst2++) = pal[*(src2++)];
        dst += dst_linesize;
        src += r->pict.linesize[0];
    }
}

static void sub2video_push_ref(InputStream *ist, int64_t pts)
{
    AVFilterBufferRef *ref = ist->sub2video.ref;
    int i;

    ist->sub2video.last_pts = ref->pts = pts;
    for (i = 0; i < ist->nb_filters; i++)
        av_buffersrc_add_ref(ist->filters[i]->filter,
                             avfilter_ref_buffer(ref, ~0),
                             AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT |
202 203
                             AV_BUFFERSRC_FLAG_NO_COPY |
                             AV_BUFFERSRC_FLAG_PUSH);
204 205
}

206
static void sub2video_update(InputStream *ist, AVSubtitle *sub)
207 208 209 210 211 212
{
    int w = ist->sub2video.w, h = ist->sub2video.h;
    AVFilterBufferRef *ref = ist->sub2video.ref;
    int8_t *dst;
    int     dst_linesize;
    int i;
213
    int64_t pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ist->st->time_base);
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261

    if (!ref)
        return;
    dst          = ref->data    [0];
    dst_linesize = ref->linesize[0];
    memset(dst, 0, h * dst_linesize);
    for (i = 0; i < sub->num_rects; i++)
        sub2video_copy_rect(dst, dst_linesize, w, h, sub->rects[i]);
    sub2video_push_ref(ist, pts);
}

static void sub2video_heartbeat(InputStream *ist, int64_t pts)
{
    InputFile *infile = input_files[ist->file_index];
    int i, j, nb_reqs;
    int64_t pts2;

    /* When a frame is read from a file, examine all sub2video streams in
       the same file and send the sub2video frame again. Otherwise, decoded
       video frames could be accumulating in the filter graph while a filter
       (possibly overlay) is desperately waiting for a subtitle frame. */
    for (i = 0; i < infile->nb_streams; i++) {
        InputStream *ist2 = input_streams[infile->ist_index + i];
        if (!ist2->sub2video.ref)
            continue;
        /* subtitles seem to be usually muxed ahead of other streams;
           if not, substracting a larger time here is necessary */
        pts2 = av_rescale_q(pts, ist->st->time_base, ist2->st->time_base) - 1;
        /* do not send the heartbeat frame if the subtitle is already ahead */
        if (pts2 <= ist2->sub2video.last_pts)
            continue;
        for (j = 0, nb_reqs = 0; j < ist2->nb_filters; j++)
            nb_reqs += av_buffersrc_get_nb_failed_requests(ist2->filters[j]->filter);
        if (nb_reqs)
            sub2video_push_ref(ist2, pts2);
    }
}

static void sub2video_flush(InputStream *ist)
{
    int i;

    for (i = 0; i < ist->nb_filters; i++)
        av_buffersrc_add_ref(ist->filters[i]->filter, NULL, 0);
}

/* end of sub2video hack */

262
void term_exit(void)
263
{
264 265 266 267 268
    av_log(NULL, AV_LOG_QUIET, "%s", "");
#if HAVE_TERMIOS_H
    if(restore_tty)
        tcsetattr (0, TCSANOW, &oldtty);
#endif
269
}
270

271
static volatile int received_sigterm = 0;
272
static volatile int received_nb_signals = 0;
273

274 275
static void
sigterm_handler(int sig)
276 277 278 279
{
    received_sigterm = sig;
    received_nb_signals++;
    term_exit();
280 281
    if(received_nb_signals > 3)
        exit(123);
282 283
}

284
void term_init(void)
285
{
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307
#if HAVE_TERMIOS_H
    if(!run_as_daemon){
        struct termios tty;
        int istty = 1;
#if HAVE_ISATTY
        istty = isatty(0) && isatty(2);
#endif
        if (istty && tcgetattr (0, &tty) == 0) {
            oldtty = tty;
            restore_tty = 1;
            atexit(term_exit);

            tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
                             |INLCR|IGNCR|ICRNL|IXON);
            tty.c_oflag |= OPOST;
            tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
            tty.c_cflag &= ~(CSIZE|PARENB);
            tty.c_cflag |= CS8;
            tty.c_cc[VMIN] = 1;
            tty.c_cc[VTIME] = 0;

            tcsetattr (0, TCSANOW, &tty);
308
        }
309
        signal(SIGQUIT, sigterm_handler); /* Quit (POSIX).  */
310
    }
311 312 313
#endif
    avformat_network_deinit();

Aneesh Dogra's avatar
Aneesh Dogra committed
314
    signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).    */
315 316 317 318
    signal(SIGTERM, sigterm_handler); /* Termination (ANSI).  */
#ifdef SIGXCPU
    signal(SIGXCPU, sigterm_handler);
#endif
319 320
}

321 322
/* read a key without blocking */
static int read_key(void)
323
{
324 325 326 327 328
    unsigned char ch;
#if HAVE_TERMIOS_H
    int n = 1;
    struct timeval tv;
    fd_set rfds;
329

330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350
    FD_ZERO(&rfds);
    FD_SET(0, &rfds);
    tv.tv_sec = 0;
    tv.tv_usec = 0;
    n = select(1, &rfds, NULL, NULL, &tv);
    if (n > 0) {
        n = read(0, &ch, 1);
        if (n == 1)
            return ch;

        return n;
    }
#elif HAVE_KBHIT
#    if HAVE_PEEKNAMEDPIPE
    static int is_pipe;
    static HANDLE input_handle;
    DWORD dw, nchars;
    if(!input_handle){
        input_handle = GetStdHandle(STD_INPUT_HANDLE);
        is_pipe = !GetConsoleMode(input_handle, &dw);
    }
351

352 353 354 355 356 357 358 359 360 361 362 363 364 365
    if (stdin->_cnt > 0) {
        read(0, &ch, 1);
        return ch;
    }
    if (is_pipe) {
        /* When running under a GUI, you will end here. */
        if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
            return -1;
        //Read it
        if(nchars != 0) {
            read(0, &ch, 1);
            return ch;
        }else{
            return -1;
366
        }
367 368 369 370 371 372
    }
#    endif
    if(kbhit())
        return(getch());
#endif
    return -1;
373 374
}

375
static int decode_interrupt_cb(void *ctx)
376 377
{
    return received_nb_signals > 1;
378 379
}

380
const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
381

382
static void exit_program(void)
383
{
384
    int i, j;
385

386 387
    for (i = 0; i < nb_filtergraphs; i++) {
        avfilter_graph_free(&filtergraphs[i]->graph);
388 389
        for (j = 0; j < filtergraphs[i]->nb_inputs; j++) {
            av_freep(&filtergraphs[i]->inputs[j]->name);
390
            av_freep(&filtergraphs[i]->inputs[j]);
391
        }
392
        av_freep(&filtergraphs[i]->inputs);
393 394
        for (j = 0; j < filtergraphs[i]->nb_outputs; j++) {
            av_freep(&filtergraphs[i]->outputs[j]->name);
395
            av_freep(&filtergraphs[i]->outputs[j]);
396
        }
397 398 399 400
        av_freep(&filtergraphs[i]->outputs);
        av_freep(&filtergraphs[i]);
    }
    av_freep(&filtergraphs);
401

402
    av_freep(&subtitle_out);
403

404
    /* close files */
Aneesh Dogra's avatar
Aneesh Dogra committed
405
    for (i = 0; i < nb_output_files; i++) {
406
        AVFormatContext *s = output_files[i]->ctx;
407 408 409
        if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
            avio_close(s->pb);
        avformat_free_context(s);
410 411
        av_dict_free(&output_files[i]->opts);
        av_freep(&output_files[i]);
412
    }
413
    for (i = 0; i < nb_output_streams; i++) {
414
        AVBitStreamFilterContext *bsfc = output_streams[i]->bitstream_filters;
415 416 417 418 419
        while (bsfc) {
            AVBitStreamFilterContext *next = bsfc->next;
            av_bitstream_filter_close(bsfc);
            bsfc = next;
        }
420
        output_streams[i]->bitstream_filters = NULL;
421
        avcodec_free_frame(&output_streams[i]->filtered_frame);
422

423
        av_freep(&output_streams[i]->forced_keyframes);
424
        av_freep(&output_streams[i]->avfilter);
425
        av_freep(&output_streams[i]->logfile_prefix);
426
        av_freep(&output_streams[i]);
427
    }
Aneesh Dogra's avatar
Aneesh Dogra committed
428
    for (i = 0; i < nb_input_files; i++) {
429 430
        avformat_close_input(&input_files[i]->ctx);
        av_freep(&input_files[i]);
431
    }
432
    for (i = 0; i < nb_input_streams; i++) {
433
        avcodec_free_frame(&input_streams[i]->decoded_frame);
434
        av_dict_free(&input_streams[i]->opts);
435
        free_buffer_pool(&input_streams[i]->buffer_pool);
436
        avfilter_unref_bufferp(&input_streams[i]->sub2video.ref);
437
        av_freep(&input_streams[i]->filters);
438
        av_freep(&input_streams[i]);
439
    }
440

441 442 443
    if (vstats_file)
        fclose(vstats_file);
    av_free(vstats_filename);
444

445 446
    av_freep(&input_streams);
    av_freep(&input_files);
447
    av_freep(&output_streams);
448
    av_freep(&output_files);
449

450
    uninit_opts();
451

452
    avfilter_uninit();
453
    avformat_network_deinit();
454

455
    if (received_sigterm) {
456 457
        av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
               (int) received_sigterm);
458 459
        exit (255);
    }
460 461
}

462
void assert_avoptions(AVDictionary *m)
463
{
464 465
    AVDictionaryEntry *t;
    if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
466
        av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
467
        exit(1);
468
    }
469
}
470

471
static void abort_codec_experimental(AVCodec *c, int encoder)
472
{
473
    exit(1);
474
}
475

476
static void update_benchmark(const char *fmt, ...)
477
{
478 479 480 481
    if (do_benchmark_all) {
        int64_t t = getutime();
        va_list va;
        char buf[1024];
482

483 484 485 486 487
        if (fmt) {
            va_start(va, fmt);
            vsnprintf(buf, sizeof(buf), fmt, va);
            va_end(va);
            printf("bench: %8"PRIu64" %s \n", t - current_time, buf);
488
        }
489
        current_time = t;
490 491 492
    }
}

493
static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
494
{
495 496
    AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
    AVCodecContext          *avctx = ost->st->codec;
497 498
    int ret;

499 500 501
    if ((avctx->codec_type == AVMEDIA_TYPE_VIDEO && video_sync_method == VSYNC_DROP) ||
        (avctx->codec_type == AVMEDIA_TYPE_AUDIO && audio_sync_method < 0))
        pkt->pts = pkt->dts = AV_NOPTS_VALUE;
502

503
    if ((avctx->codec_type == AVMEDIA_TYPE_AUDIO || avctx->codec_type == AVMEDIA_TYPE_VIDEO) && pkt->dts != AV_NOPTS_VALUE) {
504 505
        int64_t max = ost->st->cur_dts + !(s->oformat->flags & AVFMT_TS_NONSTRICT);
        if (ost->st->cur_dts && ost->st->cur_dts != AV_NOPTS_VALUE &&  max > pkt->dts) {
506
            av_log(s, max - pkt->dts > 2 || avctx->codec_type == AVMEDIA_TYPE_VIDEO ? AV_LOG_WARNING : AV_LOG_DEBUG,
rogerdpack's avatar
rogerdpack committed
507
                   "st:%d PTS: %"PRId64" DTS: %"PRId64" < %"PRId64" invalid, clipping\n", pkt->stream_index, pkt->pts, pkt->dts, max);
508 509 510
            if(pkt->pts >= pkt->dts)
                pkt->pts = FFMAX(pkt->pts, max);
            pkt->dts = max;
511
        }
512 513
    }

514 515 516 517 518 519 520 521
    /*
     * Audio encoders may split the packets --  #frames in != #packets out.
     * But there is no reordering, so we can limit the number of output packets
     * by simply dropping them here.
     * Counting encoded video frames needs to be done separately because of
     * reordering, see do_video_out()
     */
    if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) {
522 523
        if (ost->frame_number >= ost->max_frames) {
            av_free_packet(pkt);
524
            return;
525
        }
526
        ost->frame_number++;
527 528
    }

Aneesh Dogra's avatar
Aneesh Dogra committed
529 530 531 532 533 534
    while (bsfc) {
        AVPacket new_pkt = *pkt;
        int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
                                           &new_pkt.data, &new_pkt.size,
                                           pkt->data, pkt->size,
                                           pkt->flags & AV_PKT_FLAG_KEY);
535 536 537 538 539 540 541 542 543 544
        if(a == 0 && new_pkt.data != pkt->data && new_pkt.destruct) {
            uint8_t *t = av_malloc(new_pkt.size + FF_INPUT_BUFFER_PADDING_SIZE); //the new should be a subset of the old so cannot overflow
            if(t) {
                memcpy(t, new_pkt.data, new_pkt.size);
                memset(t + new_pkt.size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
                new_pkt.data = t;
                a = 1;
            } else
                a = AVERROR(ENOMEM);
        }
Aneesh Dogra's avatar
Aneesh Dogra committed
545
        if (a > 0) {
546
            av_free_packet(pkt);
Aneesh Dogra's avatar
Aneesh Dogra committed
547 548
            new_pkt.destruct = av_destruct_packet;
        } else if (a < 0) {
549
            av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
550 551
                   bsfc->filter->name, pkt->stream_index,
                   avctx->codec ? avctx->codec->name : "copy");
552 553
            print_error("", a);
            if (exit_on_error)
554
                exit(1);
555
        }
Aneesh Dogra's avatar
Aneesh Dogra committed
556
        *pkt = new_pkt;
557

Aneesh Dogra's avatar
Aneesh Dogra committed
558
        bsfc = bsfc->next;
559 560
    }

561
    pkt->stream_index = ost->index;
562 563 564

    if (debug_ts) {
        av_log(NULL, AV_LOG_INFO, "muxer <- type:%s "
565
                "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s size:%d\n",
566 567
                av_get_media_type_string(ost->st->codec->codec_type),
                av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &ost->st->time_base),
568 569
                av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &ost->st->time_base),
                pkt->size
570 571 572
              );
    }

Aneesh Dogra's avatar
Aneesh Dogra committed
573 574
    ret = av_interleaved_write_frame(s, pkt);
    if (ret < 0) {
575
        print_error("av_interleaved_write_frame()", ret);
576
        exit(1);
577
    }
578 579
}

580 581 582 583 584 585 586 587 588 589 590 591
static void close_output_stream(OutputStream *ost)
{
    OutputFile *of = output_files[ost->file_index];

    ost->finished = 1;
    if (of->shortest) {
        int i;
        for (i = 0; i < of->ctx->nb_streams; i++)
            output_streams[of->ost_index + i]->finished = 1;
    }
}

592
static int check_recording_time(OutputStream *ost)
593
{
594
    OutputFile *of = output_files[ost->file_index];
595

596 597 598
    if (of->recording_time != INT64_MAX &&
        av_compare_ts(ost->sync_opts - ost->first_pts, ost->st->codec->time_base, of->recording_time,
                      AV_TIME_BASE_Q) >= 0) {
599
        close_output_stream(ost);
600
        return 0;
601
    }
602 603
    return 1;
}
604

605 606
static void do_audio_out(AVFormatContext *s, OutputStream *ost,
                         AVFrame *frame)
607 608 609
{
    AVCodecContext *enc = ost->st->codec;
    AVPacket pkt;
610
    int got_packet = 0;
611

612 613 614
    av_init_packet(&pkt);
    pkt.data = NULL;
    pkt.size = 0;
615

616 617
    if (!check_recording_time(ost))
        return;
618

619
    if (frame->pts == AV_NOPTS_VALUE || audio_sync_method < 0)
620
        frame->pts = ost->sync_opts;
621
    ost->sync_opts = frame->pts + frame->nb_samples;
622

623 624
    av_assert0(pkt.size || !pkt.data);
    update_benchmark(NULL);
625
    if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
626
        av_log(NULL, AV_LOG_FATAL, "Audio encoding failed (avcodec_encode_audio2)\n");
627
        exit(1);
628
    }
629
    update_benchmark("encode_audio %d.%d", ost->file_index, ost->index);
630

631 632 633
    if (got_packet) {
        if (pkt.pts != AV_NOPTS_VALUE)
            pkt.pts      = av_rescale_q(pkt.pts,      enc->time_base, ost->st->time_base);
634 635
        if (pkt.dts != AV_NOPTS_VALUE)
            pkt.dts      = av_rescale_q(pkt.dts,      enc->time_base, ost->st->time_base);
636 637
        if (pkt.duration > 0)
            pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
638

639 640 641 642 643 644
        if (debug_ts) {
            av_log(NULL, AV_LOG_INFO, "encoder -> type:audio "
                   "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
                   av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
                   av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
        }
645

646
        audio_size += pkt.size;
647
        write_frame(s, &pkt, ost);
648

649
        av_free_packet(&pkt);
650 651 652
    }
}

653
static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
654
{
655 656 657 658
    AVCodecContext *dec;
    AVPicture *picture2;
    AVPicture picture_tmp;
    uint8_t *buf = 0;
659

660
    dec = ist->st->codec;
661

662 663 664
    /* deinterlace : must be done before any resize */
    if (do_deinterlace) {
        int size;
665

666 667
        /* create temporary picture */
        size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
668 669
        if (size < 0)
            return;
Aneesh Dogra's avatar
Aneesh Dogra committed
670
        buf  = av_malloc(size);
671 672
        if (!buf)
            return;
673

674 675
        picture2 = &picture_tmp;
        avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
676

Aneesh Dogra's avatar
Aneesh Dogra committed
677
        if (avpicture_deinterlace(picture2, picture,
678 679
                                 dec->pix_fmt, dec->width, dec->height) < 0) {
            /* if error, do not deinterlace */
680
            av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
681 682 683 684 685 686
            av_free(buf);
            buf = NULL;
            picture2 = picture;
        }
    } else {
        picture2 = picture;
687 688
    }

689 690 691
    if (picture != picture2)
        *picture = *picture2;
    *bufp = buf;
692 693
}

694 695 696
static void do_subtitle_out(AVFormatContext *s,
                            OutputStream *ost,
                            InputStream *ist,
697
                            AVSubtitle *sub)
698
{
699 700 701 702
    int subtitle_out_max_size = 1024 * 1024;
    int subtitle_out_size, nb, i;
    AVCodecContext *enc;
    AVPacket pkt;
703
    int64_t pts;
704

705
    if (sub->pts == AV_NOPTS_VALUE) {
706
        av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
707
        if (exit_on_error)
708
            exit(1);
709
        return;
710
    }
711

712
    enc = ost->st->codec;
713

714 715
    if (!subtitle_out) {
        subtitle_out = av_malloc(subtitle_out_max_size);
716 717
    }

718 719 720
    /* Note: DVB subtitle need one packet to draw them and one other
       packet to clear them */
    /* XXX: signal it in the codec context ? */
721
    if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE)
722 723 724
        nb = 2;
    else
        nb = 1;
725

726
    /* shift timestamp to honor -ss and make check_recording_time() work with -t */
727
    pts = sub->pts - output_files[ost->file_index]->start_time;
Aneesh Dogra's avatar
Aneesh Dogra committed
728
    for (i = 0; i < nb; i++) {
729
        ost->sync_opts = av_rescale_q(pts, AV_TIME_BASE_Q, enc->time_base);
730 731
        if (!check_recording_time(ost))
            return;
732

733
        sub->pts = pts;
734
        // start_display_time is required to be 0
Aneesh Dogra's avatar
Aneesh Dogra committed
735 736
        sub->pts               += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
        sub->end_display_time  -= sub->start_display_time;
737
        sub->start_display_time = 0;
738 739
        if (i == 1)
            sub->num_rects = 0;
740 741 742
        subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
                                                    subtitle_out_max_size, sub);
        if (subtitle_out_size < 0) {
743
            av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
744
            exit(1);
745 746 747 748 749
        }

        av_init_packet(&pkt);
        pkt.data = subtitle_out;
        pkt.size = subtitle_out_size;
Aneesh Dogra's avatar
Aneesh Dogra committed
750
        pkt.pts  = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
751
        pkt.duration = av_rescale_q(sub->end_display_time, (AVRational){ 1, 1000 }, ost->st->time_base);
752
        if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE) {
753 754 755 756 757 758 759
            /* XXX: the pts correction is handled here. Maybe handling
               it in the codec would be better */
            if (i == 0)
                pkt.pts += 90 * sub->start_display_time;
            else
                pkt.pts += 90 * sub->end_display_time;
        }
760
        subtitle_size += pkt.size;
761
        write_frame(s, &pkt, ost);
762
    }
763
}
764

765 766
static void do_video_out(AVFormatContext *s,
                         OutputStream *ost,
767
                         AVFrame *in_picture)
768
{
769 770 771
    int ret, format_video_sync;
    AVPacket pkt;
    AVCodecContext *enc = ost->st->codec;
772 773 774 775 776
    int nb_frames, i;
    double sync_ipts, delta;
    double duration = 0;
    int frame_size = 0;
    InputStream *ist = NULL;
777

778 779
    if (ost->source_index >= 0)
        ist = input_streams[ost->source_index];
780

781 782
    if(ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE && ost->frame_rate.num)
        duration = 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base));
783

784 785
    sync_ipts = in_picture->pts;
    delta = sync_ipts - ost->sync_opts + duration;
786

787 788
    /* by default, we output a single frame */
    nb_frames = 1;
789

790
    format_video_sync = video_sync_method;
791
    if (format_video_sync == VSYNC_AUTO)
792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817
        format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;

    switch (format_video_sync) {
    case VSYNC_CFR:
        // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
        if (delta < -1.1)
            nb_frames = 0;
        else if (delta > 1.1)
            nb_frames = lrintf(delta);
        break;
    case VSYNC_VFR:
        if (delta <= -0.6)
            nb_frames = 0;
        else if (delta > 0.6)
            ost->sync_opts = lrint(sync_ipts);
        break;
    case VSYNC_DROP:
    case VSYNC_PASSTHROUGH:
        ost->sync_opts = lrint(sync_ipts);
        break;
    default:
        av_assert0(0);
    }

    nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
    if (nb_frames == 0) {
818 819
        nb_frames_drop++;
        av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
820
        return;
821 822
    } else if (nb_frames > 1) {
        if (nb_frames > dts_error_threshold * 30) {
823
            av_log(NULL, AV_LOG_ERROR, "%d frame duplication too large, skipping\n", nb_frames - 1);
824 825
            nb_frames_drop++;
            return;
826
        }
827 828
        nb_frames_dup += nb_frames - 1;
        av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
829 830
    }

831 832
  /* duplicates frame if needed */
  for (i = 0; i < nb_frames; i++) {
Anton Khirnov's avatar
Anton Khirnov committed
833 834 835
    av_init_packet(&pkt);
    pkt.data = NULL;
    pkt.size = 0;
836

837
    in_picture->pts = ost->sync_opts;
838

839
    if (!check_recording_time(ost))
Anton Khirnov's avatar
Anton Khirnov committed
840
        return;
841

Anton Khirnov's avatar
Anton Khirnov committed
842
    if (s->oformat->flags & AVFMT_RAWPICTURE &&
843
        enc->codec->id == AV_CODEC_ID_RAWVIDEO) {
Anton Khirnov's avatar
Anton Khirnov committed
844 845 846 847 848 849 850 851 852
        /* raw pictures are written as AVPicture structure to
           avoid any copies. We support temporarily the older
           method. */
        enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
        enc->coded_frame->top_field_first  = in_picture->top_field_first;
        pkt.data   = (uint8_t *)in_picture;
        pkt.size   =  sizeof(AVPicture);
        pkt.pts    = av_rescale_q(in_picture->pts, enc->time_base, ost->st->time_base);
        pkt.flags |= AV_PKT_FLAG_KEY;
853

854
        video_size += pkt.size;
855
        write_frame(s, &pkt, ost);
Anton Khirnov's avatar
Anton Khirnov committed
856 857 858
    } else {
        int got_packet;
        AVFrame big_picture;
Fabrice Bellard's avatar
Fabrice Bellard committed
859

Anton Khirnov's avatar
Anton Khirnov committed
860 861 862 863 864 865 866 867 868 869
        big_picture = *in_picture;
        /* better than nothing: use input picture interlaced
           settings */
        big_picture.interlaced_frame = in_picture->interlaced_frame;
        if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
            if (ost->top_field_first == -1)
                big_picture.top_field_first = in_picture->top_field_first;
            else
                big_picture.top_field_first = !!ost->top_field_first;
        }
870

871
        big_picture.quality = ost->st->codec->global_quality;
Anton Khirnov's avatar
Anton Khirnov committed
872 873 874 875 876 877 878
        if (!enc->me_threshold)
            big_picture.pict_type = 0;
        if (ost->forced_kf_index < ost->forced_kf_count &&
            big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
            big_picture.pict_type = AV_PICTURE_TYPE_I;
            ost->forced_kf_index++;
        }
879
        update_benchmark(NULL);
Anton Khirnov's avatar
Anton Khirnov committed
880
        ret = avcodec_encode_video2(enc, &pkt, &big_picture, &got_packet);
881
        update_benchmark("encode_video %d.%d", ost->file_index, ost->index);
Anton Khirnov's avatar
Anton Khirnov committed
882 883
        if (ret < 0) {
            av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
884
            exit(1);
Anton Khirnov's avatar
Anton Khirnov committed
885
        }
886

Anton Khirnov's avatar
Anton Khirnov committed
887
        if (got_packet) {
888 889
            if (pkt.pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & CODEC_CAP_DELAY))
                pkt.pts = ost->sync_opts;
890

Anton Khirnov's avatar
Anton Khirnov committed
891 892 893 894
            if (pkt.pts != AV_NOPTS_VALUE)
                pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
            if (pkt.dts != AV_NOPTS_VALUE)
                pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
895

896 897 898 899 900 901 902 903
            if (debug_ts) {
                av_log(NULL, AV_LOG_INFO, "encoder -> type:video "
                    "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
                    av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
                    av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
            }

            frame_size = pkt.size;
Anton Khirnov's avatar
Anton Khirnov committed
904
            video_size += pkt.size;
905
            write_frame(s, &pkt, ost);
906
            av_free_packet(&pkt);
907

Anton Khirnov's avatar
Anton Khirnov committed
908 909 910
            /* if two pass, output log */
            if (ost->logfile && enc->stats_out) {
                fprintf(ost->logfile, "%s", enc->stats_out);
911
            }
912
        }
913
    }
Anton Khirnov's avatar
Anton Khirnov committed
914 915 916 917 918 919 920
    ost->sync_opts++;
    /*
     * For video, number of frames in == number of packets out.
     * But there may be reordering, so we can't throw away frames on encoder
     * flush, we need to limit them here, before they go into encoder.
     */
    ost->frame_number++;
921
  }
922

923
    if (vstats_filename && frame_size)
924
        do_video_stats(ost, frame_size);
Fabrice Bellard's avatar
Fabrice Bellard committed
925 926
}

Aneesh Dogra's avatar
Aneesh Dogra committed
927
static double psnr(double d)
Fabrice Bellard's avatar
Fabrice Bellard committed
928
{
Aneesh Dogra's avatar
Aneesh Dogra committed
929
    return -10.0 * log(d) / log(10.0);
930
}
931

932
static void do_video_stats(OutputStream *ost, int frame_size)
933
{
934 935 936
    AVCodecContext *enc;
    int frame_number;
    double ti1, bitrate, avg_bitrate;
937

938 939 940 941 942
    /* this is executed just the first time do_video_stats is called */
    if (!vstats_file) {
        vstats_file = fopen(vstats_filename, "w");
        if (!vstats_file) {
            perror("fopen");
943
            exit(1);
944
        }
945
    }
946

947 948 949
    enc = ost->st->codec;
    if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
        frame_number = ost->frame_number;
Aneesh Dogra's avatar
Aneesh Dogra committed
950
        fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
951
        if (enc->flags&CODEC_FLAG_PSNR)
Aneesh Dogra's avatar
Aneesh Dogra committed
952
            fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
953

954 955 956 957 958
        fprintf(vstats_file,"f_size= %6d ", frame_size);
        /* compute pts value */
        ti1 = ost->sync_opts * av_q2d(enc->time_base);
        if (ti1 < 0.01)
            ti1 = 0.01;
959

Aneesh Dogra's avatar
Aneesh Dogra committed
960
        bitrate     = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
961 962
        avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
        fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
Aneesh Dogra's avatar
Aneesh Dogra committed
963
               (double)video_size / 1024, ti1, bitrate, avg_bitrate);
964
        fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
965
    }
966
}
967

968
/*
969 970 971 972 973 974
 * Get and encode new output from any of the filtergraphs, without causing
 * activity.
 *
 * @return  0 for success, <0 for severe errors
 */
static int reap_filters(void)
975 976 977
{
    AVFilterBufferRef *picref;
    AVFrame *filtered_frame = NULL;
978
    int i;
979
    int64_t frame_pts;
980

981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004
    /* Reap all buffers present in the buffer sinks */
    for (i = 0; i < nb_output_streams; i++) {
        OutputStream *ost = output_streams[i];
        OutputFile    *of = output_files[ost->file_index];
        int ret = 0;

        if (!ost->filter)
            continue;

        if (!ost->filtered_frame && !(ost->filtered_frame = avcodec_alloc_frame())) {
            return AVERROR(ENOMEM);
        } else
            avcodec_get_frame_defaults(ost->filtered_frame);
        filtered_frame = ost->filtered_frame;

        while (1) {
            ret = av_buffersink_get_buffer_ref(ost->filter->filter, &picref,
                                               AV_BUFFERSINK_FLAG_NO_REQUEST);
            if (ret < 0) {
                if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) {
                    char buf[256];
                    av_strerror(ret, buf, sizeof(buf));
                    av_log(NULL, AV_LOG_WARNING,
                           "Error in av_buffersink_get_buffer_ref(): %s\n", buf);
1005
                }
1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
                break;
            }
            frame_pts = AV_NOPTS_VALUE;
            if (picref->pts != AV_NOPTS_VALUE) {
                filtered_frame->pts = frame_pts = av_rescale_q(picref->pts,
                                                ost->filter->filter->inputs[0]->time_base,
                                                ost->st->codec->time_base) -
                                    av_rescale_q(of->start_time,
                                                AV_TIME_BASE_Q,
                                                ost->st->codec->time_base);

                if (of->start_time && filtered_frame->pts < 0) {
                    avfilter_unref_buffer(picref);
                    continue;
1020
                }
1021
            }
1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032
            //if (ost->source_index >= 0)
            //    *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold


            switch (ost->filter->filter->inputs[0]->type) {
            case AVMEDIA_TYPE_VIDEO:
                avfilter_copy_buf_props(filtered_frame, picref);
                filtered_frame->pts = frame_pts;
                if (!ost->frame_aspect_ratio)
                    ost->st->codec->sample_aspect_ratio = picref->video->sample_aspect_ratio;

1033
                do_video_out(of->ctx, ost, filtered_frame);
1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045
                break;
            case AVMEDIA_TYPE_AUDIO:
                avfilter_copy_buf_props(filtered_frame, picref);
                filtered_frame->pts = frame_pts;
                do_audio_out(of->ctx, ost, filtered_frame);
                break;
            default:
                // TODO support subtitle filters
                av_assert0(0);
            }

            avfilter_unref_buffer(picref);
1046
        }
1047
    }
1048 1049

    return 0;
1050 1051
}

1052
static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time)
1053
{
1054
    char buf[1024];
1055
    AVBPrint buf_script;
1056 1057 1058 1059 1060
    OutputStream *ost;
    AVFormatContext *oc;
    int64_t total_size;
    AVCodecContext *enc;
    int frame_number, vid, i;
1061
    double bitrate;
1062
    int64_t pts = INT64_MIN;
1063 1064
    static int64_t last_time = -1;
    static int qp_histogram[52];
1065
    int hours, mins, secs, us;
1066

1067
    if (!print_stats && !is_last_report && !progress_avio)
1068
        return;
1069

1070 1071 1072
    if (!is_last_report) {
        if (last_time == -1) {
            last_time = cur_time;
1073
            return;
Ramiro Polla's avatar
Ramiro Polla committed
1074
        }
1075 1076 1077
        if ((cur_time - last_time) < 500000)
            return;
        last_time = cur_time;
1078 1079
    }

1080

1081
    oc = output_files[0]->ctx;
1082

1083
    total_size = avio_size(oc->pb);
1084
    if (total_size <= 0) // FIXME improve avio_size() so it works with non seekable output too
Aneesh Dogra's avatar
Aneesh Dogra committed
1085
        total_size = avio_tell(oc->pb);
1086 1087 1088 1089 1090 1091
    if (total_size < 0) {
        char errbuf[128];
        av_strerror(total_size, errbuf, sizeof(errbuf));
        av_log(NULL, AV_LOG_VERBOSE, "Bitrate not available, "
               "avio_tell() failed: %s\n", errbuf);
        total_size = 0;
1092 1093
    }

1094 1095
    buf[0] = '\0';
    vid = 0;
1096
    av_bprint_init(&buf_script, 0, 1);
1097
    for (i = 0; i < nb_output_streams; i++) {
1098
        float q = -1;
1099
        ost = output_streams[i];
1100
        enc = ost->st->codec;
1101
        if (!ost->stream_copy && enc->coded_frame)
Aneesh Dogra's avatar
Aneesh Dogra committed
1102
            q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
1103 1104
        if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
            snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1105 1106
            av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
                       ost->file_index, ost->index, q);
1107
        }
1108
        if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1109
            float fps, t = (cur_time-timer_start) / 1000000.0;
1110

1111
            frame_number = ost->frame_number;
1112 1113 1114 1115 1116 1117 1118
            fps = t > 1 ? frame_number / t : 0;
            snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3.*f q=%3.1f ",
                     frame_number, fps < 9.95, fps, q);
            av_bprintf(&buf_script, "frame=%d\n", frame_number);
            av_bprintf(&buf_script, "fps=%.1f\n", fps);
            av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
                       ost->file_index, ost->index, q);
Aneesh Dogra's avatar
Aneesh Dogra committed
1119
            if (is_last_report)
1120
                snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
Aneesh Dogra's avatar
Aneesh Dogra committed
1121
            if (qp_hist) {
1122 1123
                int j;
                int qp = lrintf(q);
Aneesh Dogra's avatar
Aneesh Dogra committed
1124
                if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
1125
                    qp_histogram[qp]++;
Aneesh Dogra's avatar
Aneesh Dogra committed
1126
                for (j = 0; j < 32; j++)
1127
                    snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log2(qp_histogram[j] + 1)));
Fabrice Bellard's avatar
Fabrice Bellard committed
1128
            }
1129
            if ((enc->flags&CODEC_FLAG_PSNR) && (enc->coded_frame || is_last_report)) {
1130
                int j;
Aneesh Dogra's avatar
Aneesh Dogra committed
1131 1132
                double error, error_sum = 0;
                double scale, scale_sum = 0;
1133
                double p;
Aneesh Dogra's avatar
Aneesh Dogra committed
1134
                char type[3] = { 'Y','U','V' };
1135
                snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
Aneesh Dogra's avatar
Aneesh Dogra committed
1136 1137 1138 1139 1140 1141 1142
                for (j = 0; j < 3; j++) {
                    if (is_last_report) {
                        error = enc->error[j];
                        scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
                    } else {
                        error = enc->coded_frame->error[j];
                        scale = enc->width * enc->height * 255.0 * 255.0;
1143
                    }
Aneesh Dogra's avatar
Aneesh Dogra committed
1144 1145
                    if (j)
                        scale /= 4;
1146 1147
                    error_sum += error;
                    scale_sum += scale;
1148 1149 1150 1151
                    p = psnr(error / scale);
                    snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], p);
                    av_bprintf(&buf_script, "stream_%d_%d_psnr_%c=%2.2f\n",
                               ost->file_index, ost->index, type[i] | 32, p);
1152
                }
1153
                p = psnr(error_sum / scale_sum);
Aneesh Dogra's avatar
Aneesh Dogra committed
1154
                snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
1155 1156
                av_bprintf(&buf_script, "stream_%d_%d_psnr_all=%2.2f\n",
                           ost->file_index, ost->index, p);
1157 1158
            }
            vid = 1;
Fabrice Bellard's avatar
Fabrice Bellard committed
1159
        }
1160
        /* compute min output value */
1161
        if ((is_last_report || !ost->finished) && ost->st->pts.val != AV_NOPTS_VALUE)
1162 1163
            pts = FFMAX(pts, av_rescale_q(ost->st->pts.val,
                                          ost->st->time_base, AV_TIME_BASE_Q));
Fabrice Bellard's avatar
Fabrice Bellard committed
1164 1165
    }

1166 1167 1168 1169 1170 1171
    secs = pts / AV_TIME_BASE;
    us = pts % AV_TIME_BASE;
    mins = secs / 60;
    secs %= 60;
    hours = mins / 60;
    mins %= 60;
1172

1173
    bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1174

1175
    snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1176 1177 1178 1179 1180 1181 1182 1183 1184 1185
             "size=%8.0fkB time=", total_size / 1024.0);
    snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
             "%02d:%02d:%02d.%02d ", hours, mins, secs,
             (100 * us) / AV_TIME_BASE);
    snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
             "bitrate=%6.1fkbits/s", bitrate);
    av_bprintf(&buf_script, "total_size=%"PRId64"\n", total_size);
    av_bprintf(&buf_script, "out_time_ms=%"PRId64"\n", pts);
    av_bprintf(&buf_script, "out_time=%02d:%02d:%02d.%06d\n",
               hours, mins, secs, us);
1186

1187 1188 1189
    if (nb_frames_dup || nb_frames_drop)
        snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
                nb_frames_dup, nb_frames_drop);
1190 1191
    av_bprintf(&buf_script, "dup_frames=%d\n", nb_frames_dup);
    av_bprintf(&buf_script, "drop_frames=%d\n", nb_frames_drop);
1192

1193
    if (print_stats || is_last_report) {
1194
    av_log(NULL, AV_LOG_INFO, "%s    \r", buf);
1195

1196
    fflush(stderr);
Fabrice Bellard's avatar
Fabrice Bellard committed
1197 1198
    }

1199 1200 1201 1202 1203 1204 1205 1206 1207 1208
    if (progress_avio) {
        av_bprintf(&buf_script, "progress=%s\n",
                   is_last_report ? "end" : "continue");
        avio_write(progress_avio, buf_script.str,
                   FFMIN(buf_script.len, buf_script.size - 1));
        avio_flush(progress_avio);
        av_bprint_finalize(&buf_script, NULL);
        if (is_last_report) {
            avio_close(progress_avio);
            progress_avio = NULL;
1209 1210
        }
    }
1211

1212
    if (is_last_report) {
1213
        int64_t raw= audio_size + video_size + subtitle_size + extra_size;
1214
        av_log(NULL, AV_LOG_INFO, "\n");
1215
        av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB subtitle:%1.0f global headers:%1.0fkB muxing overhead %f%%\n",
Aneesh Dogra's avatar
Aneesh Dogra committed
1216 1217
               video_size / 1024.0,
               audio_size / 1024.0,
1218
               subtitle_size / 1024.0,
Aneesh Dogra's avatar
Aneesh Dogra committed
1219 1220
               extra_size / 1024.0,
               100.0 * (total_size - raw) / raw
1221
        );
1222 1223 1224
        if(video_size + audio_size + subtitle_size + extra_size == 0){
            av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
        }
1225
    }
1226
}
1227

1228
static void flush_encoders(void)
1229 1230
{
    int i, ret;
1231

1232
    for (i = 0; i < nb_output_streams; i++) {
1233
        OutputStream   *ost = output_streams[i];
1234
        AVCodecContext *enc = ost->st->codec;
1235
        AVFormatContext *os = output_files[ost->file_index]->ctx;
1236
        int stop_encoding = 0;
1237

1238
        if (!ost->encoding_needed)
1239 1240
            continue;

Aneesh Dogra's avatar
Aneesh Dogra committed
1241
        if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
1242
            continue;
1243
        if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == AV_CODEC_ID_RAWVIDEO)
1244 1245
            continue;

Aneesh Dogra's avatar
Aneesh Dogra committed
1246
        for (;;) {
1247 1248 1249
            int (*encode)(AVCodecContext*, AVPacket*, const AVFrame*, int*) = NULL;
            const char *desc;
            int64_t *size;
1250 1251 1252

            switch (ost->st->codec->codec_type) {
            case AVMEDIA_TYPE_AUDIO:
1253 1254 1255
                encode = avcodec_encode_audio2;
                desc   = "Audio";
                size   = &audio_size;
1256 1257
                break;
            case AVMEDIA_TYPE_VIDEO:
1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272
                encode = avcodec_encode_video2;
                desc   = "Video";
                size   = &video_size;
                break;
            default:
                stop_encoding = 1;
            }

            if (encode) {
                AVPacket pkt;
                int got_packet;
                av_init_packet(&pkt);
                pkt.data = NULL;
                pkt.size = 0;

1273
                update_benchmark(NULL);
1274
                ret = encode(enc, &pkt, NULL, &got_packet);
1275
                update_benchmark("flush %s %d.%d", desc, ost->file_index, ost->index);
1276
                if (ret < 0) {
1277
                    av_log(NULL, AV_LOG_FATAL, "%s encoding failed\n", desc);
1278
                    exit(1);
1279
                }
1280
                *size += pkt.size;
1281 1282 1283
                if (ost->logfile && enc->stats_out) {
                    fprintf(ost->logfile, "%s", enc->stats_out);
                }
1284
                if (!got_packet) {
1285 1286 1287
                    stop_encoding = 1;
                    break;
                }
1288 1289 1290 1291
                if (pkt.pts != AV_NOPTS_VALUE)
                    pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
                if (pkt.dts != AV_NOPTS_VALUE)
                    pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1292 1293
                if (pkt.duration > 0)
                    pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
1294
                write_frame(os, &pkt, ost);
1295
            }
1296

1297
            if (stop_encoding)
1298
                break;
1299 1300
        }
    }
1301
}
1302

1303 1304 1305 1306 1307
/*
 * Check whether a packet from ist should be written into ost at this time
 */
static int check_output_constraints(InputStream *ist, OutputStream *ost)
{
1308 1309
    OutputFile *of = output_files[ost->file_index];
    int ist_index  = input_files[ist->file_index]->ist_index + ist->st->index;
1310

1311 1312
    if (ost->source_index != ist_index)
        return 0;
1313

1314
    if (of->start_time && ist->pts < of->start_time)
1315
        return 0;
1316

1317 1318
    return 1;
}
1319

1320 1321
static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
{
1322
    OutputFile *of = output_files[ost->file_index];
1323
    int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1324
    AVPicture pict;
1325
    AVPacket opkt;
1326

1327 1328 1329 1330 1331 1332
    av_init_packet(&opkt);

    if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
        !ost->copy_initial_nonkeyframes)
        return;

1333 1334 1335 1336
    if (!ost->frame_number && ist->pts < of->start_time &&
        !ost->copy_prior_start)
        return;

1337
    if (of->recording_time != INT64_MAX &&
1338
        ist->pts >= of->recording_time + of->start_time) {
1339
        close_output_stream(ost);
1340
        return;
1341 1342
    }

1343 1344 1345 1346 1347 1348
    /* force the input stream PTS */
    if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
        audio_size += pkt->size;
    else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
        video_size += pkt->size;
        ost->sync_opts++;
1349 1350
    } else if (ost->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
        subtitle_size += pkt->size;
Fabrice Bellard's avatar
Fabrice Bellard committed
1351 1352
    }

1353 1354 1355 1356
    if (pkt->pts != AV_NOPTS_VALUE)
        opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
    else
        opkt.pts = AV_NOPTS_VALUE;
1357

1358
    if (pkt->dts == AV_NOPTS_VALUE)
1359
        opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->st->time_base);
1360 1361 1362
    else
        opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
    opkt.dts -= ost_tb_start_time;
1363

1364 1365 1366 1367 1368 1369 1370 1371 1372
    if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->dts != AV_NOPTS_VALUE) {
        int duration = av_get_audio_frame_duration(ist->st->codec, pkt->size);
        if(!duration)
            duration = ist->st->codec->frame_size;
        opkt.dts = opkt.pts = av_rescale_delta(ist->st->time_base, pkt->dts,
                                               (AVRational){1, ist->st->codec->sample_rate}, duration, &ist->filter_in_rescale_delta_last,
                                               ost->st->time_base);
    }

1373 1374
    opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
    opkt.flags    = pkt->flags;
1375

Aneesh Dogra's avatar
Aneesh Dogra committed
1376
    // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1377 1378 1379 1380
    if (  ost->st->codec->codec_id != AV_CODEC_ID_H264
       && ost->st->codec->codec_id != AV_CODEC_ID_MPEG1VIDEO
       && ost->st->codec->codec_id != AV_CODEC_ID_MPEG2VIDEO
       && ost->st->codec->codec_id != AV_CODEC_ID_VC1
1381 1382 1383 1384 1385 1386
       ) {
        if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
            opkt.destruct = av_destruct_packet;
    } else {
        opkt.data = pkt->data;
        opkt.size = pkt->size;
1387 1388
    }

1389 1390 1391 1392 1393 1394 1395
    if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (of->ctx->oformat->flags & AVFMT_RAWPICTURE)) {
        /* store AVPicture in AVPacket, as expected by the output format */
        avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
        opkt.data = (uint8_t *)&pict;
        opkt.size = sizeof(AVPicture);
        opkt.flags |= AV_PKT_FLAG_KEY;
    }
1396

1397
    write_frame(of->ctx, &opkt, ost);
1398
    ost->st->codec->frame_number++;
1399
}
1400

1401
static void rate_emu_sleep(InputStream *ist)
1402
{
1403
    if (input_files[ist->file_index]->rate_emu) {
1404
        int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
1405 1406
        int64_t now = av_gettime() - ist->start;
        if (pts > now)
1407
            av_usleep(pts - now);
1408 1409 1410
    }
}

1411
int guess_input_channel_layout(InputStream *ist)
1412
{
1413
    AVCodecContext *dec = ist->st->codec;
1414

1415 1416
    if (!dec->channel_layout) {
        char layout_name[256];
1417

1418 1419 1420 1421 1422 1423 1424
        dec->channel_layout = av_get_default_channel_layout(dec->channels);
        if (!dec->channel_layout)
            return 0;
        av_get_channel_layout_string(layout_name, sizeof(layout_name),
                                     dec->channels, dec->channel_layout);
        av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for  Input Stream "
               "#%d.%d : %s\n", ist->file_index, ist->st->index, layout_name);
1425
    }
1426
    return 1;
1427 1428
}

1429
static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
1430
{
1431 1432
    AVFrame *decoded_frame;
    AVCodecContext *avctx = ist->st->codec;
1433
    int i, ret, resample_changed;
1434
    AVRational decoded_frame_tb;
1435

1436
    if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
1437
        return AVERROR(ENOMEM);
1438
    decoded_frame = ist->decoded_frame;
1439

1440
    update_benchmark(NULL);
1441
    ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
1442
    update_benchmark("decode_audio %d.%d", ist->file_index, ist->st->index);
1443 1444

    if (ret >= 0 && avctx->sample_rate <= 0) {
1445
        av_log(avctx, AV_LOG_ERROR, "Sample rate %d invalid\n", avctx->sample_rate);
1446
        ret = AVERROR_INVALIDDATA;
1447
    }
1448

1449 1450
    if (!*got_output || ret < 0) {
        if (!pkt->size) {
1451
            for (i = 0; i < ist->nb_filters; i++)
1452
                av_buffersrc_add_ref(ist->filters[i]->filter, NULL, 0);
1453
        }
1454
        return ret;
1455 1456
    }

1457 1458 1459 1460 1461 1462 1463 1464
#if 1
    /* increment next_dts to use for the case where the input stream does not
       have timestamps or there are multiple frames in the packet */
    ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
                     avctx->sample_rate;
    ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
                     avctx->sample_rate;
#endif
1465

1466
    rate_emu_sleep(ist);
1467

1468 1469 1470 1471 1472 1473
    resample_changed = ist->resample_sample_fmt     != decoded_frame->format         ||
                       ist->resample_channels       != avctx->channels               ||
                       ist->resample_channel_layout != decoded_frame->channel_layout ||
                       ist->resample_sample_rate    != decoded_frame->sample_rate;
    if (resample_changed) {
        char layout1[64], layout2[64];
1474

1475 1476 1477 1478
        if (!guess_input_channel_layout(ist)) {
            av_log(NULL, AV_LOG_FATAL, "Unable to find default channel "
                   "layout for Input Stream #%d.%d\n", ist->file_index,
                   ist->st->index);
1479
            exit(1);
1480 1481
        }
        decoded_frame->channel_layout = avctx->channel_layout;
1482

1483 1484 1485 1486
        av_get_channel_layout_string(layout1, sizeof(layout1), ist->resample_channels,
                                     ist->resample_channel_layout);
        av_get_channel_layout_string(layout2, sizeof(layout2), avctx->channels,
                                     decoded_frame->channel_layout);
1487

1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501
        av_log(NULL, AV_LOG_INFO,
               "Input stream #%d:%d frame changed from rate:%d fmt:%s ch:%d chl:%s to rate:%d fmt:%s ch:%d chl:%s\n",
               ist->file_index, ist->st->index,
               ist->resample_sample_rate,  av_get_sample_fmt_name(ist->resample_sample_fmt),
               ist->resample_channels, layout1,
               decoded_frame->sample_rate, av_get_sample_fmt_name(decoded_frame->format),
               avctx->channels, layout2);

        ist->resample_sample_fmt     = decoded_frame->format;
        ist->resample_sample_rate    = decoded_frame->sample_rate;
        ist->resample_channel_layout = decoded_frame->channel_layout;
        ist->resample_channels       = avctx->channels;

        for (i = 0; i < nb_filtergraphs; i++)
1502 1503 1504 1505 1506
            if (ist_in_filtergraph(filtergraphs[i], ist)) {
                FilterGraph *fg = filtergraphs[i];
                int j;
                if (configure_filtergraph(fg) < 0) {
                    av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
1507
                    exit(1);
1508 1509 1510 1511 1512 1513 1514 1515
                }
                for (j = 0; j < fg->nb_outputs; j++) {
                    OutputStream *ost = fg->outputs[j]->ost;
                    if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
                        !(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
                        av_buffersink_set_frame_size(ost->filter->filter,
                                                     ost->st->codec->frame_size);
                }
1516
            }
1517 1518
    }

1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535
    /* if the decoder provides a pts, use it instead of the last packet pts.
       the decoder could be delaying output by a packet or more. */
    if (decoded_frame->pts != AV_NOPTS_VALUE) {
        ist->dts = ist->next_dts = ist->pts = ist->next_pts = av_rescale_q(decoded_frame->pts, avctx->time_base, AV_TIME_BASE_Q);
        decoded_frame_tb   = avctx->time_base;
    } else if (decoded_frame->pkt_pts != AV_NOPTS_VALUE) {
        decoded_frame->pts = decoded_frame->pkt_pts;
        pkt->pts           = AV_NOPTS_VALUE;
        decoded_frame_tb   = ist->st->time_base;
    } else if (pkt->pts != AV_NOPTS_VALUE) {
        decoded_frame->pts = pkt->pts;
        pkt->pts           = AV_NOPTS_VALUE;
        decoded_frame_tb   = ist->st->time_base;
    }else {
        decoded_frame->pts = ist->dts;
        decoded_frame_tb   = AV_TIME_BASE_Q;
    }
1536
    if (decoded_frame->pts != AV_NOPTS_VALUE)
1537 1538 1539
        decoded_frame->pts = av_rescale_delta(decoded_frame_tb, decoded_frame->pts,
                                              (AVRational){1, ist->st->codec->sample_rate}, decoded_frame->nb_samples, &ist->filter_in_rescale_delta_last,
                                              (AVRational){1, ist->st->codec->sample_rate});
1540
    for (i = 0; i < ist->nb_filters; i++)
1541 1542
        av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame,
                               AV_BUFFERSRC_FLAG_PUSH);
1543 1544

    decoded_frame->pts = AV_NOPTS_VALUE;
1545

1546
    return ret;
1547 1548
}

1549
static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
1550
{
1551
    AVFrame *decoded_frame;
1552
    void *buffer_to_free = NULL;
1553
    int i, ret = 0, resample_changed;
1554 1555
    int64_t best_effort_timestamp;
    AVRational *frame_sample_aspect;
1556

1557
    if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
1558
        return AVERROR(ENOMEM);
1559
    decoded_frame = ist->decoded_frame;
1560
    pkt->dts  = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base);
1561

1562
    update_benchmark(NULL);
1563 1564
    ret = avcodec_decode_video2(ist->st->codec,
                                decoded_frame, got_output, pkt);
1565
    update_benchmark("decode_video %d.%d", ist->file_index, ist->st->index);
1566 1567
    if (!*got_output || ret < 0) {
        if (!pkt->size) {
1568
            for (i = 0; i < ist->nb_filters; i++)
1569
                av_buffersrc_add_ref(ist->filters[i]->filter, NULL, 0);
1570
        }
1571
        return ret;
1572
    }
1573

1574 1575
    if(ist->top_field_first>=0)
        decoded_frame->top_field_first = ist->top_field_first;
1576

1577 1578 1579
    best_effort_timestamp= av_frame_get_best_effort_timestamp(decoded_frame);
    if(best_effort_timestamp != AV_NOPTS_VALUE)
        ist->next_pts = ist->pts = av_rescale_q(decoded_frame->pts = best_effort_timestamp, ist->st->time_base, AV_TIME_BASE_Q);
1580

1581 1582 1583 1584 1585 1586 1587 1588
    if (debug_ts) {
        av_log(NULL, AV_LOG_INFO, "decoder -> ist_index:%d type:video "
                "frame_pts:%s frame_pts_time:%s best_effort_ts:%"PRId64" best_effort_ts_time:%s keyframe:%d frame_type:%d \n",
                ist->st->index, av_ts2str(decoded_frame->pts),
                av_ts2timestr(decoded_frame->pts, &ist->st->time_base),
                best_effort_timestamp,
                av_ts2timestr(best_effort_timestamp, &ist->st->time_base),
                decoded_frame->key_frame, decoded_frame->pict_type);
1589 1590
    }

1591 1592
    pkt->size = 0;
    pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
1593

1594
    rate_emu_sleep(ist);
1595

1596 1597
    if (ist->st->sample_aspect_ratio.num)
        decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
1598

1599 1600 1601 1602 1603 1604 1605 1606 1607
    resample_changed = ist->resample_width   != decoded_frame->width  ||
                       ist->resample_height  != decoded_frame->height ||
                       ist->resample_pix_fmt != decoded_frame->format;
    if (resample_changed) {
        av_log(NULL, AV_LOG_INFO,
               "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
               ist->file_index, ist->st->index,
               ist->resample_width,  ist->resample_height,  av_get_pix_fmt_name(ist->resample_pix_fmt),
               decoded_frame->width, decoded_frame->height, av_get_pix_fmt_name(decoded_frame->format));
1608

1609 1610 1611
        ist->resample_width   = decoded_frame->width;
        ist->resample_height  = decoded_frame->height;
        ist->resample_pix_fmt = decoded_frame->format;
1612

1613 1614
        for (i = 0; i < nb_filtergraphs; i++) {
            if (ist_in_filtergraph(filtergraphs[i], ist) && ist->reinit_filters &&
1615
                configure_filtergraph(filtergraphs[i]) < 0) {
1616
                av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
1617
                exit(1);
1618
            }
1619
        }
1620 1621
    }

1622
    frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
1623
    for (i = 0; i < ist->nb_filters; i++) {
1624 1625 1626
        int changed =      ist->st->codec->width   != ist->filters[i]->filter->outputs[0]->w
                        || ist->st->codec->height  != ist->filters[i]->filter->outputs[0]->h
                        || ist->st->codec->pix_fmt != ist->filters[i]->filter->outputs[0]->format;
1627

1628 1629 1630
        if (!frame_sample_aspect->num)
            *frame_sample_aspect = ist->st->sample_aspect_ratio;
        if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER && !changed) {
1631 1632 1633 1634 1635 1636
            FrameBuffer      *buf = decoded_frame->opaque;
            AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
                                        decoded_frame->data, decoded_frame->linesize,
                                        AV_PERM_READ | AV_PERM_PRESERVE,
                                        ist->st->codec->width, ist->st->codec->height,
                                        ist->st->codec->pix_fmt);
1637

1638 1639 1640 1641
            avfilter_copy_frame_props(fb, decoded_frame);
            fb->buf->priv           = buf;
            fb->buf->free           = filter_release_buffer;

1642
            av_assert0(buf->refcount>0);
1643
            buf->refcount++;
1644 1645
            av_buffersrc_add_ref(ist->filters[i]->filter, fb,
                                 AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT |
1646 1647
                                 AV_BUFFERSRC_FLAG_NO_COPY |
                                 AV_BUFFERSRC_FLAG_PUSH);
1648
        } else
1649
        if(av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, AV_BUFFERSRC_FLAG_PUSH)<0) {
1650
            av_log(NULL, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
1651
            exit(1);
1652
        }
1653

1654
    }
1655

1656
    av_free(buffer_to_free);
1657 1658 1659
    return ret;
}

1660
static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
1661
{
1662 1663 1664
    AVSubtitle subtitle;
    int i, ret = avcodec_decode_subtitle2(ist->st->codec,
                                          &subtitle, got_output, pkt);
1665 1666 1667
    if (ret < 0 || !*got_output) {
        if (!pkt->size)
            sub2video_flush(ist);
1668
        return ret;
1669
    }
1670

1671 1672
    if (ist->fix_sub_duration) {
        if (ist->prev_sub.got_output) {
1673 1674
            int end = av_rescale(subtitle.pts - ist->prev_sub.subtitle.pts,
                                 1000, AV_TIME_BASE);
1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686
            if (end < ist->prev_sub.subtitle.end_display_time) {
                av_log(ist->st->codec, AV_LOG_DEBUG,
                       "Subtitle duration reduced from %d to %d\n",
                       ist->prev_sub.subtitle.end_display_time, end);
                ist->prev_sub.subtitle.end_display_time = end;
            }
        }
        FFSWAP(int,        *got_output, ist->prev_sub.got_output);
        FFSWAP(int,        ret,         ist->prev_sub.ret);
        FFSWAP(AVSubtitle, subtitle,    ist->prev_sub.subtitle);
    }

1687
    sub2video_update(ist, &subtitle);
1688

1689 1690 1691
    if (!*got_output || !subtitle.num_rects)
        return ret;

1692
    rate_emu_sleep(ist);
1693

1694
    for (i = 0; i < nb_output_streams; i++) {
1695
        OutputStream *ost = output_streams[i];
1696

1697
        if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1698
            continue;
1699

1700
        do_subtitle_out(output_files[ost->file_index]->ctx, ost, ist, &subtitle);
1701
    }
1702

1703
    avsubtitle_free(&subtitle);
1704
    return ret;
1705
}
1706

1707
/* pkt = NULL means EOF (needed to flush decoder buffers) */
1708
static int output_packet(InputStream *ist, const AVPacket *pkt)
1709
{
1710
    int ret = 0, i;
1711
    int got_output;
Fabrice Bellard's avatar
Fabrice Bellard committed
1712

1713
    AVPacket avpkt;
1714 1715 1716 1717 1718 1719
    if (!ist->saw_first_ts) {
        ist->dts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames * AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
        ist->pts = 0;
        if (pkt != NULL && pkt->pts != AV_NOPTS_VALUE && !ist->decoding_needed) {
            ist->dts += av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
            ist->pts = ist->dts; //unused but better to set it to a value thats not totally wrong
1720
        }
1721 1722
        ist->saw_first_ts = 1;
    }
1723

1724
    if (ist->next_dts == AV_NOPTS_VALUE)
1725 1726 1727
        ist->next_dts = ist->dts;
    if (ist->next_pts == AV_NOPTS_VALUE)
        ist->next_pts = ist->pts;
1728

1729 1730 1731 1732 1733 1734 1735 1736 1737
    if (pkt == NULL) {
        /* EOF handling */
        av_init_packet(&avpkt);
        avpkt.data = NULL;
        avpkt.size = 0;
        goto handle_eof;
    } else {
        avpkt = *pkt;
    }
1738

1739 1740 1741
    if (pkt->dts != AV_NOPTS_VALUE) {
        ist->next_dts = ist->dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
        if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
1742
            ist->next_pts = ist->pts = ist->dts;
1743
    }
1744

Aneesh Dogra's avatar
Aneesh Dogra committed
1745
    // while we have more to decode or while the decoder did output something on EOF
1746
    while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
1747
        int duration;
1748
    handle_eof:
1749

1750 1751
        ist->pts = ist->next_pts;
        ist->dts = ist->next_dts;
1752

1753
        if (avpkt.size && avpkt.size != pkt->size) {
1754 1755
            av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
                   "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1756
            ist->showed_multi_packet_warning = 1;
Michael Niedermayer's avatar
Michael Niedermayer committed
1757
        }
1758

Aneesh Dogra's avatar
Aneesh Dogra committed
1759
        switch (ist->st->codec->codec_type) {
1760
        case AVMEDIA_TYPE_AUDIO:
1761
            ret = decode_audio    (ist, &avpkt, &got_output);
1762 1763
            break;
        case AVMEDIA_TYPE_VIDEO:
1764
            ret = decode_video    (ist, &avpkt, &got_output);
1765 1766 1767 1768 1769 1770 1771 1772 1773
            if (avpkt.duration) {
                duration = av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
            } else if(ist->st->codec->time_base.num != 0 && ist->st->codec->time_base.den != 0) {
                int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
                duration = ((int64_t)AV_TIME_BASE *
                                ist->st->codec->time_base.num * ticks) /
                                ist->st->codec->time_base.den;
            } else
                duration = 0;
1774

1775 1776 1777 1778
            if(ist->dts != AV_NOPTS_VALUE && duration) {
                ist->next_dts += duration;
            }else
                ist->next_dts = AV_NOPTS_VALUE;
1779

1780 1781
            if (got_output)
                ist->next_pts += duration; //FIXME the duration is not correct in some cases
1782 1783 1784 1785
            break;
        case AVMEDIA_TYPE_SUBTITLE:
            ret = transcode_subtitles(ist, &avpkt, &got_output);
            break;
Anton Khirnov's avatar
Anton Khirnov committed
1786 1787
        default:
            return -1;
1788
        }
Fabrice Bellard's avatar
Fabrice Bellard committed
1789

1790 1791
        if (ret < 0)
            return ret;
1792

1793 1794
        avpkt.dts=
        avpkt.pts= AV_NOPTS_VALUE;
1795

1796 1797
        // touch data and size only if not EOF
        if (pkt) {
1798 1799
            if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
                ret = avpkt.size;
1800 1801
            avpkt.data += ret;
            avpkt.size -= ret;
Fabrice Bellard's avatar
Fabrice Bellard committed
1802
        }
1803
        if (!got_output) {
1804
            continue;
Fabrice Bellard's avatar
Fabrice Bellard committed
1805 1806 1807
        }
    }

1808
    /* handle stream copy */
1809 1810
    if (!ist->decoding_needed) {
        rate_emu_sleep(ist);
1811
        ist->dts = ist->next_dts;
1812 1813
        switch (ist->st->codec->codec_type) {
        case AVMEDIA_TYPE_AUDIO:
1814
            ist->next_dts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1815 1816 1817
                             ist->st->codec->sample_rate;
            break;
        case AVMEDIA_TYPE_VIDEO:
1818 1819 1820 1821
            if (pkt->duration) {
                ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
            } else if(ist->st->codec->time_base.num != 0) {
                int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
1822
                ist->next_dts += ((int64_t)AV_TIME_BASE *
1823 1824
                                  ist->st->codec->time_base.num * ticks) /
                                  ist->st->codec->time_base.den;
Fabrice Bellard's avatar
Fabrice Bellard committed
1825
            }
1826
            break;
Fabrice Bellard's avatar
Fabrice Bellard committed
1827
        }
1828 1829
        ist->pts = ist->dts;
        ist->next_pts = ist->next_dts;
Fabrice Bellard's avatar
Fabrice Bellard committed
1830
    }
1831
    for (i = 0; pkt && i < nb_output_streams; i++) {
1832
        OutputStream *ost = output_streams[i];
1833

1834 1835
        if (!check_output_constraints(ist, ost) || ost->encoding_needed)
            continue;
1836

1837 1838
        do_streamcopy(ist, ost, pkt);
    }
1839

1840
    return 0;
1841 1842
}

1843
static void print_sdp(void)
Fabrice Bellard's avatar
Fabrice Bellard committed
1844
{
1845
    char sdp[2048];
1846
    int i;
1847
    AVFormatContext **avc = av_malloc(sizeof(*avc) * nb_output_files);
Fabrice Bellard's avatar
Fabrice Bellard committed
1848

1849
    if (!avc)
1850
        exit(1);
1851
    for (i = 0; i < nb_output_files; i++)
1852
        avc[i] = output_files[i]->ctx;
1853

1854
    av_sdp_create(avc, nb_output_files, sdp, sizeof(sdp));
1855 1856
    printf("SDP:\n%s\n", sdp);
    fflush(stdout);
1857
    av_freep(&avc);
1858 1859
}

1860
static int init_input_stream(int ist_index, char *error, int error_len)
1861
{
1862
    int ret;
1863
    InputStream *ist = input_streams[ist_index];
1864

1865 1866 1867
    if (ist->decoding_needed) {
        AVCodec *codec = ist->dec;
        if (!codec) {
1868 1869
            snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
                    avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
1870
            return AVERROR(EINVAL);
1871 1872
        }

1873 1874
        ist->dr1 = (codec->capabilities & CODEC_CAP_DR1) && !do_deinterlace;
        if (codec->type == AVMEDIA_TYPE_VIDEO && ist->dr1) {
1875 1876
            ist->st->codec->get_buffer     = codec_get_buffer;
            ist->st->codec->release_buffer = codec_release_buffer;
1877
            ist->st->codec->opaque         = &ist->buffer_pool;
1878
        }
1879

1880 1881
        if (!av_dict_get(ist->opts, "threads", NULL, 0))
            av_dict_set(&ist->opts, "threads", "auto", 0);
1882 1883 1884
        if ((ret = avcodec_open2(ist->st->codec, codec, &ist->opts)) < 0) {
            if (ret == AVERROR_EXPERIMENTAL)
                abort_codec_experimental(codec, 0);
1885
            snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
1886
                    ist->file_index, ist->st->index);
1887
            return ret;
1888
        }
1889
        assert_avoptions(ist->opts);
1890
    }
1891

1892
    ist->next_pts = AV_NOPTS_VALUE;
1893
    ist->next_dts = AV_NOPTS_VALUE;
1894
    ist->is_start = 1;
1895

1896
    return 0;
Fabrice Bellard's avatar
Fabrice Bellard committed
1897 1898
}

1899
static InputStream *get_input_stream(OutputStream *ost)
1900
{
1901 1902 1903
    if (ost->source_index >= 0)
        return input_streams[ost->source_index];
    return NULL;
1904 1905
}

1906 1907
static void parse_forced_key_frames(char *kf, OutputStream *ost,
                                    AVCodecContext *avctx)
1908
{
1909 1910 1911
    char *p;
    int n = 1, i;
    int64_t t;
1912

1913 1914 1915 1916 1917 1918 1919
    for (p = kf; *p; p++)
        if (*p == ',')
            n++;
    ost->forced_kf_count = n;
    ost->forced_kf_pts   = av_malloc(sizeof(*ost->forced_kf_pts) * n);
    if (!ost->forced_kf_pts) {
        av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1920
        exit(1);
1921 1922
    }

1923
    p = kf;
1924
    for (i = 0; i < n; i++) {
1925
        char *next = strchr(p, ',');
1926

1927 1928 1929
        if (next)
            *next++ = 0;

1930 1931
        t = parse_time_or_die("force_key_frames", p, 1);
        ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1932 1933

        p = next;
1934 1935 1936
    }
}

1937
static void report_new_stream(int input_index, AVPacket *pkt)
1938
{
1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949
    InputFile *file = input_files[input_index];
    AVStream *st = file->ctx->streams[pkt->stream_index];

    if (pkt->stream_index < file->nb_streams_warn)
        return;
    av_log(file->ctx, AV_LOG_WARNING,
           "New %s stream %d:%d at pos:%"PRId64" and DTS:%ss\n",
           av_get_media_type_string(st->codec->codec_type),
           input_index, pkt->stream_index,
           pkt->pos, av_ts2timestr(pkt->dts, &st->time_base));
    file->nb_streams_warn = pkt->stream_index + 1;
1950 1951
}

1952
static int transcode_init(void)
1953
{
1954
    int ret = 0, i, j, k;
1955
    AVFormatContext *oc;
1956
    AVCodecContext *codec;
1957
    OutputStream *ost;
1958 1959 1960
    InputStream *ist;
    char error[1024];
    int want_sdp = 1;
1961

1962 1963
    /* init framerate emulation */
    for (i = 0; i < nb_input_files; i++) {
1964
        InputFile *ifile = input_files[i];
1965 1966
        if (ifile->rate_emu)
            for (j = 0; j < ifile->nb_streams; j++)
1967
                input_streams[j + ifile->ist_index]->start = av_gettime();
1968
    }
1969

1970
    /* output stream init */
1971
    for (i = 0; i < nb_output_files; i++) {
1972
        oc = output_files[i]->ctx;
1973 1974
        if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
            av_dump_format(oc, i, oc->filename, 1);
1975
            av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
1976
            return AVERROR(EINVAL);
1977 1978
        }
    }
1979

1980 1981 1982 1983
    /* init complex filtergraphs */
    for (i = 0; i < nb_filtergraphs; i++)
        if ((ret = avfilter_graph_config(filtergraphs[i]->graph, NULL)) < 0)
            return ret;
1984

1985
    /* for each output stream, we compute the right encoding parameters */
1986
    for (i = 0; i < nb_output_streams; i++) {
1987
        AVCodecContext *icodec = NULL;
1988 1989
        ost = output_streams[i];
        oc  = output_files[ost->file_index]->ctx;
1990
        ist = get_input_stream(ost);
1991

1992 1993
        if (ost->attachment_filename)
            continue;
1994

1995
        codec  = ost->st->codec;
1996

1997 1998
        if (ist) {
            icodec = ist->st->codec;
1999

2000 2001 2002 2003
            ost->st->disposition          = ist->st->disposition;
            codec->bits_per_raw_sample    = icodec->bits_per_raw_sample;
            codec->chroma_sample_location = icodec->chroma_sample_location;
        }
2004

2005
        if (ost->stream_copy) {
2006
            uint64_t extra_size;
2007

2008
            av_assert0(ist && !ost->filter);
2009

2010
            extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2011

2012
            if (extra_size > INT_MAX) {
2013
                return AVERROR(EINVAL);
2014
            }
2015

2016
            /* if stream_copy is selected, no need to decode or encode */
2017
            codec->codec_id   = icodec->codec_id;
2018
            codec->codec_type = icodec->codec_type;
2019

2020 2021 2022 2023
            if (!codec->codec_tag) {
                if (!oc->oformat->codec_tag ||
                     av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
                     av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2024 2025
                    codec->codec_tag = icodec->codec_tag;
            }
2026

2027
            codec->bit_rate       = icodec->bit_rate;
2028 2029
            codec->rc_max_rate    = icodec->rc_max_rate;
            codec->rc_buffer_size = icodec->rc_buffer_size;
2030
            codec->field_order    = icodec->field_order;
2031
            codec->extradata      = av_mallocz(extra_size);
2032
            if (!codec->extradata) {
2033
                return AVERROR(ENOMEM);
2034
            }
2035
            memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2036 2037
            codec->extradata_size= icodec->extradata_size;
            codec->bits_per_coded_sample  = icodec->bits_per_coded_sample;
2038

2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064
            codec->time_base = ist->st->time_base;
            /*
             * Avi is a special case here because it supports variable fps but
             * having the fps and timebase differe significantly adds quite some
             * overhead
             */
            if(!strcmp(oc->oformat->name, "avi")) {
                if ( copy_tb<0 && av_q2d(ist->st->r_frame_rate) >= av_q2d(ist->st->avg_frame_rate)
                               && 0.5/av_q2d(ist->st->r_frame_rate) > av_q2d(ist->st->time_base)
                               && 0.5/av_q2d(ist->st->r_frame_rate) > av_q2d(icodec->time_base)
                               && av_q2d(ist->st->time_base) < 1.0/500 && av_q2d(icodec->time_base) < 1.0/500
                     || copy_tb==2){
                    codec->time_base.num = ist->st->r_frame_rate.den;
                    codec->time_base.den = 2*ist->st->r_frame_rate.num;
                    codec->ticks_per_frame = 2;
                } else if (   copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
                                 && av_q2d(ist->st->time_base) < 1.0/500
                    || copy_tb==0){
                    codec->time_base = icodec->time_base;
                    codec->time_base.num *= icodec->ticks_per_frame;
                    codec->time_base.den *= 2;
                    codec->ticks_per_frame = 2;
                }
            } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
                      && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
                      && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
2065
                      && strcmp(oc->oformat->name, "f4v")
2066
            ) {
2067 2068
                if(   copy_tb<0 && icodec->time_base.den
                                && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
2069 2070 2071 2072 2073 2074
                                && av_q2d(ist->st->time_base) < 1.0/500
                   || copy_tb==0){
                    codec->time_base = icodec->time_base;
                    codec->time_base.num *= icodec->ticks_per_frame;
                }
            }
2075

2076 2077 2078 2079 2080
            if(ost->frame_rate.num)
                codec->time_base = av_inv_q(ost->frame_rate);

            av_reduce(&codec->time_base.num, &codec->time_base.den,
                        codec->time_base.num, codec->time_base.den, INT_MAX);
2081

Aneesh Dogra's avatar
Aneesh Dogra committed
2082
            switch (codec->codec_type) {
2083
            case AVMEDIA_TYPE_AUDIO:
Aneesh Dogra's avatar
Aneesh Dogra committed
2084
                if (audio_volume != 256) {
2085
                    av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2086
                    exit(1);
2087
                }
2088 2089 2090 2091
                codec->channel_layout     = icodec->channel_layout;
                codec->sample_rate        = icodec->sample_rate;
                codec->channels           = icodec->channels;
                codec->frame_size         = icodec->frame_size;
2092
                codec->audio_service_type = icodec->audio_service_type;
2093
                codec->block_align        = icodec->block_align;
2094 2095 2096 2097
                if((codec->block_align == 1 || codec->block_align == 1152) && codec->codec_id == AV_CODEC_ID_MP3)
                    codec->block_align= 0;
                if(codec->codec_id == AV_CODEC_ID_AC3)
                    codec->block_align= 0;
2098 2099
                break;
            case AVMEDIA_TYPE_VIDEO:
2100 2101 2102 2103
                codec->pix_fmt            = icodec->pix_fmt;
                codec->width              = icodec->width;
                codec->height             = icodec->height;
                codec->has_b_frames       = icodec->has_b_frames;
2104
                if (!codec->sample_aspect_ratio.num) {
2105
                    codec->sample_aspect_ratio   =
2106 2107 2108 2109 2110
                    ost->st->sample_aspect_ratio =
                        ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
                        ist->st->codec->sample_aspect_ratio.num ?
                        ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
                }
2111
                ost->st->avg_frame_rate = ist->st->avg_frame_rate;
2112 2113
                break;
            case AVMEDIA_TYPE_SUBTITLE:
2114
                codec->width  = icodec->width;
2115 2116 2117
                codec->height = icodec->height;
                break;
            case AVMEDIA_TYPE_DATA:
2118
            case AVMEDIA_TYPE_ATTACHMENT:
2119 2120 2121 2122 2123
                break;
            default:
                abort();
            }
        } else {
2124 2125
            if (!ost->enc)
                ost->enc = avcodec_find_encoder(codec->codec_id);
2126 2127
            if (!ost->enc) {
                /* should only happen when a default codec is not present. */
2128 2129
                snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
                         avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2130 2131
                ret = AVERROR(EINVAL);
                goto dump_format;
2132 2133
            }

2134
            if (ist)
2135
                ist->decoding_needed++;
2136
            ost->encoding_needed = 1;
2137

2138 2139 2140
            if (!ost->filter &&
                (codec->codec_type == AVMEDIA_TYPE_VIDEO ||
                 codec->codec_type == AVMEDIA_TYPE_AUDIO)) {
2141 2142
                    FilterGraph *fg;
                    fg = init_simple_filtergraph(ist, ost);
2143
                    if (configure_filtergraph(fg)) {
2144 2145 2146
                        av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
                        exit(1);
                    }
2147 2148
            }

2149 2150 2151
            if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
                if (ost->filter && !ost->frame_rate.num)
                    ost->frame_rate = av_buffersink_get_frame_rate(ost->filter->filter);
2152 2153
                if (ist && !ost->frame_rate.num)
                    ost->frame_rate = ist->framerate;
2154 2155 2156 2157 2158 2159 2160 2161
                if (ist && !ost->frame_rate.num)
                    ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25, 1};
//                    ost->frame_rate = ist->st->avg_frame_rate.num ? ist->st->avg_frame_rate : (AVRational){25, 1};
                if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
                    int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
                    ost->frame_rate = ost->enc->supported_framerates[idx];
                }
            }
2162

2163 2164 2165 2166 2167 2168 2169 2170 2171
            switch (codec->codec_type) {
            case AVMEDIA_TYPE_AUDIO:
                codec->sample_fmt     = ost->filter->filter->inputs[0]->format;
                codec->sample_rate    = ost->filter->filter->inputs[0]->sample_rate;
                codec->channel_layout = ost->filter->filter->inputs[0]->channel_layout;
                codec->channels       = av_get_channel_layout_nb_channels(codec->channel_layout);
                codec->time_base      = (AVRational){ 1, codec->sample_rate };
                break;
            case AVMEDIA_TYPE_VIDEO:
2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183
                codec->time_base = av_inv_q(ost->frame_rate);
                if (ost->filter && !(codec->time_base.num && codec->time_base.den))
                    codec->time_base = ost->filter->filter->inputs[0]->time_base;
                if (   av_q2d(codec->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
                   && (video_sync_method == VSYNC_CFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
                    av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not efficiently supporting it.\n"
                                               "Please consider specifying a lower framerate, a different muxer or -vsync 2\n");
                }
                for (j = 0; j < ost->forced_kf_count; j++)
                    ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
                                                         AV_TIME_BASE_Q,
                                                         codec->time_base);
2184

2185 2186 2187 2188 2189 2190 2191
                codec->width  = ost->filter->filter->inputs[0]->w;
                codec->height = ost->filter->filter->inputs[0]->h;
                codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
                    ost->frame_aspect_ratio ? // overridden by the -aspect cli option
                    av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
                    ost->filter->filter->inputs[0]->sample_aspect_ratio;
                codec->pix_fmt = ost->filter->filter->inputs[0]->format;
2192

2193 2194
                if (!icodec ||
                    codec->width   != icodec->width  ||
2195 2196
                    codec->height  != icodec->height ||
                    codec->pix_fmt != icodec->pix_fmt) {
2197
                    codec->bits_per_raw_sample = frame_bits_per_raw_sample;
2198
                }
2199

2200 2201 2202
                if (ost->forced_keyframes)
                    parse_forced_key_frames(ost->forced_keyframes, ost,
                                            ost->st->codec);
2203 2204
                break;
            case AVMEDIA_TYPE_SUBTITLE:
2205
                codec->time_base = (AVRational){1, 1000};
2206 2207 2208 2209
                if (!codec->width) {
                    codec->width     = input_streams[ost->source_index]->st->codec->width;
                    codec->height    = input_streams[ost->source_index]->st->codec->height;
                }
2210 2211 2212 2213 2214 2215
                break;
            default:
                abort();
                break;
            }
            /* two pass mode */
2216
            if (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2)) {
2217 2218
                char logfilename[1024];
                FILE *f;
2219

2220
                snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2221 2222
                         ost->logfile_prefix ? ost->logfile_prefix :
                                               DEFAULT_PASS_LOGFILENAME_PREFIX,
2223
                         i);
2224 2225 2226
                if (!strcmp(ost->enc->name, "libx264")) {
                    av_dict_set(&ost->opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
                } else {
2227
                    if (codec->flags & CODEC_FLAG_PASS2) {
Anton Khirnov's avatar
Anton Khirnov committed
2228 2229 2230 2231 2232
                        char  *logbuffer;
                        size_t logbuffer_size;
                        if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
                            av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
                                   logfilename);
2233
                            exit(1);
Anton Khirnov's avatar
Anton Khirnov committed
2234 2235
                        }
                        codec->stats_in = logbuffer;
2236
                    }
2237 2238 2239 2240 2241
                    if (codec->flags & CODEC_FLAG_PASS1) {
                        f = fopen(logfilename, "wb");
                        if (!f) {
                            av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
                                logfilename, strerror(errno));
2242
                            exit(1);
2243 2244 2245
                        }
                        ost->logfile = f;
                    }
2246
                }
2247
            }
2248 2249 2250
        }
    }

2251
    /* open each encoder */
2252
    for (i = 0; i < nb_output_streams; i++) {
2253
        ost = output_streams[i];
2254
        if (ost->encoding_needed) {
2255
            AVCodec      *codec = ost->enc;
2256 2257 2258 2259 2260
            AVCodecContext *dec = NULL;

            if ((ist = get_input_stream(ost)))
                dec = ist->st->codec;
            if (dec && dec->subtitle_header) {
2261 2262
                /* ASS code assumes this buffer is null terminated so add extra byte. */
                ost->st->codec->subtitle_header = av_mallocz(dec->subtitle_header_size + 1);
2263 2264 2265
                if (!ost->st->codec->subtitle_header) {
                    ret = AVERROR(ENOMEM);
                    goto dump_format;
2266
                }
2267 2268
                memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
                ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2269
            }
2270 2271
            if (!av_dict_get(ost->opts, "threads", NULL, 0))
                av_dict_set(&ost->opts, "threads", "auto", 0);
2272 2273 2274
            if ((ret = avcodec_open2(ost->st->codec, codec, &ost->opts)) < 0) {
                if (ret == AVERROR_EXPERIMENTAL)
                    abort_codec_experimental(codec, 1);
2275
                snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2276 2277
                        ost->file_index, ost->index);
                goto dump_format;
2278
            }
2279 2280 2281 2282
            if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
                !(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
                av_buffersink_set_frame_size(ost->filter->filter,
                                             ost->st->codec->frame_size);
2283 2284 2285
            assert_avoptions(ost->opts);
            if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
                av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2286
                                             " It takes bits/s as argument, not kbits/s\n");
2287
            extra_size += ost->st->codec->extradata_size;
2288

2289
            if (ost->st->codec->me_threshold)
2290
                input_streams[ost->source_index]->st->codec->debug |= FF_DEBUG_MV;
2291
        }
2292
    }
2293

2294 2295
    /* init input streams */
    for (i = 0; i < nb_input_streams; i++)
2296
        if ((ret = init_input_stream(i, error, sizeof(error))) < 0)
2297
            goto dump_format;
2298

2299 2300
    /* discard unused programs */
    for (i = 0; i < nb_input_files; i++) {
2301
        InputFile *ifile = input_files[i];
2302 2303 2304
        for (j = 0; j < ifile->ctx->nb_programs; j++) {
            AVProgram *p = ifile->ctx->programs[j];
            int discard  = AVDISCARD_ALL;
2305

2306
            for (k = 0; k < p->nb_stream_indexes; k++)
2307
                if (!input_streams[ifile->ist_index + p->stream_index[k]]->discard) {
2308 2309 2310 2311
                    discard = AVDISCARD_DEFAULT;
                    break;
                }
            p->discard = discard;
2312
        }
2313 2314
    }

2315
    /* open files and write file headers */
2316
    for (i = 0; i < nb_output_files; i++) {
2317
        oc = output_files[i]->ctx;
2318
        oc->interrupt_callback = int_cb;
2319 2320 2321 2322 2323 2324
        if ((ret = avformat_write_header(oc, &output_files[i]->opts)) < 0) {
            char errbuf[128];
            const char *errbuf_ptr = errbuf;
            if (av_strerror(ret, errbuf, sizeof(errbuf)) < 0)
                errbuf_ptr = strerror(AVUNERROR(ret));
            snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?): %s", i, errbuf_ptr);
2325 2326
            ret = AVERROR(EINVAL);
            goto dump_format;
2327
        }
2328
//         assert_avoptions(output_files[i]->opts);
2329
        if (strcmp(oc->oformat->name, "rtp")) {
2330
            want_sdp = 0;
2331
        }
2332
    }
2333

2334 2335 2336
 dump_format:
    /* dump the file output parameters - cannot be done before in case
       of stream copy */
2337
    for (i = 0; i < nb_output_files; i++) {
2338
        av_dump_format(output_files[i]->ctx, i, output_files[i]->ctx->filename, 1);
Fabrice Bellard's avatar
Fabrice Bellard committed
2339 2340
    }

2341
    /* dump the stream mapping */
2342
    av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2343 2344
    for (i = 0; i < nb_input_streams; i++) {
        ist = input_streams[i];
2345

2346 2347 2348 2349
        for (j = 0; j < ist->nb_filters; j++) {
            if (ist->filters[j]->graph->graph_desc) {
                av_log(NULL, AV_LOG_INFO, "  Stream #%d:%d (%s) -> %s",
                       ist->file_index, ist->st->index, ist->dec ? ist->dec->name : "?",
2350
                       ist->filters[j]->name);
2351 2352 2353 2354
                if (nb_filtergraphs > 1)
                    av_log(NULL, AV_LOG_INFO, " (graph %d)", ist->filters[j]->graph->index);
                av_log(NULL, AV_LOG_INFO, "\n");
            }
2355 2356 2357
        }
    }

2358
    for (i = 0; i < nb_output_streams; i++) {
2359
        ost = output_streams[i];
2360

2361 2362 2363 2364 2365
        if (ost->attachment_filename) {
            /* an attached file */
            av_log(NULL, AV_LOG_INFO, "  File %s -> Stream #%d:%d\n",
                   ost->attachment_filename, ost->file_index, ost->index);
            continue;
2366
        }
2367

2368 2369
        if (ost->filter && ost->filter->graph->graph_desc) {
            /* output from a complex graph */
2370
            av_log(NULL, AV_LOG_INFO, "  %s", ost->filter->name);
2371 2372
            if (nb_filtergraphs > 1)
                av_log(NULL, AV_LOG_INFO, " (graph %d)", ost->filter->graph->index);
2373

2374 2375
            av_log(NULL, AV_LOG_INFO, " -> Stream #%d:%d (%s)\n", ost->file_index,
                   ost->index, ost->enc ? ost->enc->name : "?");
2376
            continue;
2377
        }
2378

2379
        av_log(NULL, AV_LOG_INFO, "  Stream #%d:%d -> #%d:%d",
2380 2381
               input_streams[ost->source_index]->file_index,
               input_streams[ost->source_index]->st->index,
2382 2383
               ost->file_index,
               ost->index);
2384
        if (ost->sync_ist != input_streams[ost->source_index])
2385
            av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2386 2387
                   ost->sync_ist->file_index,
                   ost->sync_ist->st->index);
2388
        if (ost->stream_copy)
2389 2390
            av_log(NULL, AV_LOG_INFO, " (copy)");
        else
2391 2392
            av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index]->dec ?
                   input_streams[ost->source_index]->dec->name : "?",
2393 2394
                   ost->enc ? ost->enc->name : "?");
        av_log(NULL, AV_LOG_INFO, "\n");
2395 2396
    }

2397
    if (ret) {
2398
        av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2399
        return ret;
2400 2401
    }

2402
    if (want_sdp) {
2403
        print_sdp();
2404 2405
    }

2406 2407
    return 0;
}
2408

2409
/* Return 1 if there remain streams where more output is wanted, 0 otherwise. */
2410 2411 2412
static int need_output(void)
{
    int i;
2413

2414 2415 2416 2417
    for (i = 0; i < nb_output_streams; i++) {
        OutputStream *ost    = output_streams[i];
        OutputFile *of       = output_files[ost->file_index];
        AVFormatContext *os  = output_files[ost->file_index]->ctx;
2418

2419
        if (ost->finished ||
2420 2421
            (os->pb && avio_tell(os->pb) >= of->limit_filesize))
            continue;
2422
        if (ost->frame_number >= ost->max_frames) {
2423 2424
            int j;
            for (j = 0; j < of->ctx->nb_streams; j++)
2425
                close_output_stream(output_streams[of->ost_index + j]);
2426 2427
            continue;
        }
2428

2429
        return 1;
2430
    }
2431

2432 2433
    return 0;
}
2434

2435
/**
2436
 * Select the output stream to process.
2437
 *
2438
 * @return  selected output stream, or NULL if none available
2439
 */
2440
static OutputStream *choose_output(void)
Fabrice Bellard's avatar
Fabrice Bellard committed
2441
{
2442 2443 2444
    int i;
    int64_t opts_min = INT64_MAX;
    OutputStream *ost_min = NULL;
2445

2446 2447 2448 2449 2450 2451 2452
    for (i = 0; i < nb_output_streams; i++) {
        OutputStream *ost = output_streams[i];
        int64_t opts = av_rescale_q(ost->st->cur_dts, ost->st->time_base,
                                    AV_TIME_BASE_Q);
        if (!ost->unavailable && !ost->finished && opts < opts_min) {
            opts_min = opts;
            ost_min  = ost;
2453
        }
2454
    }
2455
    return ost_min;
2456
}
2457

2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508
static int check_keyboard_interaction(int64_t cur_time)
{
    int i, ret, key;
    static int64_t last_time;
    if (received_nb_signals)
        return AVERROR_EXIT;
    /* read_key() returns 0 on EOF */
    if(cur_time - last_time >= 100000 && !run_as_daemon){
        key =  read_key();
        last_time = cur_time;
    }else
        key = -1;
    if (key == 'q')
        return AVERROR_EXIT;
    if (key == '+') av_log_set_level(av_log_get_level()+10);
    if (key == '-') av_log_set_level(av_log_get_level()-10);
    if (key == 's') qp_hist     ^= 1;
    if (key == 'h'){
        if (do_hex_dump){
            do_hex_dump = do_pkt_dump = 0;
        } else if(do_pkt_dump){
            do_hex_dump = 1;
        } else
            do_pkt_dump = 1;
        av_log_set_level(AV_LOG_DEBUG);
    }
    if (key == 'c' || key == 'C'){
        char buf[4096], target[64], command[256], arg[256] = {0};
        double time;
        int k, n = 0;
        fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
        i = 0;
        while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
            if (k > 0)
                buf[i++] = k;
        buf[i] = 0;
        if (k > 0 &&
            (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
            av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
                   target, time, command, arg);
            for (i = 0; i < nb_filtergraphs; i++) {
                FilterGraph *fg = filtergraphs[i];
                if (fg->graph) {
                    if (time < 0) {
                        ret = avfilter_graph_send_command(fg->graph, target, command, arg, buf, sizeof(buf),
                                                          key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
                        fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
                    } else {
                        ret = avfilter_graph_queue_command(fg->graph, target, command, arg, 0, time);
                    }
                }
2509
            }
2510 2511 2512 2513
        } else {
            av_log(NULL, AV_LOG_ERROR,
                   "Parse error, at least 3 arguments were expected, "
                   "only %d given in string '%s'\n", n, buf);
2514
        }
2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527
    }
    if (key == 'd' || key == 'D'){
        int debug=0;
        if(key == 'D') {
            debug = input_streams[0]->st->codec->debug<<1;
            if(!debug) debug = 1;
            while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
                debug += debug;
        }else
            if(scanf("%d", &debug)!=1)
                fprintf(stderr,"error parsing debug value\n");
        for(i=0;i<nb_input_streams;i++) {
            input_streams[i]->st->codec->debug = debug;
2528
        }
2529 2530 2531 2532 2533 2534
        for(i=0;i<nb_output_streams;i++) {
            OutputStream *ost = output_streams[i];
            ost->st->codec->debug = debug;
        }
        if(debug) av_log_set_level(AV_LOG_DEBUG);
        fprintf(stderr,"debug=%d\n", debug);
2535
    }
2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548
    if (key == '?'){
        fprintf(stderr, "key    function\n"
                        "?      show this help\n"
                        "+      increase verbosity\n"
                        "-      decrease verbosity\n"
                        "c      Send command to filtergraph\n"
                        "D      cycle through available debug modes\n"
                        "h      dump packets/hex press to cycle through the 3 states\n"
                        "q      quit\n"
                        "s      Show QP histogram\n"
        );
    }
    return 0;
2549 2550
}

2551
#if HAVE_PTHREADS
2552
static void *input_thread(void *arg)
2553
{
2554 2555
    InputFile *f = arg;
    int ret = 0;
2556

2557 2558 2559
    while (!transcoding_finished && ret >= 0) {
        AVPacket pkt;
        ret = av_read_frame(f->ctx, &pkt);
2560

2561
        if (ret == AVERROR(EAGAIN)) {
2562
            av_usleep(10000);
2563 2564 2565 2566
            ret = 0;
            continue;
        } else if (ret < 0)
            break;
2567

2568 2569 2570
        pthread_mutex_lock(&f->fifo_lock);
        while (!av_fifo_space(f->fifo))
            pthread_cond_wait(&f->fifo_cond, &f->fifo_lock);
2571

2572 2573
        av_dup_packet(&pkt);
        av_fifo_generic_write(f->fifo, &pkt, sizeof(pkt), NULL);
2574

2575
        pthread_mutex_unlock(&f->fifo_lock);
2576 2577
    }

2578 2579
    f->finished = 1;
    return NULL;
2580
}
2581

2582
static void free_input_threads(void)
2583
{
2584
    int i;
2585

2586 2587
    if (nb_input_files == 1)
        return;
2588

2589
    transcoding_finished = 1;
2590

2591 2592 2593
    for (i = 0; i < nb_input_files; i++) {
        InputFile *f = input_files[i];
        AVPacket pkt;
2594

2595
        if (!f->fifo || f->joined)
2596
            continue;
2597

2598 2599 2600 2601 2602 2603 2604
        pthread_mutex_lock(&f->fifo_lock);
        while (av_fifo_size(f->fifo)) {
            av_fifo_generic_read(f->fifo, &pkt, sizeof(pkt), NULL);
            av_free_packet(&pkt);
        }
        pthread_cond_signal(&f->fifo_cond);
        pthread_mutex_unlock(&f->fifo_lock);
2605

2606 2607 2608 2609 2610 2611 2612 2613
        pthread_join(f->thread, NULL);
        f->joined = 1;

        while (av_fifo_size(f->fifo)) {
            av_fifo_generic_read(f->fifo, &pkt, sizeof(pkt), NULL);
            av_free_packet(&pkt);
        }
        av_fifo_free(f->fifo);
2614 2615
    }
}
2616

2617
static int init_input_threads(void)
2618
{
2619
    int i, ret;
2620

2621 2622
    if (nb_input_files == 1)
        return 0;
2623

2624 2625
    for (i = 0; i < nb_input_files; i++) {
        InputFile *f = input_files[i];
2626

2627
        if (!(f->fifo = av_fifo_alloc(8*sizeof(AVPacket))))
2628 2629
            return AVERROR(ENOMEM);

2630 2631
        pthread_mutex_init(&f->fifo_lock, NULL);
        pthread_cond_init (&f->fifo_cond, NULL);
2632

2633 2634
        if ((ret = pthread_create(&f->thread, NULL, input_thread, f)))
            return AVERROR(ret);
2635 2636 2637 2638
    }
    return 0;
}

2639
static int get_input_packet_mt(InputFile *f, AVPacket *pkt)
2640
{
2641
    int ret = 0;
2642

2643
    pthread_mutex_lock(&f->fifo_lock);
2644

2645 2646 2647 2648 2649 2650 2651 2652
    if (av_fifo_size(f->fifo)) {
        av_fifo_generic_read(f->fifo, pkt, sizeof(*pkt), NULL);
        pthread_cond_signal(&f->fifo_cond);
    } else {
        if (f->finished)
            ret = AVERROR_EOF;
        else
            ret = AVERROR(EAGAIN);
2653 2654
    }

2655
    pthread_mutex_unlock(&f->fifo_lock);
2656

2657 2658 2659
    return ret;
}
#endif
2660

2661 2662
static int get_input_packet(InputFile *f, AVPacket *pkt)
{
2663
#if HAVE_PTHREADS
2664 2665 2666 2667
    if (nb_input_files > 1)
        return get_input_packet_mt(f, pkt);
#endif
    return av_read_frame(f->ctx, pkt);
2668 2669
}

2670 2671 2672
static int got_eagain(void)
{
    int i;
2673 2674
    for (i = 0; i < nb_output_streams; i++)
        if (output_streams[i]->unavailable)
2675 2676 2677 2678 2679 2680 2681 2682 2683
            return 1;
    return 0;
}

static void reset_eagain(void)
{
    int i;
    for (i = 0; i < nb_input_files; i++)
        input_files[i]->eagain = 0;
2684 2685 2686 2687
    for (i = 0; i < nb_output_streams; i++)
        output_streams[i]->unavailable = 0;
}

2688 2689
/*
 * Return
2690 2691 2692 2693 2694
 * - 0 -- one packet was read and processed
 * - AVERROR(EAGAIN) -- no packets were available for selected file,
 *   this function should be called again
 * - AVERROR_EOF -- this function should not be called again
 */
2695
static int process_input(int file_index)
2696
{
2697
    InputFile *ifile = input_files[file_index];
2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713
    AVFormatContext *is;
    InputStream *ist;
    AVPacket pkt;
    int ret, i, j;

    is  = ifile->ctx;
    ret = get_input_packet(ifile, &pkt);

    if (ret == AVERROR(EAGAIN)) {
        ifile->eagain = 1;
        return ret;
    }
    if (ret < 0) {
        if (ret != AVERROR_EOF) {
            print_error(is->filename, ret);
            if (exit_on_error)
2714
                exit(1);
2715 2716 2717 2718 2719 2720 2721 2722
        }
        ifile->eof_reached = 1;

        for (i = 0; i < ifile->nb_streams; i++) {
            ist = input_streams[ifile->ist_index + i];
            if (ist->decoding_needed)
                output_packet(ist, NULL);

2723 2724 2725
            /* mark all outputs that don't go through lavfi as finished */
            for (j = 0; j < nb_output_streams; j++) {
                OutputStream *ost = output_streams[j];
2726

2727 2728 2729
                if (ost->source_index == ifile->ist_index + i &&
                    (ost->stream_copy || ost->enc->type == AVMEDIA_TYPE_SUBTITLE))
                    close_output_stream(ost);
2730 2731 2732
            }
        }

2733
        return AVERROR(EAGAIN);
2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753
    }

    reset_eagain();

    if (do_pkt_dump) {
        av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
                         is->streams[pkt.stream_index]);
    }
    /* the following test is needed in case new streams appear
       dynamically in stream : we ignore them */
    if (pkt.stream_index >= ifile->nb_streams) {
        report_new_stream(file_index, &pkt);
        goto discard_packet;
    }

    ist = input_streams[ifile->ist_index + pkt.stream_index];
    if (ist->discard)
        goto discard_packet;

    if(!ist->wrap_correction_done && input_files[file_index]->ctx->start_time != AV_NOPTS_VALUE && ist->st->pts_wrap_bits < 64){
2754 2755
        int64_t stime = av_rescale_q(input_files[file_index]->ctx->start_time, AV_TIME_BASE_Q, ist->st->time_base);
        int64_t stime2= stime + (1ULL<<ist->st->pts_wrap_bits);
2756
        ist->wrap_correction_done = 1;
2757 2758 2759

        if(stime2 > stime && pkt.dts != AV_NOPTS_VALUE && pkt.dts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) {
            pkt.dts -= 1ULL<<ist->st->pts_wrap_bits;
2760 2761
            ist->wrap_correction_done = 0;
        }
2762 2763
        if(stime2 > stime && pkt.pts != AV_NOPTS_VALUE && pkt.pts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) {
            pkt.pts -= 1ULL<<ist->st->pts_wrap_bits;
2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807
            ist->wrap_correction_done = 0;
        }
    }

    if (pkt.dts != AV_NOPTS_VALUE)
        pkt.dts += av_rescale_q(ifile->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
    if (pkt.pts != AV_NOPTS_VALUE)
        pkt.pts += av_rescale_q(ifile->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);

    if (pkt.pts != AV_NOPTS_VALUE)
        pkt.pts *= ist->ts_scale;
    if (pkt.dts != AV_NOPTS_VALUE)
        pkt.dts *= ist->ts_scale;

    if (debug_ts) {
        av_log(NULL, AV_LOG_INFO, "demuxer -> ist_index:%d type:%s "
                "next_dts:%s next_dts_time:%s next_pts:%s next_pts_time:%s  pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s off:%"PRId64"\n",
                ifile->ist_index + pkt.stream_index, av_get_media_type_string(ist->st->codec->codec_type),
                av_ts2str(ist->next_dts), av_ts2timestr(ist->next_dts, &AV_TIME_BASE_Q),
                av_ts2str(ist->next_pts), av_ts2timestr(ist->next_pts, &AV_TIME_BASE_Q),
                av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ist->st->time_base),
                av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ist->st->time_base),
                input_files[ist->file_index]->ts_offset);
    }

    if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE &&
        !copy_ts) {
        int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
        int64_t delta   = pkt_dts - ist->next_dts;
        if (is->iformat->flags & AVFMT_TS_DISCONT) {
        if(delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
            (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
                ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
            pkt_dts+1<ist->pts){
            ifile->ts_offset -= delta;
            av_log(NULL, AV_LOG_DEBUG,
                   "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
                   delta, ifile->ts_offset);
            pkt.dts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
            if (pkt.pts != AV_NOPTS_VALUE)
                pkt.pts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
        }
        } else {
            if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
2808 2809
                (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE)
               ) {
2810 2811 2812 2813 2814 2815 2816
                av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt.dts, ist->next_dts, pkt.stream_index);
                pkt.dts = AV_NOPTS_VALUE;
            }
            if (pkt.pts != AV_NOPTS_VALUE){
                int64_t pkt_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q);
                delta   = pkt_pts - ist->next_dts;
                if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
2817 2818
                    (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE)
                   ) {
2819 2820 2821 2822 2823 2824 2825 2826 2827
                    av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt.pts, ist->next_dts, pkt.stream_index);
                    pkt.pts = AV_NOPTS_VALUE;
                }
            }
        }
    }

    sub2video_heartbeat(ist, pkt.pts);

2828 2829
    ret = output_packet(ist, &pkt);
    if (ret < 0) {
2830 2831 2832 2833 2834
        char buf[128];
        av_strerror(ret, buf, sizeof(buf));
        av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d: %s\n",
                ist->file_index, ist->st->index, buf);
        if (exit_on_error)
2835
            exit(1);
2836 2837 2838 2839 2840 2841 2842 2843
    }

discard_packet:
    av_free_packet(&pkt);

    return 0;
}

2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935
/**
 * Perform a step of transcoding for the specified filter graph.
 *
 * @param[in]  graph     filter graph to consider
 * @param[out] best_ist  input stream where a frame would allow to continue
 * @return  0 for success, <0 for error
 */
static int transcode_from_filter(FilterGraph *graph, InputStream **best_ist)
{
    int i, ret;
    int nb_requests, nb_requests_max = 0;
    InputFilter *ifilter;
    InputStream *ist;

    *best_ist = NULL;
    ret = avfilter_graph_request_oldest(graph->graph);
    if (ret >= 0)
        return reap_filters();

    if (ret == AVERROR_EOF) {
        ret = reap_filters();
        for (i = 0; i < graph->nb_outputs; i++)
            close_output_stream(graph->outputs[i]->ost);
        return ret;
    }
    if (ret != AVERROR(EAGAIN))
        return ret;

    for (i = 0; i < graph->nb_inputs; i++) {
        ifilter = graph->inputs[i];
        ist = ifilter->ist;
        if (input_files[ist->file_index]->eagain ||
            input_files[ist->file_index]->eof_reached)
            continue;
        nb_requests = av_buffersrc_get_nb_failed_requests(ifilter->filter);
        if (nb_requests > nb_requests_max) {
            nb_requests_max = nb_requests;
            *best_ist = ist;
        }
    }

    if (!*best_ist)
        for (i = 0; i < graph->nb_outputs; i++)
            graph->outputs[i]->ost->unavailable = 1;

    return 0;
}

/**
 * Run a single step of transcoding.
 *
 * @return  0 for success, <0 for error
 */
static int transcode_step(void)
{
    OutputStream *ost;
    InputStream  *ist;
    int ret;

    ost = choose_output();
    if (!ost) {
        if (got_eagain()) {
            reset_eagain();
            av_usleep(10000);
            return 0;
        }
        av_log(NULL, AV_LOG_VERBOSE, "No more inputs to read from, finishing.\n");
        return AVERROR_EOF;
    }

    if (ost->filter) {
        if ((ret = transcode_from_filter(ost->filter->graph, &ist)) < 0)
            return ret;
        if (!ist)
            return 0;
    } else {
        av_assert0(ost->source_index >= 0);
        ist = input_streams[ost->source_index];
    }

    ret = process_input(ist->file_index);
    if (ret == AVERROR(EAGAIN)) {
        if (input_files[ist->file_index]->eagain)
            ost->unavailable = 1;
        return 0;
    }
    if (ret < 0)
        return ret == AVERROR_EOF ? 0 : ret;

    return reap_filters();
}

2936 2937 2938
/*
 * The following code is the main loop of the file converter
 */
2939
static int transcode(void)
2940
{
2941
    int ret, i;
2942
    AVFormatContext *os;
2943
    OutputStream *ost;
2944 2945
    InputStream *ist;
    int64_t timer_start;
Fabrice Bellard's avatar
Fabrice Bellard committed
2946

2947
    ret = transcode_init();
2948 2949 2950
    if (ret < 0)
        goto fail;

2951 2952
    if (stdin_interaction) {
        av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
2953 2954
    }

2955
    timer_start = av_gettime();
Fabrice Bellard's avatar
Fabrice Bellard committed
2956

2957
#if HAVE_PTHREADS
2958 2959 2960
    if ((ret = init_input_threads()) < 0)
        goto fail;
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
2961

Anton Khirnov's avatar
Anton Khirnov committed
2962
    while (!received_sigterm) {
2963
        int64_t cur_time= av_gettime();
2964

2965 2966 2967 2968
        /* if 'q' pressed, exits */
        if (stdin_interaction)
            if (check_keyboard_interaction(cur_time) < 0)
                break;
2969

2970
        /* check if there's any stream where output is still needed */
2971 2972
        if (!need_output()) {
            av_log(NULL, AV_LOG_VERBOSE, "No more output streams to write to, finishing.\n");
2973
            break;
2974
        }
2975

2976
        ret = transcode_step();
2977
        if (ret < 0) {
2978
            if (ret == AVERROR_EOF || ret == AVERROR(EAGAIN))
2979
                continue;
2980

2981 2982
            av_log(NULL, AV_LOG_ERROR, "Error while filtering.\n");
            break;
2983
        }
2984 2985

        /* dump report by using the output first video and audio streams */
2986
        print_report(0, timer_start, cur_time);
Fabrice Bellard's avatar
Fabrice Bellard committed
2987
    }
2988
#if HAVE_PTHREADS
2989 2990
    free_input_threads();
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
2991

2992 2993
    /* at the end of stream, we must flush the decoder buffers */
    for (i = 0; i < nb_input_streams; i++) {
2994
        ist = input_streams[i];
2995
        if (!input_files[ist->file_index]->eof_reached && ist->decoding_needed) {
2996
            output_packet(ist, NULL);
2997
        }
2998
    }
2999
    flush_encoders();
3000

3001
    term_exit();
Fabrice Bellard's avatar
Fabrice Bellard committed
3002

3003
    /* write the trailer if needed and close file */
Aneesh Dogra's avatar
Aneesh Dogra committed
3004
    for (i = 0; i < nb_output_files; i++) {
3005
        os = output_files[i]->ctx;
3006
        av_write_trailer(os);
3007
    }
3008

3009
    /* dump report by using the first video and audio streams */
3010
    print_report(1, timer_start, av_gettime());
3011

3012
    /* close each encoder */
3013
    for (i = 0; i < nb_output_streams; i++) {
3014
        ost = output_streams[i];
3015 3016 3017
        if (ost->encoding_needed) {
            av_freep(&ost->st->codec->stats_in);
            avcodec_close(ost->st->codec);
3018 3019 3020
        }
    }

3021 3022
    /* close each decoder */
    for (i = 0; i < nb_input_streams; i++) {
3023
        ist = input_streams[i];
3024 3025
        if (ist->decoding_needed) {
            avcodec_close(ist->st->codec);
3026 3027
        }
    }
3028

3029 3030 3031 3032
    /* finished ! */
    ret = 0;

 fail:
3033
#if HAVE_PTHREADS
3034 3035
    free_input_threads();
#endif
3036

3037 3038
    if (output_streams) {
        for (i = 0; i < nb_output_streams; i++) {
3039
            ost = output_streams[i];
3040
            if (ost) {
3041
                if (ost->stream_copy)
3042 3043 3044 3045
                    av_freep(&ost->st->codec->extradata);
                if (ost->logfile) {
                    fclose(ost->logfile);
                    ost->logfile = NULL;
3046
                }
3047 3048 3049
                av_freep(&ost->st->codec->subtitle_header);
                av_free(ost->forced_kf_pts);
                av_dict_free(&ost->opts);
3050 3051 3052
            }
        }
    }
3053
    return ret;
Fabrice Bellard's avatar
Fabrice Bellard committed
3054 3055
}

3056

3057
static int64_t getutime(void)
3058
{
3059 3060
#if HAVE_GETRUSAGE
    struct rusage rusage;
3061

3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072
    getrusage(RUSAGE_SELF, &rusage);
    return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
#elif HAVE_GETPROCESSTIMES
    HANDLE proc;
    FILETIME c, e, k, u;
    proc = GetCurrentProcess();
    GetProcessTimes(proc, &c, &e, &k, &u);
    return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
#else
    return av_gettime();
#endif
3073
}
3074

3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092
static int64_t getmaxrss(void)
{
#if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
    struct rusage rusage;
    getrusage(RUSAGE_SELF, &rusage);
    return (int64_t)rusage.ru_maxrss * 1024;
#elif HAVE_GETPROCESSMEMORYINFO
    HANDLE proc;
    PROCESS_MEMORY_COUNTERS memcounters;
    proc = GetCurrentProcess();
    memcounters.cb = sizeof(memcounters);
    GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
    return memcounters.PeakPagefileUsage;
#else
    return 0;
#endif
}

3093
static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
3094 3095 3096
{
}

3097 3098 3099 3100
static void parse_cpuflags(int argc, char **argv, const OptionDef *options)
{
    int idx = locate_option(argc, argv, options, "cpuflags");
    if (idx && argv[idx + 1])
3101
        opt_cpuflags(NULL, "cpuflags", argv[idx + 1]);
3102 3103
}

3104 3105
int main(int argc, char **argv)
{
3106
    OptionsContext o = { 0 };
3107 3108
    int64_t ti;

3109 3110
    atexit(exit_program);

3111
    reset_options(&o, 0);
3112

3113 3114
    setvbuf(stderr,NULL,_IONBF,0); /* win32 runtime needs this */

3115
    av_log_set_flags(AV_LOG_SKIP_REPEATED);
3116
    parse_loglevel(argc, argv, options);
3117

3118
    if(argc>1 && !strcmp(argv[1], "-d")){
3119
        run_as_daemon=1;
3120 3121 3122 3123 3124
        av_log_set_callback(log_callback_null);
        argc--;
        argv++;
    }

Luca Abeni's avatar
Luca Abeni committed
3125
    avcodec_register_all();
3126
#if CONFIG_AVDEVICE
Luca Abeni's avatar
Luca Abeni committed
3127
    avdevice_register_all();
3128 3129
#endif
    avfilter_register_all();
3130
    av_register_all();
3131
    avformat_network_init();
3132

3133
    show_banner(argc, argv, options);
3134

3135 3136
    term_init();

3137 3138
    parse_cpuflags(argc, argv, options);

3139
    /* parse options */
3140
    parse_options(&o, argc, argv, options, opt_output_file);
3141

3142
    if (nb_output_files <= 0 && nb_input_files == 0) {
3143
        show_usage();
3144
        av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
3145
        exit(1);
3146
    }
3147

3148 3149
    /* file converter / grab */
    if (nb_output_files <= 0) {
3150
        av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
3151
        exit(1);
3152 3153
    }

3154 3155
//     if (nb_input_files == 0) {
//         av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
3156
//         exit(1);
3157
//     }
3158

3159
    current_time = ti = getutime();
3160
    if (transcode() < 0)
3161
        exit(1);
3162 3163
    ti = getutime() - ti;
    if (do_benchmark) {
3164 3165
        int maxrss = getmaxrss() / 1024;
        printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
3166 3167
    }

3168
    exit(0);
3169
    return 0;
3170
}