mov.c 95.3 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/intreadwrite.h"
29
#include "libavutil/intfloat.h"
30
#include "libavutil/mathematics.h"
31
#include "libavutil/avstring.h"
32
#include "libavutil/dict.h"
33
#include "avformat.h"
34
#include "internal.h"
35
#include "avio_internal.h"
36
#include "riff.h"
37
#include "isom.h"
38
#include "libavcodec/get_bits.h"
R
Raivo Hool 已提交
39
#include "id3v1.h"
40
#include "mov_chan.h"
41

42
#if CONFIG_ZLIB
43 44 45
#include <zlib.h>
#endif

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

51 52
#include "qtpalette.h"

G
Gael Chardon 已提交
53

54 55 56
#undef NDEBUG
#include <assert.h>

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

64 65
static const MOVParseTableEntry mov_default_parse_table[];

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

71
    short current, total;
72
    avio_rb16(pb); // unknown
73 74 75 76 77 78 79
    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 已提交
80 81 82 83

    return 0;
}

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

89 90 91 92
    /* bypass padding bytes */
    avio_r8(pb);
    avio_r8(pb);
    avio_r8(pb);
93

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

97
    return 0;
98 99
}

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

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

108
    return 0;
109 110
}

R
Raivo Hool 已提交
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
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;
}

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

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

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

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

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

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

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

    if (parse)
247
        parse(c, pb, str_size, key);
B
Baptiste Coudurier 已提交
248
    else {
249 250 251
        if (data_type == 3 || (data_type == 0 && langcode < 0x800)) { // MAC Encoded
            mov_read_mac_string(c, pb, str_size, str, sizeof(str));
        } else {
252
            avio_read(pb, str, str_size);
253 254
            str[str_size] = 0;
        }
255
        av_dict_set(&c->fc->metadata, key, str, 0);
B
Baptiste Coudurier 已提交
256 257
        if (*language && strcmp(language, "und")) {
            snprintf(key2, sizeof(key2), "%s-%s", key, language);
258
            av_dict_set(&c->fc->metadata, key2, str, 0);
B
Baptiste Coudurier 已提交
259
        }
B
Baptiste Coudurier 已提交
260
    }
261 262 263
    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);
264 265 266

    return 0;
}
267

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

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

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

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

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

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

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

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

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

333 334 335 336 337
        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;
            }
338

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

364
        total_size += a.size;
365 366
    }

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

370
    return 0;
371 372
}

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

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

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

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

398
        if (size < 12)
399
            return AVERROR_INVALIDDATA;
400

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

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

410
            avio_skip(pb, 10);
411

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

418
            avio_skip(pb, 12);
419

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

426
            avio_skip(pb, 16);
427 428

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

434
            avio_skip(pb, 16);
435

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

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

483 484 485 486 487
    if (c->fc->nb_streams < 1) // meta before first trak
        return 0;

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

488 489
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
490 491

    /* component type */
492 493
    ctype = avio_rl32(pb);
    type = avio_rl32(pb); /* component subtype */
494

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

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

507 508 509
    avio_rb32(pb); /* component  manufacture */
    avio_rb32(pb); /* component flags */
    avio_rb32(pb); /* component flags mask */
510 511 512 513

    return 0;
}

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

519
    if (fc->nb_streams < 1)
520
        return 0;
521
    st = fc->streams[fc->nb_streams-1];
522

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

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

536
static int mov_read_esds(MOVContext *c, AVIOContext *pb, MOVAtom atom)
537 538 539 540
{
    return ff_mov_read_esds(c->fc, pb, atom);
}

541
static int mov_read_dac3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
542 543
{
    AVStream *st;
544
    int ac3info, acmod, lfeon, bsmod;
545

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

550
    ac3info = avio_rb24(pb);
551
    bsmod = (ac3info >> 14) & 0x7;
552 553 554
    acmod = (ac3info >> 11) & 0x7;
    lfeon = (ac3info >> 10) & 0x1;
    st->codec->channels = ((int[]){2,1,2,3,3,4,4,5})[acmod] + lfeon;
555 556 557
    st->codec->audio_service_type = bsmod;
    if (st->codec->channels > 1 && bsmod == 0x7)
        st->codec->audio_service_type = AV_AUDIO_SERVICE_TYPE_KARAOKE;
558 559 560 561

    return 0;
}

562 563 564 565
static int mov_read_chan(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
    AVStream *st;
    uint8_t version;
566 567
    uint32_t flags, layout_tag, bitmap, num_descr, label_mask;
    int i;
568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588

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

589
    label_mask = 0;
590 591 592 593
    for (i = 0; i < num_descr; i++) {
        uint32_t label, cflags;
        label     = avio_rb32(pb);          // mChannelLabel
        cflags    = avio_rb32(pb);          // mChannelFlags
594 595 596
        avio_rl32(pb);                      // mCoordinates[0]
        avio_rl32(pb);                      // mCoordinates[1]
        avio_rl32(pb);                      // mCoordinates[2]
597 598 599 600 601 602 603 604
        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;
        }
605
    }
606 607 608 609
    if (layout_tag == 0)
        st->codec->channel_layout = label_mask;
    else
        st->codec->channel_layout = ff_mov_get_channel_layout(layout_tag, bitmap);
610 611 612 613

    return 0;
}

614 615 616 617 618 619 620 621 622 623 624 625 626
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;
}

627
static int mov_read_pasp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
628
{
629 630
    const int num = avio_rb32(pb);
    const int den = avio_rb32(pb);
631 632 633 634 635 636
    AVStream *st;

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

637 638 639 640 641 642 643
    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) {
644 645 646 647 648 649
        st->sample_aspect_ratio.num = num;
        st->sample_aspect_ratio.den = den;
    }
    return 0;
}

650
/* this atom contains actual media data */
651
static int mov_read_mdat(MOVContext *c, AVIOContext *pb, MOVAtom atom)
652
{
653
    if (atom.size == 0) /* wrong one (MP4) */
654 655 656 657 658
        return 0;
    c->found_mdat=1;
    return 0; /* now go for moov */
}

659
/* read major brand, minor version and compatible brands and store them as metadata */
660
static int mov_read_ftyp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
661
{
662 663 664 665 666 667
    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};

668
    avio_read(pb, type, 4);
B
Baptiste Coudurier 已提交
669
    if (strcmp(type, "qt  "))
670
        c->isom = 1;
671
    av_log(c->fc, AV_LOG_DEBUG, "ISO: File Type Major Brand: %.4s\n",(char *)&type);
672
    av_dict_set(&c->fc->metadata, "major_brand", type, 0);
673
    minor_ver = avio_rb32(pb); /* minor version */
674
    snprintf(minor_ver_str, sizeof(minor_ver_str), "%d", minor_ver);
675
    av_dict_set(&c->fc->metadata, "minor_version", minor_ver_str, 0);
676 677 678

    comp_brand_size = atom.size - 8;
    if (comp_brand_size < 0)
679
        return AVERROR_INVALIDDATA;
680 681 682
    comp_brands_str = av_malloc(comp_brand_size + 1); /* Add null terminator */
    if (!comp_brands_str)
        return AVERROR(ENOMEM);
683
    avio_read(pb, comp_brands_str, comp_brand_size);
684
    comp_brands_str[comp_brand_size] = 0;
685
    av_dict_set(&c->fc->metadata, "compatible_brands", comp_brands_str, 0);
686 687
    av_freep(&comp_brands_str);

688 689 690
    return 0;
}

691
/* this atom should contain all header atoms */
692
static int mov_read_moov(MOVContext *c, AVIOContext *pb, MOVAtom atom)
693
{
694 695 696 697
    int ret;

    if ((ret = mov_read_default(c, pb, atom)) < 0)
        return ret;
698 699 700 701 702 703
    /* 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 */
}

704
static int mov_read_moof(MOVContext *c, AVIOContext *pb, MOVAtom atom)
B
Baptiste Coudurier 已提交
705
{
706
    c->fragment.moof_offset = avio_tell(pb) - 8;
707
    av_dlog(c->fc, "moof offset %"PRIx64"\n", c->fragment.moof_offset);
B
Baptiste Coudurier 已提交
708 709
    return mov_read_default(c, pb, atom);
}
710

711
static void mov_metadata_creation_time(AVDictionary **metadata, time_t time)
712 713 714
{
    char buffer[32];
    if (time) {
715
        struct tm *ptm;
716
        time -= 2082844800;  /* seconds between 1904-01-01 and Epoch */
717 718 719
        ptm = gmtime(&time);
        if (!ptm) return;
        strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", ptm);
720
        av_dict_set(metadata, "creation_time", buffer, 0);
721 722 723
    }
}

724
static int mov_read_mdhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
725
{
726 727 728
    AVStream *st;
    MOVStreamContext *sc;
    int version;
729
    char language[4] = {0};
730
    unsigned lang;
731
    time_t creation_time;
732

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

738
    version = avio_r8(pb);
739 740 741 742
    if (version > 1) {
        av_log_ask_for_sample(c, "unsupported version %d\n", version);
        return AVERROR_PATCHWELCOME;
    }
743
    avio_rb24(pb); /* flags */
B
clean  
Baptiste Coudurier 已提交
744
    if (version == 1) {
745 746
        creation_time = avio_rb64(pb);
        avio_rb64(pb);
B
clean  
Baptiste Coudurier 已提交
747
    } else {
748 749
        creation_time = avio_rb32(pb);
        avio_rb32(pb); /* modification time */
B
clean  
Baptiste Coudurier 已提交
750
    }
751
    mov_metadata_creation_time(&st->metadata, creation_time);
752

753 754
    sc->time_scale = avio_rb32(pb);
    st->duration = (version == 1) ? avio_rb64(pb) : avio_rb32(pb); /* duration */
755

756
    lang = avio_rb16(pb); /* language */
757
    if (ff_mov_lang_to_iso639(lang, language))
758
        av_dict_set(&st->metadata, "language", language, 0);
759
    avio_rb16(pb); /* quality */
760 761 762 763

    return 0;
}

764
static int mov_read_mvhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
765
{
766
    time_t creation_time;
767 768
    int version = avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
769

B
Baptiste Coudurier 已提交
770
    if (version == 1) {
771 772
        creation_time = avio_rb64(pb);
        avio_rb64(pb);
B
Baptiste Coudurier 已提交
773
    } else {
774 775
        creation_time = avio_rb32(pb);
        avio_rb32(pb); /* modification time */
B
Baptiste Coudurier 已提交
776
    }
777
    mov_metadata_creation_time(&c->fc->metadata, creation_time);
778
    c->time_scale = avio_rb32(pb); /* time scale */
779

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

782 783
    c->duration = (version == 1) ? avio_rb64(pb) : avio_rb32(pb); /* duration */
    avio_rb32(pb); /* preferred scale */
784

785
    avio_rb16(pb); /* preferred volume */
786

787
    avio_skip(pb, 10); /* reserved */
788

789
    avio_skip(pb, 36); /* display matrix */
790

791 792 793 794 795 796 797
    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 */
798 799 800 801

    return 0;
}

802
static int mov_read_smi(MOVContext *c, AVIOContext *pb, MOVAtom atom)
803
{
804 805 806 807 808
    AVStream *st;

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

810
    if ((uint64_t)atom.size > (1<<30))
811
        return AVERROR_INVALIDDATA;
812

813 814
    // currently SVQ3 decoder expect full STSD header - so let's fake it
    // this should be fixed and just SMI header should be passed
815
    av_free(st->codec->extradata);
816 817 818
    st->codec->extradata = av_mallocz(atom.size + 0x5a + FF_INPUT_BUFFER_PADDING_SIZE);
    if (!st->codec->extradata)
        return AVERROR(ENOMEM);
B
Baptiste Coudurier 已提交
819 820
    st->codec->extradata_size = 0x5a + atom.size;
    memcpy(st->codec->extradata, "SVQ3", 4); // fake
821
    avio_read(pb, st->codec->extradata + 0x5a, atom.size);
L
Luca Barbato 已提交
822
    av_dlog(c->fc, "Reading SMI %"PRId64"  %s\n", atom.size, st->codec->extradata + 0x5a);
823 824
    return 0;
}
825

826
static int mov_read_enda(MOVContext *c, AVIOContext *pb, MOVAtom atom)
827
{
828 829 830 831 832 833
    AVStream *st;
    int little_endian;

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

835
    little_endian = avio_rb16(pb);
L
Luca Barbato 已提交
836
    av_dlog(c->fc, "enda %d\n", little_endian);
837
    if (little_endian == 1) {
838 839 840 841 842 843 844
        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;
845 846 847 848 849 850
        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;
851 852 853 854 855 856 857
        default:
            break;
        }
    }
    return 0;
}

858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891
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;
}

892
/* FIXME modify qdm2/svq3/h264 decoders to take full atom as extradata */
893
static int mov_read_extradata(MOVContext *c, AVIOContext *pb, MOVAtom atom)
894
{
895 896
    AVStream *st;
    uint64_t size;
897
    uint8_t *buf;
898 899 900 901 902

    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;
903
    if (size > INT_MAX || (uint64_t)atom.size > INT_MAX)
904
        return AVERROR_INVALIDDATA;
905
    buf= av_realloc(st->codec->extradata, size);
906
    if (!buf)
907
        return AVERROR(ENOMEM);
908 909 910 911 912
    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);
913
    avio_read(pb, buf + 8, atom.size);
914 915 916
    return 0;
}

917
static int mov_read_wave(MOVContext *c, AVIOContext *pb, MOVAtom atom)
R
Roberto Togni 已提交
918
{
919 920 921 922 923
    AVStream *st;

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

925
    if ((uint64_t)atom.size > (1<<30))
926
        return AVERROR_INVALIDDATA;
927

928 929
    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
930
        av_free(st->codec->extradata);
931 932 933
        st->codec->extradata = av_mallocz(atom.size + FF_INPUT_BUFFER_PADDING_SIZE);
        if (!st->codec->extradata)
            return AVERROR(ENOMEM);
934
        st->codec->extradata_size = atom.size;
935
        avio_read(pb, st->codec->extradata, atom.size);
936
    } else if (atom.size > 8) { /* to read frma, esds atoms */
937 938 939
        int ret;
        if ((ret = mov_read_default(c, pb, atom)) < 0)
            return ret;
940
    } else
941
        avio_skip(pb, atom.size);
R
Roberto Togni 已提交
942 943 944
    return 0;
}

945 946 947 948
/**
 * This function reads atom content and puts data in extradata without tag
 * nor size unlike mov_read_extradata.
 */
949
static int mov_read_glbl(MOVContext *c, AVIOContext *pb, MOVAtom atom)
950
{
951 952 953 954 955
    AVStream *st;

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

957
    if ((uint64_t)atom.size > (1<<30))
958
        return AVERROR_INVALIDDATA;
959

960 961 962 963 964 965 966 967 968
    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);
    }
969
    av_free(st->codec->extradata);
970 971 972
    st->codec->extradata = av_mallocz(atom.size + FF_INPUT_BUFFER_PADDING_SIZE);
    if (!st->codec->extradata)
        return AVERROR(ENOMEM);
973
    st->codec->extradata_size = atom.size;
974
    avio_read(pb, st->codec->extradata, atom.size);
975 976 977
    return 0;
}

M
Martin Storsjö 已提交
978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003
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ö 已提交
1004 1005 1006 1007 1008
/**
 * 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.
 */
1009
static int mov_read_strf(MOVContext *c, AVIOContext *pb, MOVAtom atom)
M
Martin Storsjö 已提交
1010 1011 1012 1013 1014 1015 1016 1017 1018
{
    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];

1019
    if ((uint64_t)atom.size > (1<<30))
1020
        return AVERROR_INVALIDDATA;
M
Martin Storsjö 已提交
1021 1022 1023 1024 1025 1026

    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;
1027
    avio_skip(pb, 40);
1028
    avio_read(pb, st->codec->extradata, atom.size - 40);
M
Martin Storsjö 已提交
1029 1030 1031
    return 0;
}

1032
static int mov_read_stco(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1033
{
1034 1035
    AVStream *st;
    MOVStreamContext *sc;
1036
    unsigned int i, entries;
1037

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

1043 1044
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
1045

1046
    entries = avio_rb32(pb);
1047

A
Alex Converse 已提交
1048 1049
    if (!entries)
        return 0;
1050
    if (entries >= UINT_MAX/sizeof(int64_t))
1051
        return AVERROR_INVALIDDATA;
1052

B
Baptiste Coudurier 已提交
1053
    sc->chunk_offsets = av_malloc(entries * sizeof(int64_t));
1054
    if (!sc->chunk_offsets)
1055 1056 1057
        return AVERROR(ENOMEM);
    sc->chunk_count = entries;

1058
    if      (atom.type == MKTAG('s','t','c','o'))
1059
        for (i=0; i<entries; i++)
1060
            sc->chunk_offsets[i] = avio_rb32(pb);
1061
    else if (atom.type == MKTAG('c','o','6','4'))
1062
        for (i=0; i<entries; i++)
1063
            sc->chunk_offsets[i] = avio_rb64(pb);
1064
    else
1065
        return AVERROR_INVALIDDATA;
1066

1067 1068 1069
    return 0;
}

1070 1071 1072 1073
/**
 * Compute codec id for 'lpcm' tag.
 * See CoreAudioTypes and AudioStreamBasicDescription at Apple.
 */
1074
enum CodecID ff_mov_get_lpcm_codec_id(int bps, int flags)
1075 1076 1077 1078
{
    if (flags & 1) { // floating point
        if (flags & 2) { // big endian
            if      (bps == 32) return CODEC_ID_PCM_F32BE;
1079
            else if (bps == 64) return CODEC_ID_PCM_F64BE;
1080
        } else {
1081 1082
            if      (bps == 32) return CODEC_ID_PCM_F32LE;
            else if (bps == 64) return CODEC_ID_PCM_F64LE;
1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096
        }
    } 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 已提交
1097
            else if (bps == 16) return CODEC_ID_PCM_S16LE;
1098 1099 1100 1101
            else if (bps == 24) return CODEC_ID_PCM_S24LE;
            else if (bps == 32) return CODEC_ID_PCM_S32LE;
        }
    }
D
Diego Pettenò 已提交
1102
    return CODEC_ID_NONE;
1103 1104
}

1105
int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries)
1106
{
1107 1108
    AVStream *st;
    MOVStreamContext *sc;
1109
    int j, pseudo_stream_id;
1110

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

1116
    for (pseudo_stream_id=0; pseudo_stream_id<entries; pseudo_stream_id++) {
1117
        //Parsing Sample description table
1118
        enum CodecID id;
1119
        int dref_id = 1;
1120
        MOVAtom a = { AV_RL32("stsd") };
1121
        int64_t start_pos = avio_tell(pb);
1122 1123
        int size = avio_rb32(pb); /* size */
        uint32_t format = avio_rl32(pb); /* data format */
1124

1125
        if (size >= 16) {
1126 1127 1128
            avio_rb32(pb); /* reserved */
            avio_rb16(pb); /* reserved */
            dref_id = avio_rb16(pb);
1129
        }
1130

1131
        if (st->codec->codec_tag &&
1132
            st->codec->codec_tag != format &&
1133
            (c->fc->video_codec_id ? ff_codec_get_id(ff_codec_movvideo_tags, format) != c->fc->video_codec_id
1134
                                   : st->codec->codec_tag != MKTAG('j','p','e','g'))
1135
           ){
D
Diego Biurrun 已提交
1136 1137 1138
            /* 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. */
1139
        multiple_stsd:
B
Baptiste Coudurier 已提交
1140
            av_log(c->fc, AV_LOG_WARNING, "multiple fourcc not supported\n");
1141
            avio_skip(pb, size - (avio_tell(pb) - start_pos));
1142 1143
            continue;
        }
1144 1145 1146
        /* 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;
1147
        sc->pseudo_stream_id = st->codec->codec_tag ? -1 : pseudo_stream_id;
1148
        sc->dref_id= dref_id;
1149

1150
        st->codec->codec_tag = format;
1151
        id = ff_codec_get_id(ff_codec_movaudio_tags, format);
1152
        if (id<=0 && ((format&0xFFFF) == 'm'+('s'<<8) || (format&0xFFFF) == 'T'+('S'<<8)))
M
Måns Rullgård 已提交
1153
            id = ff_codec_get_id(ff_codec_wav_tags, av_bswap32(format)&0xFFFF);
M
Michael Niedermayer 已提交
1154

1155 1156 1157
        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 */
1158
                   format && format != MKTAG('m','p','4','s')) { /* skip old asf mpeg4 tag */
1159
            id = ff_codec_get_id(ff_codec_movvideo_tags, format);
1160
            if (id <= 0)
1161
                id = ff_codec_get_id(ff_codec_bmp_tags, format);
1162
            if (id > 0)
1163
                st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
1164
            else if (st->codec->codec_type == AVMEDIA_TYPE_DATA){
1165
                id = ff_codec_get_id(ff_codec_movsubtitle_tags, format);
1166
                if (id > 0)
1167
                    st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
1168
            }
1169 1170
        }

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

1175
        if (st->codec->codec_type==AVMEDIA_TYPE_VIDEO) {
1176
            unsigned int color_depth, len;
1177 1178
            int color_greyscale;

1179
            st->codec->codec_id = id;
1180 1181 1182 1183 1184
            avio_rb16(pb); /* version */
            avio_rb16(pb); /* revision level */
            avio_rb32(pb); /* vendor */
            avio_rb32(pb); /* temporal quality */
            avio_rb32(pb); /* spatial quality */
1185

1186 1187
            st->codec->width = avio_rb16(pb); /* width */
            st->codec->height = avio_rb16(pb); /* height */
1188

1189 1190 1191 1192
            avio_rb32(pb); /* horiz resolution */
            avio_rb32(pb); /* vert resolution */
            avio_rb32(pb); /* data size, always 0 */
            avio_rb16(pb); /* frames per samples */
1193

1194
            len = avio_r8(pb); /* codec name, pascal string */
1195 1196 1197 1198
            if (len > 31)
                len = 31;
            mov_read_mac_string(c, pb, len, st->codec->codec_name, 32);
            if (len < 31)
1199
                avio_skip(pb, 31 - len);
1200 1201 1202
            /* 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');
1203

1204 1205
            st->codec->bits_per_coded_sample = avio_rb16(pb); /* depth */
            st->codec->color_table_id = avio_rb16(pb); /* colortable id */
L
Luca Barbato 已提交
1206
            av_dlog(c->fc, "depth %d, ctab id %d\n",
1207
                   st->codec->bits_per_coded_sample, st->codec->color_table_id);
1208
            /* figure out the palette situation */
1209 1210
            color_depth = st->codec->bits_per_coded_sample & 0x1F;
            color_greyscale = st->codec->bits_per_coded_sample & 0x20;
1211 1212

            /* if the depth is 2, 4, or 8 bpp, file is palettized */
1213
            if ((color_depth == 2) || (color_depth == 4) ||
1214
                (color_depth == 8)) {
1215 1216 1217 1218
                /* for palette traversal */
                unsigned int color_start, color_count, color_end;
                unsigned char r, g, b;

1219
                if (color_greyscale) {
1220
                    int color_index, color_dec;
1221
                    /* compute the greyscale palette */
1222
                    st->codec->bits_per_coded_sample = color_depth;
1223 1224 1225 1226 1227
                    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;
1228
                        sc->palette[j] =
1229 1230 1231 1232 1233
                            (r << 16) | (g << 8) | (b);
                        color_index -= color_dec;
                        if (color_index < 0)
                            color_index = 0;
                    }
1234
                } else if (st->codec->color_table_id) {
1235
                    const uint8_t *color_table;
1236 1237 1238
                    /* if flag bit 3 is set, use the default palette */
                    color_count = 1 << color_depth;
                    if (color_depth == 2)
M
Michael Niedermayer 已提交
1239
                        color_table = ff_qt_default_palette_4;
1240
                    else if (color_depth == 4)
M
Michael Niedermayer 已提交
1241
                        color_table = ff_qt_default_palette_16;
1242
                    else
M
Michael Niedermayer 已提交
1243
                        color_table = ff_qt_default_palette_256;
1244 1245

                    for (j = 0; j < color_count; j++) {
1246 1247 1248
                        r = color_table[j * 3 + 0];
                        g = color_table[j * 3 + 1];
                        b = color_table[j * 3 + 2];
1249
                        sc->palette[j] =
1250 1251 1252 1253
                            (r << 16) | (g << 8) | (b);
                    }
                } else {
                    /* load the palette from the file */
1254 1255 1256
                    color_start = avio_rb32(pb);
                    color_count = avio_rb16(pb);
                    color_end = avio_rb16(pb);
1257 1258
                    if ((color_start <= 255) &&
                        (color_end <= 255)) {
M
Mike Melanson 已提交
1259 1260 1261 1262
                        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 */
1263 1264 1265 1266 1267 1268 1269 1270
                            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);
1271
                            sc->palette[j] =
M
Mike Melanson 已提交
1272
                                (r << 16) | (g << 8) | (b);
1273
                        }
1274 1275
                    }
                }
1276
                sc->has_palette = 1;
1277
            }
1278
        } else if (st->codec->codec_type==AVMEDIA_TYPE_AUDIO) {
1279
            int bits_per_sample, flags;
1280
            uint16_t version = avio_rb16(pb);
1281

1282
            st->codec->codec_id = id;
1283 1284
            avio_rb16(pb); /* revision level */
            avio_rb32(pb); /* vendor */
1285

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

1290 1291
            sc->audio_cid = avio_rb16(pb);
            avio_rb16(pb); /* packet size = 0 */
1292

1293
            st->codec->sample_rate = ((avio_rb32(pb) >> 16));
1294

1295
            //Read QT version 1 fields. In version 0 these do not exist.
L
Luca Barbato 已提交
1296
            av_dlog(c->fc, "version =%d, isom =%d\n",version,c->isom);
1297 1298
            if (!c->isom) {
                if (version==1) {
1299 1300 1301 1302
                    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 */
1303
                } else if (version==2) {
1304
                    avio_rb32(pb); /* sizeof struct only */
1305
                    st->codec->sample_rate = av_int2double(avio_rb64(pb)); /* float 64 */
1306 1307 1308 1309 1310 1311
                    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 */
1312
                    if (format == MKTAG('l','p','c','m'))
1313
                        st->codec->codec_id = ff_mov_get_lpcm_codec_id(st->codec->bits_per_coded_sample, flags);
1314 1315 1316
                }
            }

1317
            switch (st->codec->codec_id) {
1318 1319
            case CODEC_ID_PCM_S8:
            case CODEC_ID_PCM_U8:
1320
                if (st->codec->bits_per_coded_sample == 16)
1321 1322
                    st->codec->codec_id = CODEC_ID_PCM_S16BE;
                break;
1323
            case CODEC_ID_PCM_S16LE:
1324
            case CODEC_ID_PCM_S16BE:
1325
                if (st->codec->bits_per_coded_sample == 8)
1326
                    st->codec->codec_id = CODEC_ID_PCM_S8;
1327
                else if (st->codec->bits_per_coded_sample == 24)
1328 1329 1330
                    st->codec->codec_id =
                        st->codec->codec_id == CODEC_ID_PCM_S16BE ?
                        CODEC_ID_PCM_S24BE : CODEC_ID_PCM_S24LE;
1331
                break;
1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344
            /* 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;
1345 1346 1347 1348
            case CODEC_ID_GSM:
                sc->samples_per_frame = 160;
                sc->bytes_per_frame = 33;
                break;
1349 1350
            default:
                break;
1351
            }
1352

1353 1354
            bits_per_sample = av_get_bits_per_sample(st->codec->codec_id);
            if (bits_per_sample) {
1355
                st->codec->bits_per_coded_sample = bits_per_sample;
1356 1357
                sc->sample_size = (bits_per_sample >> 3) * st->codec->channels;
            }
1358
        } else if (st->codec->codec_type==AVMEDIA_TYPE_SUBTITLE){
1359 1360
            // ttxt stsd contains display flags, justification, background
            // color, fonts, and default styles, so fake an atom to read it
1361
            MOVAtom fake_atom = { .size = size - (avio_tell(pb) - start_pos) };
1362
            if (format != AV_RL32("mp4s")) // mp4s contains a regular esds atom
R
Reimar Döffinger 已提交
1363
                mov_read_glbl(c, pb, fake_atom);
1364
            st->codec->codec_id= id;
1365 1366
            st->codec->width = sc->width;
            st->codec->height = sc->height;
1367 1368
        } else {
            /* other codec type, just skip (rtp, mp4s, tmcd ...) */
1369
            avio_skip(pb, size - (avio_tell(pb) - start_pos));
1370
        }
1371
        /* this will read extra atoms at the end (wave, alac, damr, avcC, SMI ...) */
1372
        a.size = size - (avio_tell(pb) - start_pos);
1373
        if (a.size > 8) {
1374 1375 1376
            int ret;
            if ((ret = mov_read_default(c, pb, a)) < 0)
                return ret;
1377
        } else if (a.size > 0)
1378
            avio_skip(pb, a.size);
1379
    }
1380

1381
    if (st->codec->codec_type==AVMEDIA_TYPE_AUDIO && st->codec->sample_rate==0 && sc->time_scale>1)
1382
        st->codec->sample_rate= sc->time_scale;
1383

1384
    /* special codec parameters handling */
1385
    switch (st->codec->codec_id) {
1386
#if CONFIG_DV_DEMUXER
1387
    case CODEC_ID_DVAUDIO:
1388
        c->dv_fctx = avformat_alloc_context();
1389
        c->dv_demux = avpriv_dv_init_demux(c->dv_fctx);
1390 1391
        if (!c->dv_demux) {
            av_log(c->fc, AV_LOG_ERROR, "dv demux context init error\n");
1392
            return AVERROR(ENOMEM);
1393 1394 1395 1396
        }
        sc->dv_audio_container = 1;
        st->codec->codec_id = CODEC_ID_PCM_S16LE;
        break;
1397
#endif
1398
    /* no ifdef since parameters are always those */
1399
    case CODEC_ID_QCELP:
1400 1401 1402
        // 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;
1403
        st->codec->frame_size= 160;
1404
        st->codec->channels= 1; /* really needed */
1405
        break;
1406 1407
    case CODEC_ID_AMR_NB:
        st->codec->channels= 1; /* really needed */
1408
        /* force sample rate for amr, stsd in 3gp does not store sample rate */
C
Carl Eugen Hoyos 已提交
1409 1410 1411 1412 1413 1414 1415 1416
        st->codec->sample_rate = 8000;
        /* force frame_size, too, samples_per_frame isn't always set properly */
        st->codec->frame_size  = 160;
        break;
    case CODEC_ID_AMR_WB:
        st->codec->channels    = 1;
        st->codec->sample_rate = 16000;
        st->codec->frame_size  = 320;
1417
        break;
1418
    case CODEC_ID_MP2:
1419
    case CODEC_ID_MP3:
1420
        st->codec->codec_type = AVMEDIA_TYPE_AUDIO; /* force type after stsd for m1a hdlr */
A
Aurelien Jacobs 已提交
1421
        st->need_parsing = AVSTREAM_PARSE_FULL;
1422
        break;
1423
    case CODEC_ID_GSM:
1424 1425
    case CODEC_ID_ADPCM_MS:
    case CODEC_ID_ADPCM_IMA_WAV:
1426
        st->codec->frame_size = sc->samples_per_frame;
1427 1428
        st->codec->block_align = sc->bytes_per_frame;
        break;
1429
    case CODEC_ID_ALAC:
1430
        if (st->codec->extradata_size == 36) {
1431 1432
            st->codec->frame_size = AV_RB32(st->codec->extradata+12);
            st->codec->channels   = AV_RB8 (st->codec->extradata+21);
1433
            st->codec->sample_rate = AV_RB32(st->codec->extradata+32);
1434
        }
1435
        break;
1436 1437 1438
    default:
        break;
    }
1439

1440 1441 1442
    return 0;
}

1443
static int mov_read_stsd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1444 1445 1446
{
    int entries;

1447 1448 1449
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
    entries = avio_rb32(pb);
1450 1451 1452 1453

    return ff_mov_read_stsd_entries(c, pb, entries);
}

1454
static int mov_read_stsc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1455
{
1456 1457
    AVStream *st;
    MOVStreamContext *sc;
1458
    unsigned int i, entries;
1459

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

1465 1466
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
1467

1468
    entries = avio_rb32(pb);
1469

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

A
Alex Converse 已提交
1472 1473
    if (!entries)
        return 0;
1474
    if (entries >= UINT_MAX / sizeof(*sc->stsc_data))
1475
        return AVERROR_INVALIDDATA;
1476 1477
    sc->stsc_data = av_malloc(entries * sizeof(*sc->stsc_data));
    if (!sc->stsc_data)
1478 1479 1480
        return AVERROR(ENOMEM);
    sc->stsc_count = entries;

1481
    for (i=0; i<entries; i++) {
1482 1483 1484
        sc->stsc_data[i].first = avio_rb32(pb);
        sc->stsc_data[i].count = avio_rb32(pb);
        sc->stsc_data[i].id = avio_rb32(pb);
1485 1486 1487 1488
    }
    return 0;
}

1489
static int mov_read_stps(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1490 1491 1492 1493 1494 1495 1496 1497 1498 1499
{
    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;

1500
    avio_rb32(pb); // version + flags
1501

1502
    entries = avio_rb32(pb);
1503
    if (entries >= UINT_MAX / sizeof(*sc->stps_data))
1504
        return AVERROR_INVALIDDATA;
1505 1506 1507 1508 1509 1510
    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++) {
1511
        sc->stps_data[i] = avio_rb32(pb);
L
Luca Barbato 已提交
1512
        //av_dlog(c->fc, "stps %d\n", sc->stps_data[i]);
1513 1514 1515 1516 1517
    }

    return 0;
}

1518
static int mov_read_stss(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1519
{
1520 1521
    AVStream *st;
    MOVStreamContext *sc;
1522
    unsigned int i, entries;
1523

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

1529 1530
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
1531

1532
    entries = avio_rb32(pb);
1533

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

1536 1537
    if (!entries)
        return 0;
1538
    if (entries >= UINT_MAX / sizeof(int))
1539
        return AVERROR_INVALIDDATA;
B
Baptiste Coudurier 已提交
1540
    sc->keyframes = av_malloc(entries * sizeof(int));
1541
    if (!sc->keyframes)
1542 1543 1544
        return AVERROR(ENOMEM);
    sc->keyframe_count = entries;

1545
    for (i=0; i<entries; i++) {
1546
        sc->keyframes[i] = avio_rb32(pb);
L
Luca Barbato 已提交
1547
        //av_dlog(c->fc, "keyframes[]=%d\n", sc->keyframes[i]);
1548 1549 1550 1551
    }
    return 0;
}

1552
static int mov_read_stsz(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1553
{
1554 1555
    AVStream *st;
    MOVStreamContext *sc;
1556 1557 1558
    unsigned int i, entries, sample_size, field_size, num_bytes;
    GetBitContext gb;
    unsigned char* buf;
1559

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

1565 1566
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
1567

1568
    if (atom.type == MKTAG('s','t','s','z')) {
1569
        sample_size = avio_rb32(pb);
1570 1571 1572
        if (!sc->sample_size) /* do not overwrite value computed in stsd */
            sc->sample_size = sample_size;
        field_size = 32;
1573 1574
    } else {
        sample_size = 0;
1575 1576
        avio_rb24(pb); /* reserved */
        field_size = avio_r8(pb);
1577
    }
1578
    entries = avio_rb32(pb);
1579

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

1582
    sc->sample_count = entries;
1583 1584 1585
    if (sample_size)
        return 0;

1586 1587
    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);
1588
        return AVERROR_INVALIDDATA;
1589 1590
    }

A
Alex Converse 已提交
1591 1592
    if (!entries)
        return 0;
1593
    if (entries >= UINT_MAX / sizeof(int) || entries >= (UINT_MAX - 4) / field_size)
1594
        return AVERROR_INVALIDDATA;
B
Baptiste Coudurier 已提交
1595
    sc->sample_sizes = av_malloc(entries * sizeof(int));
1596
    if (!sc->sample_sizes)
1597 1598
        return AVERROR(ENOMEM);

1599 1600
    num_bytes = (entries*field_size+4)>>3;

1601
    buf = av_malloc(num_bytes+FF_INPUT_BUFFER_PADDING_SIZE);
1602 1603 1604 1605 1606
    if (!buf) {
        av_freep(&sc->sample_sizes);
        return AVERROR(ENOMEM);
    }

1607
    if (avio_read(pb, buf, num_bytes) < num_bytes) {
1608 1609
        av_freep(&sc->sample_sizes);
        av_free(buf);
1610
        return AVERROR_INVALIDDATA;
1611 1612 1613 1614
    }

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

1615
    for (i = 0; i < entries; i++) {
1616
        sc->sample_sizes[i] = get_bits_long(&gb, field_size);
1617 1618
        sc->data_size += sc->sample_sizes[i];
    }
1619 1620

    av_free(buf);
1621 1622 1623
    return 0;
}

1624
static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1625
{
1626 1627
    AVStream *st;
    MOVStreamContext *sc;
1628
    unsigned int i, entries;
1629 1630
    int64_t duration=0;
    int64_t total_sample_count=0;
1631

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

1637 1638 1639
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
    entries = avio_rb32(pb);
1640

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

A
Alex Converse 已提交
1644 1645 1646
    if (!entries)
        return 0;
    if (entries >= UINT_MAX / sizeof(*sc->stts_data))
L
Luca Barbato 已提交
1647
        return AVERROR(EINVAL);
1648

1649
    sc->stts_data = av_malloc(entries * sizeof(*sc->stts_data));
1650
    if (!sc->stts_data)
1651
        return AVERROR(ENOMEM);
1652

1653
    sc->stts_count = entries;
1654

1655
    for (i=0; i<entries; i++) {
M
cleanup  
Michael Niedermayer 已提交
1656 1657
        int sample_duration;
        int sample_count;
1658

1659 1660
        sample_count=avio_rb32(pb);
        sample_duration = avio_rb32(pb);
1661 1662 1663
        sc->stts_data[i].count= sample_count;
        sc->stts_data[i].duration= sample_duration;

1664 1665
        av_dlog(c->fc, "sample_count=%d, sample_duration=%d\n",
                sample_count, sample_duration);
1666

B
Baptiste Coudurier 已提交
1667
        duration+=(int64_t)sample_duration*sample_count;
1668 1669 1670
        total_sample_count+=sample_count;
    }

1671
    st->nb_frames= total_sample_count;
1672
    if (duration)
1673
        st->duration= duration;
1674
    sc->track_end = duration;
1675 1676 1677
    return 0;
}

1678
static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
M
Michael Niedermayer 已提交
1679
{
1680 1681
    AVStream *st;
    MOVStreamContext *sc;
M
Michael Niedermayer 已提交
1682 1683
    unsigned int i, entries;

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

1689 1690 1691
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
    entries = avio_rb32(pb);
1692

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

A
Alex Converse 已提交
1695 1696
    if (!entries)
        return 0;
1697
    if (entries >= UINT_MAX / sizeof(*sc->ctts_data))
1698
        return AVERROR_INVALIDDATA;
1699
    sc->ctts_data = av_malloc(entries * sizeof(*sc->ctts_data));
1700
    if (!sc->ctts_data)
1701 1702
        return AVERROR(ENOMEM);
    sc->ctts_count = entries;
1703

1704
    for (i=0; i<entries; i++) {
1705 1706
        int count    =avio_rb32(pb);
        int duration =avio_rb32(pb);
1707 1708 1709

        sc->ctts_data[i].count   = count;
        sc->ctts_data[i].duration= duration;
1710 1711
        if (duration < 0)
            sc->dts_shift = FFMAX(sc->dts_shift, -duration);
M
Michael Niedermayer 已提交
1712
    }
1713

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

M
Michael Niedermayer 已提交
1716 1717 1718
    return 0;
}

1719 1720 1721
static void mov_build_index(MOVContext *mov, AVStream *st)
{
    MOVStreamContext *sc = st->priv_data;
1722
    int64_t current_offset;
1723 1724 1725 1726
    int64_t current_dts = 0;
    unsigned int stts_index = 0;
    unsigned int stsc_index = 0;
    unsigned int stss_index = 0;
1727
    unsigned int stps_index = 0;
1728
    unsigned int i, j;
1729
    uint64_t stream_size = 0;
1730

1731
    /* adjust first dts according to edit list */
1732
    if (sc->time_offset && mov->time_scale > 0) {
1733 1734 1735
        if (sc->time_offset < 0)
            sc->time_offset = av_rescale(sc->time_offset, sc->time_scale, mov->time_scale);
        current_dts = -sc->time_offset;
1736
        if (sc->ctts_data && sc->stts_data && sc->stts_data[0].duration &&
1737
            sc->ctts_data[0].duration / sc->stts_data[0].duration > 16) {
1738 1739 1740 1741 1742
            /* 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;
        }
1743 1744
    }

1745
    /* only use old uncompressed audio chunk demuxing when stts specifies it */
1746
    if (!(st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1747
          sc->stts_count == 1 && sc->stts_data[0].duration == 1)) {
1748 1749
        unsigned int current_sample = 0;
        unsigned int stts_sample = 0;
1750
        unsigned int sample_size;
1751 1752 1753
        unsigned int distance = 0;
        int key_off = sc->keyframes && sc->keyframes[0] == 1;

1754 1755
        current_dts -= sc->dts_shift;

A
Alex Converse 已提交
1756 1757
        if (!sc->sample_count)
            return;
1758 1759 1760 1761 1762 1763 1764
        if (sc->sample_count >= UINT_MAX / sizeof(*st->index_entries))
            return;
        st->index_entries = av_malloc(sc->sample_count*sizeof(*st->index_entries));
        if (!st->index_entries)
            return;
        st->index_entries_allocated_size = sc->sample_count*sizeof(*st->index_entries);

1765 1766
        for (i = 0; i < sc->chunk_count; i++) {
            current_offset = sc->chunk_offsets[i];
1767
            while (stsc_index + 1 < sc->stsc_count &&
1768
                i + 1 == sc->stsc_data[stsc_index + 1].first)
1769
                stsc_index++;
1770
            for (j = 0; j < sc->stsc_data[stsc_index].count; j++) {
1771
                int keyframe = 0;
1772 1773
                if (current_sample >= sc->sample_count) {
                    av_log(mov->fc, AV_LOG_ERROR, "wrong sample count\n");
1774
                    return;
1775
                }
1776 1777 1778

                if (!sc->keyframe_count || current_sample+key_off == sc->keyframes[stss_index]) {
                    keyframe = 1;
1779 1780
                    if (stss_index + 1 < sc->keyframe_count)
                        stss_index++;
1781 1782 1783 1784
                } 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++;
1785
                }
1786 1787
                if (keyframe)
                    distance = 0;
1788
                sample_size = sc->sample_size > 0 ? sc->sample_size : sc->sample_sizes[current_sample];
1789
                if (sc->pseudo_stream_id == -1 ||
1790
                   sc->stsc_data[stsc_index].id - 1 == sc->pseudo_stream_id) {
1791 1792 1793 1794 1795 1796
                    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 已提交
1797
                    av_dlog(mov->fc, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "
1798 1799 1800
                            "size %d, distance %d, keyframe %d\n", st->index, current_sample,
                            current_offset, current_dts, sample_size, distance, keyframe);
                }
1801

1802
                current_offset += sample_size;
1803
                stream_size += sample_size;
1804
                current_dts += sc->stts_data[stts_index].duration;
1805 1806 1807 1808 1809 1810 1811 1812 1813
                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++;
                }
            }
        }
1814 1815
        if (st->duration > 0)
            st->codec->bit_rate = stream_size*8*sc->time_scale/st->duration;
1816
    } else {
1817
        unsigned chunk_samples, total = 0;
1818

1819 1820 1821
        // compute total chunk count
        for (i = 0; i < sc->stsc_count; i++) {
            unsigned count, chunk_count;
1822

1823
            chunk_samples = sc->stsc_data[i].count;
1824 1825 1826 1827 1828
            if (sc->samples_per_frame && chunk_samples % sc->samples_per_frame) {
                av_log(mov->fc, AV_LOG_ERROR, "error unaligned chunk\n");
                return;
            }

1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844
            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 已提交
1845
        av_dlog(mov->fc, "chunk count %d\n", total);
1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860
        if (total >= UINT_MAX / sizeof(*st->index_entries))
            return;
        st->index_entries = av_malloc(total*sizeof(*st->index_entries));
        if (!st->index_entries)
            return;
        st->index_entries_allocated_size = total*sizeof(*st->index_entries);

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

1861
            while (chunk_samples > 0) {
1862
                AVIndexEntry *e;
1863 1864 1865 1866 1867 1868 1869 1870 1871 1872
                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;
1873
                    } else {
1874 1875
                        samples = FFMIN(1024, chunk_samples);
                        size = samples * sc->sample_size;
1876 1877
                    }
                }
1878

1879 1880 1881 1882 1883 1884 1885 1886 1887 1888
                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 已提交
1889
                av_dlog(mov->fc, "AVIndex stream %d, chunk %d, offset %"PRIx64", dts %"PRId64", "
1890
                        "size %d, duration %d\n", st->index, i, current_offset, current_dts,
1891 1892 1893
                        size, samples);

                current_offset += size;
1894
                current_dts += samples;
1895
                chunk_samples -= samples;
1896 1897 1898 1899
            }
        }
    }
}
1900

1901 1902
static int mov_open_dref(AVIOContext **pb, char *src, MOVDref *ref,
                         AVIOInterruptCB *int_cb)
1903
{
1904 1905
    /* try relative path, we do not try the absolute because it can leak information about our
       system to an attacker */
1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927
    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 */
1928
        if (i == ref->nlvl_to - 1 && src_path - src  < sizeof(filename)) {
1929 1930 1931 1932 1933 1934 1935 1936
            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);

1937
            if (!avio_open2(pb, filename, AVIO_FLAG_READ, int_cb, NULL))
1938 1939 1940 1941 1942
                return 0;
        }
    }

    return AVERROR(ENOENT);
M
Mans Rullgard 已提交
1943
}
1944

1945
static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1946 1947 1948
{
    AVStream *st;
    MOVStreamContext *sc;
1949
    int ret;
1950

1951
    st = avformat_new_stream(c->fc, NULL);
B
Baptiste Coudurier 已提交
1952
    if (!st) return AVERROR(ENOMEM);
1953
    st->id = c->fc->nb_streams;
B
Baptiste Coudurier 已提交
1954
    sc = av_mallocz(sizeof(MOVStreamContext));
1955
    if (!sc) return AVERROR(ENOMEM);
1956 1957

    st->priv_data = sc;
1958
    st->codec->codec_type = AVMEDIA_TYPE_DATA;
1959
    sc->ffindex = st->index;
1960

1961 1962 1963 1964
    if ((ret = mov_read_default(c, pb, atom)) < 0)
        return ret;

    /* sanity checks */
1965 1966
    if (sc->chunk_count && (!sc->stts_count || !sc->stsc_count ||
                            (!sc->sample_size && !sc->sample_count))) {
1967 1968
        av_log(c->fc, AV_LOG_ERROR, "stream %d, missing mandatory atoms, broken header\n",
               st->index);
1969 1970
        return 0;
    }
1971

1972
    if (sc->time_scale <= 0) {
1973
        av_log(c->fc, AV_LOG_WARNING, "stream %d, timescale not set\n", st->index);
1974
        sc->time_scale = c->time_scale;
1975
        if (sc->time_scale <= 0)
1976 1977
            sc->time_scale = 1;
    }
1978

1979
    avpriv_set_pts_info(st, 64, 1, sc->time_scale);
1980

1981
    if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1982 1983 1984
        !st->codec->frame_size && sc->stts_count == 1) {
        st->codec->frame_size = av_rescale(sc->stts_data[0].duration,
                                           st->codec->sample_rate, sc->time_scale);
L
Luca Barbato 已提交
1985
        av_dlog(c->fc, "frame size %d\n", st->codec->frame_size);
1986
    }
1987 1988 1989 1990

    mov_build_index(c, st);

    if (sc->dref_id-1 < sc->drefs_count && sc->drefs[sc->dref_id-1].path) {
1991
        MOVDref *dref = &sc->drefs[sc->dref_id - 1];
1992
        if (mov_open_dref(&sc->pb, c->fc->filename, dref, &c->fc->interrupt_callback) < 0)
1993 1994 1995 1996 1997
            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);
1998 1999 2000
    } else
        sc->pb = c->fc->pb;

2001
    if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2002 2003 2004 2005
        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);
2006 2007 2008 2009
        }

        av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
                  sc->time_scale*st->nb_frames, st->duration, INT_MAX);
2010 2011 2012 2013

        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);
2014 2015
    }

2016
    switch (st->codec->codec_id) {
2017
#if CONFIG_H261_DECODER
2018 2019
    case CODEC_ID_H261:
#endif
2020
#if CONFIG_H263_DECODER
2021 2022
    case CODEC_ID_H263:
#endif
2023 2024 2025
#if CONFIG_H264_DECODER
    case CODEC_ID_H264:
#endif
2026
#if CONFIG_MPEG4_DECODER
2027 2028
    case CODEC_ID_MPEG4:
#endif
2029
        st->codec->width = 0; /* let decoder init width/height */
2030 2031 2032
        st->codec->height= 0;
        break;
    }
B
Baptiste Coudurier 已提交
2033 2034 2035

    /* Do not need those anymore. */
    av_freep(&sc->chunk_offsets);
2036
    av_freep(&sc->stsc_data);
B
Baptiste Coudurier 已提交
2037 2038 2039
    av_freep(&sc->sample_sizes);
    av_freep(&sc->keyframes);
    av_freep(&sc->stts_data);
2040
    av_freep(&sc->stps_data);
B
Baptiste Coudurier 已提交
2041

2042
    return 0;
2043 2044
}

2045
static int mov_read_ilst(MOVContext *c, AVIOContext *pb, MOVAtom atom)
2046 2047 2048 2049 2050 2051 2052 2053
{
    int ret;
    c->itunes_metadata = 1;
    ret = mov_read_default(c, pb, atom);
    c->itunes_metadata = 0;
    return ret;
}

2054
static int mov_read_meta(MOVContext *c, AVIOContext *pb, MOVAtom atom)
2055
{
2056
    while (atom.size > 8) {
2057
        uint32_t tag = avio_rl32(pb);
2058 2059
        atom.size -= 4;
        if (tag == MKTAG('h','d','l','r')) {
A
Anton Khirnov 已提交
2060
            avio_seek(pb, -8, SEEK_CUR);
2061 2062 2063 2064 2065
            atom.size += 8;
            return mov_read_default(c, pb, atom);
        }
    }
    return 0;
2066 2067
}

2068
static int mov_read_tkhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
2069
{
2070 2071 2072 2073 2074
    int i;
    int width;
    int height;
    int64_t disp_transform[2];
    int display_matrix[3][2];
2075 2076 2077 2078 2079 2080 2081 2082
    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;
2083

2084 2085
    version = avio_r8(pb);
    avio_rb24(pb); /* flags */
2086 2087 2088 2089 2090 2091 2092
    /*
    MOV_TRACK_ENABLED 0x0001
    MOV_TRACK_IN_MOVIE 0x0002
    MOV_TRACK_IN_PREVIEW 0x0004
    MOV_TRACK_IN_POSTER 0x0008
    */

B
Baptiste Coudurier 已提交
2093
    if (version == 1) {
2094 2095
        avio_rb64(pb);
        avio_rb64(pb);
B
Baptiste Coudurier 已提交
2096
    } else {
2097 2098
        avio_rb32(pb); /* creation time */
        avio_rb32(pb); /* modification time */
B
Baptiste Coudurier 已提交
2099
    }
2100 2101
    st->id = (int)avio_rb32(pb); /* track id (NOT 0 !)*/
    avio_rb32(pb); /* reserved */
2102

2103
    /* highlevel (considering edits) duration in movie timebase */
2104 2105 2106
    (version == 1) ? avio_rb64(pb) : avio_rb32(pb);
    avio_rb32(pb); /* reserved */
    avio_rb32(pb); /* reserved */
2107

2108 2109 2110 2111
    avio_rb16(pb); /* layer */
    avio_rb16(pb); /* alternate group */
    avio_rb16(pb); /* volume */
    avio_rb16(pb); /* reserved */
2112

2113 2114 2115 2116
    //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++) {
2117 2118 2119
        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)
2120
    }
2121

2122 2123
    width = avio_rb32(pb);       // 16.16 fixed point track width
    height = avio_rb32(pb);      // 16.16 fixed point track height
2124 2125
    sc->width = width >> 16;
    sc->height = height >> 16;
2126

2127
    // transform the display width/height according to the matrix
2128
    // skip this if the display matrix is the default identity matrix
2129
    // or if it is rotating the picture, ex iPhone 3GS
2130 2131
    // to keep the same scale, use [width height 1<<16]
    if (width && height &&
2132 2133 2134 2135 2136
        ((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])) {
2137 2138 2139 2140 2141 2142 2143
        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
2144
        st->sample_aspect_ratio = av_d2q(
2145 2146 2147
            ((double) disp_transform[0] * height) /
            ((double) disp_transform[1] * width), INT_MAX);
    }
2148 2149 2150
    return 0;
}

2151
static int mov_read_tfhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
B
Baptiste Coudurier 已提交
2152 2153 2154 2155 2156
{
    MOVFragment *frag = &c->fragment;
    MOVTrackExt *trex = NULL;
    int flags, track_id, i;

2157 2158
    avio_r8(pb); /* version */
    flags = avio_rb24(pb);
B
Baptiste Coudurier 已提交
2159

2160
    track_id = avio_rb32(pb);
2161
    if (!track_id)
2162
        return AVERROR_INVALIDDATA;
B
Baptiste Coudurier 已提交
2163 2164 2165 2166 2167 2168 2169 2170
    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");
2171
        return AVERROR_INVALIDDATA;
B
Baptiste Coudurier 已提交
2172 2173
    }

2174 2175 2176 2177 2178 2179 2180 2181 2182 2183
    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 已提交
2184
    av_dlog(c->fc, "frag flags 0x%x\n", frag->flags);
B
Baptiste Coudurier 已提交
2185 2186 2187
    return 0;
}

2188
static int mov_read_chap(MOVContext *c, AVIOContext *pb, MOVAtom atom)
D
David Conrad 已提交
2189
{
2190
    c->chapter_track = avio_rb32(pb);
D
David Conrad 已提交
2191 2192 2193
    return 0;
}

2194
static int mov_read_trex(MOVContext *c, AVIOContext *pb, MOVAtom atom)
B
Baptiste Coudurier 已提交
2195 2196 2197 2198
{
    MOVTrackExt *trex;

    if ((uint64_t)c->trex_count+1 >= UINT_MAX / sizeof(*c->trex_data))
2199
        return AVERROR_INVALIDDATA;
2200 2201
    trex = av_realloc(c->trex_data, (c->trex_count+1)*sizeof(*c->trex_data));
    if (!trex)
B
Baptiste Coudurier 已提交
2202
        return AVERROR(ENOMEM);
2203
    c->trex_data = trex;
B
Baptiste Coudurier 已提交
2204
    trex = &c->trex_data[c->trex_count++];
2205 2206 2207 2208 2209 2210 2211
    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 已提交
2212 2213 2214
    return 0;
}

2215
static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
B
Baptiste Coudurier 已提交
2216 2217
{
    MOVFragment *frag = &c->fragment;
2218
    AVStream *st = NULL;
2219
    MOVStreamContext *sc;
2220
    MOVStts *ctts_data;
B
Baptiste Coudurier 已提交
2221 2222 2223 2224
    uint64_t offset;
    int64_t dts;
    int data_offset = 0;
    unsigned entries, first_sample_flags = frag->flags;
2225
    int flags, distance, i, found_keyframe = 0;
B
Baptiste Coudurier 已提交
2226

2227 2228 2229 2230 2231 2232 2233 2234
    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);
2235
        return AVERROR_INVALIDDATA;
2236
    }
2237
    sc = st->priv_data;
B
Baptiste Coudurier 已提交
2238 2239
    if (sc->pseudo_stream_id+1 != frag->stsd_id)
        return 0;
2240 2241 2242
    avio_r8(pb); /* version */
    flags = avio_rb24(pb);
    entries = avio_rb32(pb);
L
Luca Barbato 已提交
2243
    av_dlog(c->fc, "flags 0x%x entries %d\n", flags, entries);
2244 2245 2246 2247 2248 2249 2250 2251 2252 2253

    /* 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));
2254
        if (!ctts_data)
B
Baptiste Coudurier 已提交
2255
            return AVERROR(ENOMEM);
2256
        sc->ctts_data = ctts_data;
2257 2258 2259
        sc->ctts_data[sc->ctts_count].count = sc->sample_count;
        sc->ctts_data[sc->ctts_count].duration = 0;
        sc->ctts_count++;
B
Baptiste Coudurier 已提交
2260
    }
2261
    if ((uint64_t)entries+sc->ctts_count >= UINT_MAX/sizeof(*sc->ctts_data))
2262
        return AVERROR_INVALIDDATA;
2263 2264 2265 2266 2267 2268
    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;

2269 2270
    if (flags & MOV_TRUN_DATA_OFFSET)        data_offset        = avio_rb32(pb);
    if (flags & MOV_TRUN_FIRST_SAMPLE_FLAGS) first_sample_flags = avio_rb32(pb);
2271
    dts    = sc->track_end - sc->time_offset;
B
Baptiste Coudurier 已提交
2272 2273
    offset = frag->base_data_offset + data_offset;
    distance = 0;
L
Luca Barbato 已提交
2274
    av_dlog(c->fc, "first sample flags 0x%x\n", first_sample_flags);
B
Baptiste Coudurier 已提交
2275 2276 2277 2278
    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;
2279
        int keyframe = 0;
B
Baptiste Coudurier 已提交
2280

2281 2282 2283
        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);
2284
        sc->ctts_data[sc->ctts_count].count = 1;
2285 2286
        sc->ctts_data[sc->ctts_count].duration = (flags & MOV_TRUN_SAMPLE_CTS) ?
                                                  avio_rb32(pb) : 0;
2287
        sc->ctts_count++;
2288 2289 2290 2291 2292 2293 2294
        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 已提交
2295 2296 2297
            distance = 0;
        av_add_index_entry(st, offset, dts, sample_size, distance,
                           keyframe ? AVINDEX_KEYFRAME : 0);
L
Luca Barbato 已提交
2298
        av_dlog(c->fc, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "
B
Baptiste Coudurier 已提交
2299 2300 2301
                "size %d, distance %d, keyframe %d\n", st->index, sc->sample_count+i,
                offset, dts, sample_size, distance, keyframe);
        distance++;
2302
        dts += sample_duration;
B
Baptiste Coudurier 已提交
2303
        offset += sample_size;
2304
        sc->data_size += sample_size;
B
Baptiste Coudurier 已提交
2305 2306
    }
    frag->moof_offset = offset;
2307
    st->duration = sc->track_end = dts + sc->time_offset;
B
Baptiste Coudurier 已提交
2308 2309 2310
    return 0;
}

2311 2312 2313
/* 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/ */
2314
static int mov_read_wide(MOVContext *c, AVIOContext *pb, MOVAtom atom)
2315 2316 2317 2318 2319
{
    int err;

    if (atom.size < 8)
        return 0; /* continue */
2320
    if (avio_rb32(pb) != 0) { /* 0 sized mdat atom... use the 'wide' atom size */
2321
        avio_skip(pb, atom.size - 4);
2322 2323
        return 0;
    }
2324
    atom.type = avio_rl32(pb);
2325
    atom.size -= 8;
2326
    if (atom.type != MKTAG('m','d','a','t')) {
2327
        avio_skip(pb, atom.size);
2328 2329 2330 2331 2332 2333
        return 0;
    }
    err = mov_read_mdat(c, pb, atom);
    return err;
}

2334
static int mov_read_cmov(MOVContext *c, AVIOContext *pb, MOVAtom atom)
2335
{
2336
#if CONFIG_ZLIB
2337
    AVIOContext ctx;
2338 2339
    uint8_t *cmov_data;
    uint8_t *moov_data; /* uncompressed data */
2340
    long cmov_len, moov_len;
2341
    int ret = -1;
2342

2343 2344
    avio_rb32(pb); /* dcom atom */
    if (avio_rl32(pb) != MKTAG('d','c','o','m'))
2345
        return AVERROR_INVALIDDATA;
2346
    if (avio_rl32(pb) != MKTAG('z','l','i','b')) {
B
Benoit Fouet 已提交
2347
        av_log(c->fc, AV_LOG_ERROR, "unknown compression for cmov atom !");
2348
        return AVERROR_INVALIDDATA;
2349
    }
2350 2351
    avio_rb32(pb); /* cmvd atom */
    if (avio_rl32(pb) != MKTAG('c','m','v','d'))
2352
        return AVERROR_INVALIDDATA;
2353
    moov_len = avio_rb32(pb); /* uncompressed size */
2354
    cmov_len = atom.size - 6 * 4;
2355

B
Baptiste Coudurier 已提交
2356
    cmov_data = av_malloc(cmov_len);
2357
    if (!cmov_data)
2358
        return AVERROR(ENOMEM);
B
Baptiste Coudurier 已提交
2359
    moov_data = av_malloc(moov_len);
2360 2361
    if (!moov_data) {
        av_free(cmov_data);
2362
        return AVERROR(ENOMEM);
2363
    }
2364
    avio_read(pb, cmov_data, cmov_len);
2365
    if (uncompress (moov_data, (uLongf *) &moov_len, (const Bytef *)cmov_data, cmov_len) != Z_OK)
2366
        goto free_and_return;
2367
    if (ffio_init_context(&ctx, moov_data, moov_len, 0, NULL, NULL, NULL, NULL) != 0)
2368
        goto free_and_return;
2369
    atom.type = MKTAG('m','o','o','v');
2370 2371
    atom.size = moov_len;
    ret = mov_read_default(c, &ctx, atom);
2372
free_and_return:
2373 2374 2375
    av_free(moov_data);
    av_free(cmov_data);
    return ret;
2376 2377
#else
    av_log(c->fc, AV_LOG_ERROR, "this file requires zlib support compiled in\n");
2378
    return AVERROR(ENOSYS);
2379
#endif
2380
}
2381

G
Gael Chardon 已提交
2382
/* edit list atom */
2383
static int mov_read_elst(MOVContext *c, AVIOContext *pb, MOVAtom atom)
G
Gael Chardon 已提交
2384
{
2385
    MOVStreamContext *sc;
2386
    int i, edit_count, version;
B
Baptiste Coudurier 已提交
2387

2388 2389 2390 2391
    if (c->fc->nb_streams < 1)
        return 0;
    sc = c->fc->streams[c->fc->nb_streams-1]->priv_data;

2392
    version = avio_r8(pb); /* version */
2393 2394
    avio_rb24(pb); /* flags */
    edit_count = avio_rb32(pb); /* entries */
B
Baptiste Coudurier 已提交
2395

2396
    if ((uint64_t)edit_count*12+8 > atom.size)
2397
        return AVERROR_INVALIDDATA;
2398

2399
    for (i=0; i<edit_count; i++){
2400 2401 2402 2403 2404 2405 2406
        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 已提交
2407
            time     = (int32_t)avio_rb32(pb); /* media time */
2408
        }
2409
        avio_rb32(pb); /* Media rate */
2410 2411
        if (i == 0 && time >= -1) {
            sc->time_offset = time != -1 ? time : -duration;
2412
        }
B
Baptiste Coudurier 已提交
2413
    }
2414

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

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

2423
static const MOVParseTableEntry mov_default_parse_table[] = {
2424
{ MKTAG('a','v','s','s'), mov_read_extradata },
D
David Conrad 已提交
2425
{ MKTAG('c','h','p','l'), mov_read_chpl },
2426 2427 2428 2429 2430 2431 2432
{ 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 },
2433
{ MKTAG('f','i','e','l'), mov_read_fiel },
2434 2435 2436
{ MKTAG('f','t','y','p'), mov_read_ftyp },
{ MKTAG('g','l','b','l'), mov_read_glbl },
{ MKTAG('h','d','l','r'), mov_read_hdlr },
2437
{ MKTAG('i','l','s','t'), mov_read_ilst },
2438 2439 2440 2441
{ 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 },
2442
{ MKTAG('m','e','t','a'), mov_read_meta },
2443 2444 2445 2446 2447 2448 2449 2450
{ 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 },
2451
{ MKTAG('p','a','s','p'), mov_read_pasp },
2452 2453
{ MKTAG('s','t','b','l'), mov_read_default },
{ MKTAG('s','t','c','o'), mov_read_stco },
2454
{ MKTAG('s','t','p','s'), mov_read_stps },
M
Martin Storsjö 已提交
2455
{ MKTAG('s','t','r','f'), mov_read_strf },
2456 2457 2458 2459 2460
{ 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 },
2461
{ MKTAG('s','t','z','2'), mov_read_stsz }, /* compact sample size */
2462 2463 2464 2465
{ 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 已提交
2466 2467
{ MKTAG('t','r','e','f'), mov_read_default },
{ MKTAG('c','h','a','p'), mov_read_chap },
2468 2469
{ MKTAG('t','r','e','x'), mov_read_trex },
{ MKTAG('t','r','u','n'), mov_read_trun },
B
Baptiste Coudurier 已提交
2470
{ MKTAG('u','d','t','a'), mov_read_default },
2471 2472
{ MKTAG('w','a','v','e'), mov_read_wave },
{ MKTAG('e','s','d','s'), mov_read_esds },
2473
{ MKTAG('d','a','c','3'), mov_read_dac3 }, /* AC-3 info */
2474
{ MKTAG('w','i','d','e'), mov_read_wide }, /* place holder */
2475
{ MKTAG('w','f','e','x'), mov_read_wfex },
2476
{ MKTAG('c','m','o','v'), mov_read_cmov },
2477
{ MKTAG('c','h','a','n'), mov_read_chan }, /* channel layout */
M
Martin Storsjö 已提交
2478
{ MKTAG('d','v','c','1'), mov_read_dvc1 },
B
Baptiste Coudurier 已提交
2479
{ 0, NULL }
2480 2481
};

F
Fabrice Bellard 已提交
2482 2483
static int mov_probe(AVProbeData *p)
{
2484 2485
    unsigned int offset;
    uint32_t tag;
2486
    int score = 0;
2487

F
Fabrice Bellard 已提交
2488
    /* check file header */
2489
    offset = 0;
2490
    for (;;) {
2491 2492
        /* ignore invalid offset */
        if ((offset + 8) > (unsigned int)p->buf_size)
2493
            return score;
2494
        tag = AV_RL32(p->buf + offset + 4);
2495
        switch(tag) {
2496
        /* check for obvious tags */
2497 2498 2499 2500 2501
        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 */
2502
        case MKTAG('f','t','y','p'):
2503
            return AVPROBE_SCORE_MAX;
2504
        /* those are more common words, so rate then a bit less */
2505 2506 2507 2508 2509
        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'):
2510
            return AVPROBE_SCORE_MAX - 5;
B
Baptiste Coudurier 已提交
2511
        case MKTAG(0x82,0x82,0x7f,0x7d):
2512 2513 2514
        case MKTAG('s','k','i','p'):
        case MKTAG('u','u','i','d'):
        case MKTAG('p','r','f','l'):
2515
            offset = AV_RB32(p->buf+offset) + offset;
2516 2517
            /* if we only find those cause probedata is too small at least rate them */
            score = AVPROBE_SCORE_MAX - 50;
2518 2519 2520
            break;
        default:
            /* unrecognized tag */
2521
            return score;
2522
        }
2523
    }
F
Fabrice Bellard 已提交
2524 2525
}

D
David Conrad 已提交
2526 2527 2528 2529 2530 2531 2532
// 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;
2533
    int i;
D
David Conrad 已提交
2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546

    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;
2547
    cur_pos = avio_tell(sc->pb);
D
David Conrad 已提交
2548 2549 2550 2551

    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;
2552 2553 2554
        uint8_t *title;
        uint16_t ch;
        int len, title_len;
D
David Conrad 已提交
2555

A
Anton Khirnov 已提交
2556
        if (avio_seek(sc->pb, sample->pos, SEEK_SET) != sample->pos) {
D
David Conrad 已提交
2557 2558 2559 2560 2561
            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
2562
        len = avio_rb16(sc->pb);
D
David Conrad 已提交
2563 2564
        if (len > sample->size-2)
            continue;
2565 2566 2567
        title_len = 2*len + 1;
        if (!(title = av_mallocz(title_len)))
            goto finish;
D
David Conrad 已提交
2568 2569 2570 2571

        // 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
2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582
        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)
2583
                    title[len] = 0;
2584 2585 2586
                else
                    avio_get_str(sc->pb, len - 2, title + 2, title_len - 2);
            }
D
David Conrad 已提交
2587 2588
        }

2589
        avpriv_new_chapter(s, i, st->time_base, sample->timestamp, end, title);
2590
        av_freep(&title);
D
David Conrad 已提交
2591 2592
    }
finish:
A
Anton Khirnov 已提交
2593
    avio_seek(sc->pb, cur_pos, SEEK_SET);
D
David Conrad 已提交
2594 2595
}

2596
static int mov_read_header(AVFormatContext *s)
2597
{
2598
    MOVContext *mov = s->priv_data;
2599
    AVIOContext *pb = s->pb;
B
Baptiste Coudurier 已提交
2600
    int err;
2601
    MOVAtom atom = { AV_RL32("root") };
2602 2603

    mov->fc = s;
2604
    /* .mov and .mp4 aren't streamable anyway (only progressive download if moov is before mdat) */
2605
    if (pb->seekable)
A
Anton Khirnov 已提交
2606
        atom.size = avio_size(pb);
2607
    else
B
Baptiste Coudurier 已提交
2608
        atom.size = INT64_MAX;
2609 2610

    /* check MOV header */
B
Baptiste Coudurier 已提交
2611 2612 2613 2614 2615 2616
    if ((err = mov_read_default(mov, pb, atom)) < 0) {
        av_log(s, AV_LOG_ERROR, "error reading header: %d\n", err);
        return err;
    }
    if (!mov->found_moov) {
        av_log(s, AV_LOG_ERROR, "moov atom not found\n");
2617
        return AVERROR_INVALIDDATA;
2618
    }
2619
    av_dlog(mov->fc, "on_parse_exit_offset=%"PRId64"\n", avio_tell(pb));
2620

2621
    if (pb->seekable && mov->chapter_track > 0)
D
David Conrad 已提交
2622 2623
        mov_read_chapters(s);

2624 2625 2626 2627 2628 2629 2630 2631 2632 2633
    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;
        }
    }

2634 2635 2636
    return 0;
}

2637
static AVIndexEntry *mov_find_next_sample(AVFormatContext *s, AVStream **st)
2638
{
2639
    AVIndexEntry *sample = NULL;
2640
    int64_t best_dts = INT64_MAX;
2641
    int i;
B
Baptiste Coudurier 已提交
2642
    for (i = 0; i < s->nb_streams; i++) {
2643 2644
        AVStream *avst = s->streams[i];
        MOVStreamContext *msc = avst->priv_data;
2645
        if (msc->pb && msc->current_sample < avst->nb_index_entries) {
2646
            AVIndexEntry *current_sample = &avst->index_entries[msc->current_sample];
2647
            int64_t dts = av_rescale(current_sample->timestamp, AV_TIME_BASE, msc->time_scale);
L
Luca Barbato 已提交
2648
            av_dlog(s, "stream %d, sample %d, dts %"PRId64"\n", i, msc->current_sample, dts);
2649 2650
            if (!sample || (!s->pb->seekable && current_sample->pos < sample->pos) ||
                (s->pb->seekable &&
2651
                 ((msc->pb != s->pb && dts < best_dts) || (msc->pb == s->pb &&
B
Baptiste Coudurier 已提交
2652
                 ((FFABS(best_dts - dts) <= AV_TIME_BASE && current_sample->pos < sample->pos) ||
2653
                  (FFABS(best_dts - dts) > AV_TIME_BASE && dts < best_dts)))))) {
2654 2655
                sample = current_sample;
                best_dts = dts;
2656
                *st = avst;
2657
            }
2658 2659
        }
    }
2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671
    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);
2672 2673
    if (!sample) {
        mov->found_mdat = 0;
2674 2675 2676 2677 2678
        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 已提交
2679
            s->pb->eof_reached)
B
Baptiste Coudurier 已提交
2680
            return AVERROR_EOF;
2681
        av_dlog(s, "read fragments, offset 0x%"PRIx64"\n", avio_tell(s->pb));
2682 2683
        goto retry;
    }
2684
    sc = st->priv_data;
2685 2686
    /* must be done just before reading, to avoid infinite loop on sample */
    sc->current_sample++;
2687 2688

    if (st->discard != AVDISCARD_ALL) {
A
Anton Khirnov 已提交
2689
        if (avio_seek(sc->pb, sample->pos, SEEK_SET) != sample->pos) {
R
Reimar Döffinger 已提交
2690 2691
            av_log(mov->fc, AV_LOG_ERROR, "stream %d, offset 0x%"PRIx64": partial file\n",
                   sc->ffindex, sample->pos);
2692
            return AVERROR_INVALIDDATA;
R
Reimar Döffinger 已提交
2693 2694
        }
        ret = av_get_packet(sc->pb, pkt, sample->size);
2695 2696
        if (ret < 0)
            return ret;
2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707
        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 已提交
2708 2709
#if CONFIG_DV_DEMUXER
        if (mov->dv_demux && sc->dv_audio_container) {
2710
            avpriv_dv_produce_packet(mov->dv_demux, pkt, pkt->data, pkt->size);
R
Reimar Döffinger 已提交
2711 2712
            av_free(pkt->data);
            pkt->size = 0;
2713
            ret = avpriv_dv_get_packet(mov->dv_demux, pkt);
R
Reimar Döffinger 已提交
2714 2715 2716
            if (ret < 0)
                return ret;
        }
2717
#endif
2718 2719
    }

2720 2721 2722
    pkt->stream_index = sc->ffindex;
    pkt->dts = sample->timestamp;
    if (sc->ctts_data) {
2723
        pkt->pts = pkt->dts + sc->dts_shift + sc->ctts_data[sc->ctts_index].duration;
2724
        /* update ctts context */
2725 2726 2727 2728 2729
        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;
2730
        }
2731 2732
        if (sc->wrong_dts)
            pkt->dts = AV_NOPTS_VALUE;
2733
    } else {
2734
        int64_t next_dts = (sc->current_sample < st->nb_index_entries) ?
2735 2736
            st->index_entries[sc->current_sample].timestamp : st->duration;
        pkt->duration = next_dts - pkt->dts;
2737
        pkt->pts = pkt->dts;
2738
    }
2739 2740
    if (st->discard == AVDISCARD_ALL)
        goto retry;
2741
    pkt->flags |= sample->flags & AVINDEX_KEYFRAME ? AV_PKT_FLAG_KEY : 0;
2742
    pkt->pos = sample->pos;
L
Luca Barbato 已提交
2743
    av_dlog(s, "stream %d, pts %"PRId64", dts %"PRId64", pos 0x%"PRIx64", duration %d\n",
2744
            pkt->stream_index, pkt->pts, pkt->dts, pkt->pos, pkt->duration);
2745 2746
    return 0;
}
2747

2748
static int mov_seek_stream(AVFormatContext *s, AVStream *st, int64_t timestamp, int flags)
2749 2750 2751 2752
{
    MOVStreamContext *sc = st->priv_data;
    int sample, time_sample;
    int i;
2753

2754
    sample = av_index_search_timestamp(st, timestamp, flags);
L
Luca Barbato 已提交
2755
    av_dlog(s, "stream %d, timestamp %"PRId64", sample %d\n", st->index, timestamp, sample);
2756 2757
    if (sample < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
        sample = 0;
2758
    if (sample < 0) /* not sure what to do */
2759
        return AVERROR_INVALIDDATA;
2760
    sc->current_sample = sample;
L
Luca Barbato 已提交
2761
    av_dlog(s, "stream %d, found sample %d\n", st->index, sc->current_sample);
2762 2763 2764 2765
    /* adjust ctts index */
    if (sc->ctts_data) {
        time_sample = 0;
        for (i = 0; i < sc->ctts_count; i++) {
2766 2767
            int next = time_sample + sc->ctts_data[i].count;
            if (next > sc->current_sample) {
2768 2769
                sc->ctts_index = i;
                sc->ctts_sample = sc->current_sample - time_sample;
2770
                break;
2771
            }
2772
            time_sample = next;
2773 2774
        }
    }
2775
    return sample;
2776 2777
}

2778
static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags)
G
Gael Chardon 已提交
2779
{
2780 2781 2782 2783
    AVStream *st;
    int64_t seek_timestamp, timestamp;
    int sample;
    int i;
G
Gael Chardon 已提交
2784

2785
    if (stream_index >= s->nb_streams)
2786
        return AVERROR_INVALIDDATA;
2787 2788
    if (sample_time < 0)
        sample_time = 0;
G
Gael Chardon 已提交
2789

2790
    st = s->streams[stream_index];
2791
    sample = mov_seek_stream(s, st, sample_time, flags);
2792
    if (sample < 0)
2793
        return sample;
G
Gael Chardon 已提交
2794

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

2798 2799
    for (i = 0; i < s->nb_streams; i++) {
        st = s->streams[i];
2800
        if (stream_index == i)
2801
            continue;
G
Gael Chardon 已提交
2802

2803
        timestamp = av_rescale_q(seek_timestamp, s->streams[stream_index]->time_base, st->time_base);
2804
        mov_seek_stream(s, st, timestamp, flags);
2805
    }
G
Gael Chardon 已提交
2806 2807 2808
    return 0;
}

Z
Zdenek Kabelac 已提交
2809
static int mov_read_close(AVFormatContext *s)
2810
{
2811
    MOVContext *mov = s->priv_data;
2812 2813 2814
    int i, j;

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

2818
        av_freep(&sc->ctts_data);
2819
        for (j = 0; j < sc->drefs_count; j++) {
2820
            av_freep(&sc->drefs[j].path);
2821 2822
            av_freep(&sc->drefs[j].dir);
        }
2823 2824
        av_freep(&sc->drefs);
        if (sc->pb && sc->pb != s->pb)
2825
            avio_close(sc->pb);
2826
    }
2827 2828

    if (mov->dv_demux) {
2829
        for (i = 0; i < mov->dv_fctx->nb_streams; i++) {
2830 2831 2832 2833 2834 2835
            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);
    }
2836

B
Baptiste Coudurier 已提交
2837
    av_freep(&mov->trex_data);
2838

2839 2840 2841
    return 0;
}

2842
AVInputFormat ff_mov_demuxer = {
2843 2844 2845 2846 2847 2848 2849 2850
    .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,
2851
};