annotate ffmpeg/libavformat/mux.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * muxing functions for use within FFmpeg
yading@11 3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
yading@11 4 *
yading@11 5 * This file is part of FFmpeg.
yading@11 6 *
yading@11 7 * FFmpeg is free software; you can redistribute it and/or
yading@11 8 * modify it under the terms of the GNU Lesser General Public
yading@11 9 * License as published by the Free Software Foundation; either
yading@11 10 * version 2.1 of the License, or (at your option) any later version.
yading@11 11 *
yading@11 12 * FFmpeg is distributed in the hope that it will be useful,
yading@11 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 15 * Lesser General Public License for more details.
yading@11 16 *
yading@11 17 * You should have received a copy of the GNU Lesser General Public
yading@11 18 * License along with FFmpeg; if not, write to the Free Software
yading@11 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 20 */
yading@11 21
yading@11 22 /* #define DEBUG */
yading@11 23
yading@11 24 #include "avformat.h"
yading@11 25 #include "avio_internal.h"
yading@11 26 #include "internal.h"
yading@11 27 #include "libavcodec/internal.h"
yading@11 28 #include "libavcodec/bytestream.h"
yading@11 29 #include "libavutil/opt.h"
yading@11 30 #include "libavutil/dict.h"
yading@11 31 #include "libavutil/pixdesc.h"
yading@11 32 #include "libavutil/timestamp.h"
yading@11 33 #include "metadata.h"
yading@11 34 #include "id3v2.h"
yading@11 35 #include "libavutil/avassert.h"
yading@11 36 #include "libavutil/avstring.h"
yading@11 37 #include "libavutil/mathematics.h"
yading@11 38 #include "libavutil/parseutils.h"
yading@11 39 #include "libavutil/time.h"
yading@11 40 #include "riff.h"
yading@11 41 #include "audiointerleave.h"
yading@11 42 #include "url.h"
yading@11 43 #include <stdarg.h>
yading@11 44 #if CONFIG_NETWORK
yading@11 45 #include "network.h"
yading@11 46 #endif
yading@11 47
yading@11 48 #undef NDEBUG
yading@11 49 #include <assert.h>
yading@11 50
yading@11 51 /**
yading@11 52 * @file
yading@11 53 * muxing functions for use within libavformat
yading@11 54 */
yading@11 55
yading@11 56 /* fraction handling */
yading@11 57
yading@11 58 /**
yading@11 59 * f = val + (num / den) + 0.5.
yading@11 60 *
yading@11 61 * 'num' is normalized so that it is such as 0 <= num < den.
yading@11 62 *
yading@11 63 * @param f fractional number
yading@11 64 * @param val integer value
yading@11 65 * @param num must be >= 0
yading@11 66 * @param den must be >= 1
yading@11 67 */
yading@11 68 static void frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
yading@11 69 {
yading@11 70 num += (den >> 1);
yading@11 71 if (num >= den) {
yading@11 72 val += num / den;
yading@11 73 num = num % den;
yading@11 74 }
yading@11 75 f->val = val;
yading@11 76 f->num = num;
yading@11 77 f->den = den;
yading@11 78 }
yading@11 79
yading@11 80 /**
yading@11 81 * Fractional addition to f: f = f + (incr / f->den).
yading@11 82 *
yading@11 83 * @param f fractional number
yading@11 84 * @param incr increment, can be positive or negative
yading@11 85 */
yading@11 86 static void frac_add(AVFrac *f, int64_t incr)
yading@11 87 {
yading@11 88 int64_t num, den;
yading@11 89
yading@11 90 num = f->num + incr;
yading@11 91 den = f->den;
yading@11 92 if (num < 0) {
yading@11 93 f->val += num / den;
yading@11 94 num = num % den;
yading@11 95 if (num < 0) {
yading@11 96 num += den;
yading@11 97 f->val--;
yading@11 98 }
yading@11 99 } else if (num >= den) {
yading@11 100 f->val += num / den;
yading@11 101 num = num % den;
yading@11 102 }
yading@11 103 f->num = num;
yading@11 104 }
yading@11 105
yading@11 106 AVRational ff_choose_timebase(AVFormatContext *s, AVStream *st, int min_precission)
yading@11 107 {
yading@11 108 AVRational q;
yading@11 109 int j;
yading@11 110
yading@11 111 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
yading@11 112 q = (AVRational){1, st->codec->sample_rate};
yading@11 113 } else {
yading@11 114 q = st->codec->time_base;
yading@11 115 }
yading@11 116 for (j=2; j<14; j+= 1+(j>2))
yading@11 117 while (q.den / q.num < min_precission && q.num % j == 0)
yading@11 118 q.num /= j;
yading@11 119 while (q.den / q.num < min_precission && q.den < (1<<24))
yading@11 120 q.den <<= 1;
yading@11 121
yading@11 122 return q;
yading@11 123 }
yading@11 124
yading@11 125 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
yading@11 126 const char *format, const char *filename)
yading@11 127 {
yading@11 128 AVFormatContext *s = avformat_alloc_context();
yading@11 129 int ret = 0;
yading@11 130
yading@11 131 *avctx = NULL;
yading@11 132 if (!s)
yading@11 133 goto nomem;
yading@11 134
yading@11 135 if (!oformat) {
yading@11 136 if (format) {
yading@11 137 oformat = av_guess_format(format, NULL, NULL);
yading@11 138 if (!oformat) {
yading@11 139 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
yading@11 140 ret = AVERROR(EINVAL);
yading@11 141 goto error;
yading@11 142 }
yading@11 143 } else {
yading@11 144 oformat = av_guess_format(NULL, filename, NULL);
yading@11 145 if (!oformat) {
yading@11 146 ret = AVERROR(EINVAL);
yading@11 147 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
yading@11 148 filename);
yading@11 149 goto error;
yading@11 150 }
yading@11 151 }
yading@11 152 }
yading@11 153
yading@11 154 s->oformat = oformat;
yading@11 155 if (s->oformat->priv_data_size > 0) {
yading@11 156 s->priv_data = av_mallocz(s->oformat->priv_data_size);
yading@11 157 if (!s->priv_data)
yading@11 158 goto nomem;
yading@11 159 if (s->oformat->priv_class) {
yading@11 160 *(const AVClass**)s->priv_data= s->oformat->priv_class;
yading@11 161 av_opt_set_defaults(s->priv_data);
yading@11 162 }
yading@11 163 } else
yading@11 164 s->priv_data = NULL;
yading@11 165
yading@11 166 if (filename)
yading@11 167 av_strlcpy(s->filename, filename, sizeof(s->filename));
yading@11 168 *avctx = s;
yading@11 169 return 0;
yading@11 170 nomem:
yading@11 171 av_log(s, AV_LOG_ERROR, "Out of memory\n");
yading@11 172 ret = AVERROR(ENOMEM);
yading@11 173 error:
yading@11 174 avformat_free_context(s);
yading@11 175 return ret;
yading@11 176 }
yading@11 177
yading@11 178 #if FF_API_ALLOC_OUTPUT_CONTEXT
yading@11 179 AVFormatContext *avformat_alloc_output_context(const char *format,
yading@11 180 AVOutputFormat *oformat, const char *filename)
yading@11 181 {
yading@11 182 AVFormatContext *avctx;
yading@11 183 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
yading@11 184 return ret < 0 ? NULL : avctx;
yading@11 185 }
yading@11 186 #endif
yading@11 187
yading@11 188 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
yading@11 189 {
yading@11 190 const AVCodecTag *avctag;
yading@11 191 int n;
yading@11 192 enum AVCodecID id = AV_CODEC_ID_NONE;
yading@11 193 unsigned int tag = 0;
yading@11 194
yading@11 195 /**
yading@11 196 * Check that tag + id is in the table
yading@11 197 * If neither is in the table -> OK
yading@11 198 * If tag is in the table with another id -> FAIL
yading@11 199 * If id is in the table with another tag -> FAIL unless strict < normal
yading@11 200 */
yading@11 201 for (n = 0; s->oformat->codec_tag[n]; n++) {
yading@11 202 avctag = s->oformat->codec_tag[n];
yading@11 203 while (avctag->id != AV_CODEC_ID_NONE) {
yading@11 204 if (avpriv_toupper4(avctag->tag) == avpriv_toupper4(st->codec->codec_tag)) {
yading@11 205 id = avctag->id;
yading@11 206 if (id == st->codec->codec_id)
yading@11 207 return 1;
yading@11 208 }
yading@11 209 if (avctag->id == st->codec->codec_id)
yading@11 210 tag = avctag->tag;
yading@11 211 avctag++;
yading@11 212 }
yading@11 213 }
yading@11 214 if (id != AV_CODEC_ID_NONE)
yading@11 215 return 0;
yading@11 216 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
yading@11 217 return 0;
yading@11 218 return 1;
yading@11 219 }
yading@11 220
yading@11 221
yading@11 222 static int init_muxer(AVFormatContext *s, AVDictionary **options)
yading@11 223 {
yading@11 224 int ret = 0, i;
yading@11 225 AVStream *st;
yading@11 226 AVDictionary *tmp = NULL;
yading@11 227 AVCodecContext *codec = NULL;
yading@11 228 AVOutputFormat *of = s->oformat;
yading@11 229
yading@11 230 if (options)
yading@11 231 av_dict_copy(&tmp, *options, 0);
yading@11 232
yading@11 233 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
yading@11 234 goto fail;
yading@11 235 if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
yading@11 236 (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
yading@11 237 goto fail;
yading@11 238
yading@11 239 // some sanity checks
yading@11 240 if (s->nb_streams == 0 && !(of->flags & AVFMT_NOSTREAMS)) {
yading@11 241 av_log(s, AV_LOG_ERROR, "no streams\n");
yading@11 242 ret = AVERROR(EINVAL);
yading@11 243 goto fail;
yading@11 244 }
yading@11 245
yading@11 246 for (i = 0; i < s->nb_streams; i++) {
yading@11 247 st = s->streams[i];
yading@11 248 codec = st->codec;
yading@11 249
yading@11 250 switch (codec->codec_type) {
yading@11 251 case AVMEDIA_TYPE_AUDIO:
yading@11 252 if (codec->sample_rate <= 0) {
yading@11 253 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
yading@11 254 ret = AVERROR(EINVAL);
yading@11 255 goto fail;
yading@11 256 }
yading@11 257 if (!codec->block_align)
yading@11 258 codec->block_align = codec->channels *
yading@11 259 av_get_bits_per_sample(codec->codec_id) >> 3;
yading@11 260 break;
yading@11 261 case AVMEDIA_TYPE_VIDEO:
yading@11 262 if (codec->time_base.num <= 0 ||
yading@11 263 codec->time_base.den <= 0) { //FIXME audio too?
yading@11 264 av_log(s, AV_LOG_ERROR, "time base not set\n");
yading@11 265 ret = AVERROR(EINVAL);
yading@11 266 goto fail;
yading@11 267 }
yading@11 268
yading@11 269 if ((codec->width <= 0 || codec->height <= 0) &&
yading@11 270 !(of->flags & AVFMT_NODIMENSIONS)) {
yading@11 271 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
yading@11 272 ret = AVERROR(EINVAL);
yading@11 273 goto fail;
yading@11 274 }
yading@11 275 if (av_cmp_q(st->sample_aspect_ratio, codec->sample_aspect_ratio)
yading@11 276 && FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(codec->sample_aspect_ratio)) > 0.004*av_q2d(st->sample_aspect_ratio)
yading@11 277 ) {
yading@11 278 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between muxer "
yading@11 279 "(%d/%d) and encoder layer (%d/%d)\n",
yading@11 280 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
yading@11 281 codec->sample_aspect_ratio.num,
yading@11 282 codec->sample_aspect_ratio.den);
yading@11 283 ret = AVERROR(EINVAL);
yading@11 284 goto fail;
yading@11 285 }
yading@11 286 break;
yading@11 287 }
yading@11 288
yading@11 289 if (of->codec_tag) {
yading@11 290 if ( codec->codec_tag
yading@11 291 && codec->codec_id == AV_CODEC_ID_RAWVIDEO
yading@11 292 && ( av_codec_get_tag(of->codec_tag, codec->codec_id) == 0
yading@11 293 || av_codec_get_tag(of->codec_tag, codec->codec_id) == MKTAG('r', 'a', 'w', ' '))
yading@11 294 && !validate_codec_tag(s, st)) {
yading@11 295 // the current rawvideo encoding system ends up setting
yading@11 296 // the wrong codec_tag for avi/mov, we override it here
yading@11 297 codec->codec_tag = 0;
yading@11 298 }
yading@11 299 if (codec->codec_tag) {
yading@11 300 if (!validate_codec_tag(s, st)) {
yading@11 301 char tagbuf[32], cortag[32];
yading@11 302 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), codec->codec_tag);
yading@11 303 av_get_codec_tag_string(cortag, sizeof(cortag), av_codec_get_tag(s->oformat->codec_tag, codec->codec_id));
yading@11 304 av_log(s, AV_LOG_ERROR,
yading@11 305 "Tag %s/0x%08x incompatible with output codec id '%d' (%s)\n",
yading@11 306 tagbuf, codec->codec_tag, codec->codec_id, cortag);
yading@11 307 ret = AVERROR_INVALIDDATA;
yading@11 308 goto fail;
yading@11 309 }
yading@11 310 } else
yading@11 311 codec->codec_tag = av_codec_get_tag(of->codec_tag, codec->codec_id);
yading@11 312 }
yading@11 313
yading@11 314 if (of->flags & AVFMT_GLOBALHEADER &&
yading@11 315 !(codec->flags & CODEC_FLAG_GLOBAL_HEADER))
yading@11 316 av_log(s, AV_LOG_WARNING,
yading@11 317 "Codec for stream %d does not use global headers "
yading@11 318 "but container format requires global headers\n", i);
yading@11 319 }
yading@11 320
yading@11 321 if (!s->priv_data && of->priv_data_size > 0) {
yading@11 322 s->priv_data = av_mallocz(of->priv_data_size);
yading@11 323 if (!s->priv_data) {
yading@11 324 ret = AVERROR(ENOMEM);
yading@11 325 goto fail;
yading@11 326 }
yading@11 327 if (of->priv_class) {
yading@11 328 *(const AVClass **)s->priv_data = of->priv_class;
yading@11 329 av_opt_set_defaults(s->priv_data);
yading@11 330 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
yading@11 331 goto fail;
yading@11 332 }
yading@11 333 }
yading@11 334
yading@11 335 /* set muxer identification string */
yading@11 336 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
yading@11 337 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
yading@11 338 }
yading@11 339
yading@11 340 if (options) {
yading@11 341 av_dict_free(options);
yading@11 342 *options = tmp;
yading@11 343 }
yading@11 344
yading@11 345 return 0;
yading@11 346
yading@11 347 fail:
yading@11 348 av_dict_free(&tmp);
yading@11 349 return ret;
yading@11 350 }
yading@11 351
yading@11 352 static int init_pts(AVFormatContext *s)
yading@11 353 {
yading@11 354 int i;
yading@11 355 AVStream *st;
yading@11 356
yading@11 357 /* init PTS generation */
yading@11 358 for (i = 0; i < s->nb_streams; i++) {
yading@11 359 int64_t den = AV_NOPTS_VALUE;
yading@11 360 st = s->streams[i];
yading@11 361
yading@11 362 switch (st->codec->codec_type) {
yading@11 363 case AVMEDIA_TYPE_AUDIO:
yading@11 364 den = (int64_t)st->time_base.num * st->codec->sample_rate;
yading@11 365 break;
yading@11 366 case AVMEDIA_TYPE_VIDEO:
yading@11 367 den = (int64_t)st->time_base.num * st->codec->time_base.den;
yading@11 368 break;
yading@11 369 default:
yading@11 370 break;
yading@11 371 }
yading@11 372 if (den != AV_NOPTS_VALUE) {
yading@11 373 if (den <= 0)
yading@11 374 return AVERROR_INVALIDDATA;
yading@11 375
yading@11 376 frac_init(&st->pts, 0, 0, den);
yading@11 377 }
yading@11 378 }
yading@11 379
yading@11 380 return 0;
yading@11 381 }
yading@11 382
yading@11 383 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
yading@11 384 {
yading@11 385 int ret = 0;
yading@11 386
yading@11 387 if (ret = init_muxer(s, options))
yading@11 388 return ret;
yading@11 389
yading@11 390 if (s->oformat->write_header) {
yading@11 391 ret = s->oformat->write_header(s);
yading@11 392 if (ret >= 0 && s->pb && s->pb->error < 0)
yading@11 393 ret = s->pb->error;
yading@11 394 if (ret < 0)
yading@11 395 return ret;
yading@11 396 }
yading@11 397
yading@11 398 if ((ret = init_pts(s)) < 0)
yading@11 399 return ret;
yading@11 400
yading@11 401 return 0;
yading@11 402 }
yading@11 403
yading@11 404 //FIXME merge with compute_pkt_fields
yading@11 405 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt)
yading@11 406 {
yading@11 407 int delay = FFMAX(st->codec->has_b_frames, st->codec->max_b_frames > 0);
yading@11 408 int num, den, frame_size, i;
yading@11 409
yading@11 410 av_dlog(s, "compute_pkt_fields2: pts:%s dts:%s cur_dts:%s b:%d size:%d st:%d\n",
yading@11 411 av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), delay, pkt->size, pkt->stream_index);
yading@11 412
yading@11 413 /* duration field */
yading@11 414 if (pkt->duration == 0) {
yading@11 415 ff_compute_frame_duration(&num, &den, st, NULL, pkt);
yading@11 416 if (den && num) {
yading@11 417 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
yading@11 418 }
yading@11 419 }
yading@11 420
yading@11 421 if (pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay == 0)
yading@11 422 pkt->pts = pkt->dts;
yading@11 423
yading@11 424 //XXX/FIXME this is a temporary hack until all encoders output pts
yading@11 425 if ((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay) {
yading@11 426 static int warned;
yading@11 427 if (!warned) {
yading@11 428 av_log(s, AV_LOG_WARNING, "Encoder did not produce proper pts, making some up.\n");
yading@11 429 warned = 1;
yading@11 430 }
yading@11 431 pkt->dts =
yading@11 432 // pkt->pts= st->cur_dts;
yading@11 433 pkt->pts = st->pts.val;
yading@11 434 }
yading@11 435
yading@11 436 //calculate dts from pts
yading@11 437 if (pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
yading@11 438 st->pts_buffer[0] = pkt->pts;
yading@11 439 for (i = 1; i < delay + 1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
yading@11 440 st->pts_buffer[i] = pkt->pts + (i - delay - 1) * pkt->duration;
yading@11 441 for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
yading@11 442 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
yading@11 443
yading@11 444 pkt->dts = st->pts_buffer[0];
yading@11 445 }
yading@11 446
yading@11 447 if (st->cur_dts && st->cur_dts != AV_NOPTS_VALUE &&
yading@11 448 ((!(s->oformat->flags & AVFMT_TS_NONSTRICT) &&
yading@11 449 st->cur_dts >= pkt->dts) || st->cur_dts > pkt->dts)) {
yading@11 450 av_log(s, AV_LOG_ERROR,
yading@11 451 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %s >= %s\n",
yading@11 452 st->index, av_ts2str(st->cur_dts), av_ts2str(pkt->dts));
yading@11 453 return AVERROR(EINVAL);
yading@11 454 }
yading@11 455 if (pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts) {
yading@11 456 av_log(s, AV_LOG_ERROR, "pts (%s) < dts (%s) in stream %d\n",
yading@11 457 av_ts2str(pkt->pts), av_ts2str(pkt->dts), st->index);
yading@11 458 return AVERROR(EINVAL);
yading@11 459 }
yading@11 460
yading@11 461 av_dlog(s, "av_write_frame: pts2:%s dts2:%s\n",
yading@11 462 av_ts2str(pkt->pts), av_ts2str(pkt->dts));
yading@11 463 st->cur_dts = pkt->dts;
yading@11 464 st->pts.val = pkt->dts;
yading@11 465
yading@11 466 /* update pts */
yading@11 467 switch (st->codec->codec_type) {
yading@11 468 case AVMEDIA_TYPE_AUDIO:
yading@11 469 frame_size = ff_get_audio_frame_size(st->codec, pkt->size, 1);
yading@11 470
yading@11 471 /* HACK/FIXME, we skip the initial 0 size packets as they are most
yading@11 472 * likely equal to the encoder delay, but it would be better if we
yading@11 473 * had the real timestamps from the encoder */
yading@11 474 if (frame_size >= 0 && (pkt->size || st->pts.num != st->pts.den >> 1 || st->pts.val)) {
yading@11 475 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
yading@11 476 }
yading@11 477 break;
yading@11 478 case AVMEDIA_TYPE_VIDEO:
yading@11 479 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
yading@11 480 break;
yading@11 481 default:
yading@11 482 break;
yading@11 483 }
yading@11 484 return 0;
yading@11 485 }
yading@11 486
yading@11 487 /**
yading@11 488 * Move side data from payload to internal struct, call muxer, and restore
yading@11 489 * original packet.
yading@11 490 */
yading@11 491 static inline int split_write_packet(AVFormatContext *s, AVPacket *pkt)
yading@11 492 {
yading@11 493 int ret, did_split;
yading@11 494
yading@11 495 did_split = av_packet_split_side_data(pkt);
yading@11 496 ret = s->oformat->write_packet(s, pkt);
yading@11 497 if (s->flush_packets && s->pb && s->pb->error >= 0)
yading@11 498 avio_flush(s->pb);
yading@11 499 if (did_split)
yading@11 500 av_packet_merge_side_data(pkt);
yading@11 501 return ret;
yading@11 502 }
yading@11 503
yading@11 504 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
yading@11 505 {
yading@11 506 int ret;
yading@11 507
yading@11 508 if (!pkt) {
yading@11 509 if (s->oformat->flags & AVFMT_ALLOW_FLUSH) {
yading@11 510 ret = s->oformat->write_packet(s, NULL);
yading@11 511 if (s->flush_packets && s->pb && s->pb->error >= 0)
yading@11 512 avio_flush(s->pb);
yading@11 513 if (ret >= 0 && s->pb && s->pb->error < 0)
yading@11 514 ret = s->pb->error;
yading@11 515 return ret;
yading@11 516 }
yading@11 517 return 1;
yading@11 518 }
yading@11 519
yading@11 520 ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
yading@11 521
yading@11 522 if (ret < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
yading@11 523 return ret;
yading@11 524
yading@11 525 ret = split_write_packet(s, pkt);
yading@11 526 if (ret >= 0 && s->pb && s->pb->error < 0)
yading@11 527 ret = s->pb->error;
yading@11 528
yading@11 529 if (ret >= 0)
yading@11 530 s->streams[pkt->stream_index]->nb_frames++;
yading@11 531 return ret;
yading@11 532 }
yading@11 533
yading@11 534 #define CHUNK_START 0x1000
yading@11 535
yading@11 536 int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
yading@11 537 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
yading@11 538 {
yading@11 539 AVPacketList **next_point, *this_pktl;
yading@11 540 AVStream *st = s->streams[pkt->stream_index];
yading@11 541 int chunked = s->max_chunk_size || s->max_chunk_duration;
yading@11 542
yading@11 543 this_pktl = av_mallocz(sizeof(AVPacketList));
yading@11 544 if (!this_pktl)
yading@11 545 return AVERROR(ENOMEM);
yading@11 546 this_pktl->pkt = *pkt;
yading@11 547 #if FF_API_DESTRUCT_PACKET
yading@11 548 pkt->destruct = NULL; // do not free original but only the copy
yading@11 549 #endif
yading@11 550 pkt->buf = NULL;
yading@11 551 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-allocated memory
yading@11 552
yading@11 553 if (s->streams[pkt->stream_index]->last_in_packet_buffer) {
yading@11 554 next_point = &(st->last_in_packet_buffer->next);
yading@11 555 } else {
yading@11 556 next_point = &s->packet_buffer;
yading@11 557 }
yading@11 558
yading@11 559 if (chunked) {
yading@11 560 uint64_t max= av_rescale_q_rnd(s->max_chunk_duration, AV_TIME_BASE_Q, st->time_base, AV_ROUND_UP);
yading@11 561 st->interleaver_chunk_size += pkt->size;
yading@11 562 st->interleaver_chunk_duration += pkt->duration;
yading@11 563 if ( (s->max_chunk_size && st->interleaver_chunk_size > s->max_chunk_size)
yading@11 564 || (max && st->interleaver_chunk_duration > max)) {
yading@11 565 st->interleaver_chunk_size = 0;
yading@11 566 this_pktl->pkt.flags |= CHUNK_START;
yading@11 567 if (max && st->interleaver_chunk_duration > max) {
yading@11 568 int64_t syncoffset = (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)*max/2;
yading@11 569 int64_t syncto = av_rescale(pkt->dts + syncoffset, 1, max)*max - syncoffset;
yading@11 570
yading@11 571 st->interleaver_chunk_duration += (pkt->dts - syncto)/8 - max;
yading@11 572 } else
yading@11 573 st->interleaver_chunk_duration = 0;
yading@11 574 }
yading@11 575 }
yading@11 576 if (*next_point) {
yading@11 577 if (chunked && !(this_pktl->pkt.flags & CHUNK_START))
yading@11 578 goto next_non_null;
yading@11 579
yading@11 580 if (compare(s, &s->packet_buffer_end->pkt, pkt)) {
yading@11 581 while ( *next_point
yading@11 582 && ((chunked && !((*next_point)->pkt.flags&CHUNK_START))
yading@11 583 || !compare(s, &(*next_point)->pkt, pkt)))
yading@11 584 next_point = &(*next_point)->next;
yading@11 585 if (*next_point)
yading@11 586 goto next_non_null;
yading@11 587 } else {
yading@11 588 next_point = &(s->packet_buffer_end->next);
yading@11 589 }
yading@11 590 }
yading@11 591 av_assert1(!*next_point);
yading@11 592
yading@11 593 s->packet_buffer_end = this_pktl;
yading@11 594 next_non_null:
yading@11 595
yading@11 596 this_pktl->next = *next_point;
yading@11 597
yading@11 598 s->streams[pkt->stream_index]->last_in_packet_buffer =
yading@11 599 *next_point = this_pktl;
yading@11 600 return 0;
yading@11 601 }
yading@11 602
yading@11 603 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
yading@11 604 {
yading@11 605 AVStream *st = s->streams[pkt->stream_index];
yading@11 606 AVStream *st2 = s->streams[next->stream_index];
yading@11 607 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
yading@11 608 st->time_base);
yading@11 609 if (s->audio_preload && ((st->codec->codec_type == AVMEDIA_TYPE_AUDIO) != (st2->codec->codec_type == AVMEDIA_TYPE_AUDIO))) {
yading@11 610 int64_t ts = av_rescale_q(pkt ->dts, st ->time_base, AV_TIME_BASE_Q) - s->audio_preload*(st ->codec->codec_type == AVMEDIA_TYPE_AUDIO);
yading@11 611 int64_t ts2= av_rescale_q(next->dts, st2->time_base, AV_TIME_BASE_Q) - s->audio_preload*(st2->codec->codec_type == AVMEDIA_TYPE_AUDIO);
yading@11 612 if (ts == ts2) {
yading@11 613 ts= ( pkt ->dts* st->time_base.num*AV_TIME_BASE - s->audio_preload*(int64_t)(st ->codec->codec_type == AVMEDIA_TYPE_AUDIO)* st->time_base.den)*st2->time_base.den
yading@11 614 -( next->dts*st2->time_base.num*AV_TIME_BASE - s->audio_preload*(int64_t)(st2->codec->codec_type == AVMEDIA_TYPE_AUDIO)*st2->time_base.den)* st->time_base.den;
yading@11 615 ts2=0;
yading@11 616 }
yading@11 617 comp= (ts>ts2) - (ts<ts2);
yading@11 618 }
yading@11 619
yading@11 620 if (comp == 0)
yading@11 621 return pkt->stream_index < next->stream_index;
yading@11 622 return comp > 0;
yading@11 623 }
yading@11 624
yading@11 625 int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
yading@11 626 AVPacket *pkt, int flush)
yading@11 627 {
yading@11 628 AVPacketList *pktl;
yading@11 629 int stream_count = 0, noninterleaved_count = 0;
yading@11 630 int64_t delta_dts_max = 0;
yading@11 631 int i, ret;
yading@11 632
yading@11 633 if (pkt) {
yading@11 634 ret = ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
yading@11 635 if (ret < 0)
yading@11 636 return ret;
yading@11 637 }
yading@11 638
yading@11 639 for (i = 0; i < s->nb_streams; i++) {
yading@11 640 if (s->streams[i]->last_in_packet_buffer) {
yading@11 641 ++stream_count;
yading@11 642 } else if (s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
yading@11 643 ++noninterleaved_count;
yading@11 644 }
yading@11 645 }
yading@11 646
yading@11 647 if (s->nb_streams == stream_count) {
yading@11 648 flush = 1;
yading@11 649 } else if (!flush) {
yading@11 650 for (i=0; i < s->nb_streams; i++) {
yading@11 651 if (s->streams[i]->last_in_packet_buffer) {
yading@11 652 int64_t delta_dts =
yading@11 653 av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
yading@11 654 s->streams[i]->time_base,
yading@11 655 AV_TIME_BASE_Q) -
yading@11 656 av_rescale_q(s->packet_buffer->pkt.dts,
yading@11 657 s->streams[s->packet_buffer->pkt.stream_index]->time_base,
yading@11 658 AV_TIME_BASE_Q);
yading@11 659 delta_dts_max= FFMAX(delta_dts_max, delta_dts);
yading@11 660 }
yading@11 661 }
yading@11 662 if (s->nb_streams == stream_count+noninterleaved_count &&
yading@11 663 delta_dts_max > 20*AV_TIME_BASE) {
yading@11 664 av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
yading@11 665 flush = 1;
yading@11 666 }
yading@11 667 }
yading@11 668 if (stream_count && flush) {
yading@11 669 AVStream *st;
yading@11 670 pktl = s->packet_buffer;
yading@11 671 *out = pktl->pkt;
yading@11 672 st = s->streams[out->stream_index];
yading@11 673
yading@11 674 s->packet_buffer = pktl->next;
yading@11 675 if (!s->packet_buffer)
yading@11 676 s->packet_buffer_end = NULL;
yading@11 677
yading@11 678 if (st->last_in_packet_buffer == pktl)
yading@11 679 st->last_in_packet_buffer = NULL;
yading@11 680 av_freep(&pktl);
yading@11 681
yading@11 682 if (s->avoid_negative_ts > 0) {
yading@11 683 if (out->dts != AV_NOPTS_VALUE) {
yading@11 684 if (!st->mux_ts_offset && out->dts < 0) {
yading@11 685 for (i = 0; i < s->nb_streams; i++) {
yading@11 686 s->streams[i]->mux_ts_offset =
yading@11 687 av_rescale_q_rnd(-out->dts,
yading@11 688 st->time_base,
yading@11 689 s->streams[i]->time_base,
yading@11 690 AV_ROUND_UP);
yading@11 691 }
yading@11 692 }
yading@11 693 out->dts += st->mux_ts_offset;
yading@11 694 }
yading@11 695 if (out->pts != AV_NOPTS_VALUE)
yading@11 696 out->pts += st->mux_ts_offset;
yading@11 697 }
yading@11 698
yading@11 699 return 1;
yading@11 700 } else {
yading@11 701 av_init_packet(out);
yading@11 702 return 0;
yading@11 703 }
yading@11 704 }
yading@11 705
yading@11 706 /**
yading@11 707 * Interleave an AVPacket correctly so it can be muxed.
yading@11 708 * @param out the interleaved packet will be output here
yading@11 709 * @param in the input packet
yading@11 710 * @param flush 1 if no further packets are available as input and all
yading@11 711 * remaining packets should be output
yading@11 712 * @return 1 if a packet was output, 0 if no packet could be output,
yading@11 713 * < 0 if an error occurred
yading@11 714 */
yading@11 715 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush)
yading@11 716 {
yading@11 717 if (s->oformat->interleave_packet) {
yading@11 718 int ret = s->oformat->interleave_packet(s, out, in, flush);
yading@11 719 if (in)
yading@11 720 av_free_packet(in);
yading@11 721 return ret;
yading@11 722 } else
yading@11 723 return ff_interleave_packet_per_dts(s, out, in, flush);
yading@11 724 }
yading@11 725
yading@11 726 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt)
yading@11 727 {
yading@11 728 int ret, flush = 0;
yading@11 729
yading@11 730 if (pkt) {
yading@11 731 AVStream *st = s->streams[pkt->stream_index];
yading@11 732
yading@11 733 //FIXME/XXX/HACK drop zero sized packets
yading@11 734 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size == 0)
yading@11 735 return 0;
yading@11 736
yading@11 737 av_dlog(s, "av_interleaved_write_frame size:%d dts:%s pts:%s\n",
yading@11 738 pkt->size, av_ts2str(pkt->dts), av_ts2str(pkt->pts));
yading@11 739 if ((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
yading@11 740 return ret;
yading@11 741
yading@11 742 if (pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
yading@11 743 return AVERROR(EINVAL);
yading@11 744 } else {
yading@11 745 av_dlog(s, "av_interleaved_write_frame FLUSH\n");
yading@11 746 flush = 1;
yading@11 747 }
yading@11 748
yading@11 749 for (;; ) {
yading@11 750 AVPacket opkt;
yading@11 751 int ret = interleave_packet(s, &opkt, pkt, flush);
yading@11 752 if (ret <= 0) //FIXME cleanup needed for ret<0 ?
yading@11 753 return ret;
yading@11 754
yading@11 755 ret = split_write_packet(s, &opkt);
yading@11 756 if (ret >= 0)
yading@11 757 s->streams[opkt.stream_index]->nb_frames++;
yading@11 758
yading@11 759 av_free_packet(&opkt);
yading@11 760 pkt = NULL;
yading@11 761
yading@11 762 if (ret < 0)
yading@11 763 return ret;
yading@11 764 if(s->pb && s->pb->error)
yading@11 765 return s->pb->error;
yading@11 766 }
yading@11 767 }
yading@11 768
yading@11 769 int av_write_trailer(AVFormatContext *s)
yading@11 770 {
yading@11 771 int ret, i;
yading@11 772
yading@11 773 for (;; ) {
yading@11 774 AVPacket pkt;
yading@11 775 ret = interleave_packet(s, &pkt, NULL, 1);
yading@11 776 if (ret < 0) //FIXME cleanup needed for ret<0 ?
yading@11 777 goto fail;
yading@11 778 if (!ret)
yading@11 779 break;
yading@11 780
yading@11 781 ret = split_write_packet(s, &pkt);
yading@11 782 if (ret >= 0)
yading@11 783 s->streams[pkt.stream_index]->nb_frames++;
yading@11 784
yading@11 785 av_free_packet(&pkt);
yading@11 786
yading@11 787 if (ret < 0)
yading@11 788 goto fail;
yading@11 789 if(s->pb && s->pb->error)
yading@11 790 goto fail;
yading@11 791 }
yading@11 792
yading@11 793 if (s->oformat->write_trailer)
yading@11 794 ret = s->oformat->write_trailer(s);
yading@11 795
yading@11 796 fail:
yading@11 797 if (s->pb)
yading@11 798 avio_flush(s->pb);
yading@11 799 if (ret == 0)
yading@11 800 ret = s->pb ? s->pb->error : 0;
yading@11 801 for (i = 0; i < s->nb_streams; i++) {
yading@11 802 av_freep(&s->streams[i]->priv_data);
yading@11 803 av_freep(&s->streams[i]->index_entries);
yading@11 804 }
yading@11 805 if (s->oformat->priv_class)
yading@11 806 av_opt_free(s->priv_data);
yading@11 807 av_freep(&s->priv_data);
yading@11 808 return ret;
yading@11 809 }
yading@11 810
yading@11 811 int av_get_output_timestamp(struct AVFormatContext *s, int stream,
yading@11 812 int64_t *dts, int64_t *wall)
yading@11 813 {
yading@11 814 if (!s->oformat || !s->oformat->get_output_timestamp)
yading@11 815 return AVERROR(ENOSYS);
yading@11 816 s->oformat->get_output_timestamp(s, stream, dts, wall);
yading@11 817 return 0;
yading@11 818 }