mov.c 96.4 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
 * This file is part of Libav.
7
 *
8
 * Libav 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
 * Libav 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 Libav; 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
//#define MOV_EXPORT_ALL_METADATA
27

28
#include "libavutil/audioconvert.h"
29
#include "libavutil/intreadwrite.h"
30
#include "libavutil/intfloat.h"
31
#include "libavutil/mathematics.h"
32
#include "libavutil/avstring.h"
33
#include "libavutil/dict.h"
34
#include "libavcodec/ac3tab.h"
35
#include "avformat.h"
36
#include "internal.h"
37
#include "avio_internal.h"
38
#include "riff.h"
39
#include "isom.h"
40
#include "libavcodec/get_bits.h"
R
Raivo Hool 已提交
41
#include "id3v1.h"
42
#include "mov_chan.h"
43

44
#if CONFIG_ZLIB
45 46 47
#include <zlib.h>
#endif

48 49
/*
 * First version by Francois Revol revol@free.fr
50
 * Seek function by Gael Chardon gael.dev@4now.net
51 52
 */

53 54
#include "qtpalette.h"

G
Gael Chardon 已提交
55

56 57 58
#undef NDEBUG
#include <assert.h>

59 60 61
/* those functions parse an atom */
/* links atom IDs to parse functions */
typedef struct MOVParseTableEntry {
62
    uint32_t type;
63
    int (*parse)(MOVContext *ctx, AVIOContext *pb, MOVAtom atom);
64 65
} MOVParseTableEntry;

66 67
static const MOVParseTableEntry mov_default_parse_table[];

68 69
static int mov_metadata_track_or_disc_number(MOVContext *c, AVIOContext *pb,
                                             unsigned len, const char *key)
B
Baptiste Coudurier 已提交
70 71 72
{
    char buf[16];

73
    short current, total;
74
    avio_rb16(pb); // unknown
75 76 77 78 79 80 81
    current = avio_rb16(pb);
    total = avio_rb16(pb);
    if (!total)
        snprintf(buf, sizeof(buf), "%d", current);
    else
        snprintf(buf, sizeof(buf), "%d/%d", current, total);
    av_dict_set(&c->fc->metadata, key, buf, 0);
B
Baptiste Coudurier 已提交
82 83 84 85

    return 0;
}

86 87
static int mov_metadata_int8_bypass_padding(MOVContext *c, AVIOContext *pb,
                                            unsigned len, const char *key)
88
{
89
    char buf[16];
90

91 92 93 94
    /* bypass padding bytes */
    avio_r8(pb);
    avio_r8(pb);
    avio_r8(pb);
95

96
    snprintf(buf, sizeof(buf), "%d", avio_r8(pb));
97
    av_dict_set(&c->fc->metadata, key, buf, 0);
98

99
    return 0;
100 101
}

102 103
static int mov_metadata_int8_no_padding(MOVContext *c, AVIOContext *pb,
                                        unsigned len, const char *key)
104
{
105
    char buf[16];
106

107
    snprintf(buf, sizeof(buf), "%d", avio_r8(pb));
108
    av_dict_set(&c->fc->metadata, key, buf, 0);
109

110
    return 0;
111 112
}

R
Raivo Hool 已提交
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
static int mov_metadata_gnre(MOVContext *c, AVIOContext *pb,
                             unsigned len, const char *key)
{
    short genre;
    char buf[20];

    avio_r8(pb); // unknown

    genre = avio_r8(pb);
    if (genre < 1 || genre > ID3v1_GENRE_MAX)
        return 0;
    snprintf(buf, sizeof(buf), "%s", ff_id3v1_genre_str[genre-1]);
    av_dict_set(&c->fc->metadata, key, buf, 0);

    return 0;
}

130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
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,
};

149
static int mov_read_mac_string(MOVContext *c, AVIOContext *pb, int len,
150 151 152 153 154 155 156
                               char *dst, int dstlen)
{
    char *p = dst;
    char *end = dst+dstlen-1;
    int i;

    for (i = 0; i < len; i++) {
157
        uint8_t t, c = avio_r8(pb);
158 159 160 161 162 163 164 165 166
        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;
}

167
static int mov_read_udta_string(MOVContext *c, AVIOContext *pb, MOVAtom atom)
168 169 170 171 172 173
{
#ifdef MOV_EXPORT_ALL_METADATA
    char tmp_key[5];
#endif
    char str[1024], key2[16], language[4] = {0};
    const char *key = NULL;
174 175
    uint16_t str_size, langcode = 0;
    uint32_t data_type = 0;
176
    int (*parse)(MOVContext*, AVIOContext*, unsigned, const char*) = NULL;
177 178 179 180

    switch (atom.type) {
    case MKTAG(0xa9,'n','a','m'): key = "title";     break;
    case MKTAG(0xa9,'a','u','t'):
181
    case MKTAG(0xa9,'A','R','T'): key = "artist";    break;
R
Raivo Hool 已提交
182
    case MKTAG( 'a','A','R','T'): key = "album_artist";    break;
183
    case MKTAG(0xa9,'w','r','t'): key = "composer";  break;
184
    case MKTAG( 'c','p','r','t'):
185 186 187 188
    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;
189
    case MKTAG(0xa9,'d','a','y'): key = "date";      break;
190
    case MKTAG(0xa9,'g','e','n'): key = "genre";     break;
R
Raivo Hool 已提交
191 192
    case MKTAG( 'g','n','r','e'): key = "genre";
        parse = mov_metadata_gnre; break;
193
    case MKTAG(0xa9,'t','o','o'):
194
    case MKTAG(0xa9,'s','w','r'): key = "encoder";   break;
195
    case MKTAG(0xa9,'e','n','c'): key = "encoder";   break;
196 197 198 199 200
    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 已提交
201
    case MKTAG( 't','r','k','n'): key = "track";
202 203 204
        parse = mov_metadata_track_or_disc_number; break;
    case MKTAG( 'd','i','s','k'): key = "disc";
        parse = mov_metadata_track_or_disc_number; break;
205
    case MKTAG( 't','v','e','s'): key = "episode_sort";
206
        parse = mov_metadata_int8_bypass_padding; break;
207
    case MKTAG( 't','v','s','n'): key = "season_number";
208
        parse = mov_metadata_int8_bypass_padding; break;
209
    case MKTAG( 's','t','i','k'): key = "media_type";
210
        parse = mov_metadata_int8_no_padding; break;
211 212 213 214
    case MKTAG( 'h','d','v','d'): key = "hd_video";
        parse = mov_metadata_int8_no_padding; break;
    case MKTAG( 'p','g','a','p'): key = "gapless_playback";
        parse = mov_metadata_int8_no_padding; break;
215 216 217
    }

    if (c->itunes_metadata && atom.size > 8) {
218 219
        int data_size = avio_rb32(pb);
        int tag = avio_rl32(pb);
220
        if (tag == MKTAG('d','a','t','a')) {
221 222
            data_type = avio_rb32(pb); // type
            avio_rb32(pb); // unknown
223 224 225 226
            str_size = data_size - 16;
            atom.size -= 16;
        } else return 0;
    } else if (atom.size > 4 && key && !c->itunes_metadata) {
227 228
        str_size = avio_rb16(pb); // string length
        langcode = avio_rb16(pb);
229
        ff_mov_lang_to_iso639(langcode, language);
230 231 232 233 234 235 236 237 238 239 240 241 242 243
        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)
244
        return AVERROR_INVALIDDATA;
245 246

    str_size = FFMIN3(sizeof(str)-1, str_size, atom.size);
B
Baptiste Coudurier 已提交
247 248

    if (parse)
249
        parse(c, pb, str_size, key);
B
Baptiste Coudurier 已提交
250
    else {
251 252 253
        if (data_type == 3 || (data_type == 0 && langcode < 0x800)) { // MAC Encoded
            mov_read_mac_string(c, pb, str_size, str, sizeof(str));
        } else {
254
            avio_read(pb, str, str_size);
255 256
            str[str_size] = 0;
        }
257
        av_dict_set(&c->fc->metadata, key, str, 0);
B
Baptiste Coudurier 已提交
258 259
        if (*language && strcmp(language, "und")) {
            snprintf(key2, sizeof(key2), "%s-%s", key, language);
260
            av_dict_set(&c->fc->metadata, key2, str, 0);
B
Baptiste Coudurier 已提交
261
        }
B
Baptiste Coudurier 已提交
262
    }
263 264 265
    av_dlog(c->fc, "lang \"%3s\" ", language);
    av_dlog(c->fc, "tag \"%s\" value \"%s\" atom \"%.4s\" %d %"PRId64"\n",
            key, str, (char*)&atom.type, str_size, atom.size);
266 267 268

    return 0;
}
269

270
static int mov_read_chpl(MOVContext *c, AVIOContext *pb, MOVAtom atom)
D
David Conrad 已提交
271 272
{
    int64_t start;
D
David Conrad 已提交
273
    int i, nb_chapters, str_len, version;
D
David Conrad 已提交
274 275 276 277 278
    char str[256+1];

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

279 280
    version = avio_r8(pb);
    avio_rb24(pb);
D
David Conrad 已提交
281
    if (version)
282 283
        avio_rb32(pb); // ???
    nb_chapters = avio_r8(pb);
D
David Conrad 已提交
284 285 286 287 288

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

289 290
        start = avio_rb64(pb);
        str_len = avio_r8(pb);
D
David Conrad 已提交
291 292 293 294

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

295
        avio_read(pb, str, str_len);
D
David Conrad 已提交
296
        str[str_len] = 0;
297
        avpriv_new_chapter(c->fc, i, (AVRational){1,10000000}, start, AV_NOPTS_VALUE, str);
D
David Conrad 已提交
298 299 300 301
    }
    return 0;
}

302
static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom)
303
{
304
    int64_t total_size = 0;
305
    MOVAtom a;
306
    int i;
307

308
    if (atom.size < 0)
B
Baptiste Coudurier 已提交
309
        atom.size = INT64_MAX;
A
Anton Khirnov 已提交
310
    while (total_size + 8 < atom.size && !pb->eof_reached) {
311
        int (*parse)(MOVContext*, AVIOContext*, MOVAtom) = NULL;
312
        a.size = atom.size;
B
Baptiste Coudurier 已提交
313
        a.type=0;
314
        if (atom.size >= 8) {
315 316
            a.size = avio_rb32(pb);
            a.type = avio_rl32(pb);
317
        }
L
Luca Barbato 已提交
318
        av_dlog(c->fc, "type: %08x '%.4s' parent:'%.4s' sz: %"PRId64" %"PRId64" %"PRId64"\n",
319
                a.type, (char*)&a.type, (char*)&atom.type, a.size, total_size, atom.size);
320
        total_size += 8;
321
        if (a.size == 1) { /* 64 bit extended size */
322
            a.size = avio_rb64(pb) - 8;
323
            total_size += 8;
324
        }
325 326 327
        if (a.size == 0) {
            a.size = atom.size - total_size;
            if (a.size <= 8)
328
                break;
329 330
        }
        a.size -= 8;
331
        if (a.size < 0)
332
            break;
B
Baptiste Coudurier 已提交
333
        a.size = FFMIN(a.size, atom.size - total_size);
334

335 336 337 338 339
        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;
            }
340

341 342 343 344 345 346
        // 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 */
347
            avio_skip(pb, a.size);
348
        } else {
349
            int64_t start_pos = avio_tell(pb);
350
            int64_t left;
351 352 353
            int err = parse(c, pb, a);
            if (err < 0)
                return err;
354
            if (c->found_moov && c->found_mdat &&
355 356 357
                ((!pb->seekable || c->fc->flags & AVFMT_FLAG_IGNIDX) ||
                 start_pos + a.size == avio_size(pb))) {
                if (!pb->seekable || c->fc->flags & AVFMT_FLAG_IGNIDX)
358
                    c->next_root_atom = start_pos + a.size;
359
                return 0;
360
            }
361
            left = a.size - avio_tell(pb) + start_pos;
362
            if (left > 0) /* skip garbage at atom end */
363
                avio_skip(pb, left);
364
        }
365

366
        total_size += a.size;
367 368
    }

369
    if (total_size < atom.size && atom.size < 0x7ffff)
370
        avio_skip(pb, atom.size - total_size);
371

372
    return 0;
373 374
}

375
static int mov_read_dref(MOVContext *c, AVIOContext *pb, MOVAtom atom)
376
{
377 378
    AVStream *st;
    MOVStreamContext *sc;
379 380
    int entries, i, j;

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

386 387
    avio_rb32(pb); // version + flags
    entries = avio_rb32(pb);
388
    if (entries >= UINT_MAX / sizeof(*sc->drefs))
389
        return AVERROR_INVALIDDATA;
390
    av_free(sc->drefs);
391
    sc->drefs = av_mallocz(entries * sizeof(*sc->drefs));
392 393 394
    if (!sc->drefs)
        return AVERROR(ENOMEM);
    sc->drefs_count = entries;
395 396

    for (i = 0; i < sc->drefs_count; i++) {
397
        MOVDref *dref = &sc->drefs[i];
398
        uint32_t size = avio_rb32(pb);
399
        int64_t next = avio_tell(pb) + size - 4;
400

401
        if (size < 12)
402
            return AVERROR_INVALIDDATA;
403

404 405
        dref->type = avio_rl32(pb);
        avio_rb32(pb); // version + flags
L
Luca Barbato 已提交
406
        av_dlog(c->fc, "type %.4s size %d\n", (char*)&dref->type, size);
407 408 409 410 411 412

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

413
            avio_skip(pb, 10);
414

415
            volume_len = avio_r8(pb);
416
            volume_len = FFMIN(volume_len, 27);
417
            avio_read(pb, dref->volume, 27);
418 419
            dref->volume[volume_len] = 0;
            av_log(c->fc, AV_LOG_DEBUG, "volume %s, len %d\n", dref->volume, volume_len);
420

421
            avio_skip(pb, 12);
422

423
            len = avio_r8(pb);
424
            len = FFMIN(len, 63);
425
            avio_read(pb, dref->filename, 63);
426 427 428
            dref->filename[len] = 0;
            av_log(c->fc, AV_LOG_DEBUG, "filename %s, len %d\n", dref->filename, len);

429
            avio_skip(pb, 16);
430 431

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

437
            avio_skip(pb, 16);
438

439
            for (type = 0; type != -1 && avio_tell(pb) < next; ) {
440 441
                type = avio_rb16(pb);
                len = avio_rb16(pb);
442 443 444 445
                av_log(c->fc, AV_LOG_DEBUG, "type %d, len %d\n", type, len);
                if (len&1)
                    len += 1;
                if (type == 2) { // absolute path
446
                    av_free(dref->path);
447
                    dref->path = av_mallocz(len+1);
448 449
                    if (!dref->path)
                        return AVERROR(ENOMEM);
450
                    avio_read(pb, dref->path, len);
451
                    if (len > volume_len && !strncmp(dref->path, dref->volume, volume_len)) {
452 453 454 455 456 457 458 459
                        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);
460 461 462 463 464
                } else if (type == 0) { // directory name
                    av_free(dref->dir);
                    dref->dir = av_malloc(len+1);
                    if (!dref->dir)
                        return AVERROR(ENOMEM);
465
                    avio_read(pb, dref->dir, len);
466 467 468 469 470
                    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);
471
                } else
472
                    avio_skip(pb, len);
473 474
            }
        }
A
Anton Khirnov 已提交
475
        avio_seek(pb, next, SEEK_SET);
476 477 478 479
    }
    return 0;
}

480
static int mov_read_hdlr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
481
{
482
    AVStream *st;
483
    uint32_t type;
484
    uint32_t av_unused ctype;
485

486 487 488 489 490
    if (c->fc->nb_streams < 1) // meta before first trak
        return 0;

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

491 492
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
493 494

    /* component type */
495 496
    ctype = avio_rl32(pb);
    type = avio_rl32(pb); /* component subtype */
497

L
Luca Barbato 已提交
498 499
    av_dlog(c->fc, "ctype= %.4s (0x%08x)\n", (char*)&ctype, ctype);
    av_dlog(c->fc, "stype= %.4s\n", (char*)&type);
500

501
    if     (type == MKTAG('v','i','d','e'))
502
        st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
503
    else if (type == MKTAG('s','o','u','n'))
504
        st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
505
    else if (type == MKTAG('m','1','a',' '))
506
        st->codec->codec_id = CODEC_ID_MP2;
507
    else if ((type == MKTAG('s','u','b','p')) || (type == MKTAG('c','l','c','p')))
508
        st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
509

510 511 512
    avio_rb32(pb); /* component  manufacture */
    avio_rb32(pb); /* component flags */
    avio_rb32(pb); /* component flags mask */
513 514 515 516

    return 0;
}

517
int ff_mov_read_esds(AVFormatContext *fc, AVIOContext *pb, MOVAtom atom)
518
{
519
    AVStream *st;
M
Mans Rullgard 已提交
520
    int tag;
521

522
    if (fc->nb_streams < 1)
523
        return 0;
524
    st = fc->streams[fc->nb_streams-1];
525

526
    avio_rb32(pb); /* version + flags */
M
Mans Rullgard 已提交
527
    ff_mp4_read_descr(fc, pb, &tag);
528
    if (tag == MP4ESDescrTag) {
529
        ff_mp4_parse_es_descr(pb, NULL);
530
    } else
531
        avio_rb16(pb); /* ID */
532

M
Mans Rullgard 已提交
533
    ff_mp4_read_descr(fc, pb, &tag);
534 535
    if (tag == MP4DecConfigDescrTag)
        ff_mp4_read_dec_config_descr(fc, st, pb);
536 537 538
    return 0;
}

539
static int mov_read_esds(MOVContext *c, AVIOContext *pb, MOVAtom atom)
540 541 542 543
{
    return ff_mov_read_esds(c->fc, pb, atom);
}

544
static int mov_read_dac3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
545 546
{
    AVStream *st;
547
    int ac3info, acmod, lfeon, bsmod;
548

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

553
    ac3info = avio_rb24(pb);
554
    bsmod = (ac3info >> 14) & 0x7;
555 556 557
    acmod = (ac3info >> 11) & 0x7;
    lfeon = (ac3info >> 10) & 0x1;
    st->codec->channels = ((int[]){2,1,2,3,3,4,4,5})[acmod] + lfeon;
558 559 560
    st->codec->channel_layout = avpriv_ac3_channel_layout_tab[acmod];
    if (lfeon)
        st->codec->channel_layout |= AV_CH_LOW_FREQUENCY;
561 562 563
    st->codec->audio_service_type = bsmod;
    if (st->codec->channels > 1 && bsmod == 0x7)
        st->codec->audio_service_type = AV_AUDIO_SERVICE_TYPE_KARAOKE;
564 565 566 567

    return 0;
}

568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
static int mov_read_dec3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
    AVStream *st;
    int eac3info, acmod, lfeon, bsmod;

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

    /* No need to parse fields for additional independent substreams and its
     * associated dependent substreams since libavcodec's E-AC-3 decoder
     * does not support them yet. */
    avio_rb16(pb); /* data_rate and num_ind_sub */
    eac3info = avio_rb24(pb);
    bsmod = (eac3info >> 12) & 0x1f;
    acmod = (eac3info >>  9) & 0x7;
    lfeon = (eac3info >>  8) & 0x1;
    st->codec->channel_layout = avpriv_ac3_channel_layout_tab[acmod];
    if (lfeon)
        st->codec->channel_layout |= AV_CH_LOW_FREQUENCY;
    st->codec->channels = av_get_channel_layout_nb_channels(st->codec->channel_layout);
    st->codec->audio_service_type = bsmod;
    if (st->codec->channels > 1 && bsmod == 0x7)
        st->codec->audio_service_type = AV_AUDIO_SERVICE_TYPE_KARAOKE;

    return 0;
}

596 597 598 599
static int mov_read_chan(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
    AVStream *st;
    uint8_t version;
600 601
    uint32_t flags, layout_tag, bitmap, num_descr, label_mask;
    int i;
602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622

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

    if (atom.size < 16)
        return 0;

    version = avio_r8(pb);
    flags   = avio_rb24(pb);

    layout_tag = avio_rb32(pb);
    bitmap     = avio_rb32(pb);
    num_descr  = avio_rb32(pb);

    if (atom.size < 16ULL + num_descr * 20ULL)
        return 0;

    av_dlog(c->fc, "chan: size=%ld version=%u flags=%u layout=%u bitmap=%u num_descr=%u\n",
            atom.size, version, flags, layout_tag, bitmap, num_descr);

623
    label_mask = 0;
624 625 626 627
    for (i = 0; i < num_descr; i++) {
        uint32_t label, cflags;
        label     = avio_rb32(pb);          // mChannelLabel
        cflags    = avio_rb32(pb);          // mChannelFlags
628 629 630
        avio_rl32(pb);                      // mCoordinates[0]
        avio_rl32(pb);                      // mCoordinates[1]
        avio_rl32(pb);                      // mCoordinates[2]
631 632 633 634 635 636 637 638
        if (layout_tag == 0) {
            uint32_t mask_incr = ff_mov_get_channel_label(label);
            if (mask_incr == 0) {
                label_mask = 0;
                break;
            }
            label_mask |= mask_incr;
        }
639
    }
640 641 642 643
    if (layout_tag == 0)
        st->codec->channel_layout = label_mask;
    else
        st->codec->channel_layout = ff_mov_get_channel_layout(layout_tag, bitmap);
644 645 646 647

    return 0;
}

648 649 650 651 652 653 654 655 656 657 658 659 660
static int mov_read_wfex(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
    AVStream *st;

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

    ff_get_wav_header(pb, st->codec, atom.size);

    return 0;
}

661
static int mov_read_pasp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
662
{
663 664
    const int num = avio_rb32(pb);
    const int den = avio_rb32(pb);
665 666 667 668 669 670
    AVStream *st;

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

671 672 673 674 675 676 677
    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) {
678 679 680 681 682 683
        st->sample_aspect_ratio.num = num;
        st->sample_aspect_ratio.den = den;
    }
    return 0;
}

684
/* this atom contains actual media data */
685
static int mov_read_mdat(MOVContext *c, AVIOContext *pb, MOVAtom atom)
686
{
687
    if (atom.size == 0) /* wrong one (MP4) */
688 689 690 691 692
        return 0;
    c->found_mdat=1;
    return 0; /* now go for moov */
}

693
/* read major brand, minor version and compatible brands and store them as metadata */
694
static int mov_read_ftyp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
695
{
696 697 698 699 700 701
    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};

702
    avio_read(pb, type, 4);
B
Baptiste Coudurier 已提交
703
    if (strcmp(type, "qt  "))
704
        c->isom = 1;
705
    av_log(c->fc, AV_LOG_DEBUG, "ISO: File Type Major Brand: %.4s\n",(char *)&type);
706
    av_dict_set(&c->fc->metadata, "major_brand", type, 0);
707
    minor_ver = avio_rb32(pb); /* minor version */
708
    snprintf(minor_ver_str, sizeof(minor_ver_str), "%d", minor_ver);
709
    av_dict_set(&c->fc->metadata, "minor_version", minor_ver_str, 0);
710 711 712

    comp_brand_size = atom.size - 8;
    if (comp_brand_size < 0)
713
        return AVERROR_INVALIDDATA;
714 715 716
    comp_brands_str = av_malloc(comp_brand_size + 1); /* Add null terminator */
    if (!comp_brands_str)
        return AVERROR(ENOMEM);
717
    avio_read(pb, comp_brands_str, comp_brand_size);
718
    comp_brands_str[comp_brand_size] = 0;
719
    av_dict_set(&c->fc->metadata, "compatible_brands", comp_brands_str, 0);
720 721
    av_freep(&comp_brands_str);

722 723 724
    return 0;
}

725
/* this atom should contain all header atoms */
726
static int mov_read_moov(MOVContext *c, AVIOContext *pb, MOVAtom atom)
727
{
728 729 730 731
    int ret;

    if ((ret = mov_read_default(c, pb, atom)) < 0)
        return ret;
732 733 734 735 736 737
    /* 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 */
}

738
static int mov_read_moof(MOVContext *c, AVIOContext *pb, MOVAtom atom)
B
Baptiste Coudurier 已提交
739
{
740
    c->fragment.moof_offset = avio_tell(pb) - 8;
741
    av_dlog(c->fc, "moof offset %"PRIx64"\n", c->fragment.moof_offset);
B
Baptiste Coudurier 已提交
742 743
    return mov_read_default(c, pb, atom);
}
744

745
static void mov_metadata_creation_time(AVDictionary **metadata, time_t time)
746 747 748
{
    char buffer[32];
    if (time) {
749
        struct tm *ptm;
750
        time -= 2082844800;  /* seconds between 1904-01-01 and Epoch */
751 752 753
        ptm = gmtime(&time);
        if (!ptm) return;
        strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", ptm);
754
        av_dict_set(metadata, "creation_time", buffer, 0);
755 756 757
    }
}

758
static int mov_read_mdhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
759
{
760 761 762
    AVStream *st;
    MOVStreamContext *sc;
    int version;
763
    char language[4] = {0};
764
    unsigned lang;
765
    time_t creation_time;
766

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

772
    version = avio_r8(pb);
773 774 775 776
    if (version > 1) {
        av_log_ask_for_sample(c, "unsupported version %d\n", version);
        return AVERROR_PATCHWELCOME;
    }
777
    avio_rb24(pb); /* flags */
B
clean  
Baptiste Coudurier 已提交
778
    if (version == 1) {
779 780
        creation_time = avio_rb64(pb);
        avio_rb64(pb);
B
clean  
Baptiste Coudurier 已提交
781
    } else {
782 783
        creation_time = avio_rb32(pb);
        avio_rb32(pb); /* modification time */
B
clean  
Baptiste Coudurier 已提交
784
    }
785
    mov_metadata_creation_time(&st->metadata, creation_time);
786

787 788
    sc->time_scale = avio_rb32(pb);
    st->duration = (version == 1) ? avio_rb64(pb) : avio_rb32(pb); /* duration */
789

790
    lang = avio_rb16(pb); /* language */
791
    if (ff_mov_lang_to_iso639(lang, language))
792
        av_dict_set(&st->metadata, "language", language, 0);
793
    avio_rb16(pb); /* quality */
794 795 796 797

    return 0;
}

798
static int mov_read_mvhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
799
{
800
    time_t creation_time;
801 802
    int version = avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
803

B
Baptiste Coudurier 已提交
804
    if (version == 1) {
805 806
        creation_time = avio_rb64(pb);
        avio_rb64(pb);
B
Baptiste Coudurier 已提交
807
    } else {
808 809
        creation_time = avio_rb32(pb);
        avio_rb32(pb); /* modification time */
B
Baptiste Coudurier 已提交
810
    }
811
    mov_metadata_creation_time(&c->fc->metadata, creation_time);
812
    c->time_scale = avio_rb32(pb); /* time scale */
813

L
Luca Barbato 已提交
814
    av_dlog(c->fc, "time scale = %i\n", c->time_scale);
815

816 817
    c->duration = (version == 1) ? avio_rb64(pb) : avio_rb32(pb); /* duration */
    avio_rb32(pb); /* preferred scale */
818

819
    avio_rb16(pb); /* preferred volume */
820

821
    avio_skip(pb, 10); /* reserved */
822

823
    avio_skip(pb, 36); /* display matrix */
824

825 826 827 828 829 830 831
    avio_rb32(pb); /* preview time */
    avio_rb32(pb); /* preview duration */
    avio_rb32(pb); /* poster time */
    avio_rb32(pb); /* selection time */
    avio_rb32(pb); /* selection duration */
    avio_rb32(pb); /* current time */
    avio_rb32(pb); /* next track ID */
832 833 834 835

    return 0;
}

836
static int mov_read_smi(MOVContext *c, AVIOContext *pb, MOVAtom atom)
837
{
838 839 840 841 842
    AVStream *st;

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

844
    if ((uint64_t)atom.size > (1<<30))
845
        return AVERROR_INVALIDDATA;
846

847 848
    // currently SVQ3 decoder expect full STSD header - so let's fake it
    // this should be fixed and just SMI header should be passed
849
    av_free(st->codec->extradata);
850 851 852
    st->codec->extradata = av_mallocz(atom.size + 0x5a + FF_INPUT_BUFFER_PADDING_SIZE);
    if (!st->codec->extradata)
        return AVERROR(ENOMEM);
B
Baptiste Coudurier 已提交
853 854
    st->codec->extradata_size = 0x5a + atom.size;
    memcpy(st->codec->extradata, "SVQ3", 4); // fake
855
    avio_read(pb, st->codec->extradata + 0x5a, atom.size);
L
Luca Barbato 已提交
856
    av_dlog(c->fc, "Reading SMI %"PRId64"  %s\n", atom.size, st->codec->extradata + 0x5a);
857 858
    return 0;
}
859

860
static int mov_read_enda(MOVContext *c, AVIOContext *pb, MOVAtom atom)
861
{
862 863 864 865 866 867
    AVStream *st;
    int little_endian;

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

869
    little_endian = avio_rb16(pb);
L
Luca Barbato 已提交
870
    av_dlog(c->fc, "enda %d\n", little_endian);
871
    if (little_endian == 1) {
872 873 874 875 876 877 878
        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;
879 880 881 882 883 884
        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;
885 886 887 888 889 890 891
        default:
            break;
        }
    }
    return 0;
}

892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925
static int mov_read_fiel(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
    AVStream *st;
    unsigned mov_field_order;
    enum AVFieldOrder decoded_field_order = AV_FIELD_UNKNOWN;

    if (c->fc->nb_streams < 1) // will happen with jp2 files
        return 0;
    st = c->fc->streams[c->fc->nb_streams-1];
    if (atom.size < 2)
        return AVERROR_INVALIDDATA;
    mov_field_order = avio_rb16(pb);
    if ((mov_field_order & 0xFF00) == 0x0100)
        decoded_field_order = AV_FIELD_PROGRESSIVE;
    else if ((mov_field_order & 0xFF00) == 0x0200) {
        switch (mov_field_order & 0xFF) {
        case 0x01: decoded_field_order = AV_FIELD_TT;
                   break;
        case 0x06: decoded_field_order = AV_FIELD_BB;
                   break;
        case 0x09: decoded_field_order = AV_FIELD_TB;
                   break;
        case 0x0E: decoded_field_order = AV_FIELD_BT;
                   break;
        }
    }
    if (decoded_field_order == AV_FIELD_UNKNOWN && mov_field_order) {
        av_log(NULL, AV_LOG_ERROR, "Unknown MOV field order 0x%04x\n", mov_field_order);
    }
    st->codec->field_order = decoded_field_order;

    return 0;
}

926
/* FIXME modify qdm2/svq3/h264 decoders to take full atom as extradata */
927
static int mov_read_extradata(MOVContext *c, AVIOContext *pb, MOVAtom atom)
928
{
929 930
    AVStream *st;
    uint64_t size;
931
    uint8_t *buf;
932 933 934 935 936

    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;
937
    if (size > INT_MAX || (uint64_t)atom.size > INT_MAX)
938
        return AVERROR_INVALIDDATA;
939
    buf= av_realloc(st->codec->extradata, size);
940
    if (!buf)
941
        return AVERROR(ENOMEM);
942 943 944 945 946
    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);
947
    avio_read(pb, buf + 8, atom.size);
948 949 950
    return 0;
}

951
static int mov_read_wave(MOVContext *c, AVIOContext *pb, MOVAtom atom)
R
Roberto Togni 已提交
952
{
953 954 955 956 957
    AVStream *st;

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

959
    if ((uint64_t)atom.size > (1<<30))
960
        return AVERROR_INVALIDDATA;
961

962 963
    if (st->codec->codec_id == CODEC_ID_QDM2 || st->codec->codec_id == CODEC_ID_QDMC) {
        // pass all frma atom to codec, needed at least for QDMC and QDM2
964
        av_free(st->codec->extradata);
965 966 967
        st->codec->extradata = av_mallocz(atom.size + FF_INPUT_BUFFER_PADDING_SIZE);
        if (!st->codec->extradata)
            return AVERROR(ENOMEM);
968
        st->codec->extradata_size = atom.size;
969
        avio_read(pb, st->codec->extradata, atom.size);
970
    } else if (atom.size > 8) { /* to read frma, esds atoms */
971 972 973
        int ret;
        if ((ret = mov_read_default(c, pb, atom)) < 0)
            return ret;
974
    } else
975
        avio_skip(pb, atom.size);
R
Roberto Togni 已提交
976 977 978
    return 0;
}

979 980 981 982
/**
 * This function reads atom content and puts data in extradata without tag
 * nor size unlike mov_read_extradata.
 */
983
static int mov_read_glbl(MOVContext *c, AVIOContext *pb, MOVAtom atom)
984
{
985 986 987 988 989
    AVStream *st;

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

991
    if ((uint64_t)atom.size > (1<<30))
992
        return AVERROR_INVALIDDATA;
993

994 995 996 997 998 999 1000 1001 1002
    if (atom.size >= 10) {
        // Broken files created by legacy versions of Libav and FFmpeg will
        // wrap a whole fiel atom inside of a glbl atom.
        unsigned size = avio_rb32(pb);
        unsigned type = avio_rl32(pb);
        avio_seek(pb, -8, SEEK_CUR);
        if (type == MKTAG('f','i','e','l') && size == atom.size)
            return mov_read_default(c, pb, atom);
    }
1003
    av_free(st->codec->extradata);
1004 1005 1006
    st->codec->extradata = av_mallocz(atom.size + FF_INPUT_BUFFER_PADDING_SIZE);
    if (!st->codec->extradata)
        return AVERROR(ENOMEM);
1007
    st->codec->extradata_size = atom.size;
1008
    avio_read(pb, st->codec->extradata, atom.size);
1009 1010 1011
    return 0;
}

M
Martin Storsjö 已提交
1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037
static int mov_read_dvc1(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
    AVStream *st;
    uint8_t profile_level;

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

    if (atom.size >= (1<<28) || atom.size < 7)
        return AVERROR_INVALIDDATA;

    profile_level = avio_r8(pb);
    if (profile_level & 0xf0 != 0xc0)
        return 0;

    av_free(st->codec->extradata);
    st->codec->extradata = av_mallocz(atom.size - 7 + FF_INPUT_BUFFER_PADDING_SIZE);
    if (!st->codec->extradata)
        return AVERROR(ENOMEM);
    st->codec->extradata_size = atom.size - 7;
    avio_seek(pb, 6, SEEK_CUR);
    avio_read(pb, st->codec->extradata, st->codec->extradata_size);
    return 0;
}

M
Martin Storsjö 已提交
1038 1039 1040 1041 1042
/**
 * 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.
 */
1043
static int mov_read_strf(MOVContext *c, AVIOContext *pb, MOVAtom atom)
M
Martin Storsjö 已提交
1044 1045 1046 1047 1048 1049 1050 1051 1052
{
    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];

1053
    if ((uint64_t)atom.size > (1<<30))
1054
        return AVERROR_INVALIDDATA;
M
Martin Storsjö 已提交
1055 1056 1057 1058 1059 1060

    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;
1061
    avio_skip(pb, 40);
1062
    avio_read(pb, st->codec->extradata, atom.size - 40);
M
Martin Storsjö 已提交
1063 1064 1065
    return 0;
}

1066
static int mov_read_stco(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1067
{
1068 1069
    AVStream *st;
    MOVStreamContext *sc;
1070
    unsigned int i, entries;
1071

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

1077 1078
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
1079

1080
    entries = avio_rb32(pb);
1081

A
Alex Converse 已提交
1082 1083
    if (!entries)
        return 0;
1084
    if (entries >= UINT_MAX/sizeof(int64_t))
1085
        return AVERROR_INVALIDDATA;
1086

B
Baptiste Coudurier 已提交
1087
    sc->chunk_offsets = av_malloc(entries * sizeof(int64_t));
1088
    if (!sc->chunk_offsets)
1089 1090 1091
        return AVERROR(ENOMEM);
    sc->chunk_count = entries;

1092
    if      (atom.type == MKTAG('s','t','c','o'))
1093
        for (i=0; i<entries; i++)
1094
            sc->chunk_offsets[i] = avio_rb32(pb);
1095
    else if (atom.type == MKTAG('c','o','6','4'))
1096
        for (i=0; i<entries; i++)
1097
            sc->chunk_offsets[i] = avio_rb64(pb);
1098
    else
1099
        return AVERROR_INVALIDDATA;
1100

1101 1102 1103
    return 0;
}

1104 1105 1106 1107
/**
 * Compute codec id for 'lpcm' tag.
 * See CoreAudioTypes and AudioStreamBasicDescription at Apple.
 */
1108
enum CodecID ff_mov_get_lpcm_codec_id(int bps, int flags)
1109 1110 1111 1112
{
    if (flags & 1) { // floating point
        if (flags & 2) { // big endian
            if      (bps == 32) return CODEC_ID_PCM_F32BE;
1113
            else if (bps == 64) return CODEC_ID_PCM_F64BE;
1114
        } else {
1115 1116
            if      (bps == 32) return CODEC_ID_PCM_F32LE;
            else if (bps == 64) return CODEC_ID_PCM_F64LE;
1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130
        }
    } 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 已提交
1131
            else if (bps == 16) return CODEC_ID_PCM_S16LE;
1132 1133 1134 1135
            else if (bps == 24) return CODEC_ID_PCM_S24LE;
            else if (bps == 32) return CODEC_ID_PCM_S32LE;
        }
    }
D
Diego Pettenò 已提交
1136
    return CODEC_ID_NONE;
1137 1138
}

1139
int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries)
1140
{
1141 1142
    AVStream *st;
    MOVStreamContext *sc;
1143
    int j, pseudo_stream_id;
1144

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

1150
    for (pseudo_stream_id=0; pseudo_stream_id<entries; pseudo_stream_id++) {
1151
        //Parsing Sample description table
1152
        enum CodecID id;
1153
        int dref_id = 1;
1154
        MOVAtom a = { AV_RL32("stsd") };
1155
        int64_t start_pos = avio_tell(pb);
1156 1157
        int size = avio_rb32(pb); /* size */
        uint32_t format = avio_rl32(pb); /* data format */
1158

1159
        if (size >= 16) {
1160 1161 1162
            avio_rb32(pb); /* reserved */
            avio_rb16(pb); /* reserved */
            dref_id = avio_rb16(pb);
1163
        }
1164

1165
        if (st->codec->codec_tag &&
1166
            st->codec->codec_tag != format &&
1167
            (c->fc->video_codec_id ? ff_codec_get_id(ff_codec_movvideo_tags, format) != c->fc->video_codec_id
1168
                                   : st->codec->codec_tag != MKTAG('j','p','e','g'))
1169
           ){
D
Diego Biurrun 已提交
1170 1171 1172
            /* 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. */
1173
        multiple_stsd:
B
Baptiste Coudurier 已提交
1174
            av_log(c->fc, AV_LOG_WARNING, "multiple fourcc not supported\n");
1175
            avio_skip(pb, size - (avio_tell(pb) - start_pos));
1176 1177
            continue;
        }
1178 1179 1180
        /* we cannot demux concatenated h264 streams because of different extradata */
        if (st->codec->codec_tag && st->codec->codec_tag == AV_RL32("avc1"))
            goto multiple_stsd;
1181
        sc->pseudo_stream_id = st->codec->codec_tag ? -1 : pseudo_stream_id;
1182
        sc->dref_id= dref_id;
1183

1184
        st->codec->codec_tag = format;
1185
        id = ff_codec_get_id(ff_codec_movaudio_tags, format);
1186
        if (id<=0 && ((format&0xFFFF) == 'm'+('s'<<8) || (format&0xFFFF) == 'T'+('S'<<8)))
M
Måns Rullgård 已提交
1187
            id = ff_codec_get_id(ff_codec_wav_tags, av_bswap32(format)&0xFFFF);
M
Michael Niedermayer 已提交
1188

1189 1190 1191
        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 */
1192
                   format && format != MKTAG('m','p','4','s')) { /* skip old asf mpeg4 tag */
1193
            id = ff_codec_get_id(ff_codec_movvideo_tags, format);
1194
            if (id <= 0)
1195
                id = ff_codec_get_id(ff_codec_bmp_tags, format);
1196
            if (id > 0)
1197
                st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
1198
            else if (st->codec->codec_type == AVMEDIA_TYPE_DATA){
1199
                id = ff_codec_get_id(ff_codec_movsubtitle_tags, format);
1200
                if (id > 0)
1201
                    st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
1202
            }
1203 1204
        }

L
Luca Barbato 已提交
1205
        av_dlog(c->fc, "size=%d 4CC= %c%c%c%c codec_type=%d\n", size,
1206 1207
                (format >> 0) & 0xff, (format >> 8) & 0xff, (format >> 16) & 0xff,
                (format >> 24) & 0xff, st->codec->codec_type);
1208

1209
        if (st->codec->codec_type==AVMEDIA_TYPE_VIDEO) {
1210
            unsigned int color_depth, len;
1211
            int color_greyscale;
1212
            int color_table_id;
1213

1214
            st->codec->codec_id = id;
1215 1216 1217 1218 1219
            avio_rb16(pb); /* version */
            avio_rb16(pb); /* revision level */
            avio_rb32(pb); /* vendor */
            avio_rb32(pb); /* temporal quality */
            avio_rb32(pb); /* spatial quality */
1220

1221 1222
            st->codec->width = avio_rb16(pb); /* width */
            st->codec->height = avio_rb16(pb); /* height */
1223

1224 1225 1226 1227
            avio_rb32(pb); /* horiz resolution */
            avio_rb32(pb); /* vert resolution */
            avio_rb32(pb); /* data size, always 0 */
            avio_rb16(pb); /* frames per samples */
1228

1229
            len = avio_r8(pb); /* codec name, pascal string */
1230 1231 1232 1233
            if (len > 31)
                len = 31;
            mov_read_mac_string(c, pb, len, st->codec->codec_name, 32);
            if (len < 31)
1234
                avio_skip(pb, 31 - len);
1235 1236 1237
            /* 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');
1238

1239
            st->codec->bits_per_coded_sample = avio_rb16(pb); /* depth */
1240
            color_table_id = avio_rb16(pb); /* colortable id */
L
Luca Barbato 已提交
1241
            av_dlog(c->fc, "depth %d, ctab id %d\n",
1242
                   st->codec->bits_per_coded_sample, color_table_id);
1243
            /* figure out the palette situation */
1244 1245
            color_depth = st->codec->bits_per_coded_sample & 0x1F;
            color_greyscale = st->codec->bits_per_coded_sample & 0x20;
1246 1247

            /* if the depth is 2, 4, or 8 bpp, file is palettized */
1248
            if ((color_depth == 2) || (color_depth == 4) ||
1249
                (color_depth == 8)) {
1250 1251 1252 1253
                /* for palette traversal */
                unsigned int color_start, color_count, color_end;
                unsigned char r, g, b;

1254
                if (color_greyscale) {
1255
                    int color_index, color_dec;
1256
                    /* compute the greyscale palette */
1257
                    st->codec->bits_per_coded_sample = color_depth;
1258 1259 1260 1261 1262
                    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;
1263
                        sc->palette[j] =
1264 1265 1266 1267 1268
                            (r << 16) | (g << 8) | (b);
                        color_index -= color_dec;
                        if (color_index < 0)
                            color_index = 0;
                    }
1269
                } else if (color_table_id) {
1270
                    const uint8_t *color_table;
1271 1272 1273
                    /* if flag bit 3 is set, use the default palette */
                    color_count = 1 << color_depth;
                    if (color_depth == 2)
M
Michael Niedermayer 已提交
1274
                        color_table = ff_qt_default_palette_4;
1275
                    else if (color_depth == 4)
M
Michael Niedermayer 已提交
1276
                        color_table = ff_qt_default_palette_16;
1277
                    else
M
Michael Niedermayer 已提交
1278
                        color_table = ff_qt_default_palette_256;
1279 1280

                    for (j = 0; j < color_count; j++) {
1281 1282 1283
                        r = color_table[j * 3 + 0];
                        g = color_table[j * 3 + 1];
                        b = color_table[j * 3 + 2];
1284
                        sc->palette[j] =
1285 1286 1287 1288
                            (r << 16) | (g << 8) | (b);
                    }
                } else {
                    /* load the palette from the file */
1289 1290 1291
                    color_start = avio_rb32(pb);
                    color_count = avio_rb16(pb);
                    color_end = avio_rb16(pb);
1292 1293
                    if ((color_start <= 255) &&
                        (color_end <= 255)) {
M
Mike Melanson 已提交
1294 1295 1296 1297
                        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 */
1298 1299 1300 1301 1302 1303 1304 1305
                            avio_r8(pb);
                            avio_r8(pb);
                            r = avio_r8(pb);
                            avio_r8(pb);
                            g = avio_r8(pb);
                            avio_r8(pb);
                            b = avio_r8(pb);
                            avio_r8(pb);
1306
                            sc->palette[j] =
M
Mike Melanson 已提交
1307
                                (r << 16) | (g << 8) | (b);
1308
                        }
1309 1310
                    }
                }
1311
                sc->has_palette = 1;
1312
            }
1313
        } else if (st->codec->codec_type==AVMEDIA_TYPE_AUDIO) {
1314
            int bits_per_sample, flags;
1315
            uint16_t version = avio_rb16(pb);
1316

1317
            st->codec->codec_id = id;
1318 1319
            avio_rb16(pb); /* revision level */
            avio_rb32(pb); /* vendor */
1320

1321
            st->codec->channels = avio_rb16(pb);             /* channel count */
L
Luca Barbato 已提交
1322
            av_dlog(c->fc, "audio channels %d\n", st->codec->channels);
1323
            st->codec->bits_per_coded_sample = avio_rb16(pb);      /* sample size */
1324

1325 1326
            sc->audio_cid = avio_rb16(pb);
            avio_rb16(pb); /* packet size = 0 */
1327

1328
            st->codec->sample_rate = ((avio_rb32(pb) >> 16));
1329

1330
            //Read QT version 1 fields. In version 0 these do not exist.
L
Luca Barbato 已提交
1331
            av_dlog(c->fc, "version =%d, isom =%d\n",version,c->isom);
1332 1333
            if (!c->isom) {
                if (version==1) {
1334 1335 1336 1337
                    sc->samples_per_frame = avio_rb32(pb);
                    avio_rb32(pb); /* bytes per packet */
                    sc->bytes_per_frame = avio_rb32(pb);
                    avio_rb32(pb); /* bytes per sample */
1338
                } else if (version==2) {
1339
                    avio_rb32(pb); /* sizeof struct only */
1340
                    st->codec->sample_rate = av_int2double(avio_rb64(pb)); /* float 64 */
1341 1342 1343 1344 1345 1346
                    st->codec->channels = avio_rb32(pb);
                    avio_rb32(pb); /* always 0x7F000000 */
                    st->codec->bits_per_coded_sample = avio_rb32(pb); /* bits per channel if sound is uncompressed */
                    flags = avio_rb32(pb); /* lpcm format specific flag */
                    sc->bytes_per_frame = avio_rb32(pb); /* bytes per audio packet if constant */
                    sc->samples_per_frame = avio_rb32(pb); /* lpcm frames per audio packet if constant */
1347
                    if (format == MKTAG('l','p','c','m'))
1348
                        st->codec->codec_id = ff_mov_get_lpcm_codec_id(st->codec->bits_per_coded_sample, flags);
1349 1350 1351
                }
            }

1352
            switch (st->codec->codec_id) {
1353 1354
            case CODEC_ID_PCM_S8:
            case CODEC_ID_PCM_U8:
1355
                if (st->codec->bits_per_coded_sample == 16)
1356 1357
                    st->codec->codec_id = CODEC_ID_PCM_S16BE;
                break;
1358
            case CODEC_ID_PCM_S16LE:
1359
            case CODEC_ID_PCM_S16BE:
1360
                if (st->codec->bits_per_coded_sample == 8)
1361
                    st->codec->codec_id = CODEC_ID_PCM_S8;
1362
                else if (st->codec->bits_per_coded_sample == 24)
1363 1364 1365
                    st->codec->codec_id =
                        st->codec->codec_id == CODEC_ID_PCM_S16BE ?
                        CODEC_ID_PCM_S24BE : CODEC_ID_PCM_S24LE;
1366
                break;
1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379
            /* 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;
1380 1381 1382 1383
            case CODEC_ID_GSM:
                sc->samples_per_frame = 160;
                sc->bytes_per_frame = 33;
                break;
1384 1385
            default:
                break;
1386
            }
1387

1388 1389
            bits_per_sample = av_get_bits_per_sample(st->codec->codec_id);
            if (bits_per_sample) {
1390
                st->codec->bits_per_coded_sample = bits_per_sample;
1391 1392
                sc->sample_size = (bits_per_sample >> 3) * st->codec->channels;
            }
1393
        } else if (st->codec->codec_type==AVMEDIA_TYPE_SUBTITLE){
1394 1395
            // ttxt stsd contains display flags, justification, background
            // color, fonts, and default styles, so fake an atom to read it
1396
            MOVAtom fake_atom = { .size = size - (avio_tell(pb) - start_pos) };
1397
            if (format != AV_RL32("mp4s")) // mp4s contains a regular esds atom
R
Reimar Döffinger 已提交
1398
                mov_read_glbl(c, pb, fake_atom);
1399
            st->codec->codec_id= id;
1400 1401
            st->codec->width = sc->width;
            st->codec->height = sc->height;
1402 1403
        } else {
            /* other codec type, just skip (rtp, mp4s, tmcd ...) */
1404
            avio_skip(pb, size - (avio_tell(pb) - start_pos));
1405
        }
1406
        /* this will read extra atoms at the end (wave, alac, damr, avcC, SMI ...) */
1407
        a.size = size - (avio_tell(pb) - start_pos);
1408
        if (a.size > 8) {
1409 1410 1411
            int ret;
            if ((ret = mov_read_default(c, pb, a)) < 0)
                return ret;
1412
        } else if (a.size > 0)
1413
            avio_skip(pb, a.size);
1414
    }
1415

1416
    if (st->codec->codec_type==AVMEDIA_TYPE_AUDIO && st->codec->sample_rate==0 && sc->time_scale>1)
1417
        st->codec->sample_rate= sc->time_scale;
1418

1419
    /* special codec parameters handling */
1420
    switch (st->codec->codec_id) {
1421
#if CONFIG_DV_DEMUXER
1422
    case CODEC_ID_DVAUDIO:
1423
        c->dv_fctx = avformat_alloc_context();
1424
        c->dv_demux = avpriv_dv_init_demux(c->dv_fctx);
1425 1426
        if (!c->dv_demux) {
            av_log(c->fc, AV_LOG_ERROR, "dv demux context init error\n");
1427
            return AVERROR(ENOMEM);
1428 1429 1430 1431
        }
        sc->dv_audio_container = 1;
        st->codec->codec_id = CODEC_ID_PCM_S16LE;
        break;
1432
#endif
1433
    /* no ifdef since parameters are always those */
1434
    case CODEC_ID_QCELP:
1435 1436 1437
        // 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;
1438
        st->codec->channels= 1; /* really needed */
1439
        break;
1440 1441
    case CODEC_ID_AMR_NB:
        st->codec->channels= 1; /* really needed */
1442
        /* force sample rate for amr, stsd in 3gp does not store sample rate */
C
Carl Eugen Hoyos 已提交
1443 1444 1445 1446 1447
        st->codec->sample_rate = 8000;
        break;
    case CODEC_ID_AMR_WB:
        st->codec->channels    = 1;
        st->codec->sample_rate = 16000;
1448
        break;
1449
    case CODEC_ID_MP2:
1450
    case CODEC_ID_MP3:
1451
        st->codec->codec_type = AVMEDIA_TYPE_AUDIO; /* force type after stsd for m1a hdlr */
A
Aurelien Jacobs 已提交
1452
        st->need_parsing = AVSTREAM_PARSE_FULL;
1453
        break;
1454
    case CODEC_ID_GSM:
1455 1456 1457 1458
    case CODEC_ID_ADPCM_MS:
    case CODEC_ID_ADPCM_IMA_WAV:
        st->codec->block_align = sc->bytes_per_frame;
        break;
1459
    case CODEC_ID_ALAC:
1460
        if (st->codec->extradata_size == 36) {
1461
            st->codec->channels   = AV_RB8 (st->codec->extradata+21);
1462
            st->codec->sample_rate = AV_RB32(st->codec->extradata+32);
1463
        }
1464
        break;
1465 1466 1467
    default:
        break;
    }
1468

1469 1470 1471
    return 0;
}

1472
static int mov_read_stsd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1473 1474 1475
{
    int entries;

1476 1477 1478
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
    entries = avio_rb32(pb);
1479 1480 1481 1482

    return ff_mov_read_stsd_entries(c, pb, entries);
}

1483
static int mov_read_stsc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1484
{
1485 1486
    AVStream *st;
    MOVStreamContext *sc;
1487
    unsigned int i, entries;
1488

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

1494 1495
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
1496

1497
    entries = avio_rb32(pb);
1498

L
Luca Barbato 已提交
1499
    av_dlog(c->fc, "track[%i].stsc.entries = %i\n", c->fc->nb_streams-1, entries);
1500

A
Alex Converse 已提交
1501 1502
    if (!entries)
        return 0;
1503
    if (entries >= UINT_MAX / sizeof(*sc->stsc_data))
1504
        return AVERROR_INVALIDDATA;
1505 1506
    sc->stsc_data = av_malloc(entries * sizeof(*sc->stsc_data));
    if (!sc->stsc_data)
1507 1508 1509
        return AVERROR(ENOMEM);
    sc->stsc_count = entries;

1510
    for (i=0; i<entries; i++) {
1511 1512 1513
        sc->stsc_data[i].first = avio_rb32(pb);
        sc->stsc_data[i].count = avio_rb32(pb);
        sc->stsc_data[i].id = avio_rb32(pb);
1514 1515 1516 1517
    }
    return 0;
}

1518
static int mov_read_stps(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1519 1520 1521 1522 1523 1524 1525 1526 1527 1528
{
    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;

1529
    avio_rb32(pb); // version + flags
1530

1531
    entries = avio_rb32(pb);
1532
    if (entries >= UINT_MAX / sizeof(*sc->stps_data))
1533
        return AVERROR_INVALIDDATA;
1534 1535 1536 1537 1538 1539
    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++) {
1540
        sc->stps_data[i] = avio_rb32(pb);
L
Luca Barbato 已提交
1541
        //av_dlog(c->fc, "stps %d\n", sc->stps_data[i]);
1542 1543 1544 1545 1546
    }

    return 0;
}

1547
static int mov_read_stss(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1548
{
1549 1550
    AVStream *st;
    MOVStreamContext *sc;
1551
    unsigned int i, entries;
1552

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

1558 1559
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
1560

1561
    entries = avio_rb32(pb);
1562

L
Luca Barbato 已提交
1563
    av_dlog(c->fc, "keyframe_count = %d\n", entries);
1564

1565
    if (!entries)
1566 1567
    {
        sc->keyframe_absent = 1;
1568
        return 0;
1569
    }
1570
    if (entries >= UINT_MAX / sizeof(int))
1571
        return AVERROR_INVALIDDATA;
B
Baptiste Coudurier 已提交
1572
    sc->keyframes = av_malloc(entries * sizeof(int));
1573
    if (!sc->keyframes)
1574 1575 1576
        return AVERROR(ENOMEM);
    sc->keyframe_count = entries;

1577
    for (i=0; i<entries; i++) {
1578
        sc->keyframes[i] = avio_rb32(pb);
L
Luca Barbato 已提交
1579
        //av_dlog(c->fc, "keyframes[]=%d\n", sc->keyframes[i]);
1580 1581 1582 1583
    }
    return 0;
}

1584
static int mov_read_stsz(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1585
{
1586 1587
    AVStream *st;
    MOVStreamContext *sc;
1588 1589 1590
    unsigned int i, entries, sample_size, field_size, num_bytes;
    GetBitContext gb;
    unsigned char* buf;
1591

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

1597 1598
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
1599

1600
    if (atom.type == MKTAG('s','t','s','z')) {
1601
        sample_size = avio_rb32(pb);
1602 1603 1604
        if (!sc->sample_size) /* do not overwrite value computed in stsd */
            sc->sample_size = sample_size;
        field_size = 32;
1605 1606
    } else {
        sample_size = 0;
1607 1608
        avio_rb24(pb); /* reserved */
        field_size = avio_r8(pb);
1609
    }
1610
    entries = avio_rb32(pb);
1611

L
Luca Barbato 已提交
1612
    av_dlog(c->fc, "sample_size = %d sample_count = %d\n", sc->sample_size, entries);
1613

1614
    sc->sample_count = entries;
1615 1616 1617
    if (sample_size)
        return 0;

1618 1619
    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);
1620
        return AVERROR_INVALIDDATA;
1621 1622
    }

A
Alex Converse 已提交
1623 1624
    if (!entries)
        return 0;
1625
    if (entries >= UINT_MAX / sizeof(int) || entries >= (UINT_MAX - 4) / field_size)
1626
        return AVERROR_INVALIDDATA;
B
Baptiste Coudurier 已提交
1627
    sc->sample_sizes = av_malloc(entries * sizeof(int));
1628
    if (!sc->sample_sizes)
1629 1630
        return AVERROR(ENOMEM);

1631 1632
    num_bytes = (entries*field_size+4)>>3;

1633
    buf = av_malloc(num_bytes+FF_INPUT_BUFFER_PADDING_SIZE);
1634 1635 1636 1637 1638
    if (!buf) {
        av_freep(&sc->sample_sizes);
        return AVERROR(ENOMEM);
    }

1639
    if (avio_read(pb, buf, num_bytes) < num_bytes) {
1640 1641
        av_freep(&sc->sample_sizes);
        av_free(buf);
1642
        return AVERROR_INVALIDDATA;
1643 1644 1645 1646
    }

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

1647
    for (i = 0; i < entries; i++) {
1648
        sc->sample_sizes[i] = get_bits_long(&gb, field_size);
1649 1650
        sc->data_size += sc->sample_sizes[i];
    }
1651 1652

    av_free(buf);
1653 1654 1655
    return 0;
}

1656
static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1657
{
1658 1659
    AVStream *st;
    MOVStreamContext *sc;
1660
    unsigned int i, entries;
1661 1662
    int64_t duration=0;
    int64_t total_sample_count=0;
1663

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

1669 1670 1671
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
    entries = avio_rb32(pb);
1672

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

A
Alex Converse 已提交
1676 1677 1678
    if (!entries)
        return 0;
    if (entries >= UINT_MAX / sizeof(*sc->stts_data))
L
Luca Barbato 已提交
1679
        return AVERROR(EINVAL);
1680

1681
    sc->stts_data = av_malloc(entries * sizeof(*sc->stts_data));
1682
    if (!sc->stts_data)
1683
        return AVERROR(ENOMEM);
1684

1685
    sc->stts_count = entries;
1686

1687
    for (i=0; i<entries; i++) {
M
cleanup  
Michael Niedermayer 已提交
1688 1689
        int sample_duration;
        int sample_count;
1690

1691 1692
        sample_count=avio_rb32(pb);
        sample_duration = avio_rb32(pb);
1693 1694 1695
        sc->stts_data[i].count= sample_count;
        sc->stts_data[i].duration= sample_duration;

1696 1697
        av_dlog(c->fc, "sample_count=%d, sample_duration=%d\n",
                sample_count, sample_duration);
1698

B
Baptiste Coudurier 已提交
1699
        duration+=(int64_t)sample_duration*sample_count;
1700 1701 1702
        total_sample_count+=sample_count;
    }

1703
    st->nb_frames= total_sample_count;
1704
    if (duration)
1705
        st->duration= duration;
1706
    sc->track_end = duration;
1707 1708 1709
    return 0;
}

1710
static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
M
Michael Niedermayer 已提交
1711
{
1712 1713
    AVStream *st;
    MOVStreamContext *sc;
M
Michael Niedermayer 已提交
1714 1715
    unsigned int i, entries;

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

1721 1722 1723
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
    entries = avio_rb32(pb);
1724

L
Luca Barbato 已提交
1725
    av_dlog(c->fc, "track[%i].ctts.entries = %i\n", c->fc->nb_streams-1, entries);
1726

A
Alex Converse 已提交
1727 1728
    if (!entries)
        return 0;
1729
    if (entries >= UINT_MAX / sizeof(*sc->ctts_data))
1730
        return AVERROR_INVALIDDATA;
1731
    sc->ctts_data = av_malloc(entries * sizeof(*sc->ctts_data));
1732
    if (!sc->ctts_data)
1733 1734
        return AVERROR(ENOMEM);
    sc->ctts_count = entries;
1735

1736
    for (i=0; i<entries; i++) {
1737 1738
        int count    =avio_rb32(pb);
        int duration =avio_rb32(pb);
1739 1740 1741

        sc->ctts_data[i].count   = count;
        sc->ctts_data[i].duration= duration;
1742 1743
        if (duration < 0)
            sc->dts_shift = FFMAX(sc->dts_shift, -duration);
M
Michael Niedermayer 已提交
1744
    }
1745

L
Luca Barbato 已提交
1746
    av_dlog(c->fc, "dts shift %d\n", sc->dts_shift);
1747

M
Michael Niedermayer 已提交
1748 1749 1750
    return 0;
}

1751 1752 1753
static void mov_build_index(MOVContext *mov, AVStream *st)
{
    MOVStreamContext *sc = st->priv_data;
1754
    int64_t current_offset;
1755 1756 1757 1758
    int64_t current_dts = 0;
    unsigned int stts_index = 0;
    unsigned int stsc_index = 0;
    unsigned int stss_index = 0;
1759
    unsigned int stps_index = 0;
1760
    unsigned int i, j;
1761
    uint64_t stream_size = 0;
1762
    AVIndexEntry *mem;
1763

1764
    /* adjust first dts according to edit list */
1765
    if (sc->time_offset && mov->time_scale > 0) {
1766 1767 1768
        if (sc->time_offset < 0)
            sc->time_offset = av_rescale(sc->time_offset, sc->time_scale, mov->time_scale);
        current_dts = -sc->time_offset;
1769
        if (sc->ctts_data && sc->stts_data && sc->stts_data[0].duration &&
1770
            sc->ctts_data[0].duration / sc->stts_data[0].duration > 16) {
1771 1772 1773 1774 1775
            /* 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;
        }
1776 1777
    }

1778
    /* only use old uncompressed audio chunk demuxing when stts specifies it */
1779
    if (!(st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1780
          sc->stts_count == 1 && sc->stts_data[0].duration == 1)) {
1781 1782
        unsigned int current_sample = 0;
        unsigned int stts_sample = 0;
1783
        unsigned int sample_size;
1784
        unsigned int distance = 0;
1785
        int key_off = (sc->keyframes && sc->keyframes[0] > 0) || (sc->stps_data && sc->stps_data[0] > 0);
1786

1787 1788
        current_dts -= sc->dts_shift;

A
Alex Converse 已提交
1789 1790
        if (!sc->sample_count)
            return;
1791
        if (sc->sample_count >= UINT_MAX / sizeof(*st->index_entries) - st->nb_index_entries)
1792
            return;
1793 1794
        mem = av_realloc(st->index_entries, (st->nb_index_entries + sc->sample_count) * sizeof(*st->index_entries));
        if (!mem)
1795
            return;
1796 1797
        st->index_entries = mem;
        st->index_entries_allocated_size = (st->nb_index_entries + sc->sample_count) * sizeof(*st->index_entries);
1798

1799 1800
        for (i = 0; i < sc->chunk_count; i++) {
            current_offset = sc->chunk_offsets[i];
1801
            while (stsc_index + 1 < sc->stsc_count &&
1802
                i + 1 == sc->stsc_data[stsc_index + 1].first)
1803
                stsc_index++;
1804
            for (j = 0; j < sc->stsc_data[stsc_index].count; j++) {
1805
                int keyframe = 0;
1806 1807
                if (current_sample >= sc->sample_count) {
                    av_log(mov->fc, AV_LOG_ERROR, "wrong sample count\n");
1808
                    return;
1809
                }
1810

1811
                if (!sc->keyframe_absent && (!sc->keyframe_count || current_sample+key_off == sc->keyframes[stss_index])) {
1812
                    keyframe = 1;
1813 1814
                    if (stss_index + 1 < sc->keyframe_count)
                        stss_index++;
1815 1816 1817 1818
                } 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++;
1819
                }
1820 1821
                if (keyframe)
                    distance = 0;
1822
                sample_size = sc->sample_size > 0 ? sc->sample_size : sc->sample_sizes[current_sample];
1823
                if (sc->pseudo_stream_id == -1 ||
1824
                   sc->stsc_data[stsc_index].id - 1 == sc->pseudo_stream_id) {
1825 1826 1827 1828 1829 1830
                    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;
L
Luca Barbato 已提交
1831
                    av_dlog(mov->fc, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "
1832 1833 1834
                            "size %d, distance %d, keyframe %d\n", st->index, current_sample,
                            current_offset, current_dts, sample_size, distance, keyframe);
                }
1835

1836
                current_offset += sample_size;
1837
                stream_size += sample_size;
1838
                current_dts += sc->stts_data[stts_index].duration;
1839 1840 1841 1842 1843 1844 1845 1846 1847
                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++;
                }
            }
        }
1848 1849
        if (st->duration > 0)
            st->codec->bit_rate = stream_size*8*sc->time_scale/st->duration;
1850
    } else {
1851
        unsigned chunk_samples, total = 0;
1852

1853 1854 1855
        // compute total chunk count
        for (i = 0; i < sc->stsc_count; i++) {
            unsigned count, chunk_count;
1856

1857
            chunk_samples = sc->stsc_data[i].count;
1858 1859
            if (i != sc->stsc_count - 1 &&
                sc->samples_per_frame && chunk_samples % sc->samples_per_frame) {
1860 1861 1862 1863
                av_log(mov->fc, AV_LOG_ERROR, "error unaligned chunk\n");
                return;
            }

1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879
            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;
        }

L
Luca Barbato 已提交
1880
        av_dlog(mov->fc, "chunk count %d\n", total);
1881
        if (total >= UINT_MAX / sizeof(*st->index_entries) - st->nb_index_entries)
1882
            return;
1883 1884
        mem = av_realloc(st->index_entries, (st->nb_index_entries + total) * sizeof(*st->index_entries));
        if (!mem)
1885
            return;
1886 1887
        st->index_entries = mem;
        st->index_entries_allocated_size = (st->nb_index_entries + total) * sizeof(*st->index_entries);
1888 1889 1890 1891 1892 1893 1894 1895 1896

        // 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;

1897
            while (chunk_samples > 0) {
1898
                AVIndexEntry *e;
1899 1900 1901 1902 1903 1904 1905 1906 1907 1908
                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;
1909
                    } else {
1910 1911
                        samples = FFMIN(1024, chunk_samples);
                        size = samples * sc->sample_size;
1912 1913
                    }
                }
1914

1915 1916 1917 1918 1919 1920 1921 1922 1923 1924
                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;
L
Luca Barbato 已提交
1925
                av_dlog(mov->fc, "AVIndex stream %d, chunk %d, offset %"PRIx64", dts %"PRId64", "
1926
                        "size %d, duration %d\n", st->index, i, current_offset, current_dts,
1927 1928 1929
                        size, samples);

                current_offset += size;
1930
                current_dts += samples;
1931
                chunk_samples -= samples;
1932 1933 1934 1935
            }
        }
    }
}
1936

1937 1938
static int mov_open_dref(AVIOContext **pb, char *src, MOVDref *ref,
                         AVIOInterruptCB *int_cb)
1939
{
1940 1941
    /* try relative path, we do not try the absolute because it can leak information about our
       system to an attacker */
1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963
    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 */
1964
        if (i == ref->nlvl_to - 1 && src_path - src  < sizeof(filename)) {
1965 1966 1967 1968 1969 1970 1971 1972
            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);

1973
            if (!avio_open2(pb, filename, AVIO_FLAG_READ, int_cb, NULL))
1974 1975 1976 1977 1978
                return 0;
        }
    }

    return AVERROR(ENOENT);
M
Mans Rullgard 已提交
1979
}
1980

1981
static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1982 1983 1984
{
    AVStream *st;
    MOVStreamContext *sc;
1985
    int ret;
1986

1987
    st = avformat_new_stream(c->fc, NULL);
B
Baptiste Coudurier 已提交
1988
    if (!st) return AVERROR(ENOMEM);
1989
    st->id = c->fc->nb_streams;
B
Baptiste Coudurier 已提交
1990
    sc = av_mallocz(sizeof(MOVStreamContext));
1991
    if (!sc) return AVERROR(ENOMEM);
1992 1993

    st->priv_data = sc;
1994
    st->codec->codec_type = AVMEDIA_TYPE_DATA;
1995
    sc->ffindex = st->index;
1996

1997 1998 1999 2000
    if ((ret = mov_read_default(c, pb, atom)) < 0)
        return ret;

    /* sanity checks */
2001 2002
    if (sc->chunk_count && (!sc->stts_count || !sc->stsc_count ||
                            (!sc->sample_size && !sc->sample_count))) {
2003 2004
        av_log(c->fc, AV_LOG_ERROR, "stream %d, missing mandatory atoms, broken header\n",
               st->index);
2005 2006
        return 0;
    }
2007

2008
    if (sc->time_scale <= 0) {
2009
        av_log(c->fc, AV_LOG_WARNING, "stream %d, timescale not set\n", st->index);
2010
        sc->time_scale = c->time_scale;
2011
        if (sc->time_scale <= 0)
2012 2013
            sc->time_scale = 1;
    }
2014

2015
    avpriv_set_pts_info(st, 64, 1, sc->time_scale);
2016 2017 2018 2019

    mov_build_index(c, st);

    if (sc->dref_id-1 < sc->drefs_count && sc->drefs[sc->dref_id-1].path) {
2020
        MOVDref *dref = &sc->drefs[sc->dref_id - 1];
2021
        if (mov_open_dref(&sc->pb, c->fc->filename, dref, &c->fc->interrupt_callback) < 0)
2022 2023 2024 2025 2026
            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);
2027 2028 2029
    } else
        sc->pb = c->fc->pb;

2030
    if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2031 2032 2033 2034
        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);
2035 2036 2037 2038
        }

        av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
                  sc->time_scale*st->nb_frames, st->duration, INT_MAX);
2039 2040 2041 2042

        if (sc->stts_count == 1 || (sc->stts_count == 2 && sc->stts_data[1].count == 1))
            av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den,
                      sc->time_scale, sc->stts_data[0].duration, INT_MAX);
2043 2044
    }

2045
    switch (st->codec->codec_id) {
2046
#if CONFIG_H261_DECODER
2047 2048
    case CODEC_ID_H261:
#endif
2049
#if CONFIG_H263_DECODER
2050 2051
    case CODEC_ID_H263:
#endif
2052 2053 2054
#if CONFIG_H264_DECODER
    case CODEC_ID_H264:
#endif
2055
#if CONFIG_MPEG4_DECODER
2056 2057
    case CODEC_ID_MPEG4:
#endif
2058
        st->codec->width = 0; /* let decoder init width/height */
2059 2060 2061
        st->codec->height= 0;
        break;
    }
B
Baptiste Coudurier 已提交
2062 2063 2064

    /* Do not need those anymore. */
    av_freep(&sc->chunk_offsets);
2065
    av_freep(&sc->stsc_data);
B
Baptiste Coudurier 已提交
2066 2067 2068
    av_freep(&sc->sample_sizes);
    av_freep(&sc->keyframes);
    av_freep(&sc->stts_data);
2069
    av_freep(&sc->stps_data);
B
Baptiste Coudurier 已提交
2070

2071
    return 0;
2072 2073
}

2074
static int mov_read_ilst(MOVContext *c, AVIOContext *pb, MOVAtom atom)
2075 2076 2077 2078 2079 2080 2081 2082
{
    int ret;
    c->itunes_metadata = 1;
    ret = mov_read_default(c, pb, atom);
    c->itunes_metadata = 0;
    return ret;
}

2083
static int mov_read_meta(MOVContext *c, AVIOContext *pb, MOVAtom atom)
2084
{
2085
    while (atom.size > 8) {
2086
        uint32_t tag = avio_rl32(pb);
2087 2088
        atom.size -= 4;
        if (tag == MKTAG('h','d','l','r')) {
A
Anton Khirnov 已提交
2089
            avio_seek(pb, -8, SEEK_CUR);
2090 2091 2092 2093 2094
            atom.size += 8;
            return mov_read_default(c, pb, atom);
        }
    }
    return 0;
2095 2096
}

2097
static int mov_read_tkhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
2098
{
2099 2100 2101 2102 2103
    int i;
    int width;
    int height;
    int64_t disp_transform[2];
    int display_matrix[3][2];
2104 2105 2106 2107 2108 2109 2110 2111
    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;
2112

2113 2114
    version = avio_r8(pb);
    avio_rb24(pb); /* flags */
2115 2116 2117 2118 2119 2120 2121
    /*
    MOV_TRACK_ENABLED 0x0001
    MOV_TRACK_IN_MOVIE 0x0002
    MOV_TRACK_IN_PREVIEW 0x0004
    MOV_TRACK_IN_POSTER 0x0008
    */

B
Baptiste Coudurier 已提交
2122
    if (version == 1) {
2123 2124
        avio_rb64(pb);
        avio_rb64(pb);
B
Baptiste Coudurier 已提交
2125
    } else {
2126 2127
        avio_rb32(pb); /* creation time */
        avio_rb32(pb); /* modification time */
B
Baptiste Coudurier 已提交
2128
    }
2129 2130
    st->id = (int)avio_rb32(pb); /* track id (NOT 0 !)*/
    avio_rb32(pb); /* reserved */
2131

2132
    /* highlevel (considering edits) duration in movie timebase */
2133 2134 2135
    (version == 1) ? avio_rb64(pb) : avio_rb32(pb);
    avio_rb32(pb); /* reserved */
    avio_rb32(pb); /* reserved */
2136

2137 2138 2139 2140
    avio_rb16(pb); /* layer */
    avio_rb16(pb); /* alternate group */
    avio_rb16(pb); /* volume */
    avio_rb16(pb); /* reserved */
2141

2142 2143 2144 2145
    //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++) {
2146 2147 2148
        display_matrix[i][0] = avio_rb32(pb);   // 16.16 fixed point
        display_matrix[i][1] = avio_rb32(pb);   // 16.16 fixed point
        avio_rb32(pb);           // 2.30 fixed point (not used)
2149
    }
2150

2151 2152
    width = avio_rb32(pb);       // 16.16 fixed point track width
    height = avio_rb32(pb);      // 16.16 fixed point track height
2153 2154
    sc->width = width >> 16;
    sc->height = height >> 16;
2155

2156
    // transform the display width/height according to the matrix
2157
    // skip this if the display matrix is the default identity matrix
2158
    // or if it is rotating the picture, ex iPhone 3GS
2159 2160
    // to keep the same scale, use [width height 1<<16]
    if (width && height &&
2161 2162 2163 2164 2165
        ((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])) {
2166 2167 2168 2169 2170 2171 2172
        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
2173
        st->sample_aspect_ratio = av_d2q(
2174 2175 2176
            ((double) disp_transform[0] * height) /
            ((double) disp_transform[1] * width), INT_MAX);
    }
2177 2178 2179
    return 0;
}

2180
static int mov_read_tfhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
B
Baptiste Coudurier 已提交
2181 2182 2183 2184 2185
{
    MOVFragment *frag = &c->fragment;
    MOVTrackExt *trex = NULL;
    int flags, track_id, i;

2186 2187
    avio_r8(pb); /* version */
    flags = avio_rb24(pb);
B
Baptiste Coudurier 已提交
2188

2189
    track_id = avio_rb32(pb);
2190
    if (!track_id)
2191
        return AVERROR_INVALIDDATA;
B
Baptiste Coudurier 已提交
2192 2193 2194 2195 2196 2197 2198 2199
    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");
2200
        return AVERROR_INVALIDDATA;
B
Baptiste Coudurier 已提交
2201 2202
    }

2203 2204 2205 2206 2207 2208 2209 2210 2211 2212
    frag->base_data_offset = flags & MOV_TFHD_BASE_DATA_OFFSET ?
                             avio_rb64(pb) : frag->moof_offset;
    frag->stsd_id  = flags & MOV_TFHD_STSD_ID ? avio_rb32(pb) : trex->stsd_id;

    frag->duration = flags & MOV_TFHD_DEFAULT_DURATION ?
                     avio_rb32(pb) : trex->duration;
    frag->size     = flags & MOV_TFHD_DEFAULT_SIZE ?
                     avio_rb32(pb) : trex->size;
    frag->flags    = flags & MOV_TFHD_DEFAULT_FLAGS ?
                     avio_rb32(pb) : trex->flags;
L
Luca Barbato 已提交
2213
    av_dlog(c->fc, "frag flags 0x%x\n", frag->flags);
B
Baptiste Coudurier 已提交
2214 2215 2216
    return 0;
}

2217
static int mov_read_chap(MOVContext *c, AVIOContext *pb, MOVAtom atom)
D
David Conrad 已提交
2218
{
2219
    c->chapter_track = avio_rb32(pb);
D
David Conrad 已提交
2220 2221 2222
    return 0;
}

2223
static int mov_read_trex(MOVContext *c, AVIOContext *pb, MOVAtom atom)
B
Baptiste Coudurier 已提交
2224 2225 2226 2227
{
    MOVTrackExt *trex;

    if ((uint64_t)c->trex_count+1 >= UINT_MAX / sizeof(*c->trex_data))
2228
        return AVERROR_INVALIDDATA;
2229 2230
    trex = av_realloc(c->trex_data, (c->trex_count+1)*sizeof(*c->trex_data));
    if (!trex)
B
Baptiste Coudurier 已提交
2231
        return AVERROR(ENOMEM);
2232
    c->trex_data = trex;
B
Baptiste Coudurier 已提交
2233
    trex = &c->trex_data[c->trex_count++];
2234 2235 2236 2237 2238 2239 2240
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
    trex->track_id = avio_rb32(pb);
    trex->stsd_id  = avio_rb32(pb);
    trex->duration = avio_rb32(pb);
    trex->size     = avio_rb32(pb);
    trex->flags    = avio_rb32(pb);
B
Baptiste Coudurier 已提交
2241 2242 2243
    return 0;
}

2244
static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
B
Baptiste Coudurier 已提交
2245 2246
{
    MOVFragment *frag = &c->fragment;
2247
    AVStream *st = NULL;
2248
    MOVStreamContext *sc;
2249
    MOVStts *ctts_data;
B
Baptiste Coudurier 已提交
2250 2251 2252 2253
    uint64_t offset;
    int64_t dts;
    int data_offset = 0;
    unsigned entries, first_sample_flags = frag->flags;
2254
    int flags, distance, i, found_keyframe = 0;
B
Baptiste Coudurier 已提交
2255

2256 2257 2258 2259 2260 2261 2262 2263
    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);
2264
        return AVERROR_INVALIDDATA;
2265
    }
2266
    sc = st->priv_data;
B
Baptiste Coudurier 已提交
2267 2268
    if (sc->pseudo_stream_id+1 != frag->stsd_id)
        return 0;
2269 2270 2271
    avio_r8(pb); /* version */
    flags = avio_rb24(pb);
    entries = avio_rb32(pb);
L
Luca Barbato 已提交
2272
    av_dlog(c->fc, "flags 0x%x entries %d\n", flags, entries);
2273 2274 2275 2276 2277 2278 2279 2280 2281 2282

    /* Always assume the presence of composition time offsets.
     * Without this assumption, for instance, we cannot deal with a track in fragmented movies that meet the following.
     *  1) in the initial movie, there are no samples.
     *  2) in the first movie fragment, there is only one sample without composition time offset.
     *  3) in the subsequent movie fragments, there are samples with composition time offset. */
    if (!sc->ctts_count && sc->sample_count)
    {
        /* Complement ctts table if moov atom doesn't have ctts atom. */
        ctts_data = av_malloc(sizeof(*sc->ctts_data));
2283
        if (!ctts_data)
B
Baptiste Coudurier 已提交
2284
            return AVERROR(ENOMEM);
2285
        sc->ctts_data = ctts_data;
2286 2287 2288
        sc->ctts_data[sc->ctts_count].count = sc->sample_count;
        sc->ctts_data[sc->ctts_count].duration = 0;
        sc->ctts_count++;
B
Baptiste Coudurier 已提交
2289
    }
2290
    if ((uint64_t)entries+sc->ctts_count >= UINT_MAX/sizeof(*sc->ctts_data))
2291
        return AVERROR_INVALIDDATA;
2292 2293 2294 2295 2296 2297
    ctts_data = av_realloc(sc->ctts_data,
                           (entries+sc->ctts_count)*sizeof(*sc->ctts_data));
    if (!ctts_data)
        return AVERROR(ENOMEM);
    sc->ctts_data = ctts_data;

2298 2299
    if (flags & MOV_TRUN_DATA_OFFSET)        data_offset        = avio_rb32(pb);
    if (flags & MOV_TRUN_FIRST_SAMPLE_FLAGS) first_sample_flags = avio_rb32(pb);
2300
    dts    = sc->track_end - sc->time_offset;
B
Baptiste Coudurier 已提交
2301 2302
    offset = frag->base_data_offset + data_offset;
    distance = 0;
L
Luca Barbato 已提交
2303
    av_dlog(c->fc, "first sample flags 0x%x\n", first_sample_flags);
B
Baptiste Coudurier 已提交
2304 2305 2306 2307
    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;
2308
        int keyframe = 0;
B
Baptiste Coudurier 已提交
2309

2310 2311 2312
        if (flags & MOV_TRUN_SAMPLE_DURATION) sample_duration = avio_rb32(pb);
        if (flags & MOV_TRUN_SAMPLE_SIZE)     sample_size     = avio_rb32(pb);
        if (flags & MOV_TRUN_SAMPLE_FLAGS)    sample_flags    = avio_rb32(pb);
2313
        sc->ctts_data[sc->ctts_count].count = 1;
2314 2315
        sc->ctts_data[sc->ctts_count].duration = (flags & MOV_TRUN_SAMPLE_CTS) ?
                                                  avio_rb32(pb) : 0;
2316
        sc->ctts_count++;
2317 2318 2319 2320 2321 2322 2323
        if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
            keyframe = 1;
        else if (!found_keyframe)
            keyframe = found_keyframe =
                !(sample_flags & (MOV_FRAG_SAMPLE_FLAG_IS_NON_SYNC |
                                  MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES));
        if (keyframe)
B
Baptiste Coudurier 已提交
2324 2325 2326
            distance = 0;
        av_add_index_entry(st, offset, dts, sample_size, distance,
                           keyframe ? AVINDEX_KEYFRAME : 0);
L
Luca Barbato 已提交
2327
        av_dlog(c->fc, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "
B
Baptiste Coudurier 已提交
2328 2329 2330
                "size %d, distance %d, keyframe %d\n", st->index, sc->sample_count+i,
                offset, dts, sample_size, distance, keyframe);
        distance++;
2331
        dts += sample_duration;
B
Baptiste Coudurier 已提交
2332
        offset += sample_size;
2333
        sc->data_size += sample_size;
B
Baptiste Coudurier 已提交
2334 2335
    }
    frag->moof_offset = offset;
2336
    st->duration = sc->track_end = dts + sc->time_offset;
B
Baptiste Coudurier 已提交
2337 2338 2339
    return 0;
}

2340 2341 2342
/* 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/ */
2343
static int mov_read_wide(MOVContext *c, AVIOContext *pb, MOVAtom atom)
2344 2345 2346 2347 2348
{
    int err;

    if (atom.size < 8)
        return 0; /* continue */
2349
    if (avio_rb32(pb) != 0) { /* 0 sized mdat atom... use the 'wide' atom size */
2350
        avio_skip(pb, atom.size - 4);
2351 2352
        return 0;
    }
2353
    atom.type = avio_rl32(pb);
2354
    atom.size -= 8;
2355
    if (atom.type != MKTAG('m','d','a','t')) {
2356
        avio_skip(pb, atom.size);
2357 2358 2359 2360 2361 2362
        return 0;
    }
    err = mov_read_mdat(c, pb, atom);
    return err;
}

2363
static int mov_read_cmov(MOVContext *c, AVIOContext *pb, MOVAtom atom)
2364
{
2365
#if CONFIG_ZLIB
2366
    AVIOContext ctx;
2367 2368
    uint8_t *cmov_data;
    uint8_t *moov_data; /* uncompressed data */
2369
    long cmov_len, moov_len;
2370
    int ret = -1;
2371

2372 2373
    avio_rb32(pb); /* dcom atom */
    if (avio_rl32(pb) != MKTAG('d','c','o','m'))
2374
        return AVERROR_INVALIDDATA;
2375
    if (avio_rl32(pb) != MKTAG('z','l','i','b')) {
B
Benoit Fouet 已提交
2376
        av_log(c->fc, AV_LOG_ERROR, "unknown compression for cmov atom !");
2377
        return AVERROR_INVALIDDATA;
2378
    }
2379 2380
    avio_rb32(pb); /* cmvd atom */
    if (avio_rl32(pb) != MKTAG('c','m','v','d'))
2381
        return AVERROR_INVALIDDATA;
2382
    moov_len = avio_rb32(pb); /* uncompressed size */
2383
    cmov_len = atom.size - 6 * 4;
2384

B
Baptiste Coudurier 已提交
2385
    cmov_data = av_malloc(cmov_len);
2386
    if (!cmov_data)
2387
        return AVERROR(ENOMEM);
B
Baptiste Coudurier 已提交
2388
    moov_data = av_malloc(moov_len);
2389 2390
    if (!moov_data) {
        av_free(cmov_data);
2391
        return AVERROR(ENOMEM);
2392
    }
2393
    avio_read(pb, cmov_data, cmov_len);
2394
    if (uncompress (moov_data, (uLongf *) &moov_len, (const Bytef *)cmov_data, cmov_len) != Z_OK)
2395
        goto free_and_return;
2396
    if (ffio_init_context(&ctx, moov_data, moov_len, 0, NULL, NULL, NULL, NULL) != 0)
2397
        goto free_and_return;
2398
    atom.type = MKTAG('m','o','o','v');
2399 2400
    atom.size = moov_len;
    ret = mov_read_default(c, &ctx, atom);
2401
free_and_return:
2402 2403 2404
    av_free(moov_data);
    av_free(cmov_data);
    return ret;
2405 2406
#else
    av_log(c->fc, AV_LOG_ERROR, "this file requires zlib support compiled in\n");
2407
    return AVERROR(ENOSYS);
2408
#endif
2409
}
2410

G
Gael Chardon 已提交
2411
/* edit list atom */
2412
static int mov_read_elst(MOVContext *c, AVIOContext *pb, MOVAtom atom)
G
Gael Chardon 已提交
2413
{
2414
    MOVStreamContext *sc;
2415
    int i, edit_count, version;
B
Baptiste Coudurier 已提交
2416

2417 2418 2419 2420
    if (c->fc->nb_streams < 1)
        return 0;
    sc = c->fc->streams[c->fc->nb_streams-1]->priv_data;

2421
    version = avio_r8(pb); /* version */
2422 2423
    avio_rb24(pb); /* flags */
    edit_count = avio_rb32(pb); /* entries */
B
Baptiste Coudurier 已提交
2424

2425
    if ((uint64_t)edit_count*12+8 > atom.size)
2426
        return AVERROR_INVALIDDATA;
2427

2428
    for (i=0; i<edit_count; i++){
2429 2430 2431 2432 2433 2434 2435
        int64_t time;
        int64_t duration;
        if (version == 1) {
            duration = avio_rb64(pb);
            time     = avio_rb64(pb);
        } else {
            duration = avio_rb32(pb); /* segment duration */
Y
Yusuke Nakamura 已提交
2436
            time     = (int32_t)avio_rb32(pb); /* media time */
2437
        }
2438
        avio_rb32(pb); /* Media rate */
2439 2440
        if (i == 0 && time >= -1) {
            sc->time_offset = time != -1 ? time : -duration;
2441
        }
B
Baptiste Coudurier 已提交
2442
    }
2443

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

L
Luca Barbato 已提交
2448
    av_dlog(c->fc, "track[%i].edit_count = %i\n", c->fc->nb_streams-1, edit_count);
B
Baptiste Coudurier 已提交
2449
    return 0;
G
Gael Chardon 已提交
2450 2451
}

2452
static const MOVParseTableEntry mov_default_parse_table[] = {
2453
{ MKTAG('a','v','s','s'), mov_read_extradata },
D
David Conrad 已提交
2454
{ MKTAG('c','h','p','l'), mov_read_chpl },
2455 2456 2457 2458 2459 2460 2461
{ 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 },
2462
{ MKTAG('f','i','e','l'), mov_read_fiel },
2463 2464 2465
{ MKTAG('f','t','y','p'), mov_read_ftyp },
{ MKTAG('g','l','b','l'), mov_read_glbl },
{ MKTAG('h','d','l','r'), mov_read_hdlr },
2466
{ MKTAG('i','l','s','t'), mov_read_ilst },
2467 2468 2469 2470
{ 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 },
2471
{ MKTAG('m','e','t','a'), mov_read_meta },
2472 2473 2474 2475 2476 2477 2478 2479
{ 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 },
2480
{ MKTAG('p','a','s','p'), mov_read_pasp },
2481 2482
{ MKTAG('s','t','b','l'), mov_read_default },
{ MKTAG('s','t','c','o'), mov_read_stco },
2483
{ MKTAG('s','t','p','s'), mov_read_stps },
M
Martin Storsjö 已提交
2484
{ MKTAG('s','t','r','f'), mov_read_strf },
2485 2486 2487 2488 2489
{ 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 },
2490
{ MKTAG('s','t','z','2'), mov_read_stsz }, /* compact sample size */
2491 2492 2493 2494
{ 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 已提交
2495 2496
{ MKTAG('t','r','e','f'), mov_read_default },
{ MKTAG('c','h','a','p'), mov_read_chap },
2497 2498
{ MKTAG('t','r','e','x'), mov_read_trex },
{ MKTAG('t','r','u','n'), mov_read_trun },
B
Baptiste Coudurier 已提交
2499
{ MKTAG('u','d','t','a'), mov_read_default },
2500 2501
{ MKTAG('w','a','v','e'), mov_read_wave },
{ MKTAG('e','s','d','s'), mov_read_esds },
2502
{ MKTAG('d','a','c','3'), mov_read_dac3 }, /* AC-3 info */
2503
{ MKTAG('d','e','c','3'), mov_read_dec3 }, /* EAC-3 info */
2504
{ MKTAG('w','i','d','e'), mov_read_wide }, /* place holder */
2505
{ MKTAG('w','f','e','x'), mov_read_wfex },
2506
{ MKTAG('c','m','o','v'), mov_read_cmov },
2507
{ MKTAG('c','h','a','n'), mov_read_chan }, /* channel layout */
M
Martin Storsjö 已提交
2508
{ MKTAG('d','v','c','1'), mov_read_dvc1 },
B
Baptiste Coudurier 已提交
2509
{ 0, NULL }
2510 2511
};

F
Fabrice Bellard 已提交
2512 2513
static int mov_probe(AVProbeData *p)
{
2514 2515
    unsigned int offset;
    uint32_t tag;
2516
    int score = 0;
2517

F
Fabrice Bellard 已提交
2518
    /* check file header */
2519
    offset = 0;
2520
    for (;;) {
2521 2522
        /* ignore invalid offset */
        if ((offset + 8) > (unsigned int)p->buf_size)
2523
            return score;
2524
        tag = AV_RL32(p->buf + offset + 4);
2525
        switch(tag) {
2526
        /* check for obvious tags */
2527 2528 2529 2530 2531
        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 */
2532
        case MKTAG('f','t','y','p'):
2533
            return AVPROBE_SCORE_MAX;
2534
        /* those are more common words, so rate then a bit less */
2535 2536 2537 2538 2539
        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'):
2540
            return AVPROBE_SCORE_MAX - 5;
B
Baptiste Coudurier 已提交
2541
        case MKTAG(0x82,0x82,0x7f,0x7d):
2542 2543 2544
        case MKTAG('s','k','i','p'):
        case MKTAG('u','u','i','d'):
        case MKTAG('p','r','f','l'):
2545
            offset = AV_RB32(p->buf+offset) + offset;
2546 2547
            /* if we only find those cause probedata is too small at least rate them */
            score = AVPROBE_SCORE_MAX - 50;
2548 2549 2550
            break;
        default:
            /* unrecognized tag */
2551
            return score;
2552
        }
2553
    }
F
Fabrice Bellard 已提交
2554 2555
}

D
David Conrad 已提交
2556 2557 2558 2559 2560 2561 2562
// 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;
2563
    int i;
D
David Conrad 已提交
2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576

    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;
2577
    cur_pos = avio_tell(sc->pb);
D
David Conrad 已提交
2578 2579 2580 2581

    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;
2582 2583 2584
        uint8_t *title;
        uint16_t ch;
        int len, title_len;
D
David Conrad 已提交
2585

A
Anton Khirnov 已提交
2586
        if (avio_seek(sc->pb, sample->pos, SEEK_SET) != sample->pos) {
D
David Conrad 已提交
2587 2588 2589 2590 2591
            av_log(s, AV_LOG_ERROR, "Chapter %d not found in file\n", i);
            goto finish;
        }

        // the first two bytes are the length of the title
2592
        len = avio_rb16(sc->pb);
D
David Conrad 已提交
2593 2594
        if (len > sample->size-2)
            continue;
2595 2596 2597
        title_len = 2*len + 1;
        if (!(title = av_mallocz(title_len)))
            goto finish;
D
David Conrad 已提交
2598 2599 2600 2601

        // 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
2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612
        if (!len) {
            title[0] = 0;
        } else {
            ch = avio_rb16(sc->pb);
            if (ch == 0xfeff)
                avio_get_str16be(sc->pb, len, title, title_len);
            else if (ch == 0xfffe)
                avio_get_str16le(sc->pb, len, title, title_len);
            else {
                AV_WB16(title, ch);
                if (len == 1 || len == 2)
2613
                    title[len] = 0;
2614 2615 2616
                else
                    avio_get_str(sc->pb, len - 2, title + 2, title_len - 2);
            }
D
David Conrad 已提交
2617 2618
        }

2619
        avpriv_new_chapter(s, i, st->time_base, sample->timestamp, end, title);
2620
        av_freep(&title);
D
David Conrad 已提交
2621 2622
    }
finish:
A
Anton Khirnov 已提交
2623
    avio_seek(sc->pb, cur_pos, SEEK_SET);
D
David Conrad 已提交
2624 2625
}

2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658
static int mov_read_close(AVFormatContext *s)
{
    MOVContext *mov = s->priv_data;
    int i, j;

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

        av_freep(&sc->ctts_data);
        for (j = 0; j < sc->drefs_count; j++) {
            av_freep(&sc->drefs[j].path);
            av_freep(&sc->drefs[j].dir);
        }
        av_freep(&sc->drefs);
        if (sc->pb && sc->pb != s->pb)
            avio_close(sc->pb);
    }

    if (mov->dv_demux) {
        for (i = 0; i < mov->dv_fctx->nb_streams; i++) {
            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);
    }

    av_freep(&mov->trex_data);

    return 0;
}

2659
static int mov_read_header(AVFormatContext *s)
2660
{
2661
    MOVContext *mov = s->priv_data;
2662
    AVIOContext *pb = s->pb;
B
Baptiste Coudurier 已提交
2663
    int err;
2664
    MOVAtom atom = { AV_RL32("root") };
2665 2666

    mov->fc = s;
2667
    /* .mov and .mp4 aren't streamable anyway (only progressive download if moov is before mdat) */
2668
    if (pb->seekable)
A
Anton Khirnov 已提交
2669
        atom.size = avio_size(pb);
2670
    else
B
Baptiste Coudurier 已提交
2671
        atom.size = INT64_MAX;
2672 2673

    /* check MOV header */
B
Baptiste Coudurier 已提交
2674 2675
    if ((err = mov_read_default(mov, pb, atom)) < 0) {
        av_log(s, AV_LOG_ERROR, "error reading header: %d\n", err);
2676
        mov_read_close(s);
B
Baptiste Coudurier 已提交
2677 2678 2679 2680
        return err;
    }
    if (!mov->found_moov) {
        av_log(s, AV_LOG_ERROR, "moov atom not found\n");
2681
        mov_read_close(s);
2682
        return AVERROR_INVALIDDATA;
2683
    }
2684
    av_dlog(mov->fc, "on_parse_exit_offset=%"PRId64"\n", avio_tell(pb));
2685

2686
    if (pb->seekable && mov->chapter_track > 0)
D
David Conrad 已提交
2687 2688
        mov_read_chapters(s);

2689 2690 2691 2692 2693 2694 2695 2696 2697 2698
    if (mov->trex_data) {
        int i;
        for (i = 0; i < s->nb_streams; i++) {
            AVStream *st = s->streams[i];
            MOVStreamContext *sc = st->priv_data;
            if (st->duration)
                st->codec->bit_rate = sc->data_size * 8 * sc->time_scale / st->duration;
        }
    }

2699 2700 2701
    return 0;
}

2702
static AVIndexEntry *mov_find_next_sample(AVFormatContext *s, AVStream **st)
2703
{
2704
    AVIndexEntry *sample = NULL;
2705
    int64_t best_dts = INT64_MAX;
2706
    int i;
B
Baptiste Coudurier 已提交
2707
    for (i = 0; i < s->nb_streams; i++) {
2708 2709
        AVStream *avst = s->streams[i];
        MOVStreamContext *msc = avst->priv_data;
2710
        if (msc->pb && msc->current_sample < avst->nb_index_entries) {
2711
            AVIndexEntry *current_sample = &avst->index_entries[msc->current_sample];
2712
            int64_t dts = av_rescale(current_sample->timestamp, AV_TIME_BASE, msc->time_scale);
L
Luca Barbato 已提交
2713
            av_dlog(s, "stream %d, sample %d, dts %"PRId64"\n", i, msc->current_sample, dts);
2714 2715
            if (!sample || (!s->pb->seekable && current_sample->pos < sample->pos) ||
                (s->pb->seekable &&
2716
                 ((msc->pb != s->pb && dts < best_dts) || (msc->pb == s->pb &&
B
Baptiste Coudurier 已提交
2717
                 ((FFABS(best_dts - dts) <= AV_TIME_BASE && current_sample->pos < sample->pos) ||
2718
                  (FFABS(best_dts - dts) > AV_TIME_BASE && dts < best_dts)))))) {
2719 2720
                sample = current_sample;
                best_dts = dts;
2721
                *st = avst;
2722
            }
2723 2724
        }
    }
2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736
    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);
2737 2738
    if (!sample) {
        mov->found_mdat = 0;
2739 2740 2741 2742 2743
        if (!mov->next_root_atom)
            return AVERROR_EOF;
        avio_seek(s->pb, mov->next_root_atom, SEEK_SET);
        mov->next_root_atom = 0;
        if (mov_read_default(mov, s->pb, (MOVAtom){ AV_RL32("root"), INT64_MAX }) < 0 ||
A
Anton Khirnov 已提交
2744
            s->pb->eof_reached)
B
Baptiste Coudurier 已提交
2745
            return AVERROR_EOF;
2746
        av_dlog(s, "read fragments, offset 0x%"PRIx64"\n", avio_tell(s->pb));
2747 2748
        goto retry;
    }
2749
    sc = st->priv_data;
2750 2751
    /* must be done just before reading, to avoid infinite loop on sample */
    sc->current_sample++;
2752 2753

    if (st->discard != AVDISCARD_ALL) {
A
Anton Khirnov 已提交
2754
        if (avio_seek(sc->pb, sample->pos, SEEK_SET) != sample->pos) {
R
Reimar Döffinger 已提交
2755 2756
            av_log(mov->fc, AV_LOG_ERROR, "stream %d, offset 0x%"PRIx64": partial file\n",
                   sc->ffindex, sample->pos);
2757
            return AVERROR_INVALIDDATA;
R
Reimar Döffinger 已提交
2758 2759
        }
        ret = av_get_packet(sc->pb, pkt, sample->size);
2760 2761
        if (ret < 0)
            return ret;
2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772
        if (sc->has_palette) {
            uint8_t *pal;

            pal = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE, AVPALETTE_SIZE);
            if (!pal) {
                av_log(mov->fc, AV_LOG_ERROR, "Cannot append palette to packet\n");
            } else {
                memcpy(pal, sc->palette, AVPALETTE_SIZE);
                sc->has_palette = 0;
            }
        }
R
Reimar Döffinger 已提交
2773 2774
#if CONFIG_DV_DEMUXER
        if (mov->dv_demux && sc->dv_audio_container) {
2775
            avpriv_dv_produce_packet(mov->dv_demux, pkt, pkt->data, pkt->size);
R
Reimar Döffinger 已提交
2776 2777
            av_free(pkt->data);
            pkt->size = 0;
2778
            ret = avpriv_dv_get_packet(mov->dv_demux, pkt);
R
Reimar Döffinger 已提交
2779 2780 2781
            if (ret < 0)
                return ret;
        }
2782
#endif
2783 2784
    }

2785 2786
    pkt->stream_index = sc->ffindex;
    pkt->dts = sample->timestamp;
2787
    if (sc->ctts_data && sc->ctts_index < sc->ctts_count) {
2788
        pkt->pts = pkt->dts + sc->dts_shift + sc->ctts_data[sc->ctts_index].duration;
2789
        /* update ctts context */
2790 2791 2792 2793 2794
        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;
2795
        }
2796 2797
        if (sc->wrong_dts)
            pkt->dts = AV_NOPTS_VALUE;
2798
    } else {
2799
        int64_t next_dts = (sc->current_sample < st->nb_index_entries) ?
2800 2801
            st->index_entries[sc->current_sample].timestamp : st->duration;
        pkt->duration = next_dts - pkt->dts;
2802
        pkt->pts = pkt->dts;
2803
    }
2804 2805
    if (st->discard == AVDISCARD_ALL)
        goto retry;
2806
    pkt->flags |= sample->flags & AVINDEX_KEYFRAME ? AV_PKT_FLAG_KEY : 0;
2807
    pkt->pos = sample->pos;
L
Luca Barbato 已提交
2808
    av_dlog(s, "stream %d, pts %"PRId64", dts %"PRId64", pos 0x%"PRIx64", duration %d\n",
2809
            pkt->stream_index, pkt->pts, pkt->dts, pkt->pos, pkt->duration);
2810 2811
    return 0;
}
2812

2813
static int mov_seek_stream(AVFormatContext *s, AVStream *st, int64_t timestamp, int flags)
2814 2815 2816 2817
{
    MOVStreamContext *sc = st->priv_data;
    int sample, time_sample;
    int i;
2818

2819
    sample = av_index_search_timestamp(st, timestamp, flags);
L
Luca Barbato 已提交
2820
    av_dlog(s, "stream %d, timestamp %"PRId64", sample %d\n", st->index, timestamp, sample);
2821 2822
    if (sample < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
        sample = 0;
2823
    if (sample < 0) /* not sure what to do */
2824
        return AVERROR_INVALIDDATA;
2825
    sc->current_sample = sample;
L
Luca Barbato 已提交
2826
    av_dlog(s, "stream %d, found sample %d\n", st->index, sc->current_sample);
2827 2828 2829 2830
    /* adjust ctts index */
    if (sc->ctts_data) {
        time_sample = 0;
        for (i = 0; i < sc->ctts_count; i++) {
2831 2832
            int next = time_sample + sc->ctts_data[i].count;
            if (next > sc->current_sample) {
2833 2834
                sc->ctts_index = i;
                sc->ctts_sample = sc->current_sample - time_sample;
2835
                break;
2836
            }
2837
            time_sample = next;
2838 2839
        }
    }
2840
    return sample;
2841 2842
}

2843
static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags)
G
Gael Chardon 已提交
2844
{
2845 2846 2847 2848
    AVStream *st;
    int64_t seek_timestamp, timestamp;
    int sample;
    int i;
G
Gael Chardon 已提交
2849

2850
    if (stream_index >= s->nb_streams)
2851
        return AVERROR_INVALIDDATA;
2852 2853
    if (sample_time < 0)
        sample_time = 0;
G
Gael Chardon 已提交
2854

2855
    st = s->streams[stream_index];
2856
    sample = mov_seek_stream(s, st, sample_time, flags);
2857
    if (sample < 0)
2858
        return sample;
G
Gael Chardon 已提交
2859

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

2863 2864
    for (i = 0; i < s->nb_streams; i++) {
        st = s->streams[i];
2865
        if (stream_index == i)
2866
            continue;
G
Gael Chardon 已提交
2867

2868
        timestamp = av_rescale_q(seek_timestamp, s->streams[stream_index]->time_base, st->time_base);
2869
        mov_seek_stream(s, st, timestamp, flags);
2870
    }
G
Gael Chardon 已提交
2871 2872 2873
    return 0;
}

2874
AVInputFormat ff_mov_demuxer = {
2875 2876 2877 2878 2879 2880 2881 2882
    .name           = "mov,mp4,m4a,3gp,3g2,mj2",
    .long_name      = NULL_IF_CONFIG_SMALL("QuickTime/MPEG-4/Motion JPEG 2000 format"),
    .priv_data_size = sizeof(MOVContext),
    .read_probe     = mov_probe,
    .read_header    = mov_read_header,
    .read_packet    = mov_read_packet,
    .read_close     = mov_read_close,
    .read_seek      = mov_read_seek,
2883
};