mov.c 120.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 7 8
 * first version by Francois Revol <revol@free.fr>
 * seek function by Gael Chardon <gael.dev@4now.net>
 *
9 10 11
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
F
Fabrice Bellard 已提交
12 13
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
14
 * version 2.1 of the License, or (at your option) any later version.
15
 *
16
 * FFmpeg is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
F
Fabrice Bellard 已提交
18 19
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
20
 *
F
Fabrice Bellard 已提交
21
 * You should have received a copy of the GNU Lesser General Public
22
 * License along with FFmpeg; if not, write to the Free Software
23
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24
 */
25 26

#include <limits.h>
27
#include <stdint.h>
28

29
//#define MOV_EXPORT_ALL_METADATA
30

31
#include "libavutil/attributes.h"
32
#include "libavutil/channel_layout.h"
33
#include "libavutil/intreadwrite.h"
34
#include "libavutil/intfloat.h"
35
#include "libavutil/mathematics.h"
36
#include "libavutil/avstring.h"
37
#include "libavutil/dict.h"
38
#include "libavutil/opt.h"
39
#include "libavutil/timecode.h"
40
#include "libavcodec/ac3tab.h"
41
#include "avformat.h"
42
#include "internal.h"
43
#include "avio_internal.h"
44
#include "riff.h"
45
#include "isom.h"
46
#include "libavcodec/get_bits.h"
R
Raivo Hool 已提交
47
#include "id3v1.h"
48
#include "mov_chan.h"
49

50
#if CONFIG_ZLIB
51 52 53
#include <zlib.h>
#endif

54 55
#include "qtpalette.h"

G
Gael Chardon 已提交
56

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

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

67
static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom);
68

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

74
    short current, total = 0;
75
    avio_rb16(pb); // unknown
76
    current = avio_rb16(pb);
77 78
    if (len >= 6)
        total = avio_rb16(pb);
79 80 81 82 83
    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 已提交
84 85 86 87

    return 0;
}

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

93 94 95 96
    /* bypass padding bytes */
    avio_r8(pb);
    avio_r8(pb);
    avio_r8(pb);
97

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

101
    return 0;
102 103
}

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

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

112
    return 0;
113 114
}

R
Raivo Hool 已提交
115
static int mov_metadata_gnre(MOVContext *c, AVIOContext *pb,
116 117
                             unsigned len, const char *key)
{
R
Raivo Hool 已提交
118 119
    short genre;
    char buf[20];
120

R
Raivo Hool 已提交
121
    avio_r8(pb); // unknown
122

R
Raivo Hool 已提交
123 124 125 126 127 128 129
    genre = avio_r8(pb);
    if (genre < 1 || genre > ID3v1_GENRE_MAX)
        return 0;
    snprintf(buf, sizeof(buf), "%s", ff_id3v1_genre_str[genre-1]);
    av_dict_set(&c->fc->metadata, key, buf, 0);

    return 0;
130 131
}

J
Justin Greer 已提交
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
static int mov_read_custom_metadata(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
    char key[1024]={0}, data[1024]={0};
    int i;
    AVStream *st;
    MOVStreamContext *sc;

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

    if (atom.size <= 8) return 0;

    for (i = 0; i < 3; i++) { // Parse up to three sub-atoms looking for name and data.
        int data_size = avio_rb32(pb);
        int tag = avio_rl32(pb);
        int str_size = 0, skip_size = 0;
        char *target = NULL;

        switch (tag) {
        case MKTAG('n','a','m','e'):
            avio_rb32(pb); // version/flags
            str_size = skip_size = data_size - 12;
            atom.size -= 12;
            target = key;
            break;
        case MKTAG('d','a','t','a'):
            avio_rb32(pb); // version/flags
            avio_rb32(pb); // reserved (zero)
            str_size = skip_size = data_size - 16;
            atom.size -= 16;
            target = data;
            break;
        default:
            skip_size = data_size - 8;
            str_size = 0;
            break;
        }

        if (target) {
            str_size = FFMIN3(sizeof(data)-1, str_size, atom.size);
            avio_read(pb, target, str_size);
            target[str_size] = 0;
        }
        atom.size -= skip_size;

        // If we didn't read the full data chunk for the sub-atom, skip to the end of it.
        if (skip_size > str_size) avio_skip(pb, skip_size - str_size);
    }

    if (*key && *data) {
        if (strcmp(key, "iTunSMPB") == 0) {
            int priming, remainder, samples;
            if(sscanf(data, "%*X %X %X %X", &priming, &remainder, &samples) == 3){
                if(priming>0 && priming<16384)
                    sc->start_pad = priming;
                return 1;
            }
        }
        if (strcmp(key, "cdec") == 0) {
//             av_dict_set(&st->metadata, key, data, 0);
            return 1;
        }
    }
    return 0;
}

200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
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,
};

219
static int mov_read_mac_string(MOVContext *c, AVIOContext *pb, int len,
220 221 222 223 224 225 226
                               char *dst, int dstlen)
{
    char *p = dst;
    char *end = dst+dstlen-1;
    int i;

    for (i = 0; i < len; i++) {
227
        uint8_t t, c = avio_r8(pb);
228 229
        if (c < 0x80 && p < end)
            *p++ = c;
230
        else if (p < end)
231 232 233 234 235 236
            PUT_UTF8(mac_to_unicode[c-0x80], t, if (p < end) *p++ = t;);
    }
    *p = 0;
    return p - dst;
}

A
Anton Khirnov 已提交
237 238 239 240 241
static int mov_read_covr(MOVContext *c, AVIOContext *pb, int type, int len)
{
    AVPacket pkt;
    AVStream *st;
    MOVStreamContext *sc;
242
    enum AVCodecID id;
A
Anton Khirnov 已提交
243 244 245
    int ret;

    switch (type) {
246 247 248
    case 0xd:  id = AV_CODEC_ID_MJPEG; break;
    case 0xe:  id = AV_CODEC_ID_PNG;   break;
    case 0x1b: id = AV_CODEC_ID_BMP;   break;
A
Anton Khirnov 已提交
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278
    default:
        av_log(c->fc, AV_LOG_WARNING, "Unknown cover type: 0x%x.\n", type);
        avio_skip(pb, len);
        return 0;
    }

    st = avformat_new_stream(c->fc, NULL);
    if (!st)
        return AVERROR(ENOMEM);
    sc = av_mallocz(sizeof(*sc));
    if (!sc)
        return AVERROR(ENOMEM);
    st->priv_data = sc;

    ret = av_get_packet(pb, &pkt, len);
    if (ret < 0)
        return ret;

    st->disposition              |= AV_DISPOSITION_ATTACHED_PIC;

    st->attached_pic              = pkt;
    st->attached_pic.stream_index = st->index;
    st->attached_pic.flags       |= AV_PKT_FLAG_KEY;

    st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
    st->codec->codec_id   = id;

    return 0;
}

279 280 281 282 283 284 285 286 287 288 289
static int mov_metadata_raw(MOVContext *c, AVIOContext *pb,
                            unsigned len, const char *key)
{
    char *value = av_malloc(len + 1);
    if (!value)
        return AVERROR(ENOMEM);
    avio_read(pb, value, len);
    value[len] = 0;
    return av_dict_set(&c->fc->metadata, key, value, AV_DICT_DONT_STRDUP_VAL);
}

290
static int mov_read_udta_string(MOVContext *c, AVIOContext *pb, MOVAtom atom)
291 292 293 294 295 296
{
#ifdef MOV_EXPORT_ALL_METADATA
    char tmp_key[5];
#endif
    char str[1024], key2[16], language[4] = {0};
    const char *key = NULL;
297 298
    uint16_t langcode = 0;
    uint32_t data_type = 0, str_size;
299
    int (*parse)(MOVContext*, AVIOContext*, unsigned, const char*) = NULL;
300

J
Justin Greer 已提交
301 302 303
    if (c->itunes_metadata && atom.type == MKTAG('-','-','-','-'))
        return mov_read_custom_metadata(c, pb, atom);

304 305 306
    switch (atom.type) {
    case MKTAG(0xa9,'n','a','m'): key = "title";     break;
    case MKTAG(0xa9,'a','u','t'):
307
    case MKTAG(0xa9,'A','R','T'): key = "artist";    break;
R
Raivo Hool 已提交
308
    case MKTAG( 'a','A','R','T'): key = "album_artist";    break;
309
    case MKTAG(0xa9,'w','r','t'): key = "composer";  break;
310
    case MKTAG( 'c','p','r','t'):
311
    case MKTAG(0xa9,'c','p','y'): key = "copyright"; break;
312 313
    case MKTAG(0xa9,'g','r','p'): key = "grouping"; break;
    case MKTAG(0xa9,'l','y','r'): key = "lyrics"; break;
314 315 316
    case MKTAG(0xa9,'c','m','t'):
    case MKTAG(0xa9,'i','n','f'): key = "comment";   break;
    case MKTAG(0xa9,'a','l','b'): key = "album";     break;
317
    case MKTAG(0xa9,'d','a','y'): key = "date";      break;
318
    case MKTAG(0xa9,'g','e','n'): key = "genre";     break;
R
Raivo Hool 已提交
319 320
    case MKTAG( 'g','n','r','e'): key = "genre";
        parse = mov_metadata_gnre; break;
321
    case MKTAG(0xa9,'t','o','o'):
322
    case MKTAG(0xa9,'s','w','r'): key = "encoder";   break;
323
    case MKTAG(0xa9,'e','n','c'): key = "encoder";   break;
324 325 326
    case MKTAG(0xa9,'m','a','k'): key = "make";      break;
    case MKTAG(0xa9,'m','o','d'): key = "model";     break;
    case MKTAG(0xa9,'x','y','z'): key = "location";  break;
327 328 329 330 331
    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 已提交
332
    case MKTAG( 't','r','k','n'): key = "track";
333 334 335
        parse = mov_metadata_track_or_disc_number; break;
    case MKTAG( 'd','i','s','k'): key = "disc";
        parse = mov_metadata_track_or_disc_number; break;
336
    case MKTAG( 't','v','e','s'): key = "episode_sort";
337
        parse = mov_metadata_int8_bypass_padding; break;
338
    case MKTAG( 't','v','s','n'): key = "season_number";
339
        parse = mov_metadata_int8_bypass_padding; break;
340
    case MKTAG( 's','t','i','k'): key = "media_type";
341
        parse = mov_metadata_int8_no_padding; break;
342 343 344 345
    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;
346 347 348 349
    case MKTAG( '@','P','R','M'):
        return mov_metadata_raw(c, pb, atom.size, "premiere_version");
    case MKTAG( '@','P','R','Q'):
        return mov_metadata_raw(c, pb, atom.size, "quicktime_version");
350 351 352
    }

    if (c->itunes_metadata && atom.size > 8) {
353 354
        int data_size = avio_rb32(pb);
        int tag = avio_rl32(pb);
355
        if (tag == MKTAG('d','a','t','a')) {
356 357
            data_type = avio_rb32(pb); // type
            avio_rb32(pb); // unknown
358 359
            str_size = data_size - 16;
            atom.size -= 16;
A
Anton Khirnov 已提交
360 361 362 363 364 365 366 367

            if (atom.type == MKTAG('c', 'o', 'v', 'r')) {
                int ret = mov_read_covr(c, pb, data_type, str_size);
                if (ret < 0) {
                    av_log(c->fc, AV_LOG_ERROR, "Error parsing cover art.\n");
                    return ret;
                }
            }
368 369
        } else return 0;
    } else if (atom.size > 4 && key && !c->itunes_metadata) {
370 371
        str_size = avio_rb16(pb); // string length
        langcode = avio_rb16(pb);
372
        ff_mov_lang_to_iso639(langcode, language);
373 374 375 376 377 378 379 380 381 382 383 384 385 386
        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)
387
        return AVERROR_INVALIDDATA;
388 389

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

    if (parse)
392
        parse(c, pb, str_size, key);
B
Baptiste Coudurier 已提交
393
    else {
394
        if (data_type == 3 || (data_type == 0 && (langcode < 0x400 || langcode == 0x7fff))) { // MAC Encoded
395 396
            mov_read_mac_string(c, pb, str_size, str, sizeof(str));
        } else {
397 398 399
            int ret = avio_read(pb, str, str_size);
            if (ret != str_size)
                return ret < 0 ? ret : AVERROR_INVALIDDATA;
400 401
            str[str_size] = 0;
        }
402
        av_dict_set(&c->fc->metadata, key, str, 0);
B
Baptiste Coudurier 已提交
403 404
        if (*language && strcmp(language, "und")) {
            snprintf(key2, sizeof(key2), "%s-%s", key, language);
405
            av_dict_set(&c->fc->metadata, key2, str, 0);
B
Baptiste Coudurier 已提交
406
        }
B
Baptiste Coudurier 已提交
407
    }
408 409 410
    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);
411 412 413

    return 0;
}
414

415
static int mov_read_chpl(MOVContext *c, AVIOContext *pb, MOVAtom atom)
D
David Conrad 已提交
416 417
{
    int64_t start;
D
David Conrad 已提交
418
    int i, nb_chapters, str_len, version;
D
David Conrad 已提交
419 420 421 422 423
    char str[256+1];

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

424 425
    version = avio_r8(pb);
    avio_rb24(pb);
D
David Conrad 已提交
426
    if (version)
427 428
        avio_rb32(pb); // ???
    nb_chapters = avio_r8(pb);
D
David Conrad 已提交
429 430 431 432 433

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

434 435
        start = avio_rb64(pb);
        str_len = avio_r8(pb);
D
David Conrad 已提交
436 437 438 439

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

440
        avio_read(pb, str, str_len);
D
David Conrad 已提交
441
        str[str_len] = 0;
442
        avpriv_new_chapter(c->fc, i, (AVRational){1,10000000}, start, AV_NOPTS_VALUE, str);
D
David Conrad 已提交
443 444 445 446
    }
    return 0;
}

447
#define MIN_DATA_ENTRY_BOX_SIZE 12
448
static int mov_read_dref(MOVContext *c, AVIOContext *pb, MOVAtom atom)
449
{
450 451
    AVStream *st;
    MOVStreamContext *sc;
452 453
    int entries, i, j;

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

459 460
    avio_rb32(pb); // version + flags
    entries = avio_rb32(pb);
461 462
    if (entries >  (atom.size - 1) / MIN_DATA_ENTRY_BOX_SIZE + 1 ||
        entries >= UINT_MAX / sizeof(*sc->drefs))
463
        return AVERROR_INVALIDDATA;
464
    av_free(sc->drefs);
465
    sc->drefs_count = 0;
466
    sc->drefs = av_mallocz(entries * sizeof(*sc->drefs));
467 468 469
    if (!sc->drefs)
        return AVERROR(ENOMEM);
    sc->drefs_count = entries;
470 471

    for (i = 0; i < sc->drefs_count; i++) {
472
        MOVDref *dref = &sc->drefs[i];
473
        uint32_t size = avio_rb32(pb);
474
        int64_t next = avio_tell(pb) + size - 4;
475

476
        if (size < 12)
477
            return AVERROR_INVALIDDATA;
478

479 480
        dref->type = avio_rl32(pb);
        avio_rb32(pb); // version + flags
L
Luca Barbato 已提交
481
        av_dlog(c->fc, "type %.4s size %d\n", (char*)&dref->type, size);
482 483 484 485 486 487

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

488
            avio_skip(pb, 10);
489

490
            volume_len = avio_r8(pb);
491
            volume_len = FFMIN(volume_len, 27);
492
            avio_read(pb, dref->volume, 27);
493 494
            dref->volume[volume_len] = 0;
            av_log(c->fc, AV_LOG_DEBUG, "volume %s, len %d\n", dref->volume, volume_len);
495

496
            avio_skip(pb, 12);
497

498
            len = avio_r8(pb);
499
            len = FFMIN(len, 63);
500
            avio_read(pb, dref->filename, 63);
501 502 503
            dref->filename[len] = 0;
            av_log(c->fc, AV_LOG_DEBUG, "filename %s, len %d\n", dref->filename, len);

504
            avio_skip(pb, 16);
505 506

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

512
            avio_skip(pb, 16);
513

514
            for (type = 0; type != -1 && avio_tell(pb) < next; ) {
515
                if(url_feof(pb))
516
                    return AVERROR_EOF;
517 518
                type = avio_rb16(pb);
                len = avio_rb16(pb);
519 520 521 522
                av_log(c->fc, AV_LOG_DEBUG, "type %d, len %d\n", type, len);
                if (len&1)
                    len += 1;
                if (type == 2) { // absolute path
523
                    av_free(dref->path);
524
                    dref->path = av_mallocz(len+1);
525 526
                    if (!dref->path)
                        return AVERROR(ENOMEM);
527
                    avio_read(pb, dref->path, len);
528
                    if (len > volume_len && !strncmp(dref->path, dref->volume, volume_len)) {
529 530 531 532 533 534 535 536
                        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);
537 538 539 540 541
                } else if (type == 0) { // directory name
                    av_free(dref->dir);
                    dref->dir = av_malloc(len+1);
                    if (!dref->dir)
                        return AVERROR(ENOMEM);
542 543
                    if (avio_read(pb, dref->dir, len) != len)
                        return AVERROR_INVALIDDATA;
544 545 546 547 548
                    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);
549
                } else
550
                    avio_skip(pb, len);
551 552
            }
        }
A
Anton Khirnov 已提交
553
        avio_seek(pb, next, SEEK_SET);
554 555 556 557
    }
    return 0;
}

558
static int mov_read_hdlr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
559
{
560
    AVStream *st;
561
    uint32_t type;
562
    uint32_t av_unused ctype;
563 564
    int title_size;
    char *title_str;
565

566 567 568 569 570
    if (c->fc->nb_streams < 1) // meta before first trak
        return 0;

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

571 572
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
573 574

    /* component type */
575 576
    ctype = avio_rl32(pb);
    type = avio_rl32(pb); /* component subtype */
577

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

581
    if     (type == MKTAG('v','i','d','e'))
582
        st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
583
    else if (type == MKTAG('s','o','u','n'))
584
        st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
585
    else if (type == MKTAG('m','1','a',' '))
586
        st->codec->codec_id = AV_CODEC_ID_MP2;
587
    else if ((type == MKTAG('s','u','b','p')) || (type == MKTAG('c','l','c','p')))
588
        st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
589

590 591 592
    avio_rb32(pb); /* component  manufacture */
    avio_rb32(pb); /* component flags */
    avio_rb32(pb); /* component flags mask */
593

594 595 596 597 598 599 600
    title_size = atom.size - 24;
    if (title_size > 0) {
        title_str = av_malloc(title_size + 1); /* Add null terminator */
        if (!title_str)
            return AVERROR(ENOMEM);
        avio_read(pb, title_str, title_size);
        title_str[title_size] = 0;
601 602 603
        if (title_str[0])
            av_dict_set(&st->metadata, "handler_name", title_str +
                        (!c->isom && title_str[0] == title_size - 1), 0);
604 605 606
        av_freep(&title_str);
    }

607 608 609
    return 0;
}

610
int ff_mov_read_esds(AVFormatContext *fc, AVIOContext *pb, MOVAtom atom)
611
{
612
    AVStream *st;
613
    int tag;
614

615
    if (fc->nb_streams < 1)
616
        return 0;
617
    st = fc->streams[fc->nb_streams-1];
618

619
    avio_rb32(pb); /* version + flags */
620
    ff_mp4_read_descr(fc, pb, &tag);
621
    if (tag == MP4ESDescrTag) {
622
        ff_mp4_parse_es_descr(pb, NULL);
623
    } else
624
        avio_rb16(pb); /* ID */
625

626
    ff_mp4_read_descr(fc, pb, &tag);
627 628
    if (tag == MP4DecConfigDescrTag)
        ff_mp4_read_dec_config_descr(fc, st, pb);
629 630 631
    return 0;
}

632
static int mov_read_esds(MOVContext *c, AVIOContext *pb, MOVAtom atom)
633 634 635 636
{
    return ff_mov_read_esds(c->fc, pb, atom);
}

637
static int mov_read_dac3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
638 639
{
    AVStream *st;
640
    int ac3info, acmod, lfeon, bsmod;
641

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

646
    ac3info = avio_rb24(pb);
647
    bsmod = (ac3info >> 14) & 0x7;
648 649 650
    acmod = (ac3info >> 11) & 0x7;
    lfeon = (ac3info >> 10) & 0x1;
    st->codec->channels = ((int[]){2,1,2,3,3,4,4,5})[acmod] + lfeon;
651 652 653
    st->codec->channel_layout = avpriv_ac3_channel_layout_tab[acmod];
    if (lfeon)
        st->codec->channel_layout |= AV_CH_LOW_FREQUENCY;
654 655 656
    st->codec->audio_service_type = bsmod;
    if (st->codec->channels > 1 && bsmod == 0x7)
        st->codec->audio_service_type = AV_AUDIO_SERVICE_TYPE_KARAOKE;
657 658 659 660

    return 0;
}

661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688
static int mov_read_dec3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
    AVStream *st;
    int eac3info, acmod, lfeon, bsmod;

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

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

    return 0;
}

689 690 691 692 693 694 695 696 697 698 699
static int mov_read_chan(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];

    if (atom.size < 16)
        return 0;

700 701 702
    /* skip version and flags */
    avio_skip(pb, 4);

703
    ff_mov_read_chan(c->fc, pb, st, atom.size - 4);
704 705 706 707

    return 0;
}

708 709 710 711 712 713 714 715
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];

716 717 718
    if (ff_get_wav_header(pb, st->codec, atom.size) < 0) {
        av_log(c->fc, AV_LOG_WARNING, "get_wav_header failed\n");
    }
719 720 721 722

    return 0;
}

723
static int mov_read_pasp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
724
{
725 726
    const int num = avio_rb32(pb);
    const int den = avio_rb32(pb);
727 728 729 730 731 732
    AVStream *st;

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

733 734 735 736 737 738 739
    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) {
740 741 742 743 744 745
        st->sample_aspect_ratio.num = num;
        st->sample_aspect_ratio.den = den;
    }
    return 0;
}

746
/* this atom contains actual media data */
747
static int mov_read_mdat(MOVContext *c, AVIOContext *pb, MOVAtom atom)
748
{
749
    if (atom.size == 0) /* wrong one (MP4) */
750 751 752 753 754
        return 0;
    c->found_mdat=1;
    return 0; /* now go for moov */
}

755
/* read major brand, minor version and compatible brands and store them as metadata */
756
static int mov_read_ftyp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
757
{
758 759 760 761 762 763
    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};

764
    avio_read(pb, type, 4);
B
Baptiste Coudurier 已提交
765
    if (strcmp(type, "qt  "))
766
        c->isom = 1;
767
    av_log(c->fc, AV_LOG_DEBUG, "ISO: File Type Major Brand: %.4s\n",(char *)&type);
768
    av_dict_set(&c->fc->metadata, "major_brand", type, 0);
769
    minor_ver = avio_rb32(pb); /* minor version */
770
    snprintf(minor_ver_str, sizeof(minor_ver_str), "%d", minor_ver);
771
    av_dict_set(&c->fc->metadata, "minor_version", minor_ver_str, 0);
772 773 774

    comp_brand_size = atom.size - 8;
    if (comp_brand_size < 0)
775
        return AVERROR_INVALIDDATA;
776 777 778
    comp_brands_str = av_malloc(comp_brand_size + 1); /* Add null terminator */
    if (!comp_brands_str)
        return AVERROR(ENOMEM);
779
    avio_read(pb, comp_brands_str, comp_brand_size);
780
    comp_brands_str[comp_brand_size] = 0;
781
    av_dict_set(&c->fc->metadata, "compatible_brands", comp_brands_str, 0);
782 783
    av_freep(&comp_brands_str);

784 785 786
    return 0;
}

787
/* this atom should contain all header atoms */
788
static int mov_read_moov(MOVContext *c, AVIOContext *pb, MOVAtom atom)
789
{
790 791
    int ret;

792 793 794 795 796 797
    if (c->found_moov) {
        av_log(c->fc, AV_LOG_WARNING, "Found duplicated MOOV Atom. Skipped it\n");
        avio_skip(pb, atom.size);
        return 0;
    }

798 799
    if ((ret = mov_read_default(c, pb, atom)) < 0)
        return ret;
800 801 802 803 804 805
    /* 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 */
}

806
static int mov_read_moof(MOVContext *c, AVIOContext *pb, MOVAtom atom)
B
Baptiste Coudurier 已提交
807
{
808
    c->fragment.moof_offset = avio_tell(pb) - 8;
809
    av_dlog(c->fc, "moof offset %"PRIx64"\n", c->fragment.moof_offset);
B
Baptiste Coudurier 已提交
810 811
    return mov_read_default(c, pb, atom);
}
812

813
static void mov_metadata_creation_time(AVDictionary **metadata, int64_t time)
814 815 816
{
    char buffer[32];
    if (time) {
817
        struct tm *ptm;
818
        time_t timet;
819 820
        if(time >= 2082844800)
            time -= 2082844800;  /* seconds between 1904-01-01 and Epoch */
821 822
        timet = time;
        ptm = gmtime(&timet);
823 824
        if (!ptm) return;
        strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", ptm);
825
        av_dict_set(metadata, "creation_time", buffer, 0);
826 827 828
    }
}

829
static int mov_read_mdhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
830
{
831 832 833
    AVStream *st;
    MOVStreamContext *sc;
    int version;
834
    char language[4] = {0};
835
    unsigned lang;
836
    int64_t creation_time;
837

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

843 844 845 846 847
    if (sc->time_scale) {
        av_log(c->fc, AV_LOG_ERROR, "Multiple mdhd?\n");
        return AVERROR_INVALIDDATA;
    }

848
    version = avio_r8(pb);
849
    if (version > 1) {
850
        avpriv_request_sample(c->fc, "Version %d", version);
851 852
        return AVERROR_PATCHWELCOME;
    }
853
    avio_rb24(pb); /* flags */
B
clean  
Baptiste Coudurier 已提交
854
    if (version == 1) {
855 856
        creation_time = avio_rb64(pb);
        avio_rb64(pb);
B
clean  
Baptiste Coudurier 已提交
857
    } else {
858 859
        creation_time = avio_rb32(pb);
        avio_rb32(pb); /* modification time */
B
clean  
Baptiste Coudurier 已提交
860
    }
861
    mov_metadata_creation_time(&st->metadata, creation_time);
862

863 864
    sc->time_scale = avio_rb32(pb);
    st->duration = (version == 1) ? avio_rb64(pb) : avio_rb32(pb); /* duration */
865

866
    lang = avio_rb16(pb); /* language */
867
    if (ff_mov_lang_to_iso639(lang, language))
868
        av_dict_set(&st->metadata, "language", language, 0);
869
    avio_rb16(pb); /* quality */
870 871 872 873

    return 0;
}

874
static int mov_read_mvhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
875
{
876
    int64_t creation_time;
877 878
    int version = avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
879

B
Baptiste Coudurier 已提交
880
    if (version == 1) {
881 882
        creation_time = avio_rb64(pb);
        avio_rb64(pb);
B
Baptiste Coudurier 已提交
883
    } else {
884 885
        creation_time = avio_rb32(pb);
        avio_rb32(pb); /* modification time */
B
Baptiste Coudurier 已提交
886
    }
887
    mov_metadata_creation_time(&c->fc->metadata, creation_time);
888
    c->time_scale = avio_rb32(pb); /* time scale */
889

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

892
    c->duration = (version == 1) ? avio_rb64(pb) : avio_rb32(pb); /* duration */
893 894
    // set the AVCodecContext duration because the duration of individual tracks
    // may be inaccurate
895
    if (c->time_scale > 0 && !c->trex_data)
896
        c->fc->duration = av_rescale(c->duration, AV_TIME_BASE, c->time_scale);
897
    avio_rb32(pb); /* preferred scale */
898

899
    avio_rb16(pb); /* preferred volume */
900

901
    avio_skip(pb, 10); /* reserved */
902

903
    avio_skip(pb, 36); /* display matrix */
904

905 906 907 908 909 910 911
    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 */
912 913 914
    return 0;
}

915
static int mov_read_enda(MOVContext *c, AVIOContext *pb, MOVAtom atom)
916
{
917 918 919 920 921 922
    AVStream *st;
    int little_endian;

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

924
    little_endian = avio_rb16(pb) & 0xFF;
L
Luca Barbato 已提交
925
    av_dlog(c->fc, "enda %d\n", little_endian);
926
    if (little_endian == 1) {
927
        switch (st->codec->codec_id) {
928 929
        case AV_CODEC_ID_PCM_S24BE:
            st->codec->codec_id = AV_CODEC_ID_PCM_S24LE;
930
            break;
931 932
        case AV_CODEC_ID_PCM_S32BE:
            st->codec->codec_id = AV_CODEC_ID_PCM_S32LE;
933
            break;
934 935
        case AV_CODEC_ID_PCM_F32BE:
            st->codec->codec_id = AV_CODEC_ID_PCM_F32LE;
936
            break;
937 938
        case AV_CODEC_ID_PCM_F64BE:
            st->codec->codec_id = AV_CODEC_ID_PCM_F64LE;
939
            break;
940 941 942 943 944 945 946
        default:
            break;
        }
    }
    return 0;
}

947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980
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;
}

981
/* FIXME modify qdm2/svq3/h264 decoders to take full atom as extradata */
982
static int mov_read_extradata(MOVContext *c, AVIOContext *pb, MOVAtom atom,
983
                              enum AVCodecID codec_id)
984
{
985 986
    AVStream *st;
    uint64_t size;
987
    uint8_t *buf;
988
    int err;
989 990 991 992

    if (c->fc->nb_streams < 1) // will happen with jp2 files
        return 0;
    st= c->fc->streams[c->fc->nb_streams-1];
993 994 995 996

    if (st->codec->codec_id != codec_id)
        return 0; /* unexpected codec_id - don't mess with extradata */

997
    size= (uint64_t)st->codec->extradata_size + atom.size + 8 + FF_INPUT_BUFFER_PADDING_SIZE;
998
    if (size > INT_MAX || (uint64_t)atom.size > INT_MAX)
999
        return AVERROR_INVALIDDATA;
1000 1001
    if ((err = av_reallocp(&st->codec->extradata, size)) < 0) {
        st->codec->extradata_size = 0;
1002
        return err;
1003
    }
1004
    buf = st->codec->extradata + st->codec->extradata_size;
1005 1006 1007
    st->codec->extradata_size= size - FF_INPUT_BUFFER_PADDING_SIZE;
    AV_WB32(       buf    , atom.size + 8);
    AV_WL32(       buf + 4, atom.type);
1008 1009 1010 1011 1012 1013 1014
    err = avio_read(pb, buf + 8, atom.size);
    if (err < 0) {
        return err;
    } else if (err < atom.size) {
        av_log(c->fc, AV_LOG_WARNING, "truncated extradata\n");
        st->codec->extradata_size -= atom.size - err;
    }
1015
    memset(buf + 8 + err, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1016 1017 1018
    return 0;
}

1019 1020 1021
/* wrapper functions for reading ALAC/AVS/MJPEG/MJPEG2000 extradata atoms only for those codecs */
static int mov_read_alac(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
1022
    return mov_read_extradata(c, pb, atom, AV_CODEC_ID_ALAC);
1023 1024 1025 1026
}

static int mov_read_avss(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
1027
    return mov_read_extradata(c, pb, atom, AV_CODEC_ID_AVS);
1028 1029 1030 1031
}

static int mov_read_jp2h(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
1032
    return mov_read_extradata(c, pb, atom, AV_CODEC_ID_JPEG2000);
1033 1034
}

C
Carl Eugen Hoyos 已提交
1035
static int mov_read_avid(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1036
{
1037
    return mov_read_extradata(c, pb, atom, AV_CODEC_ID_AVUI);
1038 1039
}

1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053
static int mov_read_targa_y216(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
    int ret = mov_read_extradata(c, pb, atom, AV_CODEC_ID_TARGA_Y216);

    if (!ret && c->fc->nb_streams >= 1) {
        AVCodecContext *avctx = c->fc->streams[c->fc->nb_streams-1]->codec;
        if (avctx->extradata_size >= 40) {
            avctx->height = AV_RB16(&avctx->extradata[36]);
            avctx->width  = AV_RB16(&avctx->extradata[38]);
        }
    }
    return ret;
}

1054 1055
static int mov_read_ares(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066
    if (c->fc->nb_streams >= 1) {
        AVCodecContext *codec = c->fc->streams[c->fc->nb_streams-1]->codec;
        if (codec->codec_tag == MKTAG('A', 'V', 'i', 'n') &&
            codec->codec_id == AV_CODEC_ID_H264 &&
            atom.size > 11) {
            avio_skip(pb, 10);
            /* For AVID AVCI50, force width of 1440 to be able to select the correct SPS and PPS */
            if (avio_rb16(pb) == 0xd4d)
                codec->width = 1440;
            return 0;
        }
1067 1068 1069 1070 1071
    }

    return mov_read_avid(c, pb, atom);
}

P
Piotr Bandurski 已提交
1072 1073
static int mov_read_svq3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
1074
    return mov_read_extradata(c, pb, atom, AV_CODEC_ID_SVQ3);
P
Piotr Bandurski 已提交
1075 1076
}

1077
static int mov_read_wave(MOVContext *c, AVIOContext *pb, MOVAtom atom)
R
Roberto Togni 已提交
1078
{
1079 1080 1081 1082 1083
    AVStream *st;

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

1085
    if ((uint64_t)atom.size > (1<<30))
1086
        return AVERROR_INVALIDDATA;
1087

1088 1089 1090
    if (st->codec->codec_id == AV_CODEC_ID_QDM2 ||
        st->codec->codec_id == AV_CODEC_ID_QDMC ||
        st->codec->codec_id == AV_CODEC_ID_SPEEX) {
1091
        // pass all frma atom to codec, needed at least for QDMC and QDM2
1092
        av_free(st->codec->extradata);
1093
        if (ff_get_extradata(st->codec, pb, atom.size) < 0)
1094
            return AVERROR(ENOMEM);
1095
    } else if (atom.size > 8) { /* to read frma, esds atoms */
1096 1097 1098
        int ret;
        if ((ret = mov_read_default(c, pb, atom)) < 0)
            return ret;
1099
    } else
1100
        avio_skip(pb, atom.size);
R
Roberto Togni 已提交
1101 1102 1103
    return 0;
}

1104 1105 1106 1107
/**
 * This function reads atom content and puts data in extradata without tag
 * nor size unlike mov_read_extradata.
 */
1108
static int mov_read_glbl(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1109
{
1110 1111 1112 1113 1114
    AVStream *st;

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

1116
    if ((uint64_t)atom.size > (1<<30))
1117
        return AVERROR_INVALIDDATA;
1118

1119
    if (atom.size >= 10) {
1120
        // Broken files created by legacy versions of libavformat will
1121 1122 1123 1124 1125 1126 1127
        // 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);
    }
1128
    av_free(st->codec->extradata);
1129
    if (ff_get_extradata(st->codec, pb, atom.size) < 0)
1130
        return AVERROR(ENOMEM);
1131

1132 1133 1134
    return 0;
}

M
Martin Storsjö 已提交
1135 1136 1137 1138
static int mov_read_dvc1(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
    AVStream *st;
    uint8_t profile_level;
1139
    int ret;
M
Martin Storsjö 已提交
1140 1141 1142 1143 1144 1145 1146 1147 1148

    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);
1149
    if ((profile_level & 0xf0) != 0xc0)
M
Martin Storsjö 已提交
1150 1151 1152
        return 0;

    avio_seek(pb, 6, SEEK_CUR);
1153 1154 1155
    av_free(st->codec->extradata);
    if ((ret = ff_get_extradata(st->codec, pb, atom.size - 7)) < 0)
        return ret;
1156

M
Martin Storsjö 已提交
1157 1158 1159
    return 0;
}

M
Martin Storsjö 已提交
1160 1161 1162 1163 1164
/**
 * 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.
 */
1165
static int mov_read_strf(MOVContext *c, AVIOContext *pb, MOVAtom atom)
M
Martin Storsjö 已提交
1166 1167 1168 1169 1170 1171 1172 1173 1174
{
    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];

1175
    if ((uint64_t)atom.size > (1<<30))
1176
        return AVERROR_INVALIDDATA;
M
Martin Storsjö 已提交
1177

1178
    avio_skip(pb, 40);
M
Martin Storsjö 已提交
1179
    av_free(st->codec->extradata);
1180
    if (ff_get_extradata(st->codec, pb, atom.size - 40) < 0)
M
Martin Storsjö 已提交
1181 1182 1183 1184
        return AVERROR(ENOMEM);
    return 0;
}

1185
static int mov_read_stco(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1186
{
1187 1188
    AVStream *st;
    MOVStreamContext *sc;
1189
    unsigned int i, entries;
1190

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

1196 1197
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
1198

1199
    entries = avio_rb32(pb);
1200

A
Alex Converse 已提交
1201 1202
    if (!entries)
        return 0;
1203
    if (entries >= UINT_MAX/sizeof(int64_t))
1204
        return AVERROR_INVALIDDATA;
1205

B
Baptiste Coudurier 已提交
1206
    sc->chunk_offsets = av_malloc(entries * sizeof(int64_t));
1207
    if (!sc->chunk_offsets)
1208 1209 1210
        return AVERROR(ENOMEM);
    sc->chunk_count = entries;

1211
    if      (atom.type == MKTAG('s','t','c','o'))
1212
        for (i = 0; i < entries && !pb->eof_reached; i++)
1213
            sc->chunk_offsets[i] = avio_rb32(pb);
1214
    else if (atom.type == MKTAG('c','o','6','4'))
1215
        for (i = 0; i < entries && !pb->eof_reached; i++)
1216
            sc->chunk_offsets[i] = avio_rb64(pb);
1217
    else
1218
        return AVERROR_INVALIDDATA;
1219

1220 1221 1222 1223 1224
    sc->chunk_count = i;

    if (pb->eof_reached)
        return AVERROR_EOF;

1225 1226 1227
    return 0;
}

1228 1229 1230 1231
/**
 * Compute codec id for 'lpcm' tag.
 * See CoreAudioTypes and AudioStreamBasicDescription at Apple.
 */
1232
enum AVCodecID ff_mov_get_lpcm_codec_id(int bps, int flags)
1233
{
1234 1235 1236 1237 1238 1239
    /* lpcm flags:
     * 0x1 = float
     * 0x2 = big-endian
     * 0x4 = signed
     */
    return ff_get_pcm_codec_id(bps, flags & 1, flags & 2, flags & 4 ? -1 : 0);
1240 1241
}

1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260
static int mov_codec_id(AVStream *st, uint32_t format)
{
    int id = ff_codec_get_id(ff_codec_movaudio_tags, format);

    if (id <= 0 &&
        ((format & 0xFFFF) == 'm' + ('s' << 8) ||
         (format & 0xFFFF) == 'T' + ('S' << 8)))
        id = ff_codec_get_id(ff_codec_wav_tags, av_bswap32(format) & 0xFFFF);

    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 &&
               /* skip old asf mpeg4 tag */
               format && format != MKTAG('m','p','4','s')) {
        id = ff_codec_get_id(ff_codec_movvideo_tags, format);
        if (id <= 0)
            id = ff_codec_get_id(ff_codec_bmp_tags, format);
        if (id > 0)
            st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
1261 1262 1263
        else if (st->codec->codec_type == AVMEDIA_TYPE_DATA ||
                    (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE &&
                    st->codec->codec_id == AV_CODEC_ID_NONE)) {
1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274
            id = ff_codec_get_id(ff_codec_movsubtitle_tags, format);
            if (id > 0)
                st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
        }
    }

    st->codec->codec_tag = format;

    return id;
}

1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302
static void mov_parse_stsd_video(MOVContext *c, AVIOContext *pb,
                                 AVStream *st, MOVStreamContext *sc)
{
    unsigned int color_depth, len, j;
    int color_greyscale;
    int color_table_id;

    avio_rb16(pb); /* version */
    avio_rb16(pb); /* revision level */
    avio_rb32(pb); /* vendor */
    avio_rb32(pb); /* temporal quality */
    avio_rb32(pb); /* spatial quality */

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

    avio_rb32(pb); /* horiz resolution */
    avio_rb32(pb); /* vert resolution */
    avio_rb32(pb); /* data size, always 0 */
    avio_rb16(pb); /* frames per samples */

    len = avio_r8(pb); /* codec name, pascal string */
    if (len > 31)
        len = 31;
    mov_read_mac_string(c, pb, len, st->codec->codec_name, 32);
    if (len < 31)
        avio_skip(pb, 31 - len);
    /* codec_tag YV12 triggers an UV swap in rawdec.c */
1303
    if (!memcmp(st->codec->codec_name, "Planar Y'CbCr 8-bit 4:2:0", 25)) {
1304
        st->codec->codec_tag = MKTAG('I', '4', '2', '0');
1305 1306 1307
        st->codec->width &= ~1;
        st->codec->height &= ~1;
    }
1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319
    /* Flash Media Server uses tag H263 with Sorenson Spark */
    if (st->codec->codec_tag == MKTAG('H','2','6','3') &&
        !memcmp(st->codec->codec_name, "Sorenson H263", 13))
        st->codec->codec_id = AV_CODEC_ID_FLV1;

    st->codec->bits_per_coded_sample = avio_rb16(pb); /* depth */
    color_table_id = avio_rb16(pb); /* colortable id */
    av_dlog(c->fc, "depth %d, ctab id %d\n",
            st->codec->bits_per_coded_sample, color_table_id);
    /* figure out the palette situation */
    color_depth     = st->codec->bits_per_coded_sample & 0x1F;
    color_greyscale = st->codec->bits_per_coded_sample & 0x20;
1320 1321 1322
    /* Do not create a greyscale palette for cinepak */
    if (color_greyscale && st->codec->codec_id == AV_CODEC_ID_CINEPAK)
        return;
1323 1324 1325 1326 1327

    /* if the depth is 2, 4, or 8 bpp, file is palettized */
    if ((color_depth == 2) || (color_depth == 4) || (color_depth == 8)) {
        /* for palette traversal */
        unsigned int color_start, color_count, color_end;
1328
        unsigned char a, r, g, b;
1329 1330 1331 1332 1333 1334 1335 1336 1337

        if (color_greyscale) {
            int color_index, color_dec;
            /* compute the greyscale palette */
            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;
1338
                sc->palette[j] = (0xFFU << 24) | (r << 16) | (g << 8) | (b);
1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357
                color_index -= color_dec;
                if (color_index < 0)
                    color_index = 0;
            }
        } else if (color_table_id) {
            const uint8_t *color_table;
            /* if flag bit 3 is set, use the default palette */
            color_count = 1 << color_depth;
            if (color_depth == 2)
                color_table = ff_qt_default_palette_4;
            else if (color_depth == 4)
                color_table = ff_qt_default_palette_16;
            else
                color_table = ff_qt_default_palette_256;

            for (j = 0; j < color_count; j++) {
                r = color_table[j * 3 + 0];
                g = color_table[j * 3 + 1];
                b = color_table[j * 3 + 2];
1358
                sc->palette[j] = (0xFFU << 24) | (r << 16) | (g << 8) | (b);
1359 1360 1361 1362 1363 1364 1365 1366
            }
        } else {
            /* load the palette from the file */
            color_start = avio_rb32(pb);
            color_count = avio_rb16(pb);
            color_end   = avio_rb16(pb);
            if ((color_start <= 255) && (color_end <= 255)) {
                for (j = color_start; j <= color_end; j++) {
1367 1368 1369
                    /* each A, R, G, or B component is 16 bits;
                        * only use the top 8 bits */
                    a = avio_r8(pb);
1370 1371 1372 1373 1374 1375 1376
                    avio_r8(pb);
                    r = avio_r8(pb);
                    avio_r8(pb);
                    g = avio_r8(pb);
                    avio_r8(pb);
                    b = avio_r8(pb);
                    avio_r8(pb);
1377
                    sc->palette[j] = (a << 24 ) | (r << 16) | (g << 8) | (b);
1378 1379 1380 1381 1382 1383 1384
                }
            }
        }
        sc->has_palette = 1;
    }
}

1385 1386 1387 1388 1389
static void mov_parse_stsd_audio(MOVContext *c, AVIOContext *pb,
                                 AVStream *st, MOVStreamContext *sc)
{
    int bits_per_sample, flags;
    uint16_t version = avio_rb16(pb);
1390
    AVDictionaryEntry *compatible_brands = av_dict_get(c->fc->metadata, "compatible_brands", NULL, AV_DICT_MATCH_CASE);
1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405

    avio_rb16(pb); /* revision level */
    avio_rb32(pb); /* vendor */

    st->codec->channels              = avio_rb16(pb); /* channel count */
    st->codec->bits_per_coded_sample = avio_rb16(pb); /* sample size */
    av_dlog(c->fc, "audio channels %d\n", st->codec->channels);

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

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

    // Read QT version 1 fields. In version 0 these do not exist.
    av_dlog(c->fc, "version =%d, isom =%d\n", version, c->isom);
1406 1407 1408
    if (!c->isom ||
        (compatible_brands && strstr(compatible_brands->value, "qt  "))) {

1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473
        if (version == 1) {
            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 */
        } else if (version == 2) {
            avio_rb32(pb); /* sizeof struct only */
            st->codec->sample_rate = av_int2double(avio_rb64(pb));
            st->codec->channels    = avio_rb32(pb);
            avio_rb32(pb); /* always 0x7F000000 */
            st->codec->bits_per_coded_sample = avio_rb32(pb);

            flags = avio_rb32(pb); /* lpcm format specific flag */
            sc->bytes_per_frame   = avio_rb32(pb);
            sc->samples_per_frame = avio_rb32(pb);
            if (st->codec->codec_tag == MKTAG('l','p','c','m'))
                st->codec->codec_id =
                    ff_mov_get_lpcm_codec_id(st->codec->bits_per_coded_sample,
                                             flags);
        }
    }

    switch (st->codec->codec_id) {
    case AV_CODEC_ID_PCM_S8:
    case AV_CODEC_ID_PCM_U8:
        if (st->codec->bits_per_coded_sample == 16)
            st->codec->codec_id = AV_CODEC_ID_PCM_S16BE;
        break;
    case AV_CODEC_ID_PCM_S16LE:
    case AV_CODEC_ID_PCM_S16BE:
        if (st->codec->bits_per_coded_sample == 8)
            st->codec->codec_id = AV_CODEC_ID_PCM_S8;
        else if (st->codec->bits_per_coded_sample == 24)
            st->codec->codec_id =
                st->codec->codec_id == AV_CODEC_ID_PCM_S16BE ?
                AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
        break;
    /* set values for old format before stsd version 1 appeared */
    case AV_CODEC_ID_MACE3:
        sc->samples_per_frame = 6;
        sc->bytes_per_frame   = 2 * st->codec->channels;
        break;
    case AV_CODEC_ID_MACE6:
        sc->samples_per_frame = 6;
        sc->bytes_per_frame   = 1 * st->codec->channels;
        break;
    case AV_CODEC_ID_ADPCM_IMA_QT:
        sc->samples_per_frame = 64;
        sc->bytes_per_frame   = 34 * st->codec->channels;
        break;
    case AV_CODEC_ID_GSM:
        sc->samples_per_frame = 160;
        sc->bytes_per_frame   = 33;
        break;
    default:
        break;
    }

    bits_per_sample = av_get_bits_per_sample(st->codec->codec_id);
    if (bits_per_sample) {
        st->codec->bits_per_coded_sample = bits_per_sample;
        sc->sample_size = (bits_per_sample >> 3) * st->codec->channels;
    }
}

1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487
static void mov_parse_stsd_subtitle(MOVContext *c, AVIOContext *pb,
                                    AVStream *st, MOVStreamContext *sc,
                                    int size)
{
    // ttxt stsd contains display flags, justification, background
    // color, fonts, and default styles, so fake an atom to read it
    MOVAtom fake_atom = { .size = size };
    // mp4s contains a regular esds atom
    if (st->codec->codec_tag != AV_RL32("mp4s"))
        mov_read_glbl(c, pb, fake_atom);
    st->codec->width  = sc->width;
    st->codec->height = sc->height;
}

L
Luca Barbato 已提交
1488 1489 1490 1491 1492
static int mov_parse_stsd_data(MOVContext *c, AVIOContext *pb,
                                AVStream *st, MOVStreamContext *sc,
                                int size)
{
    if (st->codec->codec_tag == MKTAG('t','m','c','d')) {
1493
        if (ff_get_extradata(st->codec, pb, size) < 0)
L
Luca Barbato 已提交
1494
            return AVERROR(ENOMEM);
1495 1496 1497 1498 1499 1500 1501 1502 1503 1504
        if (size > 16) {
            MOVStreamContext *tmcd_ctx = st->priv_data;
            int val;
            val = AV_RB32(st->codec->extradata + 4);
            tmcd_ctx->tmcd_flags = val;
            if (val & 1)
                st->codec->flags2 |= CODEC_FLAG2_DROP_FRAME_TIMECODE;
            st->codec->time_base.den = st->codec->extradata[16]; /* number of frame */
            st->codec->time_base.num = 1;
        }
L
Luca Barbato 已提交
1505 1506 1507 1508 1509 1510 1511
    } else {
        /* other codec type, just skip (rtp, mp4s ...) */
        avio_skip(pb, size);
    }
    return 0;
}

1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538
static int mov_finalize_stsd_codec(MOVContext *c, AVIOContext *pb,
                                   AVStream *st, MOVStreamContext *sc)
{
    if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
        !st->codec->sample_rate && sc->time_scale > 1)
        st->codec->sample_rate = sc->time_scale;

    /* special codec parameters handling */
    switch (st->codec->codec_id) {
#if CONFIG_DV_DEMUXER
    case AV_CODEC_ID_DVAUDIO:
        c->dv_fctx  = avformat_alloc_context();
        c->dv_demux = avpriv_dv_init_demux(c->dv_fctx);
        if (!c->dv_demux) {
            av_log(c->fc, AV_LOG_ERROR, "dv demux context init error\n");
            return AVERROR(ENOMEM);
        }
        sc->dv_audio_container = 1;
        st->codec->codec_id    = AV_CODEC_ID_PCM_S16LE;
        break;
#endif
    /* no ifdef since parameters are always those */
    case AV_CODEC_ID_QCELP:
        st->codec->channels = 1;
        // 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;
1539 1540 1541 1542
        // FIXME: Why is the following needed for some files?
        sc->samples_per_frame = 160;
        if (!sc->bytes_per_frame)
            sc->bytes_per_frame = 35;
1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562
        break;
    case AV_CODEC_ID_AMR_NB:
        st->codec->channels    = 1;
        /* force sample rate for amr, stsd in 3gp does not store sample rate */
        st->codec->sample_rate = 8000;
        break;
    case AV_CODEC_ID_AMR_WB:
        st->codec->channels    = 1;
        st->codec->sample_rate = 16000;
        break;
    case AV_CODEC_ID_MP2:
    case AV_CODEC_ID_MP3:
        /* force type after stsd for m1a hdlr */
        st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
        st->need_parsing      = AVSTREAM_PARSE_FULL;
        break;
    case AV_CODEC_ID_GSM:
    case AV_CODEC_ID_ADPCM_MS:
    case AV_CODEC_ID_ADPCM_IMA_WAV:
    case AV_CODEC_ID_ILBC:
1563 1564 1565
    case AV_CODEC_ID_MACE3:
    case AV_CODEC_ID_MACE6:
    case AV_CODEC_ID_QDM2:
1566 1567 1568 1569 1570 1571 1572 1573
        st->codec->block_align = sc->bytes_per_frame;
        break;
    case AV_CODEC_ID_ALAC:
        if (st->codec->extradata_size == 36) {
            st->codec->channels    = AV_RB8 (st->codec->extradata + 21);
            st->codec->sample_rate = AV_RB32(st->codec->extradata + 32);
        }
        break;
1574 1575
    case AV_CODEC_ID_AC3:
    case AV_CODEC_ID_MPEG1VIDEO:
1576 1577 1578 1579 1580 1581 1582 1583 1584
    case AV_CODEC_ID_VC1:
        st->need_parsing = AVSTREAM_PARSE_FULL;
        break;
    default:
        break;
    }
    return 0;
}

1585 1586 1587 1588 1589 1590 1591 1592 1593
static int mov_skip_multiple_stsd(MOVContext *c, AVIOContext *pb,
                                  int codec_tag, int format,
                                  int size)
{
    int video_codec_id = ff_codec_get_id(ff_codec_movvideo_tags, format);

    if (codec_tag &&
         (codec_tag != format &&
          (c->fc->video_codec_id ? video_codec_id != c->fc->video_codec_id
1594
                                 : codec_tag != MKTAG('j','p','e','g')))) {
1595 1596 1597 1598 1599 1600 1601 1602
        /* 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. */

        av_log(c->fc, AV_LOG_WARNING, "multiple fourcc not supported\n");
        avio_skip(pb, size);
        return 1;
    }
Y
Yusuke Nakamura 已提交
1603 1604 1605 1606
    if ( codec_tag == AV_RL32("avc1") ||
         codec_tag == AV_RL32("hvc1") ||
         codec_tag == AV_RL32("hev1")
    )
1607
        av_log(c->fc, AV_LOG_WARNING, "Concatenated H.264 or H.265 might not play correctly.\n");
1608 1609 1610 1611

    return 0;
}

1612
int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries)
1613
{
1614 1615
    AVStream *st;
    MOVStreamContext *sc;
1616
    int pseudo_stream_id;
1617

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

1623 1624 1625
    for (pseudo_stream_id = 0;
         pseudo_stream_id < entries && !pb->eof_reached;
         pseudo_stream_id++) {
1626
        //Parsing Sample description table
1627
        enum AVCodecID id;
L
Luca Barbato 已提交
1628
        int ret, dref_id = 1;
1629
        MOVAtom a = { AV_RL32("stsd") };
1630
        int64_t start_pos = avio_tell(pb);
1631
        int64_t size = avio_rb32(pb); /* size */
1632
        uint32_t format = avio_rl32(pb); /* data format */
1633

1634
        if (size >= 16) {
1635 1636 1637
            avio_rb32(pb); /* reserved */
            avio_rb16(pb); /* reserved */
            dref_id = avio_rb16(pb);
1638
        }else if (size <= 7){
M
Michael Niedermayer 已提交
1639
            av_log(c->fc, AV_LOG_ERROR, "invalid size %"PRId64" in stsd\n", size);
1640
            return AVERROR_INVALIDDATA;
1641
        }
1642

1643 1644
        if (mov_skip_multiple_stsd(c, pb, st->codec->codec_tag, format,
                                   size - (avio_tell(pb) - start_pos)))
1645
            continue;
1646

1647
        sc->pseudo_stream_id = st->codec->codec_tag ? -1 : pseudo_stream_id;
1648
        sc->dref_id= dref_id;
1649

1650
        id = mov_codec_id(st, format);
1651

M
Michael Niedermayer 已提交
1652
        av_dlog(c->fc, "size=%"PRId64" 4CC= %c%c%c%c codec_type=%d\n", size,
1653 1654
                (format >> 0) & 0xff, (format >> 8) & 0xff, (format >> 16) & 0xff,
                (format >> 24) & 0xff, st->codec->codec_type);
1655

1656
        if (st->codec->codec_type==AVMEDIA_TYPE_VIDEO) {
1657
            st->codec->codec_id = id;
1658
            mov_parse_stsd_video(c, pb, st, sc);
1659
        } else if (st->codec->codec_type==AVMEDIA_TYPE_AUDIO) {
1660
            st->codec->codec_id = id;
1661
            mov_parse_stsd_audio(c, pb, st, sc);
1662
        } else if (st->codec->codec_type==AVMEDIA_TYPE_SUBTITLE){
1663 1664 1665
            st->codec->codec_id = id;
            mov_parse_stsd_subtitle(c, pb, st, sc,
                                    size - (avio_tell(pb) - start_pos));
1666
        } else {
L
Luca Barbato 已提交
1667 1668 1669 1670
            ret = mov_parse_stsd_data(c, pb, st, sc,
                                      size - (avio_tell(pb) - start_pos));
            if (ret < 0)
                return ret;
1671
        }
Y
Yusuke Nakamura 已提交
1672
        /* this will read extra atoms at the end (wave, alac, damr, avcC, hvcC, SMI ...) */
1673
        a.size = size - (avio_tell(pb) - start_pos);
1674
        if (a.size > 8) {
1675 1676
            if ((ret = mov_read_default(c, pb, a)) < 0)
                return ret;
1677
        } else if (a.size > 0)
1678
            avio_skip(pb, a.size);
1679
    }
1680

1681 1682 1683
    if (pb->eof_reached)
        return AVERROR_EOF;

1684
    return mov_finalize_stsd_codec(c, pb, st, sc);
1685 1686
}

1687
static int mov_read_stsd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1688 1689 1690
{
    int entries;

1691 1692 1693
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
    entries = avio_rb32(pb);
1694 1695 1696 1697

    return ff_mov_read_stsd_entries(c, pb, entries);
}

1698
static int mov_read_stsc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1699
{
1700 1701
    AVStream *st;
    MOVStreamContext *sc;
1702
    unsigned int i, entries;
1703

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

1709 1710
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
1711

1712
    entries = avio_rb32(pb);
1713

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

A
Alex Converse 已提交
1716 1717
    if (!entries)
        return 0;
1718
    if (entries >= UINT_MAX / sizeof(*sc->stsc_data))
1719
        return AVERROR_INVALIDDATA;
1720 1721
    sc->stsc_data = av_malloc(entries * sizeof(*sc->stsc_data));
    if (!sc->stsc_data)
1722 1723
        return AVERROR(ENOMEM);

1724
    for (i = 0; i < entries && !pb->eof_reached; i++) {
1725 1726 1727
        sc->stsc_data[i].first = avio_rb32(pb);
        sc->stsc_data[i].count = avio_rb32(pb);
        sc->stsc_data[i].id = avio_rb32(pb);
1728
    }
1729 1730 1731 1732 1733 1734

    sc->stsc_count = i;

    if (pb->eof_reached)
        return AVERROR_EOF;

1735 1736 1737
    return 0;
}

1738
static int mov_read_stps(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1739 1740 1741 1742 1743 1744 1745 1746 1747 1748
{
    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;

1749
    avio_rb32(pb); // version + flags
1750

1751
    entries = avio_rb32(pb);
1752
    if (entries >= UINT_MAX / sizeof(*sc->stps_data))
1753
        return AVERROR_INVALIDDATA;
1754 1755 1756 1757
    sc->stps_data = av_malloc(entries * sizeof(*sc->stps_data));
    if (!sc->stps_data)
        return AVERROR(ENOMEM);

1758
    for (i = 0; i < entries && !pb->eof_reached; i++) {
1759
        sc->stps_data[i] = avio_rb32(pb);
L
Luca Barbato 已提交
1760
        //av_dlog(c->fc, "stps %d\n", sc->stps_data[i]);
1761 1762
    }

1763 1764 1765 1766 1767
    sc->stps_count = i;

    if (pb->eof_reached)
        return AVERROR_EOF;

1768 1769 1770
    return 0;
}

1771
static int mov_read_stss(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1772
{
1773 1774
    AVStream *st;
    MOVStreamContext *sc;
1775
    unsigned int i, entries;
1776

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

1782 1783
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
1784

1785
    entries = avio_rb32(pb);
1786

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

1789
    if (!entries)
1790 1791
    {
        sc->keyframe_absent = 1;
1792
        if (!st->need_parsing && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1793
            st->need_parsing = AVSTREAM_PARSE_HEADERS;
1794
        return 0;
1795
    }
1796
    if (entries >= UINT_MAX / sizeof(int))
1797
        return AVERROR_INVALIDDATA;
B
Baptiste Coudurier 已提交
1798
    sc->keyframes = av_malloc(entries * sizeof(int));
1799
    if (!sc->keyframes)
1800 1801
        return AVERROR(ENOMEM);

1802
    for (i = 0; i < entries && !pb->eof_reached; i++) {
1803
        sc->keyframes[i] = avio_rb32(pb);
L
Luca Barbato 已提交
1804
        //av_dlog(c->fc, "keyframes[]=%d\n", sc->keyframes[i]);
1805
    }
1806 1807 1808 1809 1810 1811

    sc->keyframe_count = i;

    if (pb->eof_reached)
        return AVERROR_EOF;

1812 1813 1814
    return 0;
}

1815
static int mov_read_stsz(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1816
{
1817 1818
    AVStream *st;
    MOVStreamContext *sc;
1819 1820 1821
    unsigned int i, entries, sample_size, field_size, num_bytes;
    GetBitContext gb;
    unsigned char* buf;
1822

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

1828 1829
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
1830

1831
    if (atom.type == MKTAG('s','t','s','z')) {
1832
        sample_size = avio_rb32(pb);
1833 1834
        if (!sc->sample_size) /* do not overwrite value computed in stsd */
            sc->sample_size = sample_size;
1835
        sc->stsz_sample_size = sample_size;
1836
        field_size = 32;
1837 1838
    } else {
        sample_size = 0;
1839 1840
        avio_rb24(pb); /* reserved */
        field_size = avio_r8(pb);
1841
    }
1842
    entries = avio_rb32(pb);
1843

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

1846
    sc->sample_count = entries;
1847 1848 1849
    if (sample_size)
        return 0;

1850 1851
    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);
1852
        return AVERROR_INVALIDDATA;
1853 1854
    }

A
Alex Converse 已提交
1855 1856
    if (!entries)
        return 0;
1857
    if (entries >= UINT_MAX / sizeof(int) || entries >= (UINT_MAX - 4) / field_size)
1858
        return AVERROR_INVALIDDATA;
B
Baptiste Coudurier 已提交
1859
    sc->sample_sizes = av_malloc(entries * sizeof(int));
1860
    if (!sc->sample_sizes)
1861 1862
        return AVERROR(ENOMEM);

1863 1864
    num_bytes = (entries*field_size+4)>>3;

1865
    buf = av_malloc(num_bytes+FF_INPUT_BUFFER_PADDING_SIZE);
1866 1867 1868 1869 1870
    if (!buf) {
        av_freep(&sc->sample_sizes);
        return AVERROR(ENOMEM);
    }

1871
    if (avio_read(pb, buf, num_bytes) < num_bytes) {
1872 1873
        av_freep(&sc->sample_sizes);
        av_free(buf);
1874
        return AVERROR_INVALIDDATA;
1875 1876 1877 1878
    }

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

1879
    for (i = 0; i < entries && !pb->eof_reached; i++) {
1880
        sc->sample_sizes[i] = get_bits_long(&gb, field_size);
1881 1882
        sc->data_size += sc->sample_sizes[i];
    }
1883

1884 1885 1886 1887 1888
    sc->sample_count = i;

    if (pb->eof_reached)
        return AVERROR_EOF;

1889
    av_free(buf);
1890 1891 1892
    return 0;
}

1893
static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
1894
{
1895 1896
    AVStream *st;
    MOVStreamContext *sc;
1897
    unsigned int i, entries;
1898 1899
    int64_t duration=0;
    int64_t total_sample_count=0;
1900

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

1906 1907 1908
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
    entries = avio_rb32(pb);
1909

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

1913 1914
    if (entries >= UINT_MAX / sizeof(*sc->stts_data))
        return -1;
1915

1916
    av_free(sc->stts_data);
1917
    sc->stts_data = av_malloc(entries * sizeof(*sc->stts_data));
1918
    if (!sc->stts_data)
1919
        return AVERROR(ENOMEM);
1920

1921
    for (i = 0; i < entries && !pb->eof_reached; i++) {
M
cleanup  
Michael Niedermayer 已提交
1922 1923
        int sample_duration;
        int sample_count;
1924

1925 1926
        sample_count=avio_rb32(pb);
        sample_duration = avio_rb32(pb);
1927

1928 1929
        /* sample_duration < 0 is invalid based on the spec */
        if (sample_duration < 0) {
1930 1931
            av_log(c->fc, AV_LOG_ERROR, "Invalid SampleDelta %d in STTS, at %d st:%d\n",
                   sample_duration, i, c->fc->nb_streams-1);
1932 1933
            sample_duration = 1;
        }
1934 1935 1936 1937
        if (sample_count < 0) {
            av_log(c->fc, AV_LOG_ERROR, "Invalid sample_count=%d\n", sample_count);
            return AVERROR_INVALIDDATA;
        }
1938 1939 1940
        sc->stts_data[i].count= sample_count;
        sc->stts_data[i].duration= sample_duration;

1941 1942
        av_dlog(c->fc, "sample_count=%d, sample_duration=%d\n",
                sample_count, sample_duration);
1943

1944 1945 1946 1947 1948 1949
        if (   i+1 == entries
            && i
            && sample_count == 1
            && total_sample_count > 100
            && sample_duration/10 > duration / total_sample_count)
            sample_duration = duration / total_sample_count;
B
Baptiste Coudurier 已提交
1950
        duration+=(int64_t)sample_duration*sample_count;
1951 1952 1953
        total_sample_count+=sample_count;
    }

1954 1955
    sc->stts_count = i;

1956 1957 1958
    sc->duration_for_fps  += duration;
    sc->nb_frames_for_fps += total_sample_count;

1959 1960 1961
    if (pb->eof_reached)
        return AVERROR_EOF;

1962
    st->nb_frames= total_sample_count;
1963
    if (duration)
1964
        st->duration= duration;
1965
    sc->track_end = duration;
1966 1967 1968
    return 0;
}

1969 1970 1971 1972 1973 1974 1975
static void mov_update_dts_shift(MOVStreamContext *sc, int duration)
{
    if (duration < 0) {
        sc->dts_shift = FFMAX(sc->dts_shift, -duration);
    }
}

1976
static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
M
Michael Niedermayer 已提交
1977
{
1978 1979
    AVStream *st;
    MOVStreamContext *sc;
M
Michael Niedermayer 已提交
1980 1981
    unsigned int i, entries;

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

1987 1988 1989
    avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
    entries = avio_rb32(pb);
1990

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

A
Alex Converse 已提交
1993 1994
    if (!entries)
        return 0;
1995
    if (entries >= UINT_MAX / sizeof(*sc->ctts_data))
1996
        return AVERROR_INVALIDDATA;
1997
    sc->ctts_data = av_malloc(entries * sizeof(*sc->ctts_data));
1998
    if (!sc->ctts_data)
1999
        return AVERROR(ENOMEM);
2000

2001
    for (i = 0; i < entries && !pb->eof_reached; i++) {
2002 2003
        int count    =avio_rb32(pb);
        int duration =avio_rb32(pb);
2004 2005 2006

        sc->ctts_data[i].count   = count;
        sc->ctts_data[i].duration= duration;
M
Michael Niedermayer 已提交
2007

2008 2009 2010
        av_dlog(c->fc, "count=%d, duration=%d\n",
                count, duration);

M
Michael Niedermayer 已提交
2011 2012 2013 2014 2015 2016 2017
        if (FFABS(duration) > (1<<28) && i+2<entries) {
            av_log(c->fc, AV_LOG_WARNING, "CTTS invalid\n");
            av_freep(&sc->ctts_data);
            sc->ctts_count = 0;
            return 0;
        }

2018 2019
        if (i+2<entries)
            mov_update_dts_shift(sc, duration);
M
Michael Niedermayer 已提交
2020
    }
2021

2022 2023 2024 2025 2026
    sc->ctts_count = i;

    if (pb->eof_reached)
        return AVERROR_EOF;

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

M
Michael Niedermayer 已提交
2029 2030 2031
    return 0;
}

2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071
static int mov_read_sbgp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
    AVStream *st;
    MOVStreamContext *sc;
    unsigned int i, entries;
    uint8_t version;
    uint32_t grouping_type;

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

    version = avio_r8(pb); /* version */
    avio_rb24(pb); /* flags */
    grouping_type = avio_rl32(pb);
    if (grouping_type != MKTAG( 'r','a','p',' '))
        return 0; /* only support 'rap ' grouping */
    if (version == 1)
        avio_rb32(pb); /* grouping_type_parameter */

    entries = avio_rb32(pb);
    if (!entries)
        return 0;
    if (entries >= UINT_MAX / sizeof(*sc->rap_group))
        return AVERROR_INVALIDDATA;
    sc->rap_group = av_malloc(entries * sizeof(*sc->rap_group));
    if (!sc->rap_group)
        return AVERROR(ENOMEM);

    for (i = 0; i < entries && !pb->eof_reached; i++) {
        sc->rap_group[i].count = avio_rb32(pb); /* sample_count */
        sc->rap_group[i].index = avio_rb32(pb); /* group_description_index */
    }

    sc->rap_group_count = i;

    return pb->eof_reached ? AVERROR_EOF : 0;
}

2072 2073 2074
static void mov_build_index(MOVContext *mov, AVStream *st)
{
    MOVStreamContext *sc = st->priv_data;
2075
    int64_t current_offset;
2076 2077 2078 2079
    int64_t current_dts = 0;
    unsigned int stts_index = 0;
    unsigned int stsc_index = 0;
    unsigned int stss_index = 0;
2080
    unsigned int stps_index = 0;
2081
    unsigned int i, j;
2082
    uint64_t stream_size = 0;
2083

2084
    /* adjust first dts according to edit list */
2085 2086 2087 2088
    if ((sc->empty_duration || sc->start_time) && mov->time_scale > 0) {
        if (sc->empty_duration)
            sc->empty_duration = av_rescale(sc->empty_duration, sc->time_scale, mov->time_scale);
        sc->time_offset = sc->start_time - sc->empty_duration;
2089
        current_dts = -sc->time_offset;
2090
        if (sc->ctts_count>0 && sc->stts_count>0 &&
2091
            sc->ctts_data[0].duration / FFMAX(sc->stts_data[0].duration, 1) > 16) {
2092 2093 2094 2095 2096
            /* 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;
        }
2097 2098
    }

2099
    /* only use old uncompressed audio chunk demuxing when stts specifies it */
2100
    if (!(st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
2101
          sc->stts_count == 1 && sc->stts_data[0].duration == 1)) {
2102 2103
        unsigned int current_sample = 0;
        unsigned int stts_sample = 0;
2104
        unsigned int sample_size;
2105
        unsigned int distance = 0;
2106 2107 2108
        unsigned int rap_group_index = 0;
        unsigned int rap_group_sample = 0;
        int rap_group_present = sc->rap_group_count && sc->rap_group;
2109
        int key_off = (sc->keyframe_count && sc->keyframes[0] > 0) || (sc->stps_count && sc->stps_data[0] > 0);
2110

2111 2112
        current_dts -= sc->dts_shift;

2113
        if (!sc->sample_count || st->nb_index_entries)
A
Alex Converse 已提交
2114
            return;
2115
        if (sc->sample_count >= UINT_MAX / sizeof(*st->index_entries) - st->nb_index_entries)
2116
            return;
2117 2118 2119 2120
        if (av_reallocp_array(&st->index_entries,
                              st->nb_index_entries + sc->sample_count,
                              sizeof(*st->index_entries)) < 0) {
            st->nb_index_entries = 0;
2121
            return;
2122
        }
2123
        st->index_entries_allocated_size = (st->nb_index_entries + sc->sample_count) * sizeof(*st->index_entries);
2124

2125
        for (i = 0; i < sc->chunk_count; i++) {
2126
            int64_t next_offset = i+1 < sc->chunk_count ? sc->chunk_offsets[i+1] : INT64_MAX;
2127
            current_offset = sc->chunk_offsets[i];
2128
            while (stsc_index + 1 < sc->stsc_count &&
2129
                i + 1 == sc->stsc_data[stsc_index + 1].first)
2130
                stsc_index++;
2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141

            if (next_offset > current_offset && sc->sample_size>0 && sc->sample_size < sc->stsz_sample_size &&
                sc->stsc_data[stsc_index].count * (int64_t)sc->stsz_sample_size > next_offset - current_offset) {
                av_log(mov->fc, AV_LOG_WARNING, "STSZ sample size %d invalid (too large), ignoring\n", sc->stsz_sample_size);
                sc->stsz_sample_size = sc->sample_size;
            }
            if (sc->stsz_sample_size>0 && sc->stsz_sample_size < sc->sample_size) {
                av_log(mov->fc, AV_LOG_WARNING, "STSZ sample size %d invalid (too small), ignoring\n", sc->stsz_sample_size);
                sc->stsz_sample_size = sc->sample_size;
            }

2142
            for (j = 0; j < sc->stsc_data[stsc_index].count; j++) {
2143
                int keyframe = 0;
2144 2145
                if (current_sample >= sc->sample_count) {
                    av_log(mov->fc, AV_LOG_ERROR, "wrong sample count\n");
2146
                    return;
2147
                }
2148

2149
                if (!sc->keyframe_absent && (!sc->keyframe_count || current_sample+key_off == sc->keyframes[stss_index])) {
2150
                    keyframe = 1;
2151 2152
                    if (stss_index + 1 < sc->keyframe_count)
                        stss_index++;
2153 2154 2155 2156
                } 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++;
2157
                }
2158 2159 2160 2161 2162 2163 2164 2165
                if (rap_group_present && rap_group_index < sc->rap_group_count) {
                    if (sc->rap_group[rap_group_index].index > 0)
                        keyframe = 1;
                    if (++rap_group_sample == sc->rap_group[rap_group_index].count) {
                        rap_group_sample = 0;
                        rap_group_index++;
                    }
                }
2166 2167 2168 2169 2170
                if (sc->keyframe_absent
                    && !sc->stps_count
                    && !rap_group_present
                    && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
                     keyframe = 1;
2171 2172
                if (keyframe)
                    distance = 0;
2173
                sample_size = sc->stsz_sample_size > 0 ? sc->stsz_sample_size : sc->sample_sizes[current_sample];
2174
                if (sc->pseudo_stream_id == -1 ||
2175
                   sc->stsc_data[stsc_index].id - 1 == sc->pseudo_stream_id) {
2176 2177 2178 2179 2180 2181
                    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 已提交
2182
                    av_dlog(mov->fc, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "
2183 2184
                            "size %d, distance %d, keyframe %d\n", st->index, current_sample,
                            current_offset, current_dts, sample_size, distance, keyframe);
2185
                    if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && st->nb_index_entries < 100)
2186
                        ff_rfps_add_frame(mov->fc, st, current_dts);
2187
                }
2188

2189
                current_offset += sample_size;
2190
                stream_size += sample_size;
2191
                current_dts += sc->stts_data[stts_index].duration;
2192 2193 2194 2195 2196 2197 2198 2199 2200
                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++;
                }
            }
        }
2201 2202
        if (st->duration > 0)
            st->codec->bit_rate = stream_size*8*sc->time_scale/st->duration;
2203
    } else {
2204
        unsigned chunk_samples, total = 0;
2205

2206 2207 2208
        // compute total chunk count
        for (i = 0; i < sc->stsc_count; i++) {
            unsigned count, chunk_count;
2209

2210
            chunk_samples = sc->stsc_data[i].count;
2211 2212
            if (i != sc->stsc_count - 1 &&
                sc->samples_per_frame && chunk_samples % sc->samples_per_frame) {
2213 2214 2215 2216
                av_log(mov->fc, AV_LOG_ERROR, "error unaligned chunk\n");
                return;
            }

2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232
            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 已提交
2233
        av_dlog(mov->fc, "chunk count %d\n", total);
2234
        if (total >= UINT_MAX / sizeof(*st->index_entries) - st->nb_index_entries)
2235
            return;
2236 2237 2238 2239
        if (av_reallocp_array(&st->index_entries,
                              st->nb_index_entries + total,
                              sizeof(*st->index_entries)) < 0) {
            st->nb_index_entries = 0;
2240
            return;
2241
        }
2242
        st->index_entries_allocated_size = (st->nb_index_entries + total) * sizeof(*st->index_entries);
2243 2244 2245 2246 2247 2248 2249 2250 2251

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

2252
            while (chunk_samples > 0) {
2253
                AVIndexEntry *e;
2254 2255 2256 2257 2258 2259 2260 2261 2262 2263
                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;
2264
                    } else {
2265 2266
                        samples = FFMIN(1024, chunk_samples);
                        size = samples * sc->sample_size;
2267 2268
                    }
                }
2269

2270 2271 2272 2273 2274 2275 2276 2277 2278 2279
                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 已提交
2280
                av_dlog(mov->fc, "AVIndex stream %d, chunk %d, offset %"PRIx64", dts %"PRId64", "
2281
                        "size %d, duration %d\n", st->index, i, current_offset, current_dts,
2282 2283 2284
                        size, samples);

                current_offset += size;
2285
                current_dts += samples;
2286
                chunk_samples -= samples;
2287 2288 2289 2290
            }
        }
    }
}
2291

2292
static int mov_open_dref(AVIOContext **pb, const char *src, MOVDref *ref,
2293
                         AVIOInterruptCB *int_cb, int use_absolute_path, AVFormatContext *fc)
2294
{
2295 2296
    /* try relative path, we do not try the absolute because it can leak information about our
       system to an attacker */
2297 2298
    if (ref->nlvl_to > 0 && ref->nlvl_from > 0) {
        char filename[1024];
2299
        const char *src_path;
2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318
        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 */
2319
        if (i == ref->nlvl_to - 1 && src_path - src  < sizeof(filename)) {
2320 2321 2322 2323 2324 2325 2326 2327
            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);

2328
            if (!avio_open2(pb, filename, AVIO_FLAG_READ, int_cb, NULL))
2329 2330
                return 0;
        }
2331 2332 2333 2334 2335
    } else if (use_absolute_path) {
        av_log(fc, AV_LOG_WARNING, "Using absolute path on user request, "
               "this is a possible security issue\n");
        if (!avio_open2(pb, ref->path, AVIO_FLAG_READ, int_cb, NULL))
            return 0;
2336 2337 2338
    }

    return AVERROR(ENOENT);
M
Mans Rullgard 已提交
2339
}
2340

2341 2342 2343 2344 2345 2346 2347 2348 2349 2350
static void fix_timescale(MOVContext *c, MOVStreamContext *sc)
{
    if (sc->time_scale <= 0) {
        av_log(c->fc, AV_LOG_WARNING, "stream %d, timescale not set\n", sc->ffindex);
        sc->time_scale = c->time_scale;
        if (sc->time_scale <= 0)
            sc->time_scale = 1;
    }
}

2351
static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom)
2352 2353 2354
{
    AVStream *st;
    MOVStreamContext *sc;
2355
    int ret;
2356

2357
    st = avformat_new_stream(c->fc, NULL);
B
Baptiste Coudurier 已提交
2358
    if (!st) return AVERROR(ENOMEM);
2359
    st->id = c->fc->nb_streams;
B
Baptiste Coudurier 已提交
2360
    sc = av_mallocz(sizeof(MOVStreamContext));
2361
    if (!sc) return AVERROR(ENOMEM);
2362 2363

    st->priv_data = sc;
2364
    st->codec->codec_type = AVMEDIA_TYPE_DATA;
2365
    sc->ffindex = st->index;
2366

2367 2368 2369 2370
    if ((ret = mov_read_default(c, pb, atom)) < 0)
        return ret;

    /* sanity checks */
2371 2372
    if (sc->chunk_count && (!sc->stts_count || !sc->stsc_count ||
                            (!sc->sample_size && !sc->sample_count))) {
2373 2374
        av_log(c->fc, AV_LOG_ERROR, "stream %d, missing mandatory atoms, broken header\n",
               st->index);
2375 2376
        return 0;
    }
2377

2378
    fix_timescale(c, sc);
2379

2380
    avpriv_set_pts_info(st, 64, 1, sc->time_scale);
2381 2382 2383 2384

    mov_build_index(c, st);

    if (sc->dref_id-1 < sc->drefs_count && sc->drefs[sc->dref_id-1].path) {
2385
        MOVDref *dref = &sc->drefs[sc->dref_id - 1];
2386 2387
        if (mov_open_dref(&sc->pb, c->fc->filename, dref, &c->fc->interrupt_callback,
            c->use_absolute_path, c->fc) < 0)
2388 2389 2390 2391 2392
            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);
2393
    } else {
2394
        sc->pb = c->fc->pb;
2395 2396
        sc->pb_is_copied = 1;
    }
2397

2398
    if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2399 2400 2401 2402
        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);
2403 2404
        }

A
Anton Khirnov 已提交
2405
#if FF_API_R_FRAME_RATE
2406 2407 2408
        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);
A
Anton Khirnov 已提交
2409
#endif
2410 2411
    }

R
Reimar Döffinger 已提交
2412 2413
    // done for ai5q, ai52, ai55, ai1q, ai12 and ai15.
    if (!st->codec->extradata_size && st->codec->codec_id == AV_CODEC_ID_H264 &&
2414 2415 2416 2417
        TAG_IS_AVCI(st->codec->codec_tag)) {
        ret = ff_generate_avci_extradata(st);
        if (ret < 0)
            return ret;
R
Reimar Döffinger 已提交
2418 2419
    }

2420
    switch (st->codec->codec_id) {
2421
#if CONFIG_H261_DECODER
2422
    case AV_CODEC_ID_H261:
2423
#endif
2424
#if CONFIG_H263_DECODER
2425
    case AV_CODEC_ID_H263:
2426
#endif
2427
#if CONFIG_MPEG4_DECODER
2428
    case AV_CODEC_ID_MPEG4:
2429
#endif
2430
        st->codec->width = 0; /* let decoder init width/height */
2431 2432 2433
        st->codec->height= 0;
        break;
    }
B
Baptiste Coudurier 已提交
2434 2435 2436

    /* Do not need those anymore. */
    av_freep(&sc->chunk_offsets);
2437
    av_freep(&sc->stsc_data);
B
Baptiste Coudurier 已提交
2438 2439 2440
    av_freep(&sc->sample_sizes);
    av_freep(&sc->keyframes);
    av_freep(&sc->stts_data);
2441
    av_freep(&sc->stps_data);
2442
    av_freep(&sc->rap_group);
B
Baptiste Coudurier 已提交
2443

2444
    return 0;
2445 2446
}

2447
static int mov_read_ilst(MOVContext *c, AVIOContext *pb, MOVAtom atom)
2448 2449 2450 2451 2452 2453 2454 2455
{
    int ret;
    c->itunes_metadata = 1;
    ret = mov_read_default(c, pb, atom);
    c->itunes_metadata = 0;
    return ret;
}

2456
static int mov_read_meta(MOVContext *c, AVIOContext *pb, MOVAtom atom)
2457
{
2458
    while (atom.size > 8) {
2459
        uint32_t tag = avio_rl32(pb);
2460 2461
        atom.size -= 4;
        if (tag == MKTAG('h','d','l','r')) {
A
Anton Khirnov 已提交
2462
            avio_seek(pb, -8, SEEK_CUR);
2463 2464 2465 2466 2467
            atom.size += 8;
            return mov_read_default(c, pb, atom);
        }
    }
    return 0;
2468 2469
}

2470
static int mov_read_tkhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
2471
{
2472 2473 2474 2475 2476
    int i;
    int width;
    int height;
    int64_t disp_transform[2];
    int display_matrix[3][2];
2477 2478 2479
    AVStream *st;
    MOVStreamContext *sc;
    int version;
2480
    int flags;
2481 2482 2483 2484 2485

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

2487
    version = avio_r8(pb);
2488 2489
    flags = avio_rb24(pb);
    st->disposition |= (flags & MOV_TKHD_FLAG_ENABLED) ? AV_DISPOSITION_DEFAULT : 0;
2490

B
Baptiste Coudurier 已提交
2491
    if (version == 1) {
2492 2493
        avio_rb64(pb);
        avio_rb64(pb);
B
Baptiste Coudurier 已提交
2494
    } else {
2495 2496
        avio_rb32(pb); /* creation time */
        avio_rb32(pb); /* modification time */
B
Baptiste Coudurier 已提交
2497
    }
2498 2499
    st->id = (int)avio_rb32(pb); /* track id (NOT 0 !)*/
    avio_rb32(pb); /* reserved */
2500

2501
    /* highlevel (considering edits) duration in movie timebase */
2502 2503 2504
    (version == 1) ? avio_rb64(pb) : avio_rb32(pb);
    avio_rb32(pb); /* reserved */
    avio_rb32(pb); /* reserved */
2505

2506 2507 2508 2509
    avio_rb16(pb); /* layer */
    avio_rb16(pb); /* alternate group */
    avio_rb16(pb); /* volume */
    avio_rb16(pb); /* reserved */
2510

2511 2512 2513 2514
    //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++) {
2515 2516 2517
        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)
2518
    }
2519

2520 2521
    width = avio_rb32(pb);       // 16.16 fixed point track width
    height = avio_rb32(pb);      // 16.16 fixed point track height
2522 2523
    sc->width = width >> 16;
    sc->height = height >> 16;
2524

2525 2526 2527 2528 2529 2530 2531
    //Assign clockwise rotate values based on transform matrix so that
    //we can compensate for iPhone orientation during capture.

    if (display_matrix[1][0] == -65536 && display_matrix[0][1] == 65536) {
         av_dict_set(&st->metadata, "rotate", "90", 0);
    }

D
Dave Badia 已提交
2532
    if (display_matrix[0][0] == -65536 && display_matrix[1][1] == -65536) {
2533
         av_dict_set(&st->metadata, "rotate", "180", 0);
D
Dave Badia 已提交
2534 2535
    }

2536 2537 2538 2539
    if (display_matrix[1][0] == 65536 && display_matrix[0][1] == -65536) {
         av_dict_set(&st->metadata, "rotate", "270", 0);
    }

2540
    // transform the display width/height according to the matrix
2541
    // skip this if the display matrix is the default identity matrix
2542
    // or if it is rotating the picture, ex iPhone 3GS
2543 2544
    // to keep the same scale, use [width height 1<<16]
    if (width && height &&
2545 2546 2547 2548 2549
        ((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])) {
2550 2551 2552 2553 2554 2555 2556
        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
2557
        st->sample_aspect_ratio = av_d2q(
2558 2559 2560
            ((double) disp_transform[0] * height) /
            ((double) disp_transform[1] * width), INT_MAX);
    }
2561 2562 2563
    return 0;
}

2564
static int mov_read_tfhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
B
Baptiste Coudurier 已提交
2565 2566 2567 2568 2569
{
    MOVFragment *frag = &c->fragment;
    MOVTrackExt *trex = NULL;
    int flags, track_id, i;

2570 2571
    avio_r8(pb); /* version */
    flags = avio_rb24(pb);
B
Baptiste Coudurier 已提交
2572

2573
    track_id = avio_rb32(pb);
2574
    if (!track_id)
2575
        return AVERROR_INVALIDDATA;
B
Baptiste Coudurier 已提交
2576 2577 2578 2579 2580 2581 2582 2583
    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");
2584
        return AVERROR_INVALIDDATA;
B
Baptiste Coudurier 已提交
2585 2586
    }

2587 2588 2589 2590 2591 2592 2593 2594 2595 2596
    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 已提交
2597
    av_dlog(c->fc, "frag flags 0x%x\n", frag->flags);
B
Baptiste Coudurier 已提交
2598 2599 2600
    return 0;
}

2601
static int mov_read_chap(MOVContext *c, AVIOContext *pb, MOVAtom atom)
D
David Conrad 已提交
2602
{
2603
    c->chapter_track = avio_rb32(pb);
D
David Conrad 已提交
2604 2605 2606
    return 0;
}

2607
static int mov_read_trex(MOVContext *c, AVIOContext *pb, MOVAtom atom)
B
Baptiste Coudurier 已提交
2608 2609
{
    MOVTrackExt *trex;
2610
    int err;
B
Baptiste Coudurier 已提交
2611 2612

    if ((uint64_t)c->trex_count+1 >= UINT_MAX / sizeof(*c->trex_data))
2613
        return AVERROR_INVALIDDATA;
2614 2615 2616 2617 2618
    if ((err = av_reallocp_array(&c->trex_data, c->trex_count + 1,
                                 sizeof(*c->trex_data))) < 0) {
        c->trex_count = 0;
        return err;
    }
2619 2620 2621

    c->fc->duration = AV_NOPTS_VALUE; // the duration from mvhd is not representing the whole file when fragments are used.

B
Baptiste Coudurier 已提交
2622
    trex = &c->trex_data[c->trex_count++];
2623 2624 2625 2626 2627 2628 2629
    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 已提交
2630 2631 2632
    return 0;
}

2633
static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
B
Baptiste Coudurier 已提交
2634 2635
{
    MOVFragment *frag = &c->fragment;
2636
    AVStream *st = NULL;
2637
    MOVStreamContext *sc;
2638
    MOVStts *ctts_data;
B
Baptiste Coudurier 已提交
2639 2640 2641 2642
    uint64_t offset;
    int64_t dts;
    int data_offset = 0;
    unsigned entries, first_sample_flags = frag->flags;
2643
    int flags, distance, i, found_keyframe = 0, err;
B
Baptiste Coudurier 已提交
2644

2645 2646 2647 2648 2649 2650 2651 2652
    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);
2653
        return AVERROR_INVALIDDATA;
2654
    }
2655
    sc = st->priv_data;
2656
    if (sc->pseudo_stream_id+1 != frag->stsd_id && sc->pseudo_stream_id != -1)
B
Baptiste Coudurier 已提交
2657
        return 0;
2658 2659 2660
    avio_r8(pb); /* version */
    flags = avio_rb24(pb);
    entries = avio_rb32(pb);
L
Luca Barbato 已提交
2661
    av_dlog(c->fc, "flags 0x%x entries %d\n", flags, entries);
2662 2663 2664 2665 2666 2667 2668 2669 2670

    /* 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. */
2671
        ctts_data = av_realloc(NULL, sizeof(*sc->ctts_data));
2672
        if (!ctts_data)
B
Baptiste Coudurier 已提交
2673
            return AVERROR(ENOMEM);
2674
        sc->ctts_data = ctts_data;
2675 2676 2677
        sc->ctts_data[sc->ctts_count].count = sc->sample_count;
        sc->ctts_data[sc->ctts_count].duration = 0;
        sc->ctts_count++;
B
Baptiste Coudurier 已提交
2678
    }
2679
    if ((uint64_t)entries+sc->ctts_count >= UINT_MAX/sizeof(*sc->ctts_data))
2680
        return AVERROR_INVALIDDATA;
2681 2682 2683 2684 2685
    if ((err = av_reallocp_array(&sc->ctts_data, entries + sc->ctts_count,
                                 sizeof(*sc->ctts_data))) < 0) {
        sc->ctts_count = 0;
        return err;
    }
2686 2687
    if (flags & MOV_TRUN_DATA_OFFSET)        data_offset        = avio_rb32(pb);
    if (flags & MOV_TRUN_FIRST_SAMPLE_FLAGS) first_sample_flags = avio_rb32(pb);
2688
    dts    = sc->track_end - sc->time_offset;
B
Baptiste Coudurier 已提交
2689 2690
    offset = frag->base_data_offset + data_offset;
    distance = 0;
L
Luca Barbato 已提交
2691
    av_dlog(c->fc, "first sample flags 0x%x\n", first_sample_flags);
2692
    for (i = 0; i < entries && !pb->eof_reached; i++) {
B
Baptiste Coudurier 已提交
2693 2694 2695
        unsigned sample_size = frag->size;
        int sample_flags = i ? frag->flags : first_sample_flags;
        unsigned sample_duration = frag->duration;
2696
        int keyframe = 0;
B
Baptiste Coudurier 已提交
2697

2698 2699 2700
        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);
2701
        sc->ctts_data[sc->ctts_count].count = 1;
2702 2703
        sc->ctts_data[sc->ctts_count].duration = (flags & MOV_TRUN_SAMPLE_CTS) ?
                                                  avio_rb32(pb) : 0;
2704
        mov_update_dts_shift(sc, sc->ctts_data[sc->ctts_count].duration);
2705
        sc->ctts_count++;
2706 2707 2708 2709 2710 2711 2712
        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 已提交
2713 2714 2715
            distance = 0;
        av_add_index_entry(st, offset, dts, sample_size, distance,
                           keyframe ? AVINDEX_KEYFRAME : 0);
L
Luca Barbato 已提交
2716
        av_dlog(c->fc, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "
B
Baptiste Coudurier 已提交
2717 2718 2719
                "size %d, distance %d, keyframe %d\n", st->index, sc->sample_count+i,
                offset, dts, sample_size, distance, keyframe);
        distance++;
2720
        dts += sample_duration;
B
Baptiste Coudurier 已提交
2721
        offset += sample_size;
2722
        sc->data_size += sample_size;
2723 2724
        sc->duration_for_fps += sample_duration;
        sc->nb_frames_for_fps ++;
B
Baptiste Coudurier 已提交
2725
    }
2726 2727 2728 2729

    if (pb->eof_reached)
        return AVERROR_EOF;

B
Baptiste Coudurier 已提交
2730
    frag->moof_offset = offset;
2731
    st->duration = sc->track_end = dts + sc->time_offset;
B
Baptiste Coudurier 已提交
2732 2733 2734
    return 0;
}

2735 2736 2737
/* 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/ */
2738
static int mov_read_wide(MOVContext *c, AVIOContext *pb, MOVAtom atom)
2739 2740 2741 2742 2743
{
    int err;

    if (atom.size < 8)
        return 0; /* continue */
2744
    if (avio_rb32(pb) != 0) { /* 0 sized mdat atom... use the 'wide' atom size */
2745
        avio_skip(pb, atom.size - 4);
2746 2747
        return 0;
    }
2748
    atom.type = avio_rl32(pb);
2749
    atom.size -= 8;
2750
    if (atom.type != MKTAG('m','d','a','t')) {
2751
        avio_skip(pb, atom.size);
2752 2753 2754 2755 2756 2757
        return 0;
    }
    err = mov_read_mdat(c, pb, atom);
    return err;
}

2758
static int mov_read_cmov(MOVContext *c, AVIOContext *pb, MOVAtom atom)
2759
{
2760
#if CONFIG_ZLIB
2761
    AVIOContext ctx;
2762 2763
    uint8_t *cmov_data;
    uint8_t *moov_data; /* uncompressed data */
2764
    long cmov_len, moov_len;
2765
    int ret = -1;
2766

2767 2768
    avio_rb32(pb); /* dcom atom */
    if (avio_rl32(pb) != MKTAG('d','c','o','m'))
2769
        return AVERROR_INVALIDDATA;
2770
    if (avio_rl32(pb) != MKTAG('z','l','i','b')) {
2771
        av_log(c->fc, AV_LOG_ERROR, "unknown compression for cmov atom !\n");
2772
        return AVERROR_INVALIDDATA;
2773
    }
2774 2775
    avio_rb32(pb); /* cmvd atom */
    if (avio_rl32(pb) != MKTAG('c','m','v','d'))
2776
        return AVERROR_INVALIDDATA;
2777
    moov_len = avio_rb32(pb); /* uncompressed size */
2778
    cmov_len = atom.size - 6 * 4;
2779

B
Baptiste Coudurier 已提交
2780
    cmov_data = av_malloc(cmov_len);
2781
    if (!cmov_data)
2782
        return AVERROR(ENOMEM);
B
Baptiste Coudurier 已提交
2783
    moov_data = av_malloc(moov_len);
2784 2785
    if (!moov_data) {
        av_free(cmov_data);
2786
        return AVERROR(ENOMEM);
2787
    }
2788
    avio_read(pb, cmov_data, cmov_len);
2789
    if (uncompress (moov_data, (uLongf *) &moov_len, (const Bytef *)cmov_data, cmov_len) != Z_OK)
2790
        goto free_and_return;
2791
    if (ffio_init_context(&ctx, moov_data, moov_len, 0, NULL, NULL, NULL, NULL) != 0)
2792
        goto free_and_return;
2793
    atom.type = MKTAG('m','o','o','v');
2794 2795
    atom.size = moov_len;
    ret = mov_read_default(c, &ctx, atom);
2796
free_and_return:
2797 2798 2799
    av_free(moov_data);
    av_free(cmov_data);
    return ret;
2800 2801
#else
    av_log(c->fc, AV_LOG_ERROR, "this file requires zlib support compiled in\n");
2802
    return AVERROR(ENOSYS);
2803
#endif
2804
}
2805

G
Gael Chardon 已提交
2806
/* edit list atom */
2807
static int mov_read_elst(MOVContext *c, AVIOContext *pb, MOVAtom atom)
G
Gael Chardon 已提交
2808
{
2809
    MOVStreamContext *sc;
2810
    int i, edit_count, version, edit_start_index = 0;
2811
    int unsupported = 0;
B
Baptiste Coudurier 已提交
2812

2813
    if (c->fc->nb_streams < 1 || c->ignore_editlist)
2814 2815 2816
        return 0;
    sc = c->fc->streams[c->fc->nb_streams-1]->priv_data;

2817
    version = avio_r8(pb); /* version */
2818 2819
    avio_rb24(pb); /* flags */
    edit_count = avio_rb32(pb); /* entries */
B
Baptiste Coudurier 已提交
2820

2821
    if ((uint64_t)edit_count*12+8 > atom.size)
2822
        return AVERROR_INVALIDDATA;
2823

2824
    av_dlog(c->fc, "track[%i].edit_count = %i\n", c->fc->nb_streams-1, edit_count);
2825
    for (i=0; i<edit_count; i++){
2826 2827
        int64_t time;
        int64_t duration;
2828
        int rate;
2829 2830 2831 2832 2833
        if (version == 1) {
            duration = avio_rb64(pb);
            time     = avio_rb64(pb);
        } else {
            duration = avio_rb32(pb); /* segment duration */
Y
Yusuke Nakamura 已提交
2834
            time     = (int32_t)avio_rb32(pb); /* media time */
2835
        }
2836
        rate = avio_rb32(pb);
2837 2838 2839 2840 2841
        if (i == 0 && time == -1) {
            sc->empty_duration = duration;
            edit_start_index = 1;
        } else if (i == edit_start_index && time >= 0)
            sc->start_time = time;
2842 2843
        else
            unsupported = 1;
2844 2845 2846

        av_dlog(c->fc, "duration=%"PRId64" time=%"PRId64" rate=%f\n",
                duration, time, rate / 65536.0);
B
Baptiste Coudurier 已提交
2847
    }
2848

2849
    if (unsupported)
2850 2851 2852
        av_log(c->fc, AV_LOG_WARNING, "multiple edit list entries, "
               "a/v desync might occur, patch welcome\n");

B
Baptiste Coudurier 已提交
2853
    return 0;
G
Gael Chardon 已提交
2854 2855
}

2856
static int mov_read_tmcd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
C
Clément Bœsch 已提交
2857 2858 2859 2860 2861 2862
{
    MOVStreamContext *sc;

    if (c->fc->nb_streams < 1)
        return AVERROR_INVALIDDATA;
    sc = c->fc->streams[c->fc->nb_streams - 1]->priv_data;
2863
    sc->timecode_track = avio_rb32(pb);
C
Clément Bœsch 已提交
2864 2865 2866
    return 0;
}

2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932
static int mov_read_uuid(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
    int ret;
    uint8_t uuid[16];
    static const uint8_t uuid_isml_manifest[] = {
        0xa5, 0xd4, 0x0b, 0x30, 0xe8, 0x14, 0x11, 0xdd,
        0xba, 0x2f, 0x08, 0x00, 0x20, 0x0c, 0x9a, 0x66
    };

    if (atom.size < sizeof(uuid) || atom.size == INT64_MAX)
        return AVERROR_INVALIDDATA;

    ret = avio_read(pb, uuid, sizeof(uuid));
    if (ret < 0) {
        return ret;
    } else if (ret != sizeof(uuid)) {
        return AVERROR_INVALIDDATA;
    }
    if (!memcmp(uuid, uuid_isml_manifest, sizeof(uuid))) {
        uint8_t *buffer, *ptr;
        char *endptr;
        size_t len = atom.size - sizeof(uuid);

        if (len < 4) {
            return AVERROR_INVALIDDATA;
        }
        ret = avio_skip(pb, 4); // zeroes
        len -= 4;

        buffer = av_mallocz(len + 1);
        if (!buffer) {
            return AVERROR(ENOMEM);
        }
        ret = avio_read(pb, buffer, len);
        if (ret < 0) {
            av_free(buffer);
            return ret;
        } else if (ret != len) {
            av_free(buffer);
            return AVERROR_INVALIDDATA;
        }

        ptr = buffer;
        while ((ptr = av_stristr(ptr, "systemBitrate=\"")) != NULL) {
            ptr += sizeof("systemBitrate=\"") - 1;
            c->bitrates_count++;
            c->bitrates = av_realloc_f(c->bitrates, c->bitrates_count, sizeof(*c->bitrates));
            if (!c->bitrates) {
                c->bitrates_count = 0;
                av_free(buffer);
                return AVERROR(ENOMEM);
            }
            errno = 0;
            ret = strtol(ptr, &endptr, 10);
            if (ret < 0 || errno || *endptr != '"') {
                c->bitrates[c->bitrates_count - 1] = 0;
            } else {
                c->bitrates[c->bitrates_count - 1] = ret;
            }
        }

        av_free(buffer);
    }
    return 0;
}

2933
static const MOVParseTableEntry mov_default_parse_table[] = {
C
Carl Eugen Hoyos 已提交
2934 2935
{ MKTAG('A','C','L','R'), mov_read_avid },
{ MKTAG('A','P','R','G'), mov_read_avid },
P
Piotr Bandurski 已提交
2936
{ MKTAG('A','A','L','P'), mov_read_avid },
2937
{ MKTAG('A','R','E','S'), mov_read_ares },
2938
{ MKTAG('a','v','s','s'), mov_read_avss },
D
David Conrad 已提交
2939
{ MKTAG('c','h','p','l'), mov_read_chpl },
2940 2941 2942 2943 2944 2945 2946
{ 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 },
2947
{ MKTAG('f','i','e','l'), mov_read_fiel },
2948 2949 2950
{ MKTAG('f','t','y','p'), mov_read_ftyp },
{ MKTAG('g','l','b','l'), mov_read_glbl },
{ MKTAG('h','d','l','r'), mov_read_hdlr },
2951
{ MKTAG('i','l','s','t'), mov_read_ilst },
2952
{ MKTAG('j','p','2','h'), mov_read_jp2h },
2953 2954 2955
{ MKTAG('m','d','a','t'), mov_read_mdat },
{ MKTAG('m','d','h','d'), mov_read_mdhd },
{ MKTAG('m','d','i','a'), mov_read_default },
2956
{ MKTAG('m','e','t','a'), mov_read_meta },
2957 2958 2959 2960 2961
{ 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 },
P
Piotr Bandurski 已提交
2962
{ MKTAG('S','M','I',' '), mov_read_svq3 },
2963
{ MKTAG('a','l','a','c'), mov_read_alac }, /* alac specific atom */
2964
{ MKTAG('a','v','c','C'), mov_read_glbl },
2965
{ MKTAG('p','a','s','p'), mov_read_pasp },
2966 2967
{ MKTAG('s','t','b','l'), mov_read_default },
{ MKTAG('s','t','c','o'), mov_read_stco },
2968
{ MKTAG('s','t','p','s'), mov_read_stps },
M
Martin Storsjö 已提交
2969
{ MKTAG('s','t','r','f'), mov_read_strf },
2970 2971 2972 2973 2974
{ 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 },
2975
{ MKTAG('s','t','z','2'), mov_read_stsz }, /* compact sample size */
2976 2977 2978 2979
{ 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 },
2980 2981
{ MKTAG('t','r','e','f'), mov_read_default },
{ MKTAG('t','m','c','d'), mov_read_tmcd },
D
David Conrad 已提交
2982
{ MKTAG('c','h','a','p'), mov_read_chap },
2983 2984
{ MKTAG('t','r','e','x'), mov_read_trex },
{ MKTAG('t','r','u','n'), mov_read_trun },
B
Baptiste Coudurier 已提交
2985
{ MKTAG('u','d','t','a'), mov_read_default },
2986 2987
{ MKTAG('w','a','v','e'), mov_read_wave },
{ MKTAG('e','s','d','s'), mov_read_esds },
2988
{ MKTAG('d','a','c','3'), mov_read_dac3 }, /* AC-3 info */
2989
{ MKTAG('d','e','c','3'), mov_read_dec3 }, /* EAC-3 info */
2990
{ MKTAG('w','i','d','e'), mov_read_wide }, /* place holder */
2991
{ MKTAG('w','f','e','x'), mov_read_wfex },
2992
{ MKTAG('c','m','o','v'), mov_read_cmov },
2993
{ MKTAG('c','h','a','n'), mov_read_chan }, /* channel layout */
M
Martin Storsjö 已提交
2994
{ MKTAG('d','v','c','1'), mov_read_dvc1 },
2995
{ MKTAG('s','b','g','p'), mov_read_sbgp },
Y
Yusuke Nakamura 已提交
2996
{ MKTAG('h','v','c','C'), mov_read_glbl },
2997
{ MKTAG('u','u','i','d'), mov_read_uuid },
2998
{ MKTAG('C','i','n', 0x8e), mov_read_targa_y216 },
B
Baptiste Coudurier 已提交
2999
{ 0, NULL }
3000 3001
};

3002 3003 3004 3005 3006 3007 3008 3009
static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
    int64_t total_size = 0;
    MOVAtom a;
    int i;

    if (atom.size < 0)
        atom.size = INT64_MAX;
3010
    while (total_size + 8 <= atom.size && !url_feof(pb)) {
3011 3012 3013 3014 3015 3016
        int (*parse)(MOVContext*, AVIOContext*, MOVAtom) = NULL;
        a.size = atom.size;
        a.type=0;
        if (atom.size >= 8) {
            a.size = avio_rb32(pb);
            a.type = avio_rl32(pb);
3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031
            if (atom.type != MKTAG('r','o','o','t') &&
                atom.type != MKTAG('m','o','o','v'))
            {
                if (a.type == MKTAG('t','r','a','k') || a.type == MKTAG('m','d','a','t'))
                {
                    av_log(c->fc, AV_LOG_ERROR, "Broken file, trak/mdat not at top-level\n");
                    avio_skip(pb, -8);
                    return 0;
                }
            }
            total_size += 8;
            if (a.size == 1) { /* 64 bit extended size */
                a.size = avio_rb64(pb) - 8;
                total_size += 8;
            }
3032 3033 3034 3035
        }
        av_dlog(c->fc, "type: %08x '%.4s' parent:'%.4s' sz: %"PRId64" %"PRId64" %"PRId64"\n",
                a.type, (char*)&a.type, (char*)&atom.type, a.size, total_size, atom.size);
        if (a.size == 0) {
3036
            a.size = atom.size - total_size + 8;
3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071
        }
        a.size -= 8;
        if (a.size < 0)
            break;
        a.size = FFMIN(a.size, atom.size - total_size);

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

        // 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 */
            avio_skip(pb, a.size);
        } else {
            int64_t start_pos = avio_tell(pb);
            int64_t left;
            int err = parse(c, pb, a);
            if (err < 0)
                return err;
            if (c->found_moov && c->found_mdat &&
                ((!pb->seekable || c->fc->flags & AVFMT_FLAG_IGNIDX) ||
                 start_pos + a.size == avio_size(pb))) {
                if (!pb->seekable || c->fc->flags & AVFMT_FLAG_IGNIDX)
                    c->next_root_atom = start_pos + a.size;
                return 0;
            }
            left = a.size - avio_tell(pb) + start_pos;
            if (left > 0) /* skip garbage at atom end */
                avio_skip(pb, left);
3072 3073 3074 3075
            else if (left < 0) {
                av_log(c->fc, AV_LOG_WARNING,
                       "overread end of atom '%.4s' by %"PRId64" bytes\n",
                       (char*)&a.type, -left);
3076 3077
                avio_seek(pb, left, SEEK_CUR);
            }
3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088
        }

        total_size += a.size;
    }

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

    return 0;
}

F
Fabrice Bellard 已提交
3089 3090
static int mov_probe(AVProbeData *p)
{
3091
    int64_t offset;
3092
    uint32_t tag;
3093
    int score = 0;
3094
    int moov_offset = -1;
3095

F
Fabrice Bellard 已提交
3096
    /* check file header */
3097
    offset = 0;
3098
    for (;;) {
3099 3100
        /* ignore invalid offset */
        if ((offset + 8) > (unsigned int)p->buf_size)
3101
            break;
3102
        tag = AV_RL32(p->buf + offset + 4);
3103
        switch(tag) {
3104
        /* check for obvious tags */
3105
        case MKTAG('m','o','o','v'):
3106 3107
            moov_offset = offset + 4;
        case MKTAG('j','P',' ',' '): /* jpeg 2000 signature */
3108 3109 3110
        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 */
3111
        case MKTAG('f','t','y','p'):
3112 3113 3114 3115
            if (AV_RB32(p->buf+offset) < 8 &&
                (AV_RB32(p->buf+offset) != 1 ||
                 offset + 12 > (unsigned int)p->buf_size ||
                 AV_RB64(p->buf+offset + 8) == 0)) {
3116
                score = FFMAX(score, AVPROBE_SCORE_EXTENSION);
3117 3118 3119
            } else {
                score = AVPROBE_SCORE_MAX;
            }
3120 3121
            offset = FFMAX(4, AV_RB32(p->buf+offset)) + offset;
            break;
3122
        /* those are more common words, so rate then a bit less */
3123 3124 3125 3126 3127
        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'):
3128 3129 3130
            score  = FFMAX(score, AVPROBE_SCORE_MAX - 5);
            offset = FFMAX(4, AV_RB32(p->buf+offset)) + offset;
            break;
B
Baptiste Coudurier 已提交
3131
        case MKTAG(0x82,0x82,0x7f,0x7d):
3132 3133 3134
        case MKTAG('s','k','i','p'):
        case MKTAG('u','u','i','d'):
        case MKTAG('p','r','f','l'):
3135
            /* if we only find those cause probedata is too small at least rate them */
3136
            score  = FFMAX(score, AVPROBE_SCORE_EXTENSION);
3137
            offset = FFMAX(4, AV_RB32(p->buf+offset)) + offset;
3138 3139
            break;
        default:
3140 3141 3142
            offset = FFMAX(4, AV_RB32(p->buf+offset)) + offset;
        }
    }
3143
    if(score > AVPROBE_SCORE_MAX - 50 && moov_offset != -1) {
3144 3145 3146 3147
        /* moov atom in the header - we should make sure that this is not a
         * MOV-packed MPEG-PS */
        offset = moov_offset;

3148 3149 3150 3151 3152 3153 3154 3155
        while(offset < (p->buf_size - 16)){ /* Sufficient space */
               /* We found an actual hdlr atom */
            if(AV_RL32(p->buf + offset     ) == MKTAG('h','d','l','r') &&
               AV_RL32(p->buf + offset +  8) == MKTAG('m','h','l','r') &&
               AV_RL32(p->buf + offset + 12) == MKTAG('M','P','E','G')){
                av_log(NULL, AV_LOG_WARNING, "Found media data tag MPEG indicating this is a MOV-packed MPEG-PS.\n");
                /* We found a media handler reference atom describing an
                 * MPEG-PS-in-MOV, return a
3156 3157 3158 3159 3160 3161
                 * low score to force expanding the probe window until
                 * mpegps_probe finds what it needs */
                return 5;
            }else
                /* Keep looking */
                offset+=2;
3162
        }
3163
    }
3164 3165

    return score;
F
Fabrice Bellard 已提交
3166 3167
}

D
David Conrad 已提交
3168 3169 3170 3171 3172 3173 3174
// 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;
3175
    int i;
D
David Conrad 已提交
3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188

    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;
3189
    cur_pos = avio_tell(sc->pb);
D
David Conrad 已提交
3190 3191 3192 3193

    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;
3194 3195 3196
        uint8_t *title;
        uint16_t ch;
        int len, title_len;
D
David Conrad 已提交
3197

A
Anton Khirnov 已提交
3198
        if (avio_seek(sc->pb, sample->pos, SEEK_SET) != sample->pos) {
D
David Conrad 已提交
3199 3200 3201 3202 3203
            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
3204
        len = avio_rb16(sc->pb);
D
David Conrad 已提交
3205 3206
        if (len > sample->size-2)
            continue;
3207 3208 3209
        title_len = 2*len + 1;
        if (!(title = av_mallocz(title_len)))
            goto finish;
D
David Conrad 已提交
3210 3211 3212 3213

        // 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
3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224
        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)
3225
                    title[len] = 0;
3226
                else
3227
                    avio_get_str(sc->pb, INT_MAX, title + 2, len - 1);
3228
            }
D
David Conrad 已提交
3229 3230
        }

3231
        avpriv_new_chapter(s, i, st->time_base, sample->timestamp, end, title);
3232
        av_freep(&title);
D
David Conrad 已提交
3233 3234
    }
finish:
A
Anton Khirnov 已提交
3235
    avio_seek(sc->pb, cur_pos, SEEK_SET);
D
David Conrad 已提交
3236 3237
}

3238
static int parse_timecode_in_framenum_format(AVFormatContext *s, AVStream *st,
3239
                                             uint32_t value, int flags)
3240
{
3241 3242 3243 3244 3245 3246 3247
    AVTimecode tc;
    char buf[AV_TIMECODE_STR_SIZE];
    AVRational rate = {st->codec->time_base.den,
                       st->codec->time_base.num};
    int ret = av_timecode_init(&tc, rate, flags, 0, s);
    if (ret < 0)
        return ret;
3248
    av_dict_set(&st->metadata, "timecode",
3249
                av_timecode_make_string(&tc, buf, value), 0);
3250 3251 3252 3253 3254 3255
    return 0;
}

static int mov_read_timecode_track(AVFormatContext *s, AVStream *st)
{
    MOVStreamContext *sc = st->priv_data;
3256
    int flags = 0;
3257 3258 3259 3260 3261 3262 3263 3264 3265
    int64_t cur_pos = avio_tell(sc->pb);
    uint32_t value;

    if (!st->nb_index_entries)
        return -1;

    avio_seek(sc->pb, st->index_entries->pos, SEEK_SET);
    value = avio_rb32(s->pb);

3266 3267 3268 3269
    if (sc->tmcd_flags & 0x0001) flags |= AV_TIMECODE_FLAG_DROPFRAME;
    if (sc->tmcd_flags & 0x0002) flags |= AV_TIMECODE_FLAG_24HOURSMAX;
    if (sc->tmcd_flags & 0x0004) flags |= AV_TIMECODE_FLAG_ALLOWNEGATIVE;

3270 3271 3272 3273 3274
    /* Assume Counter flag is set to 1 in tmcd track (even though it is likely
     * not the case) and thus assume "frame number format" instead of QT one.
     * No sample with tmcd track can be found with a QT timecode at the moment,
     * despite what the tmcd track "suggests" (Counter flag set to 0 means QT
     * format). */
3275
    parse_timecode_in_framenum_format(s, st, value, flags);
3276 3277 3278 3279 3280

    avio_seek(sc->pb, cur_pos, SEEK_SET);
    return 0;
}

3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295
static int mov_read_close(AVFormatContext *s)
{
    MOVContext *mov = s->priv_data;
    int i, j;

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

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

3299
        sc->pb = NULL;
3300 3301
        av_freep(&sc->chunk_offsets);
        av_freep(&sc->stsc_data);
3302 3303
        av_freep(&sc->sample_sizes);
        av_freep(&sc->keyframes);
3304
        av_freep(&sc->stts_data);
3305 3306
        av_freep(&sc->stps_data);
        av_freep(&sc->rap_group);
3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318
    }

    if (mov->dv_demux) {
        for (i = 0; i < mov->dv_fctx->nb_streams; i++) {
            av_freep(&mov->dv_fctx->streams[i]->codec);
            av_freep(&mov->dv_fctx->streams[i]);
        }
        av_freep(&mov->dv_fctx);
        av_freep(&mov->dv_demux);
    }

    av_freep(&mov->trex_data);
3319
    av_freep(&mov->bitrates);
3320 3321 3322 3323

    return 0;
}

3324 3325
static int tmcd_is_referenced(AVFormatContext *s, int tmcd_id)
{
3326
    int i;
3327 3328 3329 3330 3331

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

3332 3333 3334
        if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
            sc->timecode_track == tmcd_id)
            return 1;
3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357
    }
    return 0;
}

/* look for a tmcd track not referenced by any video track, and export it globally */
static void export_orphan_timecode(AVFormatContext *s)
{
    int i;

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

        if (st->codec->codec_tag  == MKTAG('t','m','c','d') &&
            !tmcd_is_referenced(s, i + 1)) {
            AVDictionaryEntry *tcr = av_dict_get(st->metadata, "timecode", NULL, 0);
            if (tcr) {
                av_dict_set(&s->metadata, "timecode", tcr->value, 0);
                break;
            }
        }
    }
}

3358
static int mov_read_header(AVFormatContext *s)
3359
{
3360
    MOVContext *mov = s->priv_data;
3361
    AVIOContext *pb = s->pb;
3362
    int i, j, err;
3363
    MOVAtom atom = { AV_RL32("root") };
3364 3365

    mov->fc = s;
3366
    /* .mov and .mp4 aren't streamable anyway (only progressive download if moov is before mdat) */
3367
    if (pb->seekable)
A
Anton Khirnov 已提交
3368
        atom.size = avio_size(pb);
3369
    else
B
Baptiste Coudurier 已提交
3370
        atom.size = INT64_MAX;
3371 3372

    /* check MOV header */
B
Baptiste Coudurier 已提交
3373 3374
    if ((err = mov_read_default(mov, pb, atom)) < 0) {
        av_log(s, AV_LOG_ERROR, "error reading header: %d\n", err);
3375
        mov_read_close(s);
B
Baptiste Coudurier 已提交
3376 3377 3378 3379
        return err;
    }
    if (!mov->found_moov) {
        av_log(s, AV_LOG_ERROR, "moov atom not found\n");
3380
        mov_read_close(s);
3381
        return AVERROR_INVALIDDATA;
3382
    }
3383
    av_dlog(mov->fc, "on_parse_exit_offset=%"PRId64"\n", avio_tell(pb));
3384

3385 3386 3387 3388 3389 3390 3391
    if (pb->seekable) {
        if (mov->chapter_track > 0)
            mov_read_chapters(s);
        for (i = 0; i < s->nb_streams; i++)
            if (s->streams[i]->codec->codec_tag == AV_RL32("tmcd"))
                mov_read_timecode_track(s, s->streams[i]);
    }
D
David Conrad 已提交
3392

3393 3394 3395 3396
    /* copy timecode metadata from tmcd tracks to the related video streams */
    for (i = 0; i < s->nb_streams; i++) {
        AVStream *st = s->streams[i];
        MOVStreamContext *sc = st->priv_data;
3397
        if (sc->timecode_track > 0) {
3398
            AVDictionaryEntry *tcr;
3399
            int tmcd_st_id = -1;
3400

3401 3402 3403 3404
            for (j = 0; j < s->nb_streams; j++)
                if (s->streams[j]->id == sc->timecode_track)
                    tmcd_st_id = j;

3405
            if (tmcd_st_id < 0 || tmcd_st_id == i)
3406 3407 3408 3409 3410 3411
                continue;
            tcr = av_dict_get(s->streams[tmcd_st_id]->metadata, "timecode", NULL, 0);
            if (tcr)
                av_dict_set(&st->metadata, "timecode", tcr->value, 0);
        }
    }
3412
    export_orphan_timecode(s);
3413

3414 3415 3416
    for (i = 0; i < s->nb_streams; i++) {
        AVStream *st = s->streams[i];
        MOVStreamContext *sc = st->priv_data;
3417
        fix_timescale(mov, sc);
3418
        if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && st->codec->codec_id == AV_CODEC_ID_AAC) {
3419 3420
            st->skip_samples = sc->start_pad;
        }
3421 3422
        if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && sc->nb_frames_for_fps > 0 && sc->duration_for_fps > 0)
            av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3423
                      sc->time_scale*(int64_t)sc->nb_frames_for_fps, sc->duration_for_fps, INT_MAX);
3424 3425
    }

3426 3427 3428 3429
    if (mov->trex_data) {
        for (i = 0; i < s->nb_streams; i++) {
            AVStream *st = s->streams[i];
            MOVStreamContext *sc = st->priv_data;
3430
            if (st->duration > 0)
3431 3432 3433 3434
                st->codec->bit_rate = sc->data_size * 8 * sc->time_scale / st->duration;
        }
    }

3435 3436 3437 3438 3439 3440
    for (i = 0; i < mov->bitrates_count && i < s->nb_streams; i++) {
        if (mov->bitrates[i]) {
            s->streams[i]->codec->bit_rate = mov->bitrates[i];
        }
    }

3441 3442
    ff_rfps_calculate(s);

3443 3444 3445
    return 0;
}

3446
static AVIndexEntry *mov_find_next_sample(AVFormatContext *s, AVStream **st)
3447
{
3448
    AVIndexEntry *sample = NULL;
3449
    int64_t best_dts = INT64_MAX;
3450
    int i;
B
Baptiste Coudurier 已提交
3451
    for (i = 0; i < s->nb_streams; i++) {
3452 3453
        AVStream *avst = s->streams[i];
        MOVStreamContext *msc = avst->priv_data;
3454
        if (msc->pb && msc->current_sample < avst->nb_index_entries) {
3455
            AVIndexEntry *current_sample = &avst->index_entries[msc->current_sample];
3456
            int64_t dts = av_rescale(current_sample->timestamp, AV_TIME_BASE, msc->time_scale);
L
Luca Barbato 已提交
3457
            av_dlog(s, "stream %d, sample %d, dts %"PRId64"\n", i, msc->current_sample, dts);
3458 3459
            if (!sample || (!s->pb->seekable && current_sample->pos < sample->pos) ||
                (s->pb->seekable &&
3460
                 ((msc->pb != s->pb && dts < best_dts) || (msc->pb == s->pb &&
B
Baptiste Coudurier 已提交
3461
                 ((FFABS(best_dts - dts) <= AV_TIME_BASE && current_sample->pos < sample->pos) ||
3462
                  (FFABS(best_dts - dts) > AV_TIME_BASE && dts < best_dts)))))) {
3463 3464
                sample = current_sample;
                best_dts = dts;
3465
                *st = avst;
3466
            }
3467 3468
        }
    }
3469 3470 3471 3472 3473 3474 3475 3476 3477 3478
    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;
3479
    mov->fc = s;
3480 3481
 retry:
    sample = mov_find_next_sample(s, &st);
3482 3483
    if (!sample) {
        mov->found_mdat = 0;
3484 3485 3486 3487 3488
        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 ||
3489
            url_feof(s->pb))
B
Baptiste Coudurier 已提交
3490
            return AVERROR_EOF;
3491
        av_dlog(s, "read fragments, offset 0x%"PRIx64"\n", avio_tell(s->pb));
3492 3493
        goto retry;
    }
3494
    sc = st->priv_data;
3495 3496
    /* must be done just before reading, to avoid infinite loop on sample */
    sc->current_sample++;
3497

3498 3499 3500 3501 3502
    if (mov->next_root_atom) {
        sample->pos = FFMIN(sample->pos, mov->next_root_atom);
        sample->size = FFMIN(sample->size, (mov->next_root_atom - sample->pos));
    }

3503
    if (st->discard != AVDISCARD_ALL) {
A
Anton Khirnov 已提交
3504
        if (avio_seek(sc->pb, sample->pos, SEEK_SET) != sample->pos) {
R
Reimar Döffinger 已提交
3505 3506
            av_log(mov->fc, AV_LOG_ERROR, "stream %d, offset 0x%"PRIx64": partial file\n",
                   sc->ffindex, sample->pos);
3507
            return AVERROR_INVALIDDATA;
R
Reimar Döffinger 已提交
3508 3509
        }
        ret = av_get_packet(sc->pb, pkt, sample->size);
3510 3511
        if (ret < 0)
            return ret;
3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522
        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 已提交
3523 3524
#if CONFIG_DV_DEMUXER
        if (mov->dv_demux && sc->dv_audio_container) {
3525
            avpriv_dv_produce_packet(mov->dv_demux, pkt, pkt->data, pkt->size, pkt->pos);
R
Reimar Döffinger 已提交
3526 3527
            av_free(pkt->data);
            pkt->size = 0;
3528
            ret = avpriv_dv_get_packet(mov->dv_demux, pkt);
R
Reimar Döffinger 已提交
3529 3530 3531
            if (ret < 0)
                return ret;
        }
3532
#endif
3533 3534
    }

3535 3536
    pkt->stream_index = sc->ffindex;
    pkt->dts = sample->timestamp;
3537
    if (sc->ctts_data && sc->ctts_index < sc->ctts_count) {
3538
        pkt->pts = pkt->dts + sc->dts_shift + sc->ctts_data[sc->ctts_index].duration;
3539
        /* update ctts context */
3540 3541 3542 3543 3544
        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;
3545
        }
3546 3547
        if (sc->wrong_dts)
            pkt->dts = AV_NOPTS_VALUE;
3548
    } else {
3549
        int64_t next_dts = (sc->current_sample < st->nb_index_entries) ?
3550 3551
            st->index_entries[sc->current_sample].timestamp : st->duration;
        pkt->duration = next_dts - pkt->dts;
3552
        pkt->pts = pkt->dts;
3553
    }
3554 3555
    if (st->discard == AVDISCARD_ALL)
        goto retry;
3556
    pkt->flags |= sample->flags & AVINDEX_KEYFRAME ? AV_PKT_FLAG_KEY : 0;
3557
    pkt->pos = sample->pos;
L
Luca Barbato 已提交
3558
    av_dlog(s, "stream %d, pts %"PRId64", dts %"PRId64", pos 0x%"PRIx64", duration %d\n",
3559
            pkt->stream_index, pkt->pts, pkt->dts, pkt->pos, pkt->duration);
3560 3561
    return 0;
}
3562

3563
static int mov_seek_stream(AVFormatContext *s, AVStream *st, int64_t timestamp, int flags)
3564 3565 3566 3567
{
    MOVStreamContext *sc = st->priv_data;
    int sample, time_sample;
    int i;
3568

3569
    sample = av_index_search_timestamp(st, timestamp, flags);
L
Luca Barbato 已提交
3570
    av_dlog(s, "stream %d, timestamp %"PRId64", sample %d\n", st->index, timestamp, sample);
3571 3572
    if (sample < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
        sample = 0;
3573
    if (sample < 0) /* not sure what to do */
3574
        return AVERROR_INVALIDDATA;
3575
    sc->current_sample = sample;
L
Luca Barbato 已提交
3576
    av_dlog(s, "stream %d, found sample %d\n", st->index, sc->current_sample);
3577 3578 3579 3580
    /* adjust ctts index */
    if (sc->ctts_data) {
        time_sample = 0;
        for (i = 0; i < sc->ctts_count; i++) {
3581 3582
            int next = time_sample + sc->ctts_data[i].count;
            if (next > sc->current_sample) {
3583 3584
                sc->ctts_index = i;
                sc->ctts_sample = sc->current_sample - time_sample;
3585
                break;
3586
            }
3587
            time_sample = next;
3588 3589
        }
    }
3590
    return sample;
3591 3592
}

3593
static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags)
G
Gael Chardon 已提交
3594
{
3595 3596 3597 3598
    AVStream *st;
    int64_t seek_timestamp, timestamp;
    int sample;
    int i;
G
Gael Chardon 已提交
3599

3600
    if (stream_index >= s->nb_streams)
3601
        return AVERROR_INVALIDDATA;
G
Gael Chardon 已提交
3602

3603
    st = s->streams[stream_index];
3604
    sample = mov_seek_stream(s, st, sample_time, flags);
3605
    if (sample < 0)
3606
        return sample;
G
Gael Chardon 已提交
3607

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

3611
    for (i = 0; i < s->nb_streams; i++) {
3612
        MOVStreamContext *sc = s->streams[i]->priv_data;
3613
        st = s->streams[i];
3614 3615
        st->skip_samples = (sample_time <= 0) ? sc->start_pad : 0;

3616
        if (stream_index == i)
3617
            continue;
G
Gael Chardon 已提交
3618

3619
        timestamp = av_rescale_q(seek_timestamp, s->streams[stream_index]->time_base, st->time_base);
3620
        mov_seek_stream(s, st, timestamp, flags);
3621
    }
G
Gael Chardon 已提交
3622 3623 3624
    return 0;
}

3625 3626 3627
static const AVOption options[] = {
    {"use_absolute_path",
        "allow using absolute path when opening alias, this is a possible security issue",
3628
        offsetof(MOVContext, use_absolute_path), FF_OPT_TYPE_INT, {.i64 = 0},
3629
        0, 1, AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_DECODING_PARAM},
3630
    {"ignore_editlist", "", offsetof(MOVContext, ignore_editlist), FF_OPT_TYPE_INT, {.i64 = 0},
3631
        0, 1, AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_DECODING_PARAM},
3632 3633 3634
    {NULL}
};

3635
static const AVClass mov_class = {
3636 3637 3638 3639 3640
    .class_name = "mov,mp4,m4a,3gp,3g2,mj2",
    .item_name  = av_default_item_name,
    .option     = options,
    .version    = LIBAVUTIL_VERSION_INT,
};
3641

3642
AVInputFormat ff_mov_demuxer = {
3643
    .name           = "mov,mp4,m4a,3gp,3g2,mj2",
3644
    .long_name      = NULL_IF_CONFIG_SMALL("QuickTime / MOV"),
3645 3646 3647 3648 3649 3650
    .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,
3651
    .priv_class     = &mov_class,
3652
    .flags          = AVFMT_NO_BYTE_SEEK,
3653
};