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

#include <limits.h>
24

B
Baptiste Coudurier 已提交
25
//#define DEBUG
26 27
//#define DEBUG_METADATA
//#define MOV_EXPORT_ALL_METADATA
28

29
#include "libavutil/intreadwrite.h"
30
#include "libavutil/avstring.h"
31
#include "avformat.h"
32
#include "riff.h"
33
#include "isom.h"
34 35
#include "libavcodec/mpeg4audio.h"
#include "libavcodec/mpegaudiodata.h"
36
#include "libavcodec/get_bits.h"
37

38
#if CONFIG_ZLIB
39 40 41
#include <zlib.h>
#endif

42 43
/*
 * First version by Francois Revol revol@free.fr
44
 * Seek function by Gael Chardon gael.dev@4now.net
45
 *
46
 * Features and limitations:
47
 * - reads most of the QT files I have (at least the structure),
48 49
 *   Sample QuickTime files with mp3 audio can be found at: http://www.3ivx.com/showcase.html
 * - the code is quite ugly... maybe I won't do it recursive next time :-)
50
 *
51 52
 * Funny I didn't know about http://sourceforge.net/projects/qt-ffmpeg/
 * when coding this :) (it's a writer anyway)
53
 *
54 55 56
 * Reference documents:
 * http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt
 * Apple:
G
Gael Chardon 已提交
57
 *  http://developer.apple.com/documentation/QuickTime/QTFF/
58
 *  http://developer.apple.com/documentation/QuickTime/QTFF/qtff.pdf
59 60 61
 * QuickTime is a trademark of Apple (AFAIK :))
 */

62 63
#include "qtpalette.h"

G
Gael Chardon 已提交
64

65 66 67
#undef NDEBUG
#include <assert.h>

68 69 70 71
/* XXX: it's the first time I make a recursive parser I think... sorry if it's ugly :P */

/* those functions parse an atom */
/* return code:
B
Baptiste Coudurier 已提交
72
  0: continue to parse next atom
D
Diego Biurrun 已提交
73
 <0: error occurred, exit
B
Baptiste Coudurier 已提交
74
*/
75 76
/* links atom IDs to parse functions */
typedef struct MOVParseTableEntry {
77
    uint32_t type;
78
    int (*parse)(MOVContext *ctx, ByteIOContext *pb, MOVAtom atom);
79 80
} MOVParseTableEntry;

81 82
static const MOVParseTableEntry mov_default_parse_table[];

B
Baptiste Coudurier 已提交
83 84 85 86 87 88
static int mov_metadata_trkn(MOVContext *c, ByteIOContext *pb, unsigned len)
{
    char buf[16];

    get_be16(pb); // unknown
    snprintf(buf, sizeof(buf), "%d", get_be16(pb));
89
    av_metadata_set2(&c->fc->metadata, "track", buf, 0);
B
Baptiste Coudurier 已提交
90 91 92 93 94 95

    get_be16(pb); // total tracks

    return 0;
}

96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
static const uint32_t mac_to_unicode[128] = {
    0x00C4,0x00C5,0x00C7,0x00C9,0x00D1,0x00D6,0x00DC,0x00E1,
    0x00E0,0x00E2,0x00E4,0x00E3,0x00E5,0x00E7,0x00E9,0x00E8,
    0x00EA,0x00EB,0x00ED,0x00EC,0x00EE,0x00EF,0x00F1,0x00F3,
    0x00F2,0x00F4,0x00F6,0x00F5,0x00FA,0x00F9,0x00FB,0x00FC,
    0x2020,0x00B0,0x00A2,0x00A3,0x00A7,0x2022,0x00B6,0x00DF,
    0x00AE,0x00A9,0x2122,0x00B4,0x00A8,0x2260,0x00C6,0x00D8,
    0x221E,0x00B1,0x2264,0x2265,0x00A5,0x00B5,0x2202,0x2211,
    0x220F,0x03C0,0x222B,0x00AA,0x00BA,0x03A9,0x00E6,0x00F8,
    0x00BF,0x00A1,0x00AC,0x221A,0x0192,0x2248,0x2206,0x00AB,
    0x00BB,0x2026,0x00A0,0x00C0,0x00C3,0x00D5,0x0152,0x0153,
    0x2013,0x2014,0x201C,0x201D,0x2018,0x2019,0x00F7,0x25CA,
    0x00FF,0x0178,0x2044,0x20AC,0x2039,0x203A,0xFB01,0xFB02,
    0x2021,0x00B7,0x201A,0x201E,0x2030,0x00C2,0x00CA,0x00C1,
    0x00CB,0x00C8,0x00CD,0x00CE,0x00CF,0x00CC,0x00D3,0x00D4,
    0xF8FF,0x00D2,0x00DA,0x00DB,0x00D9,0x0131,0x02C6,0x02DC,
    0x00AF,0x02D8,0x02D9,0x02DA,0x00B8,0x02DD,0x02DB,0x02C7,
};

static int mov_read_mac_string(MOVContext *c, ByteIOContext *pb, int len,
                               char *dst, int dstlen)
{
    char *p = dst;
    char *end = dst+dstlen-1;
    int i;

    for (i = 0; i < len; i++) {
        uint8_t t, c = get_byte(pb);
        if (c < 0x80 && p < end)
            *p++ = c;
        else
            PUT_UTF8(mac_to_unicode[c-0x80], t, if (p < end) *p++ = t;);
    }
    *p = 0;
    return p - dst;
}

133 134 135 136 137 138 139
static int mov_read_udta_string(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
{
#ifdef MOV_EXPORT_ALL_METADATA
    char tmp_key[5];
#endif
    char str[1024], key2[16], language[4] = {0};
    const char *key = NULL;
140 141
    uint16_t str_size, langcode = 0;
    uint32_t data_type = 0;
B
Baptiste Coudurier 已提交
142
    int (*parse)(MOVContext*, ByteIOContext*, unsigned) = NULL;
143 144 145 146

    switch (atom.type) {
    case MKTAG(0xa9,'n','a','m'): key = "title";     break;
    case MKTAG(0xa9,'a','u','t'):
147
    case MKTAG(0xa9,'A','R','T'): key = "artist";    break;
148
    case MKTAG(0xa9,'w','r','t'): key = "composer";  break;
149
    case MKTAG( 'c','p','r','t'):
150 151 152 153
    case MKTAG(0xa9,'c','p','y'): key = "copyright"; break;
    case MKTAG(0xa9,'c','m','t'):
    case MKTAG(0xa9,'i','n','f'): key = "comment";   break;
    case MKTAG(0xa9,'a','l','b'): key = "album";     break;
154
    case MKTAG(0xa9,'d','a','y'): key = "date";      break;
155 156
    case MKTAG(0xa9,'g','e','n'): key = "genre";     break;
    case MKTAG(0xa9,'t','o','o'):
157
    case MKTAG(0xa9,'s','w','r'): key = "encoder";   break;
158
    case MKTAG(0xa9,'e','n','c'): key = "encoder";   break;
159 160 161 162 163
    case MKTAG( 'd','e','s','c'): key = "description";break;
    case MKTAG( 'l','d','e','s'): key = "synopsis";  break;
    case MKTAG( 't','v','s','h'): key = "show";      break;
    case MKTAG( 't','v','e','n'): key = "episode_id";break;
    case MKTAG( 't','v','n','n'): key = "network";   break;
B
Baptiste Coudurier 已提交
164 165
    case MKTAG( 't','r','k','n'): key = "track";
        parse = mov_metadata_trkn; break;
166 167 168 169 170 171
    }

    if (c->itunes_metadata && atom.size > 8) {
        int data_size = get_be32(pb);
        int tag = get_le32(pb);
        if (tag == MKTAG('d','a','t','a')) {
172
            data_type = get_be32(pb); // type
173 174 175 176 177 178
            get_be32(pb); // unknown
            str_size = data_size - 16;
            atom.size -= 16;
        } else return 0;
    } else if (atom.size > 4 && key && !c->itunes_metadata) {
        str_size = get_be16(pb); // string length
179 180
        langcode = get_be16(pb);
        ff_mov_lang_to_iso639(langcode, language);
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
        atom.size -= 4;
    } else
        str_size = atom.size;

#ifdef MOV_EXPORT_ALL_METADATA
    if (!key) {
        snprintf(tmp_key, 5, "%.4s", (char*)&atom.type);
        key = tmp_key;
    }
#endif

    if (!key)
        return 0;
    if (atom.size < 0)
        return -1;

    str_size = FFMIN3(sizeof(str)-1, str_size, atom.size);
B
Baptiste Coudurier 已提交
198 199 200 201

    if (parse)
        parse(c, pb, str_size);
    else {
202 203 204 205 206 207
        if (data_type == 3 || (data_type == 0 && langcode < 0x800)) { // MAC Encoded
            mov_read_mac_string(c, pb, str_size, str, sizeof(str));
        } else {
            get_buffer(pb, str, str_size);
            str[str_size] = 0;
        }
208
        av_metadata_set2(&c->fc->metadata, key, str, 0);
B
Baptiste Coudurier 已提交
209 210
        if (*language && strcmp(language, "und")) {
            snprintf(key2, sizeof(key2), "%s-%s", key, language);
211
            av_metadata_set2(&c->fc->metadata, key2, str, 0);
B
Baptiste Coudurier 已提交
212
        }
B
Baptiste Coudurier 已提交
213
    }
214 215 216 217 218 219 220 221
#ifdef DEBUG_METADATA
    av_log(c->fc, AV_LOG_DEBUG, "lang \"%3s\" ", language);
    av_log(c->fc, AV_LOG_DEBUG, "tag \"%s\" value \"%s\" atom \"%.4s\" %d %lld\n",
           key, str, (char*)&atom.type, str_size, atom.size);
#endif

    return 0;
}
222

D
David Conrad 已提交
223 224 225
static int mov_read_chpl(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
{
    int64_t start;
D
David Conrad 已提交
226
    int i, nb_chapters, str_len, version;
D
David Conrad 已提交
227 228 229 230 231
    char str[256+1];

    if ((atom.size -= 5) < 0)
        return 0;

D
David Conrad 已提交
232 233 234 235
    version = get_byte(pb);
    get_be24(pb);
    if (version)
        get_be32(pb); // ???
D
David Conrad 已提交
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
    nb_chapters = get_byte(pb);

    for (i = 0; i < nb_chapters; i++) {
        if (atom.size < 9)
            return 0;

        start = get_be64(pb);
        str_len = get_byte(pb);

        if ((atom.size -= 9+str_len) < 0)
            return 0;

        get_buffer(pb, str, str_len);
        str[str_len] = 0;
        ff_new_chapter(c->fc, i, (AVRational){1,10000000}, start, AV_NOPTS_VALUE, str);
    }
    return 0;
}

255
static int mov_read_default(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
256
{
257
    int64_t total_size = 0;
258
    MOVAtom a;
259
    int i;
260

261
    if (atom.size < 0)
B
Baptiste Coudurier 已提交
262
        atom.size = INT64_MAX;
263
    while (total_size + 8 < atom.size && !url_feof(pb)) {
264
        int (*parse)(MOVContext*, ByteIOContext*, MOVAtom) = NULL;
265
        a.size = atom.size;
B
Baptiste Coudurier 已提交
266
        a.type=0;
267
        if(atom.size >= 8) {
268
            a.size = get_be32(pb);
269
            a.type = get_le32(pb);
270
        }
271 272
        dprintf(c->fc, "type: %08x '%.4s' parent:'%.4s' sz: %"PRId64" %"PRId64" %"PRId64"\n",
                a.type, (char*)&a.type, (char*)&atom.type, a.size, total_size, atom.size);
273
        total_size += 8;
274
        if (a.size == 1) { /* 64 bit extended size */
275
            a.size = get_be64(pb) - 8;
276
            total_size += 8;
277
        }
278 279 280
        if (a.size == 0) {
            a.size = atom.size - total_size;
            if (a.size <= 8)
281
                break;
282 283
        }
        a.size -= 8;
284
        if(a.size < 0)
285
            break;
B
Baptiste Coudurier 已提交
286
        a.size = FFMIN(a.size, atom.size - total_size);
287

288 289 290 291 292
        for (i = 0; mov_default_parse_table[i].type; i++)
            if (mov_default_parse_table[i].type == a.type) {
                parse = mov_default_parse_table[i].parse;
                break;
            }
293

294 295 296 297 298 299
        // container is user data
        if (!parse && (atom.type == MKTAG('u','d','t','a') ||
                       atom.type == MKTAG('i','l','s','t')))
            parse = mov_read_udta_string;

        if (!parse) { /* skip leaf atoms data */
300
            url_fskip(pb, a.size);
301
        } else {
302
            int64_t start_pos = url_ftell(pb);
303
            int64_t left;
304 305 306
            int err = parse(c, pb, a);
            if (err < 0)
                return err;
307 308 309
            if (c->found_moov && c->found_mdat &&
                (url_is_streamed(pb) || start_pos + a.size == url_fsize(pb)))
                return 0;
310 311 312
            left = a.size - url_ftell(pb) + start_pos;
            if (left > 0) /* skip garbage at atom end */
                url_fskip(pb, left);
313
        }
314

315
        total_size += a.size;
316 317
    }

318
    if (total_size < atom.size && atom.size < 0x7ffff)
319
        url_fskip(pb, atom.size - total_size);
320

321
    return 0;
322 323
}

324
static int mov_read_dref(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
325
{
326 327
    AVStream *st;
    MOVStreamContext *sc;
328 329
    int entries, i, j;

330 331 332 333 334
    if (c->fc->nb_streams < 1)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];
    sc = st->priv_data;

335 336 337 338 339
    get_be32(pb); // version + flags
    entries = get_be32(pb);
    if (entries >= UINT_MAX / sizeof(*sc->drefs))
        return -1;
    sc->drefs = av_mallocz(entries * sizeof(*sc->drefs));
340 341 342
    if (!sc->drefs)
        return AVERROR(ENOMEM);
    sc->drefs_count = entries;
343 344

    for (i = 0; i < sc->drefs_count; i++) {
345
        MOVDref *dref = &sc->drefs[i];
346
        uint32_t size = get_be32(pb);
347
        int64_t next = url_ftell(pb) + size - 4;
348

349 350 351
        if (size < 12)
            return -1;

352 353 354 355 356 357 358 359 360 361 362 363 364
        dref->type = get_le32(pb);
        get_be32(pb); // version + flags
        dprintf(c->fc, "type %.4s size %d\n", (char*)&dref->type, size);

        if (dref->type == MKTAG('a','l','i','s') && size > 150) {
            /* macintosh alias record */
            uint16_t volume_len, len;
            int16_t type;

            url_fskip(pb, 10);

            volume_len = get_byte(pb);
            volume_len = FFMIN(volume_len, 27);
365 366 367
            get_buffer(pb, dref->volume, 27);
            dref->volume[volume_len] = 0;
            av_log(c->fc, AV_LOG_DEBUG, "volume %s, len %d\n", dref->volume, volume_len);
368

369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
            url_fskip(pb, 12);

            len = get_byte(pb);
            len = FFMIN(len, 63);
            get_buffer(pb, dref->filename, 63);
            dref->filename[len] = 0;
            av_log(c->fc, AV_LOG_DEBUG, "filename %s, len %d\n", dref->filename, len);

            url_fskip(pb, 16);

            /* read next level up_from_alias/down_to_target */
            dref->nlvl_from = get_be16(pb);
            dref->nlvl_to   = get_be16(pb);
            av_log(c->fc, AV_LOG_DEBUG, "nlvl from %d, nlvl to %d\n",
                   dref->nlvl_from, dref->nlvl_to);

            url_fskip(pb, 16);
386 387 388 389 390 391 392 393

            for (type = 0; type != -1 && url_ftell(pb) < next; ) {
                type = get_be16(pb);
                len = get_be16(pb);
                av_log(c->fc, AV_LOG_DEBUG, "type %d, len %d\n", type, len);
                if (len&1)
                    len += 1;
                if (type == 2) { // absolute path
394
                    av_free(dref->path);
395
                    dref->path = av_mallocz(len+1);
396 397
                    if (!dref->path)
                        return AVERROR(ENOMEM);
398
                    get_buffer(pb, dref->path, len);
399
                    if (len > volume_len && !strncmp(dref->path, dref->volume, volume_len)) {
400 401 402 403 404 405 406 407
                        len -= volume_len;
                        memmove(dref->path, dref->path+volume_len, len);
                        dref->path[len] = 0;
                    }
                    for (j = 0; j < len; j++)
                        if (dref->path[j] == ':')
                            dref->path[j] = '/';
                    av_log(c->fc, AV_LOG_DEBUG, "path %s\n", dref->path);
408 409 410 411 412 413 414 415 416 417 418
                } else if (type == 0) { // directory name
                    av_free(dref->dir);
                    dref->dir = av_malloc(len+1);
                    if (!dref->dir)
                        return AVERROR(ENOMEM);
                    get_buffer(pb, dref->dir, len);
                    dref->dir[len] = 0;
                    for (j = 0; j < len; j++)
                        if (dref->dir[j] == ':')
                            dref->dir[j] = '/';
                    av_log(c->fc, AV_LOG_DEBUG, "dir %s\n", dref->dir);
419 420 421 422 423 424 425 426 427
                } else
                    url_fskip(pb, len);
            }
        }
        url_fseek(pb, next, SEEK_SET);
    }
    return 0;
}

428
static int mov_read_hdlr(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
429
{
430
    AVStream *st;
431 432
    uint32_t type;
    uint32_t ctype;
433

434 435 436 437 438
    if (c->fc->nb_streams < 1) // meta before first trak
        return 0;

    st = c->fc->streams[c->fc->nb_streams-1];

439
    get_byte(pb); /* version */
440
    get_be24(pb); /* flags */
441 442 443 444 445

    /* component type */
    ctype = get_le32(pb);
    type = get_le32(pb); /* component subtype */

B
Baptiste Coudurier 已提交
446 447
    dprintf(c->fc, "ctype= %.4s (0x%08x)\n", (char*)&ctype, ctype);
    dprintf(c->fc, "stype= %.4s\n", (char*)&type);
448

449
    if     (type == MKTAG('v','i','d','e'))
450
        st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
451
    else if(type == MKTAG('s','o','u','n'))
452
        st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
453
    else if(type == MKTAG('m','1','a',' '))
454
        st->codec->codec_id = CODEC_ID_MP2;
455
    else if(type == MKTAG('s','u','b','p'))
456
        st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
457

458 459 460 461 462 463 464
    get_be32(pb); /* component  manufacture */
    get_be32(pb); /* component flags */
    get_be32(pb); /* component flags mask */

    return 0;
}

465
int ff_mp4_read_descr_len(ByteIOContext *pb)
466
{
467
    int len = 0;
468 469
    int count = 4;
    while (count--) {
470
        int c = get_byte(pb);
471 472 473
        len = (len << 7) | (c & 0x7f);
        if (!(c & 0x80))
            break;
474 475 476 477
    }
    return len;
}

478
static int mp4_read_descr(AVFormatContext *fc, ByteIOContext *pb, int *tag)
479 480 481
{
    int len;
    *tag = get_byte(pb);
482 483
    len = ff_mp4_read_descr_len(pb);
    dprintf(fc, "MPEG4 description: tag=0x%02x len=%d\n", *tag, len);
484 485 486
    return len;
}

487 488 489 490
#define MP4ESDescrTag                   0x03
#define MP4DecConfigDescrTag            0x04
#define MP4DecSpecificDescrTag          0x05

491
static const AVCodecTag mp4_audio_types[] = {
492 493 494 495
    { CODEC_ID_MP3ON4, AOT_PS   }, /* old mp3on4 draft */
    { CODEC_ID_MP3ON4, AOT_L1   }, /* layer 1 */
    { CODEC_ID_MP3ON4, AOT_L2   }, /* layer 2 */
    { CODEC_ID_MP3ON4, AOT_L3   }, /* layer 3 */
496
    { CODEC_ID_MP4ALS, AOT_ALS  }, /* MPEG-4 ALS */
497
    { CODEC_ID_NONE,   AOT_NULL },
498 499
};

500
int ff_mov_read_esds(AVFormatContext *fc, ByteIOContext *pb, MOVAtom atom)
501
{
502
    AVStream *st;
503
    int tag, len;
504

505
    if (fc->nb_streams < 1)
506
        return 0;
507
    st = fc->streams[fc->nb_streams-1];
508

509
    get_be32(pb); /* version + flags */
510
    len = mp4_read_descr(fc, pb, &tag);
511
    if (tag == MP4ESDescrTag) {
512 513
        get_be16(pb); /* ID */
        get_byte(pb); /* priority */
514
    } else
515
        get_be16(pb); /* ID */
516

517
    len = mp4_read_descr(fc, pb, &tag);
518
    if (tag == MP4DecConfigDescrTag) {
519 520 521 522 523 524
        int object_type_id = get_byte(pb);
        get_byte(pb); /* stream type */
        get_be24(pb); /* buffer size db */
        get_be32(pb); /* max bitrate */
        get_be32(pb); /* avg bitrate */

525
        st->codec->codec_id= ff_codec_get_id(ff_mp4_obj_type, object_type_id);
526
        dprintf(fc, "esds object type id 0x%02x\n", object_type_id);
527
        len = mp4_read_descr(fc, pb, &tag);
528
        if (tag == MP4DecSpecificDescrTag) {
529
            dprintf(fc, "Specific MPEG4 header len=%d\n", len);
B
Baptiste Coudurier 已提交
530 531
            if((uint64_t)len > (1<<30))
                return -1;
532
            av_free(st->codec->extradata);
B
Baptiste Coudurier 已提交
533
            st->codec->extradata = av_mallocz(len + FF_INPUT_BUFFER_PADDING_SIZE);
534 535
            if (!st->codec->extradata)
                return AVERROR(ENOMEM);
B
Baptiste Coudurier 已提交
536 537
            get_buffer(pb, st->codec->extradata, len);
            st->codec->extradata_size = len;
538 539 540 541
            if (st->codec->codec_id == CODEC_ID_AAC) {
                MPEG4AudioConfig cfg;
                ff_mpeg4audio_get_config(&cfg, st->codec->extradata,
                                         st->codec->extradata_size);
542
                st->codec->channels = cfg.channels;
543 544
                if (cfg.object_type == 29 && cfg.sampling_index < 3) // old mp3on4
                    st->codec->sample_rate = ff_mpa_freq_tab[cfg.sampling_index];
545 546
                else if (cfg.ext_sample_rate)
                    st->codec->sample_rate = cfg.ext_sample_rate;
547
                else
548
                    st->codec->sample_rate = cfg.sample_rate;
549
                dprintf(fc, "mp4a config channels %d obj %d ext obj %d "
550 551 552
                        "sample rate %d ext sample rate %d\n", st->codec->channels,
                        cfg.object_type, cfg.ext_object_type,
                        cfg.sample_rate, cfg.ext_sample_rate);
553 554
                if (!(st->codec->codec_id = ff_codec_get_id(mp4_audio_types,
                                                            cfg.object_type)))
555
                    st->codec->codec_id = CODEC_ID_AAC;
B
Baptiste Coudurier 已提交
556
            }
557
        }
558 559 560 561
    }
    return 0;
}

562 563 564 565 566
static int mov_read_esds(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
{
    return ff_mov_read_esds(c->fc, pb, atom);
}

567 568 569 570 571
static int mov_read_dac3(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
{
    AVStream *st;
    int ac3info, acmod, lfeon;

572 573
    if (c->fc->nb_streams < 1)
        return 0;
574 575 576 577 578 579 580 581 582 583
    st = c->fc->streams[c->fc->nb_streams-1];

    ac3info = get_be24(pb);
    acmod = (ac3info >> 11) & 0x7;
    lfeon = (ac3info >> 10) & 0x1;
    st->codec->channels = ((int[]){2,1,2,3,3,4,4,5})[acmod] + lfeon;

    return 0;
}

584 585 586 587
static int mov_read_pasp(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
{
    const int num = get_be32(pb);
    const int den = get_be32(pb);
588 589 590 591 592 593
    AVStream *st;

    if (c->fc->nb_streams < 1)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];

594 595 596 597 598 599 600
    if ((st->sample_aspect_ratio.den != 1 || st->sample_aspect_ratio.num) && // default
        (den != st->sample_aspect_ratio.den || num != st->sample_aspect_ratio.num)) {
        av_log(c->fc, AV_LOG_WARNING,
               "sample aspect ratio already set to %d:%d, ignoring 'pasp' atom (%d:%d)\n",
               st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
               num, den);
    } else if (den != 0) {
601 602 603 604 605 606
        st->sample_aspect_ratio.num = num;
        st->sample_aspect_ratio.den = den;
    }
    return 0;
}

607
/* this atom contains actual media data */
608
static int mov_read_mdat(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
609
{
610 611 612 613 614 615
    if(atom.size == 0) /* wrong one (MP4) */
        return 0;
    c->found_mdat=1;
    return 0; /* now go for moov */
}

616
/* read major brand, minor version and compatible brands and store them as metadata */
617
static int mov_read_ftyp(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
618
{
619 620 621 622 623 624 625
    uint32_t minor_ver;
    int comp_brand_size;
    char minor_ver_str[11]; /* 32 bit integer -> 10 digits + null */
    char* comp_brands_str;
    uint8_t type[5] = {0};

    get_buffer(pb, type, 4);
B
Baptiste Coudurier 已提交
626
    if (strcmp(type, "qt  "))
627
        c->isom = 1;
628
    av_log(c->fc, AV_LOG_DEBUG, "ISO: File Type Major Brand: %.4s\n",(char *)&type);
629
    av_metadata_set2(&c->fc->metadata, "major_brand", type, 0);
630 631
    minor_ver = get_be32(pb); /* minor version */
    snprintf(minor_ver_str, sizeof(minor_ver_str), "%d", minor_ver);
632
    av_metadata_set2(&c->fc->metadata, "minor_version", minor_ver_str, 0);
633 634 635 636 637 638 639 640 641

    comp_brand_size = atom.size - 8;
    if (comp_brand_size < 0)
        return -1;
    comp_brands_str = av_malloc(comp_brand_size + 1); /* Add null terminator */
    if (!comp_brands_str)
        return AVERROR(ENOMEM);
    get_buffer(pb, comp_brands_str, comp_brand_size);
    comp_brands_str[comp_brand_size] = 0;
642
    av_metadata_set2(&c->fc->metadata, "compatible_brands", comp_brands_str, 0);
643 644
    av_freep(&comp_brands_str);

645 646 647
    return 0;
}

648
/* this atom should contain all header atoms */
649
static int mov_read_moov(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
650
{
651 652
    if (mov_read_default(c, pb, atom) < 0)
        return -1;
653 654 655 656 657 658
    /* we parsed the 'moov' atom, we can terminate the parsing as soon as we find the 'mdat' */
    /* so we don't parse the whole file if over a network */
    c->found_moov=1;
    return 0; /* now go for mdat */
}

659
static int mov_read_moof(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
B
Baptiste Coudurier 已提交
660 661 662 663 664
{
    c->fragment.moof_offset = url_ftell(pb) - 8;
    dprintf(c->fc, "moof offset %llx\n", c->fragment.moof_offset);
    return mov_read_default(c, pb, atom);
}
665

666
static int mov_read_mdhd(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
667
{
668 669 670
    AVStream *st;
    MOVStreamContext *sc;
    int version;
671
    char language[4] = {0};
672
    unsigned lang;
673

674 675 676 677 678 679
    if (c->fc->nb_streams < 1)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];
    sc = st->priv_data;

    version = get_byte(pb);
680
    if (version > 1)
B
Baptiste Coudurier 已提交
681
        return -1; /* unsupported */
682

683
    get_be24(pb); /* flags */
B
clean  
Baptiste Coudurier 已提交
684 685 686 687 688 689 690
    if (version == 1) {
        get_be64(pb);
        get_be64(pb);
    } else {
        get_be32(pb); /* creation time */
        get_be32(pb); /* modification time */
    }
691

B
clean  
Baptiste Coudurier 已提交
692 693
    sc->time_scale = get_be32(pb);
    st->duration = (version == 1) ? get_be64(pb) : get_be32(pb); /* duration */
694

695
    lang = get_be16(pb); /* language */
696
    if (ff_mov_lang_to_iso639(lang, language))
697
        av_metadata_set2(&st->metadata, "language", language, 0);
698 699 700 701 702
    get_be16(pb); /* quality */

    return 0;
}

703
static int mov_read_mvhd(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
704
{
B
Baptiste Coudurier 已提交
705
    int version = get_byte(pb); /* version */
706
    get_be24(pb); /* flags */
707

B
Baptiste Coudurier 已提交
708 709 710 711 712 713 714
    if (version == 1) {
        get_be64(pb);
        get_be64(pb);
    } else {
        get_be32(pb); /* creation time */
        get_be32(pb); /* modification time */
    }
715
    c->time_scale = get_be32(pb); /* time scale */
716 717 718

    dprintf(c->fc, "time scale = %i\n", c->time_scale);

B
Baptiste Coudurier 已提交
719
    c->duration = (version == 1) ? get_be64(pb) : get_be32(pb); /* duration */
720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738
    get_be32(pb); /* preferred scale */

    get_be16(pb); /* preferred volume */

    url_fskip(pb, 10); /* reserved */

    url_fskip(pb, 36); /* display matrix */

    get_be32(pb); /* preview time */
    get_be32(pb); /* preview duration */
    get_be32(pb); /* poster time */
    get_be32(pb); /* selection time */
    get_be32(pb); /* selection duration */
    get_be32(pb); /* current time */
    get_be32(pb); /* next track ID */

    return 0;
}

739
static int mov_read_smi(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
740
{
741 742 743 744 745
    AVStream *st;

    if (c->fc->nb_streams < 1)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];
746

747 748
    if((uint64_t)atom.size > (1<<30))
        return -1;
749

750 751
    // currently SVQ3 decoder expect full STSD header - so let's fake it
    // this should be fixed and just SMI header should be passed
752
    av_free(st->codec->extradata);
753 754 755
    st->codec->extradata = av_mallocz(atom.size + 0x5a + FF_INPUT_BUFFER_PADDING_SIZE);
    if (!st->codec->extradata)
        return AVERROR(ENOMEM);
B
Baptiste Coudurier 已提交
756 757 758 759
    st->codec->extradata_size = 0x5a + atom.size;
    memcpy(st->codec->extradata, "SVQ3", 4); // fake
    get_buffer(pb, st->codec->extradata + 0x5a, atom.size);
    dprintf(c->fc, "Reading SMI %"PRId64"  %s\n", atom.size, st->codec->extradata + 0x5a);
760 761
    return 0;
}
762

763
static int mov_read_enda(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
764
{
765 766 767 768 769 770
    AVStream *st;
    int little_endian;

    if (c->fc->nb_streams < 1)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];
771

772
    little_endian = get_be16(pb);
773 774
    dprintf(c->fc, "enda %d\n", little_endian);
    if (little_endian == 1) {
775 776 777 778 779 780 781
        switch (st->codec->codec_id) {
        case CODEC_ID_PCM_S24BE:
            st->codec->codec_id = CODEC_ID_PCM_S24LE;
            break;
        case CODEC_ID_PCM_S32BE:
            st->codec->codec_id = CODEC_ID_PCM_S32LE;
            break;
782 783 784 785 786 787
        case CODEC_ID_PCM_F32BE:
            st->codec->codec_id = CODEC_ID_PCM_F32LE;
            break;
        case CODEC_ID_PCM_F64BE:
            st->codec->codec_id = CODEC_ID_PCM_F64LE;
            break;
788 789 790 791 792 793 794
        default:
            break;
        }
    }
    return 0;
}

795
/* FIXME modify qdm2/svq3/h264 decoders to take full atom as extradata */
796
static int mov_read_extradata(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
797
{
798 799
    AVStream *st;
    uint64_t size;
800
    uint8_t *buf;
801 802 803 804 805

    if (c->fc->nb_streams < 1) // will happen with jp2 files
        return 0;
    st= c->fc->streams[c->fc->nb_streams-1];
    size= (uint64_t)st->codec->extradata_size + atom.size + 8 + FF_INPUT_BUFFER_PADDING_SIZE;
806
    if(size > INT_MAX || (uint64_t)atom.size > INT_MAX)
807
        return -1;
808 809 810 811 812 813 814 815 816
    buf= av_realloc(st->codec->extradata, size);
    if(!buf)
        return -1;
    st->codec->extradata= buf;
    buf+= st->codec->extradata_size;
    st->codec->extradata_size= size - FF_INPUT_BUFFER_PADDING_SIZE;
    AV_WB32(       buf    , atom.size + 8);
    AV_WL32(       buf + 4, atom.type);
    get_buffer(pb, buf + 8, atom.size);
817 818 819
    return 0;
}

820
static int mov_read_wave(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
R
Roberto Togni 已提交
821
{
822 823 824 825 826
    AVStream *st;

    if (c->fc->nb_streams < 1)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];
R
Roberto Togni 已提交
827 828 829

    if((uint64_t)atom.size > (1<<30))
        return -1;
830

831 832 833
    if (st->codec->codec_id == CODEC_ID_QDM2) {
        // pass all frma atom to codec, needed at least for QDM2
        av_free(st->codec->extradata);
834 835 836
        st->codec->extradata = av_mallocz(atom.size + FF_INPUT_BUFFER_PADDING_SIZE);
        if (!st->codec->extradata)
            return AVERROR(ENOMEM);
837
        st->codec->extradata_size = atom.size;
838
        get_buffer(pb, st->codec->extradata, atom.size);
839
    } else if (atom.size > 8) { /* to read frma, esds atoms */
840 841
        if (mov_read_default(c, pb, atom) < 0)
            return -1;
842
    } else
843
        url_fskip(pb, atom.size);
R
Roberto Togni 已提交
844 845 846
    return 0;
}

847 848 849 850
/**
 * This function reads atom content and puts data in extradata without tag
 * nor size unlike mov_read_extradata.
 */
851
static int mov_read_glbl(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
852
{
853 854 855 856 857
    AVStream *st;

    if (c->fc->nb_streams < 1)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];
858

859 860 861
    if((uint64_t)atom.size > (1<<30))
        return -1;

862
    av_free(st->codec->extradata);
863 864 865
    st->codec->extradata = av_mallocz(atom.size + FF_INPUT_BUFFER_PADDING_SIZE);
    if (!st->codec->extradata)
        return AVERROR(ENOMEM);
866
    st->codec->extradata_size = atom.size;
867
    get_buffer(pb, st->codec->extradata, atom.size);
868 869 870
    return 0;
}

M
Martin Storsjö 已提交
871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898
/**
 * An strf atom is a BITMAPINFOHEADER struct. This struct is 40 bytes itself,
 * but can have extradata appended at the end after the 40 bytes belonging
 * to the struct.
 */
static int mov_read_strf(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
{
    AVStream *st;

    if (c->fc->nb_streams < 1)
        return 0;
    if (atom.size <= 40)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];

    if((uint64_t)atom.size > (1<<30))
        return -1;

    av_free(st->codec->extradata);
    st->codec->extradata = av_mallocz(atom.size - 40 + FF_INPUT_BUFFER_PADDING_SIZE);
    if (!st->codec->extradata)
        return AVERROR(ENOMEM);
    st->codec->extradata_size = atom.size - 40;
    url_fskip(pb, 40);
    get_buffer(pb, st->codec->extradata, atom.size - 40);
    return 0;
}

899
static int mov_read_stco(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
900
{
901 902
    AVStream *st;
    MOVStreamContext *sc;
903
    unsigned int i, entries;
904

905 906 907 908 909
    if (c->fc->nb_streams < 1)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];
    sc = st->priv_data;

910
    get_byte(pb); /* version */
911
    get_be24(pb); /* flags */
912 913

    entries = get_be32(pb);
914

915 916
    if(entries >= UINT_MAX/sizeof(int64_t))
        return -1;
917

B
Baptiste Coudurier 已提交
918
    sc->chunk_offsets = av_malloc(entries * sizeof(int64_t));
919
    if (!sc->chunk_offsets)
920 921 922
        return AVERROR(ENOMEM);
    sc->chunk_count = entries;

923 924
    if      (atom.type == MKTAG('s','t','c','o'))
        for(i=0; i<entries; i++)
925
            sc->chunk_offsets[i] = get_be32(pb);
926 927
    else if (atom.type == MKTAG('c','o','6','4'))
        for(i=0; i<entries; i++)
928
            sc->chunk_offsets[i] = get_be64(pb);
929
    else
930
        return -1;
931

932 933 934
    return 0;
}

935 936 937 938
/**
 * Compute codec id for 'lpcm' tag.
 * See CoreAudioTypes and AudioStreamBasicDescription at Apple.
 */
939
enum CodecID ff_mov_get_lpcm_codec_id(int bps, int flags)
940 941 942 943
{
    if (flags & 1) { // floating point
        if (flags & 2) { // big endian
            if      (bps == 32) return CODEC_ID_PCM_F32BE;
944
            else if (bps == 64) return CODEC_ID_PCM_F64BE;
945
        } else {
946 947
            if      (bps == 32) return CODEC_ID_PCM_F32LE;
            else if (bps == 64) return CODEC_ID_PCM_F64LE;
948 949 950 951 952 953 954 955 956 957 958 959 960 961
        }
    } else {
        if (flags & 2) {
            if      (bps == 8)
                // signed integer
                if (flags & 4)  return CODEC_ID_PCM_S8;
                else            return CODEC_ID_PCM_U8;
            else if (bps == 16) return CODEC_ID_PCM_S16BE;
            else if (bps == 24) return CODEC_ID_PCM_S24BE;
            else if (bps == 32) return CODEC_ID_PCM_S32BE;
        } else {
            if      (bps == 8)
                if (flags & 4)  return CODEC_ID_PCM_S8;
                else            return CODEC_ID_PCM_U8;
B
Baptiste Coudurier 已提交
962
            else if (bps == 16) return CODEC_ID_PCM_S16LE;
963 964 965 966
            else if (bps == 24) return CODEC_ID_PCM_S24LE;
            else if (bps == 32) return CODEC_ID_PCM_S32LE;
        }
    }
D
Diego Pettenò 已提交
967
    return CODEC_ID_NONE;
968 969
}

970
int ff_mov_read_stsd_entries(MOVContext *c, ByteIOContext *pb, int entries)
971
{
972 973
    AVStream *st;
    MOVStreamContext *sc;
974
    int j, pseudo_stream_id;
975

976 977 978 979 980
    if (c->fc->nb_streams < 1)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];
    sc = st->priv_data;

981 982
    for(pseudo_stream_id=0; pseudo_stream_id<entries; pseudo_stream_id++) {
        //Parsing Sample description table
983
        enum CodecID id;
984
        int dref_id = 1;
985
        MOVAtom a = { AV_RL32("stsd") };
986
        int64_t start_pos = url_ftell(pb);
987
        int size = get_be32(pb); /* size */
988
        uint32_t format = get_le32(pb); /* data format */
989

990 991 992 993 994
        if (size >= 16) {
            get_be32(pb); /* reserved */
            get_be16(pb); /* reserved */
            dref_id = get_be16(pb);
        }
995

996
        if (st->codec->codec_tag &&
997
            st->codec->codec_tag != format &&
998
            (c->fc->video_codec_id ? ff_codec_get_id(codec_movvideo_tags, format) != c->fc->video_codec_id
999
                                   : st->codec->codec_tag != MKTAG('j','p','e','g'))
1000
           ){
D
Diego Biurrun 已提交
1001 1002 1003
            /* Multiple fourcc, we skip JPEG. This is not correct, we should
             * export it as a separate AVStream but this needs a few changes
             * in the MOV demuxer, patch welcome. */
B
Baptiste Coudurier 已提交
1004
            av_log(c->fc, AV_LOG_WARNING, "multiple fourcc not supported\n");
1005 1006 1007
            url_fskip(pb, size - (url_ftell(pb) - start_pos));
            continue;
        }
1008
        sc->pseudo_stream_id = st->codec->codec_tag ? -1 : pseudo_stream_id;
1009
        sc->dref_id= dref_id;
1010

1011
        st->codec->codec_tag = format;
1012
        id = ff_codec_get_id(codec_movaudio_tags, format);
1013
        if (id<=0 && ((format&0xFFFF) == 'm'+('s'<<8) || (format&0xFFFF) == 'T'+('S'<<8)))
M
Måns Rullgård 已提交
1014
            id = ff_codec_get_id(ff_codec_wav_tags, av_bswap32(format)&0xFFFF);
M
Michael Niedermayer 已提交
1015

1016 1017 1018
        if (st->codec->codec_type != AVMEDIA_TYPE_VIDEO && id > 0) {
            st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
        } else if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO && /* do not overwrite codec type */
1019
                   format && format != MKTAG('m','p','4','s')) { /* skip old asf mpeg4 tag */
1020
            id = ff_codec_get_id(codec_movvideo_tags, format);
1021
            if (id <= 0)
1022
                id = ff_codec_get_id(ff_codec_bmp_tags, format);
1023
            if (id > 0)
1024 1025
                st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
            else if(st->codec->codec_type == AVMEDIA_TYPE_DATA){
1026
                id = ff_codec_get_id(ff_codec_movsubtitle_tags, format);
1027
                if(id > 0)
1028
                    st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
1029
            }
1030 1031
        }

1032 1033 1034
        dprintf(c->fc, "size=%d 4CC= %c%c%c%c codec_type=%d\n", size,
                (format >> 0) & 0xff, (format >> 8) & 0xff, (format >> 16) & 0xff,
                (format >> 24) & 0xff, st->codec->codec_type);
1035

1036
        if(st->codec->codec_type==AVMEDIA_TYPE_VIDEO) {
1037
            unsigned int color_depth, len;
1038 1039
            int color_greyscale;

1040
            st->codec->codec_id = id;
1041 1042 1043 1044
            get_be16(pb); /* version */
            get_be16(pb); /* revision level */
            get_be32(pb); /* vendor */
            get_be32(pb); /* temporal quality */
D
Diego Biurrun 已提交
1045
            get_be32(pb); /* spatial quality */
1046 1047 1048 1049

            st->codec->width = get_be16(pb); /* width */
            st->codec->height = get_be16(pb); /* height */

1050 1051 1052
            get_be32(pb); /* horiz resolution */
            get_be32(pb); /* vert resolution */
            get_be32(pb); /* data size, always 0 */
B
Baptiste Coudurier 已提交
1053
            get_be16(pb); /* frames per samples */
1054

1055 1056 1057 1058 1059 1060 1061 1062 1063
            len = get_byte(pb); /* codec name, pascal string */
            if (len > 31)
                len = 31;
            mov_read_mac_string(c, pb, len, st->codec->codec_name, 32);
            if (len < 31)
                url_fskip(pb, 31 - len);
            /* codec_tag YV12 triggers an UV swap in rawdec.c */
            if (!memcmp(st->codec->codec_name, "Planar Y'CbCr 8-bit 4:2:0", 25))
                st->codec->codec_tag=MKTAG('I', '4', '2', '0');
1064

1065
            st->codec->bits_per_coded_sample = get_be16(pb); /* depth */
1066
            st->codec->color_table_id = get_be16(pb); /* colortable id */
1067
            dprintf(c->fc, "depth %d, ctab id %d\n",
1068
                   st->codec->bits_per_coded_sample, st->codec->color_table_id);
1069
            /* figure out the palette situation */
1070 1071
            color_depth = st->codec->bits_per_coded_sample & 0x1F;
            color_greyscale = st->codec->bits_per_coded_sample & 0x20;
1072 1073

            /* if the depth is 2, 4, or 8 bpp, file is palettized */
1074
            if ((color_depth == 2) || (color_depth == 4) ||
1075
                (color_depth == 8)) {
1076 1077 1078 1079
                /* for palette traversal */
                unsigned int color_start, color_count, color_end;
                unsigned char r, g, b;

1080
                st->codec->palctrl = av_malloc(sizeof(*st->codec->palctrl));
1081
                if (color_greyscale) {
1082
                    int color_index, color_dec;
1083
                    /* compute the greyscale palette */
1084
                    st->codec->bits_per_coded_sample = color_depth;
1085 1086 1087 1088 1089
                    color_count = 1 << color_depth;
                    color_index = 255;
                    color_dec = 256 / (color_count - 1);
                    for (j = 0; j < color_count; j++) {
                        r = g = b = color_index;
1090
                        st->codec->palctrl->palette[j] =
1091 1092 1093 1094 1095
                            (r << 16) | (g << 8) | (b);
                        color_index -= color_dec;
                        if (color_index < 0)
                            color_index = 0;
                    }
1096
                } else if (st->codec->color_table_id) {
1097
                    const uint8_t *color_table;
1098 1099 1100
                    /* if flag bit 3 is set, use the default palette */
                    color_count = 1 << color_depth;
                    if (color_depth == 2)
M
Michael Niedermayer 已提交
1101
                        color_table = ff_qt_default_palette_4;
1102
                    else if (color_depth == 4)
M
Michael Niedermayer 已提交
1103
                        color_table = ff_qt_default_palette_16;
1104
                    else
M
Michael Niedermayer 已提交
1105
                        color_table = ff_qt_default_palette_256;
1106 1107

                    for (j = 0; j < color_count; j++) {
1108 1109 1110
                        r = color_table[j * 3 + 0];
                        g = color_table[j * 3 + 1];
                        b = color_table[j * 3 + 2];
1111
                        st->codec->palctrl->palette[j] =
1112 1113 1114 1115 1116 1117 1118
                            (r << 16) | (g << 8) | (b);
                    }
                } else {
                    /* load the palette from the file */
                    color_start = get_be32(pb);
                    color_count = get_be16(pb);
                    color_end = get_be16(pb);
1119 1120
                    if ((color_start <= 255) &&
                        (color_end <= 255)) {
M
Mike Melanson 已提交
1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132
                        for (j = color_start; j <= color_end; j++) {
                            /* each R, G, or B component is 16 bits;
                             * only use the top 8 bits; skip alpha bytes
                             * up front */
                            get_byte(pb);
                            get_byte(pb);
                            r = get_byte(pb);
                            get_byte(pb);
                            g = get_byte(pb);
                            get_byte(pb);
                            b = get_byte(pb);
                            get_byte(pb);
1133
                            st->codec->palctrl->palette[j] =
M
Mike Melanson 已提交
1134
                                (r << 16) | (g << 8) | (b);
1135
                        }
1136 1137
                    }
                }
1138
                st->codec->palctrl->palette_changed = 1;
1139
            }
1140
        } else if(st->codec->codec_type==AVMEDIA_TYPE_AUDIO) {
1141
            int bits_per_sample, flags;
1142
            uint16_t version = get_be16(pb);
1143

1144
            st->codec->codec_id = id;
1145 1146
            get_be16(pb); /* revision level */
            get_be32(pb); /* vendor */
1147

1148
            st->codec->channels = get_be16(pb);             /* channel count */
M
Michel Bardiaux 已提交
1149
            dprintf(c->fc, "audio channels %d\n", st->codec->channels);
1150
            st->codec->bits_per_coded_sample = get_be16(pb);      /* sample size */
1151

1152
            sc->audio_cid = get_be16(pb);
1153 1154 1155 1156
            get_be16(pb); /* packet size = 0 */

            st->codec->sample_rate = ((get_be32(pb) >> 16));

1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169
            //Read QT version 1 fields. In version 0 these do not exist.
            dprintf(c->fc, "version =%d, isom =%d\n",version,c->isom);
            if(!c->isom) {
                if(version==1) {
                    sc->samples_per_frame = get_be32(pb);
                    get_be32(pb); /* bytes per packet */
                    sc->bytes_per_frame = get_be32(pb);
                    get_be32(pb); /* bytes per sample */
                } else if(version==2) {
                    get_be32(pb); /* sizeof struct only */
                    st->codec->sample_rate = av_int2dbl(get_be64(pb)); /* float 64 */
                    st->codec->channels = get_be32(pb);
                    get_be32(pb); /* always 0x7F000000 */
1170
                    st->codec->bits_per_coded_sample = get_be32(pb); /* bits per channel if sound is uncompressed */
J
Jai Menon 已提交
1171
                    flags = get_be32(pb); /* lpcm format specific flag */
B
Baptiste Coudurier 已提交
1172 1173
                    sc->bytes_per_frame = get_be32(pb); /* bytes per audio packet if constant */
                    sc->samples_per_frame = get_be32(pb); /* lpcm frames per audio packet if constant */
1174
                    if (format == MKTAG('l','p','c','m'))
1175
                        st->codec->codec_id = ff_mov_get_lpcm_codec_id(st->codec->bits_per_coded_sample, flags);
1176 1177 1178
                }
            }

1179
            switch (st->codec->codec_id) {
1180 1181
            case CODEC_ID_PCM_S8:
            case CODEC_ID_PCM_U8:
1182
                if (st->codec->bits_per_coded_sample == 16)
1183 1184
                    st->codec->codec_id = CODEC_ID_PCM_S16BE;
                break;
1185
            case CODEC_ID_PCM_S16LE:
1186
            case CODEC_ID_PCM_S16BE:
1187
                if (st->codec->bits_per_coded_sample == 8)
1188
                    st->codec->codec_id = CODEC_ID_PCM_S8;
1189
                else if (st->codec->bits_per_coded_sample == 24)
1190 1191 1192
                    st->codec->codec_id =
                        st->codec->codec_id == CODEC_ID_PCM_S16BE ?
                        CODEC_ID_PCM_S24BE : CODEC_ID_PCM_S24LE;
1193
                break;
1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206
            /* set values for old format before stsd version 1 appeared */
            case CODEC_ID_MACE3:
                sc->samples_per_frame = 6;
                sc->bytes_per_frame = 2*st->codec->channels;
                break;
            case CODEC_ID_MACE6:
                sc->samples_per_frame = 6;
                sc->bytes_per_frame = 1*st->codec->channels;
                break;
            case CODEC_ID_ADPCM_IMA_QT:
                sc->samples_per_frame = 64;
                sc->bytes_per_frame = 34*st->codec->channels;
                break;
1207 1208 1209 1210
            case CODEC_ID_GSM:
                sc->samples_per_frame = 160;
                sc->bytes_per_frame = 33;
                break;
1211 1212
            default:
                break;
1213
            }
1214

1215 1216
            bits_per_sample = av_get_bits_per_sample(st->codec->codec_id);
            if (bits_per_sample) {
1217
                st->codec->bits_per_coded_sample = bits_per_sample;
1218 1219
                sc->sample_size = (bits_per_sample >> 3) * st->codec->channels;
            }
1220
        } else if(st->codec->codec_type==AVMEDIA_TYPE_SUBTITLE){
1221 1222 1223
            // ttxt stsd contains display flags, justification, background
            // color, fonts, and default styles, so fake an atom to read it
            MOVAtom fake_atom = { .size = size - (url_ftell(pb) - start_pos) };
1224
            if (format != AV_RL32("mp4s")) // mp4s contains a regular esds atom
R
Reimar Döffinger 已提交
1225
                mov_read_glbl(c, pb, fake_atom);
1226
            st->codec->codec_id= id;
1227 1228
            st->codec->width = sc->width;
            st->codec->height = sc->height;
1229 1230 1231
        } else {
            /* other codec type, just skip (rtp, mp4s, tmcd ...) */
            url_fskip(pb, size - (url_ftell(pb) - start_pos));
1232
        }
1233 1234
        /* this will read extra atoms at the end (wave, alac, damr, avcC, SMI ...) */
        a.size = size - (url_ftell(pb) - start_pos);
1235 1236 1237 1238
        if (a.size > 8) {
            if (mov_read_default(c, pb, a) < 0)
                return -1;
        } else if (a.size > 0)
1239
            url_fskip(pb, a.size);
1240
    }
1241

1242
    if(st->codec->codec_type==AVMEDIA_TYPE_AUDIO && st->codec->sample_rate==0 && sc->time_scale>1)
1243
        st->codec->sample_rate= sc->time_scale;
1244

1245
    /* special codec parameters handling */
1246
    switch (st->codec->codec_id) {
1247
#if CONFIG_DV_DEMUXER
1248
    case CODEC_ID_DVAUDIO:
1249
        c->dv_fctx = avformat_alloc_context();
1250 1251 1252 1253 1254 1255 1256 1257
        c->dv_demux = dv_init_demux(c->dv_fctx);
        if (!c->dv_demux) {
            av_log(c->fc, AV_LOG_ERROR, "dv demux context init error\n");
            return -1;
        }
        sc->dv_audio_container = 1;
        st->codec->codec_id = CODEC_ID_PCM_S16LE;
        break;
1258
#endif
1259
    /* no ifdef since parameters are always those */
1260
    case CODEC_ID_QCELP:
1261 1262 1263
        // force sample rate for qcelp when not stored in mov
        if (st->codec->codec_tag != MKTAG('Q','c','l','p'))
            st->codec->sample_rate = 8000;
1264
        st->codec->frame_size= 160;
1265
        st->codec->channels= 1; /* really needed */
1266
        break;
1267
    case CODEC_ID_AMR_NB:
1268
    case CODEC_ID_AMR_WB:
B
Baptiste Coudurier 已提交
1269
        st->codec->frame_size= sc->samples_per_frame;
1270
        st->codec->channels= 1; /* really needed */
1271
        /* force sample rate for amr, stsd in 3gp does not store sample rate */
B
Baptiste Coudurier 已提交
1272
        if (st->codec->codec_id == CODEC_ID_AMR_NB)
1273
            st->codec->sample_rate = 8000;
B
Baptiste Coudurier 已提交
1274 1275
        else if (st->codec->codec_id == CODEC_ID_AMR_WB)
            st->codec->sample_rate = 16000;
1276
        break;
1277
    case CODEC_ID_MP2:
1278
    case CODEC_ID_MP3:
1279
        st->codec->codec_type = AVMEDIA_TYPE_AUDIO; /* force type after stsd for m1a hdlr */
A
Aurelien Jacobs 已提交
1280
        st->need_parsing = AVSTREAM_PARSE_FULL;
1281
        break;
1282
    case CODEC_ID_GSM:
1283 1284 1285 1286
    case CODEC_ID_ADPCM_MS:
    case CODEC_ID_ADPCM_IMA_WAV:
        st->codec->block_align = sc->bytes_per_frame;
        break;
1287
    case CODEC_ID_ALAC:
1288
        if (st->codec->extradata_size == 36) {
1289 1290
            st->codec->frame_size = AV_RB32(st->codec->extradata+12);
            st->codec->channels   = AV_RB8 (st->codec->extradata+21);
1291
        }
1292
        break;
1293 1294 1295
    default:
        break;
    }
1296

1297 1298 1299
    return 0;
}

1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310
static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
{
    int entries;

    get_byte(pb); /* version */
    get_be24(pb); /* flags */
    entries = get_be32(pb);

    return ff_mov_read_stsd_entries(c, pb, entries);
}

1311
static int mov_read_stsc(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1312
{
1313 1314
    AVStream *st;
    MOVStreamContext *sc;
1315
    unsigned int i, entries;
1316

1317 1318 1319 1320 1321
    if (c->fc->nb_streams < 1)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];
    sc = st->priv_data;

1322
    get_byte(pb); /* version */
1323
    get_be24(pb); /* flags */
1324 1325

    entries = get_be32(pb);
1326

1327 1328
    dprintf(c->fc, "track[%i].stsc.entries = %i\n", c->fc->nb_streams-1, entries);

1329 1330
    if(entries >= UINT_MAX / sizeof(*sc->stsc_data))
        return -1;
1331 1332
    sc->stsc_data = av_malloc(entries * sizeof(*sc->stsc_data));
    if (!sc->stsc_data)
1333 1334 1335
        return AVERROR(ENOMEM);
    sc->stsc_count = entries;

1336
    for(i=0; i<entries; i++) {
1337 1338 1339
        sc->stsc_data[i].first = get_be32(pb);
        sc->stsc_data[i].count = get_be32(pb);
        sc->stsc_data[i].id = get_be32(pb);
1340 1341 1342 1343
    }
    return 0;
}

1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372
static int mov_read_stps(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
{
    AVStream *st;
    MOVStreamContext *sc;
    unsigned i, entries;

    if (c->fc->nb_streams < 1)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];
    sc = st->priv_data;

    get_be32(pb); // version + flags

    entries = get_be32(pb);
    if (entries >= UINT_MAX / sizeof(*sc->stps_data))
        return -1;
    sc->stps_data = av_malloc(entries * sizeof(*sc->stps_data));
    if (!sc->stps_data)
        return AVERROR(ENOMEM);
    sc->stps_count = entries;

    for (i = 0; i < entries; i++) {
        sc->stps_data[i] = get_be32(pb);
        //dprintf(c->fc, "stps %d\n", sc->stps_data[i]);
    }

    return 0;
}

1373
static int mov_read_stss(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1374
{
1375 1376
    AVStream *st;
    MOVStreamContext *sc;
1377
    unsigned int i, entries;
1378

1379 1380 1381 1382 1383
    if (c->fc->nb_streams < 1)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];
    sc = st->priv_data;

1384
    get_byte(pb); /* version */
1385
    get_be24(pb); /* flags */
1386 1387

    entries = get_be32(pb);
1388

1389 1390
    dprintf(c->fc, "keyframe_count = %d\n", entries);

B
Baptiste Coudurier 已提交
1391
    if(entries >= UINT_MAX / sizeof(int))
1392
        return -1;
B
Baptiste Coudurier 已提交
1393
    sc->keyframes = av_malloc(entries * sizeof(int));
1394
    if (!sc->keyframes)
1395 1396 1397
        return AVERROR(ENOMEM);
    sc->keyframe_count = entries;

1398 1399
    for(i=0; i<entries; i++) {
        sc->keyframes[i] = get_be32(pb);
1400
        //dprintf(c->fc, "keyframes[]=%d\n", sc->keyframes[i]);
1401 1402 1403 1404
    }
    return 0;
}

1405
static int mov_read_stsz(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1406
{
1407 1408
    AVStream *st;
    MOVStreamContext *sc;
1409 1410 1411
    unsigned int i, entries, sample_size, field_size, num_bytes;
    GetBitContext gb;
    unsigned char* buf;
1412

1413 1414 1415 1416 1417
    if (c->fc->nb_streams < 1)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];
    sc = st->priv_data;

1418
    get_byte(pb); /* version */
1419
    get_be24(pb); /* flags */
1420

1421
    if (atom.type == MKTAG('s','t','s','z')) {
1422 1423 1424 1425
        sample_size = get_be32(pb);
        if (!sc->sample_size) /* do not overwrite value computed in stsd */
            sc->sample_size = sample_size;
        field_size = 32;
1426 1427 1428 1429 1430
    } else {
        sample_size = 0;
        get_be24(pb); /* reserved */
        field_size = get_byte(pb);
    }
1431
    entries = get_be32(pb);
1432 1433

    dprintf(c->fc, "sample_size = %d sample_count = %d\n", sc->sample_size, entries);
1434

1435
    sc->sample_count = entries;
1436 1437 1438
    if (sample_size)
        return 0;

1439 1440 1441 1442 1443
    if (field_size != 4 && field_size != 8 && field_size != 16 && field_size != 32) {
        av_log(c->fc, AV_LOG_ERROR, "Invalid sample field size %d\n", field_size);
        return -1;
    }

1444
    if (entries >= UINT_MAX / sizeof(int) || entries >= (UINT_MAX - 4) / field_size)
1445
        return -1;
B
Baptiste Coudurier 已提交
1446
    sc->sample_sizes = av_malloc(entries * sizeof(int));
1447
    if (!sc->sample_sizes)
1448 1449
        return AVERROR(ENOMEM);

1450 1451
    num_bytes = (entries*field_size+4)>>3;

1452
    buf = av_malloc(num_bytes+FF_INPUT_BUFFER_PADDING_SIZE);
1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465
    if (!buf) {
        av_freep(&sc->sample_sizes);
        return AVERROR(ENOMEM);
    }

    if (get_buffer(pb, buf, num_bytes) < num_bytes) {
        av_freep(&sc->sample_sizes);
        av_free(buf);
        return -1;
    }

    init_get_bits(&gb, buf, 8*num_bytes);

1466
    for(i=0; i<entries; i++)
1467 1468 1469
        sc->sample_sizes[i] = get_bits_long(&gb, field_size);

    av_free(buf);
1470 1471 1472
    return 0;
}

1473
static int mov_read_stts(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1474
{
1475 1476
    AVStream *st;
    MOVStreamContext *sc;
1477
    unsigned int i, entries;
1478 1479
    int64_t duration=0;
    int64_t total_sample_count=0;
1480

1481 1482 1483 1484 1485
    if (c->fc->nb_streams < 1)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];
    sc = st->priv_data;

1486
    get_byte(pb); /* version */
1487
    get_be24(pb); /* flags */
1488
    entries = get_be32(pb);
1489 1490 1491

    dprintf(c->fc, "track[%i].stts.entries = %i\n", c->fc->nb_streams-1, entries);

1492
    if(entries >= UINT_MAX / sizeof(*sc->stts_data))
1493
        return -1;
1494
    sc->stts_data = av_malloc(entries * sizeof(*sc->stts_data));
1495
    if (!sc->stts_data)
1496 1497
        return AVERROR(ENOMEM);
    sc->stts_count = entries;
1498

1499
    for(i=0; i<entries; i++) {
M
cleanup  
Michael Niedermayer 已提交
1500 1501
        int sample_duration;
        int sample_count;
1502

1503
        sample_count=get_be32(pb);
1504
        sample_duration = get_be32(pb);
1505 1506 1507
        sc->stts_data[i].count= sample_count;
        sc->stts_data[i].duration= sample_duration;

M
Michel Bardiaux 已提交
1508
        dprintf(c->fc, "sample_count=%d, sample_duration=%d\n",sample_count,sample_duration);
1509

B
Baptiste Coudurier 已提交
1510
        duration+=(int64_t)sample_duration*sample_count;
1511 1512 1513
        total_sample_count+=sample_count;
    }

1514 1515 1516
    st->nb_frames= total_sample_count;
    if(duration)
        st->duration= duration;
1517 1518 1519
    return 0;
}

1520
static int mov_read_ctts(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
M
Michael Niedermayer 已提交
1521
{
1522 1523
    AVStream *st;
    MOVStreamContext *sc;
M
Michael Niedermayer 已提交
1524 1525
    unsigned int i, entries;

1526 1527 1528 1529 1530
    if (c->fc->nb_streams < 1)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];
    sc = st->priv_data;

M
Michael Niedermayer 已提交
1531
    get_byte(pb); /* version */
1532
    get_be24(pb); /* flags */
M
Michael Niedermayer 已提交
1533
    entries = get_be32(pb);
1534 1535 1536

    dprintf(c->fc, "track[%i].ctts.entries = %i\n", c->fc->nb_streams-1, entries);

1537
    if(entries >= UINT_MAX / sizeof(*sc->ctts_data))
M
Michael Niedermayer 已提交
1538
        return -1;
1539
    sc->ctts_data = av_malloc(entries * sizeof(*sc->ctts_data));
1540
    if (!sc->ctts_data)
1541 1542
        return AVERROR(ENOMEM);
    sc->ctts_count = entries;
1543

M
Michael Niedermayer 已提交
1544
    for(i=0; i<entries; i++) {
1545 1546 1547 1548 1549
        int count    =get_be32(pb);
        int duration =get_be32(pb);

        sc->ctts_data[i].count   = count;
        sc->ctts_data[i].duration= duration;
1550 1551
        if (duration < 0)
            sc->dts_shift = FFMAX(sc->dts_shift, -duration);
M
Michael Niedermayer 已提交
1552
    }
1553

B
Baptiste Coudurier 已提交
1554
    dprintf(c->fc, "dts shift %d\n", sc->dts_shift);
1555

M
Michael Niedermayer 已提交
1556 1557 1558
    return 0;
}

1559 1560 1561
static void mov_build_index(MOVContext *mov, AVStream *st)
{
    MOVStreamContext *sc = st->priv_data;
1562
    int64_t current_offset;
1563 1564 1565 1566
    int64_t current_dts = 0;
    unsigned int stts_index = 0;
    unsigned int stsc_index = 0;
    unsigned int stss_index = 0;
1567
    unsigned int stps_index = 0;
1568
    unsigned int i, j;
1569
    uint64_t stream_size = 0;
1570

1571 1572
    /* adjust first dts according to edit list */
    if (sc->time_offset) {
1573
        int rescaled = sc->time_offset < 0 ? av_rescale(sc->time_offset, sc->time_scale, mov->time_scale) : sc->time_offset;
1574
        current_dts = -rescaled;
1575 1576 1577 1578 1579 1580
        if (sc->ctts_data && sc->ctts_data[0].duration / sc->stts_data[0].duration > 16) {
            /* more than 16 frames delay, dts are likely wrong
               this happens with files created by iMovie */
            sc->wrong_dts = 1;
            st->codec->has_b_frames = 1;
        }
1581 1582
    }

1583
    /* only use old uncompressed audio chunk demuxing when stts specifies it */
1584
    if (!(st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1585
          sc->stts_count == 1 && sc->stts_data[0].duration == 1)) {
1586 1587
        unsigned int current_sample = 0;
        unsigned int stts_sample = 0;
1588
        unsigned int sample_size;
1589 1590 1591
        unsigned int distance = 0;
        int key_off = sc->keyframes && sc->keyframes[0] == 1;

1592 1593
        current_dts -= sc->dts_shift;

1594 1595 1596 1597 1598 1599 1600
        if (sc->sample_count >= UINT_MAX / sizeof(*st->index_entries))
            return;
        st->index_entries = av_malloc(sc->sample_count*sizeof(*st->index_entries));
        if (!st->index_entries)
            return;
        st->index_entries_allocated_size = sc->sample_count*sizeof(*st->index_entries);

1601 1602
        for (i = 0; i < sc->chunk_count; i++) {
            current_offset = sc->chunk_offsets[i];
1603 1604
            if (stsc_index + 1 < sc->stsc_count &&
                i + 1 == sc->stsc_data[stsc_index + 1].first)
1605
                stsc_index++;
1606
            for (j = 0; j < sc->stsc_data[stsc_index].count; j++) {
1607
                int keyframe = 0;
1608 1609
                if (current_sample >= sc->sample_count) {
                    av_log(mov->fc, AV_LOG_ERROR, "wrong sample count\n");
1610
                    return;
1611
                }
1612 1613 1614

                if (!sc->keyframe_count || current_sample+key_off == sc->keyframes[stss_index]) {
                    keyframe = 1;
1615 1616
                    if (stss_index + 1 < sc->keyframe_count)
                        stss_index++;
1617 1618 1619 1620
                } else if (sc->stps_count && current_sample+key_off == sc->stps_data[stps_index]) {
                    keyframe = 1;
                    if (stps_index + 1 < sc->stps_count)
                        stps_index++;
1621
                }
1622 1623
                if (keyframe)
                    distance = 0;
1624
                sample_size = sc->sample_size > 0 ? sc->sample_size : sc->sample_sizes[current_sample];
1625
                if(sc->pseudo_stream_id == -1 ||
1626
                   sc->stsc_data[stsc_index].id - 1 == sc->pseudo_stream_id) {
1627 1628 1629 1630 1631 1632
                    AVIndexEntry *e = &st->index_entries[st->nb_index_entries++];
                    e->pos = current_offset;
                    e->timestamp = current_dts;
                    e->size = sample_size;
                    e->min_distance = distance;
                    e->flags = keyframe ? AVINDEX_KEYFRAME : 0;
1633 1634 1635 1636
                    dprintf(mov->fc, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "
                            "size %d, distance %d, keyframe %d\n", st->index, current_sample,
                            current_offset, current_dts, sample_size, distance, keyframe);
                }
1637

1638
                current_offset += sample_size;
1639
                stream_size += sample_size;
1640
                current_dts += sc->stts_data[stts_index].duration;
1641 1642 1643 1644 1645 1646 1647 1648 1649
                distance++;
                stts_sample++;
                current_sample++;
                if (stts_index + 1 < sc->stts_count && stts_sample == sc->stts_data[stts_index].count) {
                    stts_sample = 0;
                    stts_index++;
                }
            }
        }
1650 1651
        if (st->duration > 0)
            st->codec->bit_rate = stream_size*8*sc->time_scale/st->duration;
1652
    } else {
1653
        unsigned chunk_samples, total = 0;
1654

1655 1656 1657
        // compute total chunk count
        for (i = 0; i < sc->stsc_count; i++) {
            unsigned count, chunk_count;
1658

1659
            chunk_samples = sc->stsc_data[i].count;
1660 1661 1662 1663 1664
            if (sc->samples_per_frame && chunk_samples % sc->samples_per_frame) {
                av_log(mov->fc, AV_LOG_ERROR, "error unaligned chunk\n");
                return;
            }

1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696
            if (sc->samples_per_frame >= 160) { // gsm
                count = chunk_samples / sc->samples_per_frame;
            } else if (sc->samples_per_frame > 1) {
                unsigned samples = (1024/sc->samples_per_frame)*sc->samples_per_frame;
                count = (chunk_samples+samples-1) / samples;
            } else {
                count = (chunk_samples+1023) / 1024;
            }

            if (i < sc->stsc_count - 1)
                chunk_count = sc->stsc_data[i+1].first - sc->stsc_data[i].first;
            else
                chunk_count = sc->chunk_count - (sc->stsc_data[i].first - 1);
            total += chunk_count * count;
        }

        dprintf(mov->fc, "chunk count %d\n", total);
        if (total >= UINT_MAX / sizeof(*st->index_entries))
            return;
        st->index_entries = av_malloc(total*sizeof(*st->index_entries));
        if (!st->index_entries)
            return;
        st->index_entries_allocated_size = total*sizeof(*st->index_entries);

        // populate index
        for (i = 0; i < sc->chunk_count; i++) {
            current_offset = sc->chunk_offsets[i];
            if (stsc_index + 1 < sc->stsc_count &&
                i + 1 == sc->stsc_data[stsc_index + 1].first)
                stsc_index++;
            chunk_samples = sc->stsc_data[stsc_index].count;

1697
            while (chunk_samples > 0) {
1698
                AVIndexEntry *e;
1699 1700 1701 1702 1703 1704 1705 1706 1707 1708
                unsigned size, samples;

                if (sc->samples_per_frame >= 160) { // gsm
                    samples = sc->samples_per_frame;
                    size = sc->bytes_per_frame;
                } else {
                    if (sc->samples_per_frame > 1) {
                        samples = FFMIN((1024 / sc->samples_per_frame)*
                                        sc->samples_per_frame, chunk_samples);
                        size = (samples / sc->samples_per_frame) * sc->bytes_per_frame;
1709
                    } else {
1710 1711
                        samples = FFMIN(1024, chunk_samples);
                        size = samples * sc->sample_size;
1712 1713
                    }
                }
1714

1715 1716 1717 1718 1719 1720 1721 1722 1723 1724
                if (st->nb_index_entries >= total) {
                    av_log(mov->fc, AV_LOG_ERROR, "wrong chunk count %d\n", total);
                    return;
                }
                e = &st->index_entries[st->nb_index_entries++];
                e->pos = current_offset;
                e->timestamp = current_dts;
                e->size = size;
                e->min_distance = 0;
                e->flags = AVINDEX_KEYFRAME;
1725 1726
                dprintf(mov->fc, "AVIndex stream %d, chunk %d, offset %"PRIx64", dts %"PRId64", "
                        "size %d, duration %d\n", st->index, i, current_offset, current_dts,
1727 1728 1729
                        size, samples);

                current_offset += size;
1730
                current_dts += samples;
1731
                chunk_samples -= samples;
1732 1733 1734 1735
            }
        }
    }
}
1736

1737 1738
static int mov_open_dref(ByteIOContext **pb, char *src, MOVDref *ref)
{
1739 1740
    /* try relative path, we do not try the absolute because it can leak information about our
       system to an attacker */
1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762
    if (ref->nlvl_to > 0 && ref->nlvl_from > 0) {
        char filename[1024];
        char *src_path;
        int i, l;

        /* find a source dir */
        src_path = strrchr(src, '/');
        if (src_path)
            src_path++;
        else
            src_path = src;

        /* find a next level down to target */
        for (i = 0, l = strlen(ref->path) - 1; l >= 0; l--)
            if (ref->path[l] == '/') {
                if (i == ref->nlvl_to - 1)
                    break;
                else
                    i++;
            }

        /* compose filename if next level down to target was found */
1763
        if (i == ref->nlvl_to - 1 && src_path - src  < sizeof(filename)) {
1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779
            memcpy(filename, src, src_path - src);
            filename[src_path - src] = 0;

            for (i = 1; i < ref->nlvl_from; i++)
                av_strlcat(filename, "../", 1024);

            av_strlcat(filename, ref->path + l + 1, 1024);

            if (!url_fopen(pb, filename, URL_RDONLY))
                return 0;
        }
    }

    return AVERROR(ENOENT);
};

1780
static int mov_read_trak(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1781 1782 1783
{
    AVStream *st;
    MOVStreamContext *sc;
1784
    int ret;
1785 1786

    st = av_new_stream(c->fc, c->fc->nb_streams);
B
Baptiste Coudurier 已提交
1787
    if (!st) return AVERROR(ENOMEM);
B
Baptiste Coudurier 已提交
1788
    sc = av_mallocz(sizeof(MOVStreamContext));
1789
    if (!sc) return AVERROR(ENOMEM);
1790 1791

    st->priv_data = sc;
1792
    st->codec->codec_type = AVMEDIA_TYPE_DATA;
1793
    sc->ffindex = st->index;
1794

1795 1796 1797 1798
    if ((ret = mov_read_default(c, pb, atom)) < 0)
        return ret;

    /* sanity checks */
1799 1800
    if (sc->chunk_count && (!sc->stts_count || !sc->stsc_count ||
                            (!sc->sample_size && !sc->sample_count))) {
1801 1802
        av_log(c->fc, AV_LOG_ERROR, "stream %d, missing mandatory atoms, broken header\n",
               st->index);
1803 1804
        return 0;
    }
1805

1806 1807
    if (!sc->time_scale) {
        av_log(c->fc, AV_LOG_WARNING, "stream %d, timescale not set\n", st->index);
1808
        sc->time_scale = c->time_scale;
1809 1810 1811
        if (!sc->time_scale)
            sc->time_scale = 1;
    }
1812

1813
    av_set_pts_info(st, 64, 1, sc->time_scale);
1814

1815
    if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1816 1817 1818 1819 1820
        !st->codec->frame_size && sc->stts_count == 1) {
        st->codec->frame_size = av_rescale(sc->stts_data[0].duration,
                                           st->codec->sample_rate, sc->time_scale);
        dprintf(c->fc, "frame size %d\n", st->codec->frame_size);
    }
1821 1822 1823 1824

    mov_build_index(c, st);

    if (sc->dref_id-1 < sc->drefs_count && sc->drefs[sc->dref_id-1].path) {
1825 1826 1827 1828 1829 1830 1831
        MOVDref *dref = &sc->drefs[sc->dref_id - 1];
        if (mov_open_dref(&sc->pb, c->fc->filename, dref) < 0)
            av_log(c->fc, AV_LOG_ERROR,
                   "stream %d, error opening alias: path='%s', dir='%s', "
                   "filename='%s', volume='%s', nlvl_from=%d, nlvl_to=%d\n",
                   st->index, dref->path, dref->dir, dref->filename,
                   dref->volume, dref->nlvl_from, dref->nlvl_to);
1832 1833 1834
    } else
        sc->pb = c->fc->pb;

1835
    if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1836 1837 1838 1839
        if (!st->sample_aspect_ratio.num &&
            (st->codec->width != sc->width || st->codec->height != sc->height)) {
            st->sample_aspect_ratio = av_d2q(((double)st->codec->height * sc->width) /
                                             ((double)st->codec->width * sc->height), INT_MAX);
1840 1841 1842 1843
        }

        av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
                  sc->time_scale*st->nb_frames, st->duration, INT_MAX);
1844 1845
    }

1846
    switch (st->codec->codec_id) {
1847
#if CONFIG_H261_DECODER
1848 1849
    case CODEC_ID_H261:
#endif
1850
#if CONFIG_H263_DECODER
1851 1852
    case CODEC_ID_H263:
#endif
1853 1854 1855
#if CONFIG_H264_DECODER
    case CODEC_ID_H264:
#endif
1856
#if CONFIG_MPEG4_DECODER
1857 1858
    case CODEC_ID_MPEG4:
#endif
1859
        st->codec->width = 0; /* let decoder init width/height */
1860 1861 1862
        st->codec->height= 0;
        break;
    }
B
Baptiste Coudurier 已提交
1863 1864 1865

    /* Do not need those anymore. */
    av_freep(&sc->chunk_offsets);
1866
    av_freep(&sc->stsc_data);
B
Baptiste Coudurier 已提交
1867 1868 1869
    av_freep(&sc->sample_sizes);
    av_freep(&sc->keyframes);
    av_freep(&sc->stts_data);
1870
    av_freep(&sc->stps_data);
B
Baptiste Coudurier 已提交
1871

1872
    return 0;
1873 1874
}

1875
static int mov_read_ilst(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1876 1877 1878 1879 1880 1881 1882 1883
{
    int ret;
    c->itunes_metadata = 1;
    ret = mov_read_default(c, pb, atom);
    c->itunes_metadata = 0;
    return ret;
}

1884
static int mov_read_meta(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1885
{
1886 1887 1888 1889 1890 1891 1892 1893 1894 1895
    while (atom.size > 8) {
        uint32_t tag = get_le32(pb);
        atom.size -= 4;
        if (tag == MKTAG('h','d','l','r')) {
            url_fseek(pb, -8, SEEK_CUR);
            atom.size += 8;
            return mov_read_default(c, pb, atom);
        }
    }
    return 0;
1896 1897
}

1898
static int mov_read_tkhd(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1899
{
1900 1901 1902 1903 1904
    int i;
    int width;
    int height;
    int64_t disp_transform[2];
    int display_matrix[3][2];
1905 1906 1907 1908 1909 1910 1911 1912
    AVStream *st;
    MOVStreamContext *sc;
    int version;

    if (c->fc->nb_streams < 1)
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];
    sc = st->priv_data;
1913

1914
    version = get_byte(pb);
1915
    get_be24(pb); /* flags */
1916 1917 1918 1919 1920 1921 1922
    /*
    MOV_TRACK_ENABLED 0x0001
    MOV_TRACK_IN_MOVIE 0x0002
    MOV_TRACK_IN_PREVIEW 0x0004
    MOV_TRACK_IN_POSTER 0x0008
    */

B
Baptiste Coudurier 已提交
1923 1924 1925 1926 1927 1928 1929
    if (version == 1) {
        get_be64(pb);
        get_be64(pb);
    } else {
        get_be32(pb); /* creation time */
        get_be32(pb); /* modification time */
    }
1930 1931
    st->id = (int)get_be32(pb); /* track id (NOT 0 !)*/
    get_be32(pb); /* reserved */
1932

1933 1934
    /* highlevel (considering edits) duration in movie timebase */
    (version == 1) ? get_be64(pb) : get_be32(pb);
1935 1936 1937 1938 1939 1940 1941 1942
    get_be32(pb); /* reserved */
    get_be32(pb); /* reserved */

    get_be16(pb); /* layer */
    get_be16(pb); /* alternate group */
    get_be16(pb); /* volume */
    get_be16(pb); /* reserved */

1943 1944 1945 1946 1947 1948 1949 1950
    //read in the display matrix (outlined in ISO 14496-12, Section 6.2.2)
    // they're kept in fixed point format through all calculations
    // ignore u,v,z b/c we don't need the scale factor to calc aspect ratio
    for (i = 0; i < 3; i++) {
        display_matrix[i][0] = get_be32(pb);   // 16.16 fixed point
        display_matrix[i][1] = get_be32(pb);   // 16.16 fixed point
        get_be32(pb);           // 2.30 fixed point (not used)
    }
1951

1952 1953
    width = get_be32(pb);       // 16.16 fixed point track width
    height = get_be32(pb);      // 16.16 fixed point track height
1954 1955
    sc->width = width >> 16;
    sc->height = height >> 16;
1956

1957
    // transform the display width/height according to the matrix
1958
    // skip this if the display matrix is the default identity matrix
1959
    // or if it is rotating the picture, ex iPhone 3GS
1960 1961
    // to keep the same scale, use [width height 1<<16]
    if (width && height &&
1962 1963 1964 1965 1966
        ((display_matrix[0][0] != 65536  ||
          display_matrix[1][1] != 65536) &&
         !display_matrix[0][1] &&
         !display_matrix[1][0] &&
         !display_matrix[2][0] && !display_matrix[2][1])) {
1967 1968 1969 1970 1971 1972 1973
        for (i = 0; i < 2; i++)
            disp_transform[i] =
                (int64_t)  width  * display_matrix[0][i] +
                (int64_t)  height * display_matrix[1][i] +
                ((int64_t) display_matrix[2][i] << 16);

        //sample aspect ratio is new width/height divided by old width/height
1974
        st->sample_aspect_ratio = av_d2q(
1975 1976 1977
            ((double) disp_transform[0] * height) /
            ((double) disp_transform[1] * width), INT_MAX);
    }
1978 1979 1980
    return 0;
}

1981
static int mov_read_tfhd(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
B
Baptiste Coudurier 已提交
1982 1983 1984 1985 1986 1987 1988 1989 1990
{
    MOVFragment *frag = &c->fragment;
    MOVTrackExt *trex = NULL;
    int flags, track_id, i;

    get_byte(pb); /* version */
    flags = get_be24(pb);

    track_id = get_be32(pb);
1991
    if (!track_id)
B
Baptiste Coudurier 已提交
1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
        return -1;
    frag->track_id = track_id;
    for (i = 0; i < c->trex_count; i++)
        if (c->trex_data[i].track_id == frag->track_id) {
            trex = &c->trex_data[i];
            break;
        }
    if (!trex) {
        av_log(c->fc, AV_LOG_ERROR, "could not find corresponding trex\n");
        return -1;
    }

    if (flags & 0x01) frag->base_data_offset = get_be64(pb);
    else              frag->base_data_offset = frag->moof_offset;
    if (flags & 0x02) frag->stsd_id          = get_be32(pb);
    else              frag->stsd_id          = trex->stsd_id;

    frag->duration = flags & 0x08 ? get_be32(pb) : trex->duration;
    frag->size     = flags & 0x10 ? get_be32(pb) : trex->size;
    frag->flags    = flags & 0x20 ? get_be32(pb) : trex->flags;
    dprintf(c->fc, "frag flags 0x%x\n", frag->flags);
    return 0;
}

D
David Conrad 已提交
2016 2017 2018 2019 2020 2021
static int mov_read_chap(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
{
    c->chapter_track = get_be32(pb);
    return 0;
}

2022
static int mov_read_trex(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
B
Baptiste Coudurier 已提交
2023 2024 2025 2026 2027
{
    MOVTrackExt *trex;

    if ((uint64_t)c->trex_count+1 >= UINT_MAX / sizeof(*c->trex_data))
        return -1;
2028 2029
    trex = av_realloc(c->trex_data, (c->trex_count+1)*sizeof(*c->trex_data));
    if (!trex)
B
Baptiste Coudurier 已提交
2030
        return AVERROR(ENOMEM);
2031
    c->trex_data = trex;
B
Baptiste Coudurier 已提交
2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042
    trex = &c->trex_data[c->trex_count++];
    get_byte(pb); /* version */
    get_be24(pb); /* flags */
    trex->track_id = get_be32(pb);
    trex->stsd_id  = get_be32(pb);
    trex->duration = get_be32(pb);
    trex->size     = get_be32(pb);
    trex->flags    = get_be32(pb);
    return 0;
}

2043
static int mov_read_trun(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
B
Baptiste Coudurier 已提交
2044 2045
{
    MOVFragment *frag = &c->fragment;
2046
    AVStream *st = NULL;
2047
    MOVStreamContext *sc;
B
Baptiste Coudurier 已提交
2048 2049 2050 2051 2052 2053
    uint64_t offset;
    int64_t dts;
    int data_offset = 0;
    unsigned entries, first_sample_flags = frag->flags;
    int flags, distance, i;

2054 2055 2056 2057 2058 2059 2060 2061
    for (i = 0; i < c->fc->nb_streams; i++) {
        if (c->fc->streams[i]->id == frag->track_id) {
            st = c->fc->streams[i];
            break;
        }
    }
    if (!st) {
        av_log(c->fc, AV_LOG_ERROR, "could not find corresponding track id %d\n", frag->track_id);
2062
        return -1;
2063
    }
2064
    sc = st->priv_data;
B
Baptiste Coudurier 已提交
2065 2066 2067 2068 2069 2070 2071 2072 2073
    if (sc->pseudo_stream_id+1 != frag->stsd_id)
        return 0;
    get_byte(pb); /* version */
    flags = get_be24(pb);
    entries = get_be32(pb);
    dprintf(c->fc, "flags 0x%x entries %d\n", flags, entries);
    if (flags & 0x001) data_offset        = get_be32(pb);
    if (flags & 0x004) first_sample_flags = get_be32(pb);
    if (flags & 0x800) {
2074
        MOVStts *ctts_data;
B
Baptiste Coudurier 已提交
2075 2076
        if ((uint64_t)entries+sc->ctts_count >= UINT_MAX/sizeof(*sc->ctts_data))
            return -1;
2077 2078 2079
        ctts_data = av_realloc(sc->ctts_data,
                               (entries+sc->ctts_count)*sizeof(*sc->ctts_data));
        if (!ctts_data)
B
Baptiste Coudurier 已提交
2080
            return AVERROR(ENOMEM);
2081
        sc->ctts_data = ctts_data;
B
Baptiste Coudurier 已提交
2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100
    }
    dts = st->duration;
    offset = frag->base_data_offset + data_offset;
    distance = 0;
    dprintf(c->fc, "first sample flags 0x%x\n", first_sample_flags);
    for (i = 0; i < entries; i++) {
        unsigned sample_size = frag->size;
        int sample_flags = i ? frag->flags : first_sample_flags;
        unsigned sample_duration = frag->duration;
        int keyframe;

        if (flags & 0x100) sample_duration = get_be32(pb);
        if (flags & 0x200) sample_size     = get_be32(pb);
        if (flags & 0x400) sample_flags    = get_be32(pb);
        if (flags & 0x800) {
            sc->ctts_data[sc->ctts_count].count = 1;
            sc->ctts_data[sc->ctts_count].duration = get_be32(pb);
            sc->ctts_count++;
        }
2101
        if ((keyframe = st->codec->codec_type == AVMEDIA_TYPE_AUDIO ||
B
Baptiste Coudurier 已提交
2102 2103 2104 2105 2106 2107 2108 2109
             (flags & 0x004 && !i && !sample_flags) || sample_flags & 0x2000000))
            distance = 0;
        av_add_index_entry(st, offset, dts, sample_size, distance,
                           keyframe ? AVINDEX_KEYFRAME : 0);
        dprintf(c->fc, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "
                "size %d, distance %d, keyframe %d\n", st->index, sc->sample_count+i,
                offset, dts, sample_size, distance, keyframe);
        distance++;
2110
        dts += sample_duration;
B
Baptiste Coudurier 已提交
2111 2112 2113 2114 2115 2116 2117
        offset += sample_size;
    }
    frag->moof_offset = offset;
    st->duration = dts;
    return 0;
}

2118 2119 2120
/* this atom should be null (from specs), but some buggy files put the 'moov' atom inside it... */
/* like the files created with Adobe Premiere 5.0, for samples see */
/* http://graphics.tudelft.nl/~wouter/publications/soundtests/ */
2121
static int mov_read_wide(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132
{
    int err;

    if (atom.size < 8)
        return 0; /* continue */
    if (get_be32(pb) != 0) { /* 0 sized mdat atom... use the 'wide' atom size */
        url_fskip(pb, atom.size - 4);
        return 0;
    }
    atom.type = get_le32(pb);
    atom.size -= 8;
2133
    if (atom.type != MKTAG('m','d','a','t')) {
2134 2135 2136 2137 2138 2139 2140
        url_fskip(pb, atom.size);
        return 0;
    }
    err = mov_read_mdat(c, pb, atom);
    return err;
}

2141
static int mov_read_cmov(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
2142
{
2143
#if CONFIG_ZLIB
2144
    ByteIOContext ctx;
2145 2146
    uint8_t *cmov_data;
    uint8_t *moov_data; /* uncompressed data */
2147
    long cmov_len, moov_len;
2148
    int ret = -1;
2149

2150
    get_be32(pb); /* dcom atom */
2151
    if (get_le32(pb) != MKTAG('d','c','o','m'))
2152
        return -1;
2153
    if (get_le32(pb) != MKTAG('z','l','i','b')) {
B
Benoit Fouet 已提交
2154
        av_log(c->fc, AV_LOG_ERROR, "unknown compression for cmov atom !");
2155 2156 2157
        return -1;
    }
    get_be32(pb); /* cmvd atom */
2158
    if (get_le32(pb) != MKTAG('c','m','v','d'))
2159 2160
        return -1;
    moov_len = get_be32(pb); /* uncompressed size */
2161
    cmov_len = atom.size - 6 * 4;
2162

B
Baptiste Coudurier 已提交
2163
    cmov_data = av_malloc(cmov_len);
2164
    if (!cmov_data)
2165
        return AVERROR(ENOMEM);
B
Baptiste Coudurier 已提交
2166
    moov_data = av_malloc(moov_len);
2167 2168
    if (!moov_data) {
        av_free(cmov_data);
2169
        return AVERROR(ENOMEM);
2170 2171
    }
    get_buffer(pb, cmov_data, cmov_len);
2172
    if(uncompress (moov_data, (uLongf *) &moov_len, (const Bytef *)cmov_data, cmov_len) != Z_OK)
2173
        goto free_and_return;
2174
    if(init_put_byte(&ctx, moov_data, moov_len, 0, NULL, NULL, NULL, NULL) != 0)
2175
        goto free_and_return;
2176
    atom.type = MKTAG('m','o','o','v');
2177
    atom.size = moov_len;
2178
#ifdef DEBUG
M
Michael Niedermayer 已提交
2179
//    { int fd = open("/tmp/uncompheader.mov", O_WRONLY | O_CREAT); write(fd, moov_data, moov_len); close(fd); }
2180
#endif
2181
    ret = mov_read_default(c, &ctx, atom);
2182
free_and_return:
2183 2184 2185
    av_free(moov_data);
    av_free(cmov_data);
    return ret;
2186 2187 2188
#else
    av_log(c->fc, AV_LOG_ERROR, "this file requires zlib support compiled in\n");
    return -1;
2189
#endif
2190
}
2191

G
Gael Chardon 已提交
2192
/* edit list atom */
2193
static int mov_read_elst(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
G
Gael Chardon 已提交
2194
{
2195
    MOVStreamContext *sc;
B
Baptiste Coudurier 已提交
2196 2197
    int i, edit_count;

2198 2199 2200 2201
    if (c->fc->nb_streams < 1)
        return 0;
    sc = c->fc->streams[c->fc->nb_streams-1]->priv_data;

B
Baptiste Coudurier 已提交
2202
    get_byte(pb); /* version */
2203
    get_be24(pb); /* flags */
B
Baptiste Coudurier 已提交
2204
    edit_count = get_be32(pb); /* entries */
B
Baptiste Coudurier 已提交
2205

2206 2207 2208
    if((uint64_t)edit_count*12+8 > atom.size)
        return -1;

B
Baptiste Coudurier 已提交
2209
    for(i=0; i<edit_count; i++){
2210
        int time;
2211
        int duration = get_be32(pb); /* Track duration */
2212
        time = get_be32(pb); /* Media time */
B
Baptiste Coudurier 已提交
2213
        get_be32(pb); /* Media rate */
2214 2215
        if (i == 0 && time >= -1) {
            sc->time_offset = time != -1 ? time : -duration;
2216
        }
B
Baptiste Coudurier 已提交
2217
    }
2218 2219 2220 2221 2222

    if(edit_count > 1)
        av_log(c->fc, AV_LOG_WARNING, "multiple edit list entries, "
               "a/v desync might occur, patch welcome\n");

2223
    dprintf(c->fc, "track[%i].edit_count = %i\n", c->fc->nb_streams-1, edit_count);
B
Baptiste Coudurier 已提交
2224
    return 0;
G
Gael Chardon 已提交
2225 2226
}

2227
static const MOVParseTableEntry mov_default_parse_table[] = {
2228
{ MKTAG('a','v','s','s'), mov_read_extradata },
D
David Conrad 已提交
2229
{ MKTAG('c','h','p','l'), mov_read_chpl },
2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240
{ MKTAG('c','o','6','4'), mov_read_stco },
{ MKTAG('c','t','t','s'), mov_read_ctts }, /* composition time to sample */
{ MKTAG('d','i','n','f'), mov_read_default },
{ MKTAG('d','r','e','f'), mov_read_dref },
{ MKTAG('e','d','t','s'), mov_read_default },
{ MKTAG('e','l','s','t'), mov_read_elst },
{ MKTAG('e','n','d','a'), mov_read_enda },
{ MKTAG('f','i','e','l'), mov_read_extradata },
{ MKTAG('f','t','y','p'), mov_read_ftyp },
{ MKTAG('g','l','b','l'), mov_read_glbl },
{ MKTAG('h','d','l','r'), mov_read_hdlr },
2241
{ MKTAG('i','l','s','t'), mov_read_ilst },
2242 2243 2244 2245
{ MKTAG('j','p','2','h'), mov_read_extradata },
{ MKTAG('m','d','a','t'), mov_read_mdat },
{ MKTAG('m','d','h','d'), mov_read_mdhd },
{ MKTAG('m','d','i','a'), mov_read_default },
2246
{ MKTAG('m','e','t','a'), mov_read_meta },
2247 2248 2249 2250 2251 2252 2253 2254
{ MKTAG('m','i','n','f'), mov_read_default },
{ MKTAG('m','o','o','f'), mov_read_moof },
{ MKTAG('m','o','o','v'), mov_read_moov },
{ MKTAG('m','v','e','x'), mov_read_default },
{ MKTAG('m','v','h','d'), mov_read_mvhd },
{ MKTAG('S','M','I',' '), mov_read_smi }, /* Sorenson extension ??? */
{ MKTAG('a','l','a','c'), mov_read_extradata }, /* alac specific atom */
{ MKTAG('a','v','c','C'), mov_read_glbl },
2255
{ MKTAG('p','a','s','p'), mov_read_pasp },
2256 2257
{ MKTAG('s','t','b','l'), mov_read_default },
{ MKTAG('s','t','c','o'), mov_read_stco },
2258
{ MKTAG('s','t','p','s'), mov_read_stps },
M
Martin Storsjö 已提交
2259
{ MKTAG('s','t','r','f'), mov_read_strf },
2260 2261 2262 2263 2264
{ MKTAG('s','t','s','c'), mov_read_stsc },
{ MKTAG('s','t','s','d'), mov_read_stsd }, /* sample description */
{ MKTAG('s','t','s','s'), mov_read_stss }, /* sync sample */
{ MKTAG('s','t','s','z'), mov_read_stsz }, /* sample size */
{ MKTAG('s','t','t','s'), mov_read_stts },
2265
{ MKTAG('s','t','z','2'), mov_read_stsz }, /* compact sample size */
2266 2267 2268 2269
{ MKTAG('t','k','h','d'), mov_read_tkhd }, /* track header */
{ MKTAG('t','f','h','d'), mov_read_tfhd }, /* track fragment header */
{ MKTAG('t','r','a','k'), mov_read_trak },
{ MKTAG('t','r','a','f'), mov_read_default },
D
David Conrad 已提交
2270 2271
{ MKTAG('t','r','e','f'), mov_read_default },
{ MKTAG('c','h','a','p'), mov_read_chap },
2272 2273
{ MKTAG('t','r','e','x'), mov_read_trex },
{ MKTAG('t','r','u','n'), mov_read_trun },
B
Baptiste Coudurier 已提交
2274
{ MKTAG('u','d','t','a'), mov_read_default },
2275 2276
{ MKTAG('w','a','v','e'), mov_read_wave },
{ MKTAG('e','s','d','s'), mov_read_esds },
2277
{ MKTAG('d','a','c','3'), mov_read_dac3 }, /* AC-3 info */
2278 2279
{ MKTAG('w','i','d','e'), mov_read_wide }, /* place holder */
{ MKTAG('c','m','o','v'), mov_read_cmov },
B
Baptiste Coudurier 已提交
2280
{ 0, NULL }
2281 2282
};

F
Fabrice Bellard 已提交
2283 2284
static int mov_probe(AVProbeData *p)
{
2285 2286
    unsigned int offset;
    uint32_t tag;
2287
    int score = 0;
2288

F
Fabrice Bellard 已提交
2289
    /* check file header */
2290 2291 2292 2293
    offset = 0;
    for(;;) {
        /* ignore invalid offset */
        if ((offset + 8) > (unsigned int)p->buf_size)
2294
            return score;
2295
        tag = AV_RL32(p->buf + offset + 4);
2296
        switch(tag) {
2297
        /* check for obvious tags */
2298 2299 2300 2301 2302
        case MKTAG('j','P',' ',' '): /* jpeg 2000 signature */
        case MKTAG('m','o','o','v'):
        case MKTAG('m','d','a','t'):
        case MKTAG('p','n','o','t'): /* detect movs with preview pics like ew.mov and april.mov */
        case MKTAG('u','d','t','a'): /* Packet Video PVAuthor adds this and a lot of more junk */
2303
        case MKTAG('f','t','y','p'):
2304
            return AVPROBE_SCORE_MAX;
2305
        /* those are more common words, so rate then a bit less */
2306 2307 2308 2309 2310
        case MKTAG('e','d','i','w'): /* xdcam files have reverted first tags */
        case MKTAG('w','i','d','e'):
        case MKTAG('f','r','e','e'):
        case MKTAG('j','u','n','k'):
        case MKTAG('p','i','c','t'):
2311
            return AVPROBE_SCORE_MAX - 5;
B
Baptiste Coudurier 已提交
2312
        case MKTAG(0x82,0x82,0x7f,0x7d):
2313 2314 2315
        case MKTAG('s','k','i','p'):
        case MKTAG('u','u','i','d'):
        case MKTAG('p','r','f','l'):
2316
            offset = AV_RB32(p->buf+offset) + offset;
2317 2318
            /* if we only find those cause probedata is too small at least rate them */
            score = AVPROBE_SCORE_MAX - 50;
2319 2320 2321
            break;
        default:
            /* unrecognized tag */
2322
            return score;
2323
        }
2324
    }
2325
    return score;
F
Fabrice Bellard 已提交
2326 2327
}

D
David Conrad 已提交
2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394
// must be done after parsing all trak because there's no order requirement
static void mov_read_chapters(AVFormatContext *s)
{
    MOVContext *mov = s->priv_data;
    AVStream *st = NULL;
    MOVStreamContext *sc;
    int64_t cur_pos;
    uint8_t *title = NULL;
    int i, len, i8, i16;

    for (i = 0; i < s->nb_streams; i++)
        if (s->streams[i]->id == mov->chapter_track) {
            st = s->streams[i];
            break;
        }
    if (!st) {
        av_log(s, AV_LOG_ERROR, "Referenced QT chapter track not found\n");
        return;
    }

    st->discard = AVDISCARD_ALL;
    sc = st->priv_data;
    cur_pos = url_ftell(sc->pb);

    for (i = 0; i < st->nb_index_entries; i++) {
        AVIndexEntry *sample = &st->index_entries[i];
        int64_t end = i+1 < st->nb_index_entries ? st->index_entries[i+1].timestamp : st->duration;

        if (url_fseek(sc->pb, sample->pos, SEEK_SET) != sample->pos) {
            av_log(s, AV_LOG_ERROR, "Chapter %d not found in file\n", i);
            goto finish;
        }

        title = av_malloc(sample->size+2);
        get_buffer(sc->pb, title, sample->size);

        // the first two bytes are the length of the title
        len = AV_RB16(title);
        if (len > sample->size-2)
            continue;

        // The samples could theoretically be in any encoding if there's an encd
        // atom following, but in practice are only utf-8 or utf-16, distinguished
        // instead by the presence of a BOM
        if (AV_RB16(title+2) == 0xfeff) {
            uint8_t *utf8 = av_malloc(2*len+3);

            i8 = i16 = 0;
            while (i16 < len) {
                uint32_t ch;
                uint8_t tmp;
                GET_UTF16(ch, i16 < len ? AV_RB16(title + (i16+=2)) : 0, break;)
                PUT_UTF8(ch, tmp, if (i8 < 2*len) utf8[2+i8++] = tmp;)
            }
            utf8[2+i8] = 0;
            av_freep(&title);
            title = utf8;
        }

        ff_new_chapter(s, i, st->time_base, sample->timestamp, end, title+2);
        av_freep(&title);
    }
finish:
    av_free(title);
    url_fseek(sc->pb, cur_pos, SEEK_SET);
}

Z
Zdenek Kabelac 已提交
2395
static int mov_read_header(AVFormatContext *s, AVFormatParameters *ap)
2396
{
2397
    MOVContext *mov = s->priv_data;
2398
    ByteIOContext *pb = s->pb;
B
Baptiste Coudurier 已提交
2399
    int err;
2400
    MOVAtom atom = { AV_RL32("root") };
2401 2402

    mov->fc = s;
2403 2404
    /* .mov and .mp4 aren't streamable anyway (only progressive download if moov is before mdat) */
    if(!url_is_streamed(pb))
2405
        atom.size = url_fsize(pb);
2406
    else
B
Baptiste Coudurier 已提交
2407
        atom.size = INT64_MAX;
2408 2409

    /* check MOV header */
B
Baptiste Coudurier 已提交
2410 2411 2412 2413 2414 2415
    if ((err = mov_read_default(mov, pb, atom)) < 0) {
        av_log(s, AV_LOG_ERROR, "error reading header: %d\n", err);
        return err;
    }
    if (!mov->found_moov) {
        av_log(s, AV_LOG_ERROR, "moov atom not found\n");
2416
        return -1;
2417
    }
B
Baptiste Coudurier 已提交
2418
    dprintf(mov->fc, "on_parse_exit_offset=%lld\n", url_ftell(pb));
2419

D
David Conrad 已提交
2420 2421 2422
    if (!url_is_streamed(pb) && mov->chapter_track > 0)
        mov_read_chapters(s);

2423 2424 2425
    return 0;
}

2426
static AVIndexEntry *mov_find_next_sample(AVFormatContext *s, AVStream **st)
2427
{
2428
    AVIndexEntry *sample = NULL;
2429
    int64_t best_dts = INT64_MAX;
2430
    int i;
B
Baptiste Coudurier 已提交
2431
    for (i = 0; i < s->nb_streams; i++) {
2432 2433
        AVStream *avst = s->streams[i];
        MOVStreamContext *msc = avst->priv_data;
2434
        if (msc->pb && msc->current_sample < avst->nb_index_entries) {
2435
            AVIndexEntry *current_sample = &avst->index_entries[msc->current_sample];
2436
            int64_t dts = av_rescale(current_sample->timestamp, AV_TIME_BASE, msc->time_scale);
B
Baptiste Coudurier 已提交
2437
            dprintf(s, "stream %d, sample %d, dts %"PRId64"\n", i, msc->current_sample, dts);
B
Baptiste Coudurier 已提交
2438 2439
            if (!sample || (url_is_streamed(s->pb) && current_sample->pos < sample->pos) ||
                (!url_is_streamed(s->pb) &&
2440
                 ((msc->pb != s->pb && dts < best_dts) || (msc->pb == s->pb &&
B
Baptiste Coudurier 已提交
2441
                 ((FFABS(best_dts - dts) <= AV_TIME_BASE && current_sample->pos < sample->pos) ||
2442
                  (FFABS(best_dts - dts) > AV_TIME_BASE && dts < best_dts)))))) {
2443 2444
                sample = current_sample;
                best_dts = dts;
2445
                *st = avst;
2446
            }
2447 2448
        }
    }
2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460
    return sample;
}

static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
{
    MOVContext *mov = s->priv_data;
    MOVStreamContext *sc;
    AVIndexEntry *sample;
    AVStream *st = NULL;
    int ret;
 retry:
    sample = mov_find_next_sample(s, &st);
2461 2462 2463
    if (!sample) {
        mov->found_mdat = 0;
        if (!url_is_streamed(s->pb) ||
2464
            mov_read_default(mov, s->pb, (MOVAtom){ AV_RL32("root"), INT64_MAX }) < 0 ||
2465
            url_feof(s->pb))
B
Baptiste Coudurier 已提交
2466
            return AVERROR_EOF;
2467 2468 2469
        dprintf(s, "read fragments, offset 0x%llx\n", url_ftell(s->pb));
        goto retry;
    }
2470
    sc = st->priv_data;
2471 2472
    /* must be done just before reading, to avoid infinite loop on sample */
    sc->current_sample++;
2473 2474

    if (st->discard != AVDISCARD_ALL) {
R
Reimar Döffinger 已提交
2475 2476 2477 2478 2479 2480
        if (url_fseek(sc->pb, sample->pos, SEEK_SET) != sample->pos) {
            av_log(mov->fc, AV_LOG_ERROR, "stream %d, offset 0x%"PRIx64": partial file\n",
                   sc->ffindex, sample->pos);
            return -1;
        }
        ret = av_get_packet(sc->pb, pkt, sample->size);
2481 2482
        if (ret < 0)
            return ret;
R
Reimar Döffinger 已提交
2483 2484 2485 2486 2487 2488 2489 2490 2491
#if CONFIG_DV_DEMUXER
        if (mov->dv_demux && sc->dv_audio_container) {
            dv_produce_packet(mov->dv_demux, pkt, pkt->data, pkt->size);
            av_free(pkt->data);
            pkt->size = 0;
            ret = dv_get_packet(mov->dv_demux, pkt);
            if (ret < 0)
                return ret;
        }
2492
#endif
2493 2494
    }

2495 2496 2497
    pkt->stream_index = sc->ffindex;
    pkt->dts = sample->timestamp;
    if (sc->ctts_data) {
2498
        pkt->pts = pkt->dts + sc->dts_shift + sc->ctts_data[sc->ctts_index].duration;
2499
        /* update ctts context */
2500 2501 2502 2503 2504
        sc->ctts_sample++;
        if (sc->ctts_index < sc->ctts_count &&
            sc->ctts_data[sc->ctts_index].count == sc->ctts_sample) {
            sc->ctts_index++;
            sc->ctts_sample = 0;
2505
        }
2506 2507
        if (sc->wrong_dts)
            pkt->dts = AV_NOPTS_VALUE;
2508
    } else {
2509
        int64_t next_dts = (sc->current_sample < st->nb_index_entries) ?
2510 2511
            st->index_entries[sc->current_sample].timestamp : st->duration;
        pkt->duration = next_dts - pkt->dts;
2512
        pkt->pts = pkt->dts;
2513
    }
2514 2515
    if (st->discard == AVDISCARD_ALL)
        goto retry;
2516
    pkt->flags |= sample->flags & AVINDEX_KEYFRAME ? AV_PKT_FLAG_KEY : 0;
2517
    pkt->pos = sample->pos;
2518 2519
    dprintf(s, "stream %d, pts %"PRId64", dts %"PRId64", pos 0x%"PRIx64", duration %d\n",
            pkt->stream_index, pkt->pts, pkt->dts, pkt->pos, pkt->duration);
2520 2521
    return 0;
}
2522

2523
static int mov_seek_stream(AVFormatContext *s, AVStream *st, int64_t timestamp, int flags)
2524 2525 2526 2527
{
    MOVStreamContext *sc = st->priv_data;
    int sample, time_sample;
    int i;
2528

2529
    sample = av_index_search_timestamp(st, timestamp, flags);
2530
    dprintf(s, "stream %d, timestamp %"PRId64", sample %d\n", st->index, timestamp, sample);
2531 2532
    if (sample < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
        sample = 0;
2533 2534 2535
    if (sample < 0) /* not sure what to do */
        return -1;
    sc->current_sample = sample;
2536
    dprintf(s, "stream %d, found sample %d\n", st->index, sc->current_sample);
2537 2538 2539 2540
    /* adjust ctts index */
    if (sc->ctts_data) {
        time_sample = 0;
        for (i = 0; i < sc->ctts_count; i++) {
2541 2542
            int next = time_sample + sc->ctts_data[i].count;
            if (next > sc->current_sample) {
2543 2544
                sc->ctts_index = i;
                sc->ctts_sample = sc->current_sample - time_sample;
2545
                break;
2546
            }
2547
            time_sample = next;
2548 2549
        }
    }
2550
    return sample;
2551 2552
}

2553
static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags)
G
Gael Chardon 已提交
2554
{
2555 2556 2557 2558
    AVStream *st;
    int64_t seek_timestamp, timestamp;
    int sample;
    int i;
G
Gael Chardon 已提交
2559

2560
    if (stream_index >= s->nb_streams)
G
Gael Chardon 已提交
2561
        return -1;
2562 2563
    if (sample_time < 0)
        sample_time = 0;
G
Gael Chardon 已提交
2564

2565
    st = s->streams[stream_index];
2566
    sample = mov_seek_stream(s, st, sample_time, flags);
2567
    if (sample < 0)
G
Gael Chardon 已提交
2568 2569
        return -1;

2570 2571
    /* adjust seek timestamp to found sample timestamp */
    seek_timestamp = st->index_entries[sample].timestamp;
G
Gael Chardon 已提交
2572

2573 2574
    for (i = 0; i < s->nb_streams; i++) {
        st = s->streams[i];
2575
        if (stream_index == i)
2576
            continue;
G
Gael Chardon 已提交
2577

2578
        timestamp = av_rescale_q(seek_timestamp, s->streams[stream_index]->time_base, st->time_base);
2579
        mov_seek_stream(s, st, timestamp, flags);
2580
    }
G
Gael Chardon 已提交
2581 2582 2583
    return 0;
}

Z
Zdenek Kabelac 已提交
2584
static int mov_read_close(AVFormatContext *s)
2585
{
2586
    MOVContext *mov = s->priv_data;
2587 2588 2589
    int i, j;

    for (i = 0; i < s->nb_streams; i++) {
2590 2591
        AVStream *st = s->streams[i];
        MOVStreamContext *sc = st->priv_data;
2592

2593
        av_freep(&sc->ctts_data);
2594
        for (j = 0; j < sc->drefs_count; j++) {
2595
            av_freep(&sc->drefs[j].path);
2596 2597
            av_freep(&sc->drefs[j].dir);
        }
2598 2599 2600
        av_freep(&sc->drefs);
        if (sc->pb && sc->pb != s->pb)
            url_fclose(sc->pb);
2601 2602

        av_freep(&st->codec->palctrl);
2603
    }
2604 2605 2606

    if (mov->dv_demux) {
        for(i = 0; i < mov->dv_fctx->nb_streams; i++) {
2607 2608 2609 2610 2611 2612
            av_freep(&mov->dv_fctx->streams[i]->codec);
            av_freep(&mov->dv_fctx->streams[i]);
        }
        av_freep(&mov->dv_fctx);
        av_freep(&mov->dv_demux);
    }
2613

B
Baptiste Coudurier 已提交
2614
    av_freep(&mov->trex_data);
2615

2616 2617 2618
    return 0;
}

2619
AVInputFormat mov_demuxer = {
2620
    "mov,mp4,m4a,3gp,3g2,mj2",
2621
    NULL_IF_CONFIG_SMALL("QuickTime/MPEG-4/Motion JPEG 2000 format"),
F
Fabrice Bellard 已提交
2622 2623
    sizeof(MOVContext),
    mov_probe,
2624 2625 2626
    mov_read_header,
    mov_read_packet,
    mov_read_close,
G
Gael Chardon 已提交
2627
    mov_read_seek,
2628
};