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

#include "avformat.h"
#include "avio_internal.h"
#include "internal.h"
#include "libavcodec/internal.h"
#include "libavcodec/bytestream.h"
#include "libavutil/opt.h"
#include "libavutil/dict.h"
#include "libavutil/pixdesc.h"
#include "metadata.h"
#include "id3v2.h"
#include "libavutil/avstring.h"
33
#include "libavutil/internal.h"
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
#include "libavutil/mathematics.h"
#include "libavutil/parseutils.h"
#include "libavutil/time.h"
#include "riff.h"
#include "audiointerleave.h"
#include "url.h"
#include <stdarg.h>
#if CONFIG_NETWORK
#include "network.h"
#endif

#undef NDEBUG
#include <assert.h>

/**
 * @file
 * muxing functions for use within Libav
 */

static int validate_codec_tag(AVFormatContext *s, AVStream *st)
{
    const AVCodecTag *avctag;
    int n;
    enum AVCodecID id = AV_CODEC_ID_NONE;
    unsigned int tag  = 0;

    /**
     * Check that tag + id is in the table
     * If neither is in the table -> OK
     * If tag is in the table with another id -> FAIL
     * If id is in the table with another tag -> FAIL unless strict < normal
     */
    for (n = 0; s->oformat->codec_tag[n]; n++) {
        avctag = s->oformat->codec_tag[n];
        while (avctag->id != AV_CODEC_ID_NONE) {
69
            if (avpriv_toupper4(avctag->tag) == avpriv_toupper4(st->codecpar->codec_tag)) {
70
                id = avctag->id;
71
                if (id == st->codecpar->codec_id)
72 73
                    return 1;
            }
74
            if (avctag->id == st->codecpar->codec_id)
75 76 77 78 79 80
                tag = avctag->tag;
            avctag++;
        }
    }
    if (id != AV_CODEC_ID_NONE)
        return 0;
81
    if (tag && (s->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
82 83 84 85
        return 0;
    return 1;
}

86 87

static int init_muxer(AVFormatContext *s, AVDictionary **options)
88 89 90 91
{
    int ret = 0, i;
    AVStream *st;
    AVDictionary *tmp = NULL;
92
    AVCodecParameters *par = NULL;
93
    AVOutputFormat *of = s->oformat;
94
    const AVCodecDescriptor *desc;
95 96 97

    if (options)
        av_dict_copy(&tmp, *options, 0);
98

99 100 101
    if ((ret = av_opt_set_dict(s, &tmp)) < 0)
        goto fail;

102
#if FF_API_LAVF_BITEXACT && FF_API_LAVF_AVCTX
103
FF_DISABLE_DEPRECATION_WARNINGS
104
    if (s->nb_streams && s->streams[0]->codec->flags & AV_CODEC_FLAG_BITEXACT)
105
        s->flags |= AVFMT_FLAG_BITEXACT;
106
FF_ENABLE_DEPRECATION_WARNINGS
107 108
#endif

109
    // some sanity checks
110
    if (s->nb_streams == 0 && !(of->flags & AVFMT_NOSTREAMS)) {
111 112 113 114 115 116
        av_log(s, AV_LOG_ERROR, "no streams\n");
        ret = AVERROR(EINVAL);
        goto fail;
    }

    for (i = 0; i < s->nb_streams; i++) {
117 118
        st  = s->streams[i];
        par = st->codecpar;
119

120
#if FF_API_LAVF_CODEC_TB && FF_API_LAVF_AVCTX
121
FF_DISABLE_DEPRECATION_WARNINGS
122
        if (!st->time_base.num && st->codec->time_base.num) {
123 124 125
            av_log(s, AV_LOG_WARNING, "Using AVStream.codec.time_base as a "
                   "timebase hint to the muxer is deprecated. Set "
                   "AVStream.time_base instead.\n");
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
            avpriv_set_pts_info(st, 64, st->codec->time_base.num, st->codec->time_base.den);
        }
FF_ENABLE_DEPRECATION_WARNINGS
#endif

#if FF_API_LAVF_AVCTX
FF_DISABLE_DEPRECATION_WARNINGS
        if (st->codecpar->codec_type == AVMEDIA_TYPE_UNKNOWN &&
            st->codec->codec_type    != AVMEDIA_TYPE_UNKNOWN) {
            av_log(s, AV_LOG_WARNING, "Using AVStream.codec to pass codec "
                   "parameters to muxers is deprecated, use AVStream.codecpar "
                   "instead.\n");
            ret = avcodec_parameters_from_context(st->codecpar, st->codec);
            if (ret < 0)
                goto fail;
141 142 143 144 145 146
        }
FF_ENABLE_DEPRECATION_WARNINGS
#endif

        if (!st->time_base.num) {
            /* fall back on the default timebase values */
147 148
            if (par->codec_type == AVMEDIA_TYPE_AUDIO && par->sample_rate)
                avpriv_set_pts_info(st, 64, 1, par->sample_rate);
149 150 151 152
            else
                avpriv_set_pts_info(st, 33, 1, 90000);
        }

153
        switch (par->codec_type) {
154
        case AVMEDIA_TYPE_AUDIO:
155
            if (par->sample_rate <= 0) {
156 157 158 159
                av_log(s, AV_LOG_ERROR, "sample rate not set\n");
                ret = AVERROR(EINVAL);
                goto fail;
            }
160 161 162
            if (!par->block_align)
                par->block_align = par->channels *
                                   av_get_bits_per_sample(par->codec_id) >> 3;
163 164
            break;
        case AVMEDIA_TYPE_VIDEO:
165
            if ((par->width <= 0 || par->height <= 0) &&
166
                !(of->flags & AVFMT_NODIMENSIONS)) {
167 168 169 170
                av_log(s, AV_LOG_ERROR, "dimensions not set\n");
                ret = AVERROR(EINVAL);
                goto fail;
            }
171 172

            if (av_cmp_q(st->sample_aspect_ratio,
173
                         par->sample_aspect_ratio)) {
174 175
                if (st->sample_aspect_ratio.num != 0 &&
                    st->sample_aspect_ratio.den != 0 &&
176 177
                    par->sample_aspect_ratio.den != 0 &&
                    par->sample_aspect_ratio.den != 0) {
178 179 180
                    av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between muxer "
                            "(%d/%d) and encoder layer (%d/%d)\n",
                            st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
181 182
                            par->sample_aspect_ratio.num,
                            par->sample_aspect_ratio.den);
183 184 185
                    ret = AVERROR(EINVAL);
                    goto fail;
                }
186 187 188 189
            }
            break;
        }

190
        desc = avcodec_descriptor_get(par->codec_id);
191 192 193
        if (desc && desc->props & AV_CODEC_PROP_REORDER)
            st->internal->reorder = 1;

194
        if (of->codec_tag) {
195 196 197
            if (par->codec_tag &&
                par->codec_id == AV_CODEC_ID_RAWVIDEO &&
                !av_codec_get_tag(of->codec_tag, par->codec_id) &&
198 199 200
                !validate_codec_tag(s, st)) {
                // the current rawvideo encoding system ends up setting
                // the wrong codec_tag for avi, we override it here
201
                par->codec_tag = 0;
202
            }
203
            if (par->codec_tag) {
204 205
                if (!validate_codec_tag(s, st)) {
                    char tagbuf[32];
206
                    av_get_codec_tag_string(tagbuf, sizeof(tagbuf), par->codec_tag);
207
                    av_log(s, AV_LOG_ERROR,
208
                           "Tag %s/0x%08"PRIx32" incompatible with output codec id '%d'\n",
209
                           tagbuf, par->codec_tag, par->codec_id);
210 211 212 213
                    ret = AVERROR_INVALIDDATA;
                    goto fail;
                }
            } else
214
                par->codec_tag = av_codec_get_tag(of->codec_tag, par->codec_id);
215 216
        }

217
        if (par->codec_type != AVMEDIA_TYPE_ATTACHMENT)
218
            s->internal->nb_interleaved_streams++;
219 220
    }

221 222
    if (!s->priv_data && of->priv_data_size > 0) {
        s->priv_data = av_mallocz(of->priv_data_size);
223 224 225 226
        if (!s->priv_data) {
            ret = AVERROR(ENOMEM);
            goto fail;
        }
227 228
        if (of->priv_class) {
            *(const AVClass **)s->priv_data = of->priv_class;
229 230 231 232 233 234 235
            av_opt_set_defaults(s->priv_data);
            if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
                goto fail;
        }
    }

    /* set muxer identification string */
236
    if (!(s->flags & AVFMT_FLAG_BITEXACT)) {
237 238 239
        av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
    }

240 241 242
    if (options) {
         av_dict_free(options);
         *options = tmp;
243 244
    }

245 246 247 248 249 250 251 252 253 254 255 256 257 258
    return 0;

fail:
    av_dict_free(&tmp);
    return ret;
}

int avformat_write_header(AVFormatContext *s, AVDictionary **options)
{
    int ret = 0;

    if (ret = init_muxer(s, options))
        return ret;

259 260
    if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
        avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_HEADER);
261 262 263 264
    if (s->oformat->write_header) {
        ret = s->oformat->write_header(s);
        if (ret < 0)
            return ret;
265
    }
266 267
    if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
        avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_UNKNOWN);
268

269 270 271 272 273 274 275
    if (s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_AUTO) {
        if (s->oformat->flags & (AVFMT_TS_NEGATIVE | AVFMT_NOTIMESTAMPS)) {
            s->avoid_negative_ts = 0;
        } else
            s->avoid_negative_ts = AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE;
    }

276 277 278
    return 0;
}

279
#if FF_API_COMPUTE_PKT_FIELDS2 && FF_API_LAVF_AVCTX
280
FF_DISABLE_DEPRECATION_WARNINGS
281 282 283 284
//FIXME merge with compute_pkt_fields
static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt)
{
    int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
285
    int num, den, i;
286

287 288 289 290 291 292 293 294 295 296
    if (!s->internal->missing_ts_warning &&
        !(s->oformat->flags & AVFMT_NOTIMESTAMPS) &&
        (pkt->pts == AV_NOPTS_VALUE || pkt->dts == AV_NOPTS_VALUE)) {
        av_log(s, AV_LOG_WARNING,
               "Timestamps are unset in a packet for stream %d. "
               "This is deprecated and will stop working in the future. "
               "Fix your code to set the timestamps properly\n", st->index);
        s->internal->missing_ts_warning = 1;
    }

297
    av_log(s, AV_LOG_TRACE, "compute_pkt_fields2: pts:%" PRId64 " dts:%" PRId64 " cur_dts:%" PRId64 " b:%d size:%d st:%d\n",
298 299 300 301 302 303 304
            pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);

/*    if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
 *      return AVERROR(EINVAL);*/

    /* duration field */
    if (pkt->duration == 0) {
305
        ff_compute_frame_duration(s, &num, &den, st, NULL, pkt);
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333
        if (den && num) {
            pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
        }
    }

    if (pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay == 0)
        pkt->pts = pkt->dts;

    //calculate dts from pts
    if (pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
        st->pts_buffer[0] = pkt->pts;
        for (i = 1; i < delay + 1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
            st->pts_buffer[i] = pkt->pts + (i - delay - 1) * pkt->duration;
        for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
            FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);

        pkt->dts = st->pts_buffer[0];
    }

    if (st->cur_dts && st->cur_dts != AV_NOPTS_VALUE &&
        ((!(s->oformat->flags & AVFMT_TS_NONSTRICT) &&
          st->cur_dts >= pkt->dts) || st->cur_dts > pkt->dts)) {
        av_log(s, AV_LOG_ERROR,
               "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %" PRId64 " >= %" PRId64 "\n",
               st->index, st->cur_dts, pkt->dts);
        return AVERROR(EINVAL);
    }
    if (pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts) {
334 335 336 337
        av_log(s, AV_LOG_ERROR,
               "pts %" PRId64 " < dts %" PRId64 " in stream %d\n",
               pkt->pts, pkt->dts,
               st->index);
338 339 340
        return AVERROR(EINVAL);
    }

341
    av_log(s, AV_LOG_TRACE, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n",
342 343
            pkt->pts, pkt->dts);
    st->cur_dts = pkt->dts;
344

345 346
    return 0;
}
347
FF_ENABLE_DEPRECATION_WARNINGS
348
#endif
349

350 351 352 353 354 355 356 357 358
/*
 * FIXME: this function should NEVER get undefined pts/dts beside when the
 * AVFMT_NOTIMESTAMPS is set.
 * Those additional safety checks should be dropped once the correct checks
 * are set in the callers.
 */

static int write_packet(AVFormatContext *s, AVPacket *pkt)
{
359
    int ret;
360 361
    // If the timestamp offsetting below is adjusted, adjust
    // ff_interleaved_peek similarly.
362
    if (s->avoid_negative_ts > 0) {
363 364 365
        AVRational time_base = s->streams[pkt->stream_index]->time_base;
        int64_t offset = 0;

366
        if (s->internal->offset == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
367
            (pkt->dts < 0 || s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_MAKE_ZERO)) {
368 369
            s->internal->offset = -pkt->dts;
            s->internal->offset_timebase = time_base;
370
        }
371 372
        if (s->internal->offset != AV_NOPTS_VALUE)
            offset = av_rescale_q(s->internal->offset, s->internal->offset_timebase, time_base);
373 374 375 376 377

        if (pkt->dts != AV_NOPTS_VALUE)
            pkt->dts += offset;
        if (pkt->pts != AV_NOPTS_VALUE)
            pkt->pts += offset;
378 379 380 381 382 383 384 385

        if (pkt->dts != AV_NOPTS_VALUE && pkt->dts < 0) {
            av_log(s, AV_LOG_WARNING,
                   "Packets poorly interleaved, failed to avoid negative "
                   "timestamp %"PRId64" in stream %d.\n"
                   "Try -max_interleave_delta 0 as a possible workaround.\n",
                   pkt->dts, pkt->stream_index);
        }
386
    }
387 388
    ret = s->oformat->write_packet(s, pkt);

389 390 391 392 393 394
    if (s->pb && ret >= 0) {
        if (s->flags & AVFMT_FLAG_FLUSH_PACKETS)
            avio_flush(s->pb);
        if (s->pb->error < 0)
            ret = s->pb->error;
    }
395 396

    return ret;
397 398
}

399 400 401 402 403 404 405 406 407 408 409
static int check_packet(AVFormatContext *s, AVPacket *pkt)
{
    if (!pkt)
        return 0;

    if (pkt->stream_index < 0 || pkt->stream_index >= s->nb_streams) {
        av_log(s, AV_LOG_ERROR, "Invalid packet stream index: %d\n",
               pkt->stream_index);
        return AVERROR(EINVAL);
    }

410
    if (s->streams[pkt->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT) {
411 412 413 414 415 416 417
        av_log(s, AV_LOG_ERROR, "Received a packet for an attachment stream.\n");
        return AVERROR(EINVAL);
    }

    return 0;
}

418
static int prepare_input_packet(AVFormatContext *s, AVPacket *pkt)
419 420 421
{
    int ret;

422 423 424 425
    ret = check_packet(s, pkt);
    if (ret < 0)
        return ret;

426
#if !FF_API_COMPUTE_PKT_FIELDS2 || !FF_API_LAVF_AVCTX
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477
    /* sanitize the timestamps */
    if (!(s->oformat->flags & AVFMT_NOTIMESTAMPS)) {
        AVStream *st = s->streams[pkt->stream_index];

        /* when there is no reordering (so dts is equal to pts), but
         * only one of them is set, set the other as well */
        if (!st->internal->reorder) {
            if (pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE)
                pkt->pts = pkt->dts;
            if (pkt->dts == AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE)
                pkt->dts = pkt->pts;
        }

        /* check that the timestamps are set */
        if (pkt->pts == AV_NOPTS_VALUE || pkt->dts == AV_NOPTS_VALUE) {
            av_log(s, AV_LOG_ERROR,
                   "Timestamps are unset in a packet for stream %d\n", st->index);
            return AVERROR(EINVAL);
        }

        /* check that the dts are increasing (or at least non-decreasing,
         * if the format allows it */
        if (st->cur_dts != AV_NOPTS_VALUE &&
            ((!(s->oformat->flags & AVFMT_TS_NONSTRICT) && st->cur_dts >= pkt->dts) ||
             st->cur_dts > pkt->dts)) {
            av_log(s, AV_LOG_ERROR,
                   "Application provided invalid, non monotonically increasing "
                   "dts to muxer in stream %d: %" PRId64 " >= %" PRId64 "\n",
                   st->index, st->cur_dts, pkt->dts);
            return AVERROR(EINVAL);
        }

        if (pkt->pts < pkt->dts) {
            av_log(s, AV_LOG_ERROR, "pts %" PRId64 " < dts %" PRId64 " in stream %d\n",
                   pkt->pts, pkt->dts, st->index);
            return AVERROR(EINVAL);
        }
    }
#endif

    return 0;
}

int av_write_frame(AVFormatContext *s, AVPacket *pkt)
{
    int ret;

    ret = prepare_input_packet(s, pkt);
    if (ret < 0)
        return ret;

478 479 480 481 482 483
    if (!pkt) {
        if (s->oformat->flags & AVFMT_ALLOW_FLUSH)
            return s->oformat->write_packet(s, pkt);
        return 1;
    }

484
#if FF_API_COMPUTE_PKT_FIELDS2 && FF_API_LAVF_AVCTX
485 486 487 488
    ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);

    if (ret < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
        return ret;
489
#endif
490

491
    ret = write_packet(s, pkt);
492 493 494 495 496 497

    if (ret >= 0)
        s->streams[pkt->stream_index]->nb_frames++;
    return ret;
}

498 499
int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
                             int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
500
{
501
    int ret;
502 503 504
    AVPacketList **next_point, *this_pktl;

    this_pktl      = av_mallocz(sizeof(AVPacketList));
505 506
    if (!this_pktl)
        return AVERROR(ENOMEM);
507 508

    if ((ret = av_packet_ref(&this_pktl->pkt, pkt)) < 0) {
509 510 511
        av_free(this_pktl);
        return ret;
    }
512 513 514 515

    if (s->streams[pkt->stream_index]->last_in_packet_buffer) {
        next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
    } else
516
        next_point = &s->internal->packet_buffer;
517 518

    if (*next_point) {
519
        if (compare(s, &s->internal->packet_buffer_end->pkt, pkt)) {
520 521 522 523
            while (!compare(s, &(*next_point)->pkt, pkt))
                next_point = &(*next_point)->next;
            goto next_non_null;
        } else {
524
            next_point = &(s->internal->packet_buffer_end->next);
525 526 527 528
        }
    }
    assert(!*next_point);

529
    s->internal->packet_buffer_end = this_pktl;
530 531 532 533 534 535
next_non_null:

    this_pktl->next = *next_point;

    s->streams[pkt->stream_index]->last_in_packet_buffer =
        *next_point                                      = this_pktl;
536

537 538
    av_packet_unref(pkt);

539
    return 0;
540 541
}

542 543
static int interleave_compare_dts(AVFormatContext *s, AVPacket *next,
                                  AVPacket *pkt)
544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559
{
    AVStream *st  = s->streams[pkt->stream_index];
    AVStream *st2 = s->streams[next->stream_index];
    int comp      = av_compare_ts(next->dts, st2->time_base, pkt->dts,
                                  st->time_base);

    if (comp == 0)
        return pkt->stream_index < next->stream_index;
    return comp > 0;
}

int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
                                 AVPacket *pkt, int flush)
{
    AVPacketList *pktl;
    int stream_count = 0;
560
    int i, ret;
561 562

    if (pkt) {
563 564
        if ((ret = ff_interleave_add_packet(s, pkt, interleave_compare_dts)) < 0)
            return ret;
565 566
    }

567 568
    if (s->max_interleave_delta > 0 && s->internal->packet_buffer && !flush) {
        AVPacket *top_pkt = &s->internal->packet_buffer->pkt;
569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599
        int64_t delta_dts = INT64_MIN;
        int64_t top_dts = av_rescale_q(top_pkt->dts,
                                       s->streams[top_pkt->stream_index]->time_base,
                                       AV_TIME_BASE_Q);

        for (i = 0; i < s->nb_streams; i++) {
            int64_t last_dts;
            const AVPacketList *last = s->streams[i]->last_in_packet_buffer;

            if (!last)
                continue;

            last_dts = av_rescale_q(last->pkt.dts,
                                    s->streams[i]->time_base,
                                    AV_TIME_BASE_Q);
            delta_dts = FFMAX(delta_dts, last_dts - top_dts);
            stream_count++;
        }

        if (delta_dts > s->max_interleave_delta) {
            av_log(s, AV_LOG_DEBUG,
                   "Delay between the first packet and last packet in the "
                   "muxing queue is %"PRId64" > %"PRId64": forcing output\n",
                   delta_dts, s->max_interleave_delta);
            flush = 1;
        }
    } else {
        for (i = 0; i < s->nb_streams; i++)
            stream_count += !!s->streams[i]->last_in_packet_buffer;
    }

600

601
    if (stream_count && (s->internal->nb_interleaved_streams == stream_count || flush)) {
602
        pktl = s->internal->packet_buffer;
603 604
        *out = pktl->pkt;

605 606 607
        s->internal->packet_buffer = pktl->next;
        if (!s->internal->packet_buffer)
            s->internal->packet_buffer_end = NULL;
608 609 610 611 612 613 614 615 616 617 618

        if (s->streams[out->stream_index]->last_in_packet_buffer == pktl)
            s->streams[out->stream_index]->last_in_packet_buffer = NULL;
        av_freep(&pktl);
        return 1;
    } else {
        av_init_packet(out);
        return 0;
    }
}

619 620
int ff_interleaved_peek(AVFormatContext *s, int stream,
                        AVPacket *pkt, int add_offset)
621 622 623
{
    AVPacketList *pktl = s->internal->packet_buffer;
    while (pktl) {
624 625 626 627 628 629 630 631 632 633 634 635 636
        if (pktl->pkt.stream_index == stream) {
            *pkt = pktl->pkt;
            if (add_offset && s->internal->offset != AV_NOPTS_VALUE) {
                int64_t offset = av_rescale_q(s->internal->offset,
                                              s->internal->offset_timebase,
                                              s->streams[stream]->time_base);
                if (pkt->dts != AV_NOPTS_VALUE)
                    pkt->dts += offset;
                if (pkt->pts != AV_NOPTS_VALUE)
                    pkt->pts += offset;
            }
            return 0;
        }
637 638
        pktl = pktl->next;
    }
639
    return AVERROR(ENOENT);
640 641
}

642 643 644 645 646 647 648 649 650 651 652 653 654 655
/**
 * Interleave an AVPacket correctly so it can be muxed.
 * @param out the interleaved packet will be output here
 * @param in the input packet
 * @param flush 1 if no further packets are available as input and all
 *              remaining packets should be output
 * @return 1 if a packet was output, 0 if no packet could be output,
 *         < 0 if an error occurred
 */
static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush)
{
    if (s->oformat->interleave_packet) {
        int ret = s->oformat->interleave_packet(s, out, in, flush);
        if (in)
656
            av_packet_unref(in);
657 658 659 660 661 662 663 664 665
        return ret;
    } else
        return ff_interleave_packet_per_dts(s, out, in, flush);
}

int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt)
{
    int ret, flush = 0;

666
    ret = prepare_input_packet(s, pkt);
667
    if (ret < 0)
668
        goto fail;
669

670
    if (pkt) {
671
#if FF_API_COMPUTE_PKT_FIELDS2 && FF_API_LAVF_AVCTX
672 673
        AVStream *st = s->streams[pkt->stream_index];

674
        av_log(s, AV_LOG_TRACE, "av_interleaved_write_frame size:%d dts:%" PRId64 " pts:%" PRId64 "\n",
675 676
                pkt->size, pkt->dts, pkt->pts);
        if ((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
677
            goto fail;
678
#endif
679

680 681 682 683
        if (pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS)) {
            ret = AVERROR(EINVAL);
            goto fail;
        }
684
    } else {
685
        av_log(s, AV_LOG_TRACE, "av_interleaved_write_frame FLUSH\n");
686 687 688 689 690 691
        flush = 1;
    }

    for (;; ) {
        AVPacket opkt;
        int ret = interleave_packet(s, &opkt, pkt, flush);
692 693 694 695 696
        if (pkt) {
            memset(pkt, 0, sizeof(*pkt));
            av_init_packet(pkt);
            pkt = NULL;
        }
697 698 699
        if (ret <= 0) //FIXME cleanup needed for ret<0 ?
            return ret;

700
        ret = write_packet(s, &opkt);
701 702 703
        if (ret >= 0)
            s->streams[opkt.stream_index]->nb_frames++;

704
        av_packet_unref(&opkt);
705 706 707 708

        if (ret < 0)
            return ret;
    }
709 710 711
fail:
    av_packet_unref(pkt);
    return ret;
712 713 714 715 716 717 718 719 720 721 722 723 724 725
}

int av_write_trailer(AVFormatContext *s)
{
    int ret, i;

    for (;; ) {
        AVPacket pkt;
        ret = interleave_packet(s, &pkt, NULL, 1);
        if (ret < 0) //FIXME cleanup needed for ret<0 ?
            goto fail;
        if (!ret)
            break;

726
        ret = write_packet(s, &pkt);
727 728 729
        if (ret >= 0)
            s->streams[pkt.stream_index]->nb_frames++;

730
        av_packet_unref(&pkt);
731 732 733 734 735

        if (ret < 0)
            goto fail;
    }

736 737
    if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
        avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_TRAILER);
738 739 740
    if (s->oformat->write_trailer)
        ret = s->oformat->write_trailer(s);

741
    if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
742 743 744 745 746 747 748 749 750 751 752 753
        avio_flush(s->pb);

fail:
    for (i = 0; i < s->nb_streams; i++) {
        av_freep(&s->streams[i]->priv_data);
        av_freep(&s->streams[i]->index_entries);
    }
    if (s->oformat->priv_class)
        av_opt_free(s->priv_data);
    av_freep(&s->priv_data);
    return ret;
}
754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771

int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
                     AVFormatContext *src)
{
    AVPacket local_pkt;

    local_pkt = *pkt;
    local_pkt.stream_index = dst_stream;
    if (pkt->pts != AV_NOPTS_VALUE)
        local_pkt.pts = av_rescale_q(pkt->pts,
                                     src->streams[pkt->stream_index]->time_base,
                                     dst->streams[dst_stream]->time_base);
    if (pkt->dts != AV_NOPTS_VALUE)
        local_pkt.dts = av_rescale_q(pkt->dts,
                                     src->streams[pkt->stream_index]->time_base,
                                     dst->streams[dst_stream]->time_base);
    return av_write_frame(dst, &local_pkt);
}