Home | History | Annotate | Download | only in libstagefright
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 //#define LOG_NDEBUG 0
     18 #define LOG_TAG "MPEG4Extractor"
     19 #include <utils/Log.h>
     20 
     21 #include "include/MPEG4Extractor.h"
     22 #include "include/SampleTable.h"
     23 #include "include/ESDS.h"
     24 
     25 #include <ctype.h>
     26 #include <stdint.h>
     27 #include <stdlib.h>
     28 #include <string.h>
     29 
     30 #include <media/stagefright/foundation/ABitReader.h>
     31 #include <media/stagefright/foundation/ABuffer.h>
     32 #include <media/stagefright/foundation/ADebug.h>
     33 #include <media/stagefright/foundation/AMessage.h>
     34 #include <media/stagefright/MediaBuffer.h>
     35 #include <media/stagefright/MediaBufferGroup.h>
     36 #include <media/stagefright/MediaDefs.h>
     37 #include <media/stagefright/MediaSource.h>
     38 #include <media/stagefright/MetaData.h>
     39 #include <utils/String8.h>
     40 
     41 namespace android {
     42 
     43 class MPEG4Source : public MediaSource {
     44 public:
     45     // Caller retains ownership of both "dataSource" and "sampleTable".
     46     MPEG4Source(const sp<MetaData> &format,
     47                 const sp<DataSource> &dataSource,
     48                 int32_t timeScale,
     49                 const sp<SampleTable> &sampleTable,
     50                 Vector<SidxEntry> &sidx,
     51                 off64_t firstMoofOffset);
     52 
     53     virtual status_t start(MetaData *params = NULL);
     54     virtual status_t stop();
     55 
     56     virtual sp<MetaData> getFormat();
     57 
     58     virtual status_t read(MediaBuffer **buffer, const ReadOptions *options = NULL);
     59     virtual status_t fragmentedRead(MediaBuffer **buffer, const ReadOptions *options = NULL);
     60 
     61 protected:
     62     virtual ~MPEG4Source();
     63 
     64 private:
     65     Mutex mLock;
     66 
     67     sp<MetaData> mFormat;
     68     sp<DataSource> mDataSource;
     69     int32_t mTimescale;
     70     sp<SampleTable> mSampleTable;
     71     uint32_t mCurrentSampleIndex;
     72     uint32_t mCurrentFragmentIndex;
     73     Vector<SidxEntry> &mSegments;
     74     off64_t mFirstMoofOffset;
     75     off64_t mCurrentMoofOffset;
     76     off64_t mNextMoofOffset;
     77     uint32_t mCurrentTime;
     78     int32_t mLastParsedTrackId;
     79     int32_t mTrackId;
     80 
     81     int32_t mCryptoMode;    // passed in from extractor
     82     int32_t mDefaultIVSize; // passed in from extractor
     83     uint8_t mCryptoKey[16]; // passed in from extractor
     84     uint32_t mCurrentAuxInfoType;
     85     uint32_t mCurrentAuxInfoTypeParameter;
     86     int32_t mCurrentDefaultSampleInfoSize;
     87     uint32_t mCurrentSampleInfoCount;
     88     uint32_t mCurrentSampleInfoAllocSize;
     89     uint8_t* mCurrentSampleInfoSizes;
     90     uint32_t mCurrentSampleInfoOffsetCount;
     91     uint32_t mCurrentSampleInfoOffsetsAllocSize;
     92     uint64_t* mCurrentSampleInfoOffsets;
     93 
     94     bool mIsAVC;
     95     size_t mNALLengthSize;
     96 
     97     bool mStarted;
     98 
     99     MediaBufferGroup *mGroup;
    100 
    101     MediaBuffer *mBuffer;
    102 
    103     bool mWantsNALFragments;
    104 
    105     uint8_t *mSrcBuffer;
    106 
    107     size_t parseNALSize(const uint8_t *data) const;
    108     status_t parseChunk(off64_t *offset);
    109     status_t parseTrackFragmentHeader(off64_t offset, off64_t size);
    110     status_t parseTrackFragmentRun(off64_t offset, off64_t size);
    111     status_t parseSampleAuxiliaryInformationSizes(off64_t offset, off64_t size);
    112     status_t parseSampleAuxiliaryInformationOffsets(off64_t offset, off64_t size);
    113 
    114     struct TrackFragmentHeaderInfo {
    115         enum Flags {
    116             kBaseDataOffsetPresent         = 0x01,
    117             kSampleDescriptionIndexPresent = 0x02,
    118             kDefaultSampleDurationPresent  = 0x08,
    119             kDefaultSampleSizePresent      = 0x10,
    120             kDefaultSampleFlagsPresent     = 0x20,
    121             kDurationIsEmpty               = 0x10000,
    122         };
    123 
    124         uint32_t mTrackID;
    125         uint32_t mFlags;
    126         uint64_t mBaseDataOffset;
    127         uint32_t mSampleDescriptionIndex;
    128         uint32_t mDefaultSampleDuration;
    129         uint32_t mDefaultSampleSize;
    130         uint32_t mDefaultSampleFlags;
    131 
    132         uint64_t mDataOffset;
    133     };
    134     TrackFragmentHeaderInfo mTrackFragmentHeaderInfo;
    135 
    136     struct Sample {
    137         off64_t offset;
    138         size_t size;
    139         uint32_t duration;
    140         uint8_t iv[16];
    141         Vector<size_t> clearsizes;
    142         Vector<size_t> encryptedsizes;
    143     };
    144     Vector<Sample> mCurrentSamples;
    145 
    146     MPEG4Source(const MPEG4Source &);
    147     MPEG4Source &operator=(const MPEG4Source &);
    148 };
    149 
    150 // This custom data source wraps an existing one and satisfies requests
    151 // falling entirely within a cached range from the cache while forwarding
    152 // all remaining requests to the wrapped datasource.
    153 // This is used to cache the full sampletable metadata for a single track,
    154 // possibly wrapping multiple times to cover all tracks, i.e.
    155 // Each MPEG4DataSource caches the sampletable metadata for a single track.
    156 
    157 struct MPEG4DataSource : public DataSource {
    158     MPEG4DataSource(const sp<DataSource> &source);
    159 
    160     virtual status_t initCheck() const;
    161     virtual ssize_t readAt(off64_t offset, void *data, size_t size);
    162     virtual status_t getSize(off64_t *size);
    163     virtual uint32_t flags();
    164 
    165     status_t setCachedRange(off64_t offset, size_t size);
    166 
    167 protected:
    168     virtual ~MPEG4DataSource();
    169 
    170 private:
    171     Mutex mLock;
    172 
    173     sp<DataSource> mSource;
    174     off64_t mCachedOffset;
    175     size_t mCachedSize;
    176     uint8_t *mCache;
    177 
    178     void clearCache();
    179 
    180     MPEG4DataSource(const MPEG4DataSource &);
    181     MPEG4DataSource &operator=(const MPEG4DataSource &);
    182 };
    183 
    184 MPEG4DataSource::MPEG4DataSource(const sp<DataSource> &source)
    185     : mSource(source),
    186       mCachedOffset(0),
    187       mCachedSize(0),
    188       mCache(NULL) {
    189 }
    190 
    191 MPEG4DataSource::~MPEG4DataSource() {
    192     clearCache();
    193 }
    194 
    195 void MPEG4DataSource::clearCache() {
    196     if (mCache) {
    197         free(mCache);
    198         mCache = NULL;
    199     }
    200 
    201     mCachedOffset = 0;
    202     mCachedSize = 0;
    203 }
    204 
    205 status_t MPEG4DataSource::initCheck() const {
    206     return mSource->initCheck();
    207 }
    208 
    209 ssize_t MPEG4DataSource::readAt(off64_t offset, void *data, size_t size) {
    210     Mutex::Autolock autoLock(mLock);
    211 
    212     if (offset >= mCachedOffset
    213             && offset + size <= mCachedOffset + mCachedSize) {
    214         memcpy(data, &mCache[offset - mCachedOffset], size);
    215         return size;
    216     }
    217 
    218     return mSource->readAt(offset, data, size);
    219 }
    220 
    221 status_t MPEG4DataSource::getSize(off64_t *size) {
    222     return mSource->getSize(size);
    223 }
    224 
    225 uint32_t MPEG4DataSource::flags() {
    226     return mSource->flags();
    227 }
    228 
    229 status_t MPEG4DataSource::setCachedRange(off64_t offset, size_t size) {
    230     Mutex::Autolock autoLock(mLock);
    231 
    232     clearCache();
    233 
    234     mCache = (uint8_t *)malloc(size);
    235 
    236     if (mCache == NULL) {
    237         return -ENOMEM;
    238     }
    239 
    240     mCachedOffset = offset;
    241     mCachedSize = size;
    242 
    243     ssize_t err = mSource->readAt(mCachedOffset, mCache, mCachedSize);
    244 
    245     if (err < (ssize_t)size) {
    246         clearCache();
    247 
    248         return ERROR_IO;
    249     }
    250 
    251     return OK;
    252 }
    253 
    254 ////////////////////////////////////////////////////////////////////////////////
    255 
    256 static void hexdump(const void *_data, size_t size) {
    257     const uint8_t *data = (const uint8_t *)_data;
    258     size_t offset = 0;
    259     while (offset < size) {
    260         printf("0x%04x  ", offset);
    261 
    262         size_t n = size - offset;
    263         if (n > 16) {
    264             n = 16;
    265         }
    266 
    267         for (size_t i = 0; i < 16; ++i) {
    268             if (i == 8) {
    269                 printf(" ");
    270             }
    271 
    272             if (offset + i < size) {
    273                 printf("%02x ", data[offset + i]);
    274             } else {
    275                 printf("   ");
    276             }
    277         }
    278 
    279         printf(" ");
    280 
    281         for (size_t i = 0; i < n; ++i) {
    282             if (isprint(data[offset + i])) {
    283                 printf("%c", data[offset + i]);
    284             } else {
    285                 printf(".");
    286             }
    287         }
    288 
    289         printf("\n");
    290 
    291         offset += 16;
    292     }
    293 }
    294 
    295 static const char *FourCC2MIME(uint32_t fourcc) {
    296     switch (fourcc) {
    297         case FOURCC('m', 'p', '4', 'a'):
    298             return MEDIA_MIMETYPE_AUDIO_AAC;
    299 
    300         case FOURCC('s', 'a', 'm', 'r'):
    301             return MEDIA_MIMETYPE_AUDIO_AMR_NB;
    302 
    303         case FOURCC('s', 'a', 'w', 'b'):
    304             return MEDIA_MIMETYPE_AUDIO_AMR_WB;
    305 
    306         case FOURCC('m', 'p', '4', 'v'):
    307             return MEDIA_MIMETYPE_VIDEO_MPEG4;
    308 
    309         case FOURCC('s', '2', '6', '3'):
    310         case FOURCC('h', '2', '6', '3'):
    311         case FOURCC('H', '2', '6', '3'):
    312             return MEDIA_MIMETYPE_VIDEO_H263;
    313 
    314         case FOURCC('a', 'v', 'c', '1'):
    315             return MEDIA_MIMETYPE_VIDEO_AVC;
    316 
    317         default:
    318             CHECK(!"should not be here.");
    319             return NULL;
    320     }
    321 }
    322 
    323 static bool AdjustChannelsAndRate(uint32_t fourcc, uint32_t *channels, uint32_t *rate) {
    324     if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_NB, FourCC2MIME(fourcc))) {
    325         // AMR NB audio is always mono, 8kHz
    326         *channels = 1;
    327         *rate = 8000;
    328         return true;
    329     } else if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_WB, FourCC2MIME(fourcc))) {
    330         // AMR WB audio is always mono, 16kHz
    331         *channels = 1;
    332         *rate = 16000;
    333         return true;
    334     }
    335     return false;
    336 }
    337 
    338 MPEG4Extractor::MPEG4Extractor(const sp<DataSource> &source)
    339     : mSidxDuration(0),
    340       mMoofOffset(0),
    341       mDataSource(source),
    342       mInitCheck(NO_INIT),
    343       mHasVideo(false),
    344       mHeaderTimescale(0),
    345       mFirstTrack(NULL),
    346       mLastTrack(NULL),
    347       mFileMetaData(new MetaData),
    348       mFirstSINF(NULL),
    349       mIsDrm(false) {
    350 }
    351 
    352 MPEG4Extractor::~MPEG4Extractor() {
    353     Track *track = mFirstTrack;
    354     while (track) {
    355         Track *next = track->next;
    356 
    357         delete track;
    358         track = next;
    359     }
    360     mFirstTrack = mLastTrack = NULL;
    361 
    362     SINF *sinf = mFirstSINF;
    363     while (sinf) {
    364         SINF *next = sinf->next;
    365         delete sinf->IPMPData;
    366         delete sinf;
    367         sinf = next;
    368     }
    369     mFirstSINF = NULL;
    370 
    371     for (size_t i = 0; i < mPssh.size(); i++) {
    372         delete [] mPssh[i].data;
    373     }
    374 }
    375 
    376 uint32_t MPEG4Extractor::flags() const {
    377     return CAN_PAUSE |
    378             ((mMoofOffset == 0 || mSidxEntries.size() != 0) ?
    379                     (CAN_SEEK_BACKWARD | CAN_SEEK_FORWARD | CAN_SEEK) : 0);
    380 }
    381 
    382 sp<MetaData> MPEG4Extractor::getMetaData() {
    383     status_t err;
    384     if ((err = readMetaData()) != OK) {
    385         return new MetaData;
    386     }
    387 
    388     return mFileMetaData;
    389 }
    390 
    391 size_t MPEG4Extractor::countTracks() {
    392     status_t err;
    393     if ((err = readMetaData()) != OK) {
    394         ALOGV("MPEG4Extractor::countTracks: no tracks");
    395         return 0;
    396     }
    397 
    398     size_t n = 0;
    399     Track *track = mFirstTrack;
    400     while (track) {
    401         ++n;
    402         track = track->next;
    403     }
    404 
    405     ALOGV("MPEG4Extractor::countTracks: %d tracks", n);
    406     return n;
    407 }
    408 
    409 sp<MetaData> MPEG4Extractor::getTrackMetaData(
    410         size_t index, uint32_t flags) {
    411     status_t err;
    412     if ((err = readMetaData()) != OK) {
    413         return NULL;
    414     }
    415 
    416     Track *track = mFirstTrack;
    417     while (index > 0) {
    418         if (track == NULL) {
    419             return NULL;
    420         }
    421 
    422         track = track->next;
    423         --index;
    424     }
    425 
    426     if (track == NULL) {
    427         return NULL;
    428     }
    429 
    430     if ((flags & kIncludeExtensiveMetaData)
    431             && !track->includes_expensive_metadata) {
    432         track->includes_expensive_metadata = true;
    433 
    434         const char *mime;
    435         CHECK(track->meta->findCString(kKeyMIMEType, &mime));
    436         if (!strncasecmp("video/", mime, 6)) {
    437             if (mMoofOffset > 0) {
    438                 int64_t duration;
    439                 if (track->meta->findInt64(kKeyDuration, &duration)) {
    440                     // nothing fancy, just pick a frame near 1/4th of the duration
    441                     track->meta->setInt64(
    442                             kKeyThumbnailTime, duration / 4);
    443                 }
    444             } else {
    445                 uint32_t sampleIndex;
    446                 uint32_t sampleTime;
    447                 if (track->sampleTable->findThumbnailSample(&sampleIndex) == OK
    448                         && track->sampleTable->getMetaDataForSample(
    449                             sampleIndex, NULL /* offset */, NULL /* size */,
    450                             &sampleTime) == OK) {
    451                     track->meta->setInt64(
    452                             kKeyThumbnailTime,
    453                             ((int64_t)sampleTime * 1000000) / track->timescale);
    454                 }
    455             }
    456         }
    457     }
    458 
    459     return track->meta;
    460 }
    461 
    462 static void MakeFourCCString(uint32_t x, char *s) {
    463     s[0] = x >> 24;
    464     s[1] = (x >> 16) & 0xff;
    465     s[2] = (x >> 8) & 0xff;
    466     s[3] = x & 0xff;
    467     s[4] = '\0';
    468 }
    469 
    470 status_t MPEG4Extractor::readMetaData() {
    471     if (mInitCheck != NO_INIT) {
    472         return mInitCheck;
    473     }
    474 
    475     off64_t offset = 0;
    476     status_t err;
    477     while (true) {
    478         err = parseChunk(&offset, 0);
    479         if (err == OK) {
    480             continue;
    481         }
    482 
    483         uint32_t hdr[2];
    484         if (mDataSource->readAt(offset, hdr, 8) < 8) {
    485             break;
    486         }
    487         uint32_t chunk_type = ntohl(hdr[1]);
    488         if (chunk_type == FOURCC('s', 'i', 'd', 'x')) {
    489             // parse the sidx box too
    490             continue;
    491         } else if (chunk_type == FOURCC('m', 'o', 'o', 'f')) {
    492             // store the offset of the first segment
    493             mMoofOffset = offset;
    494         }
    495         break;
    496     }
    497 
    498     if (mInitCheck == OK) {
    499         if (mHasVideo) {
    500             mFileMetaData->setCString(
    501                     kKeyMIMEType, MEDIA_MIMETYPE_CONTAINER_MPEG4);
    502         } else {
    503             mFileMetaData->setCString(kKeyMIMEType, "audio/mp4");
    504         }
    505 
    506         mInitCheck = OK;
    507     } else {
    508         mInitCheck = err;
    509     }
    510 
    511     CHECK_NE(err, (status_t)NO_INIT);
    512 
    513     // copy pssh data into file metadata
    514     int psshsize = 0;
    515     for (size_t i = 0; i < mPssh.size(); i++) {
    516         psshsize += 20 + mPssh[i].datalen;
    517     }
    518     if (psshsize) {
    519         char *buf = (char*)malloc(psshsize);
    520         char *ptr = buf;
    521         for (size_t i = 0; i < mPssh.size(); i++) {
    522             memcpy(ptr, mPssh[i].uuid, 20); // uuid + length
    523             memcpy(ptr + 20, mPssh[i].data, mPssh[i].datalen);
    524             ptr += (20 + mPssh[i].datalen);
    525         }
    526         mFileMetaData->setData(kKeyPssh, 'pssh', buf, psshsize);
    527         free(buf);
    528     }
    529     return mInitCheck;
    530 }
    531 
    532 char* MPEG4Extractor::getDrmTrackInfo(size_t trackID, int *len) {
    533     if (mFirstSINF == NULL) {
    534         return NULL;
    535     }
    536 
    537     SINF *sinf = mFirstSINF;
    538     while (sinf && (trackID != sinf->trackID)) {
    539         sinf = sinf->next;
    540     }
    541 
    542     if (sinf == NULL) {
    543         return NULL;
    544     }
    545 
    546     *len = sinf->len;
    547     return sinf->IPMPData;
    548 }
    549 
    550 // Reads an encoded integer 7 bits at a time until it encounters the high bit clear.
    551 static int32_t readSize(off64_t offset,
    552         const sp<DataSource> DataSource, uint8_t *numOfBytes) {
    553     uint32_t size = 0;
    554     uint8_t data;
    555     bool moreData = true;
    556     *numOfBytes = 0;
    557 
    558     while (moreData) {
    559         if (DataSource->readAt(offset, &data, 1) < 1) {
    560             return -1;
    561         }
    562         offset ++;
    563         moreData = (data >= 128) ? true : false;
    564         size = (size << 7) | (data & 0x7f); // Take last 7 bits
    565         (*numOfBytes) ++;
    566     }
    567 
    568     return size;
    569 }
    570 
    571 status_t MPEG4Extractor::parseDrmSINF(off64_t *offset, off64_t data_offset) {
    572     uint8_t updateIdTag;
    573     if (mDataSource->readAt(data_offset, &updateIdTag, 1) < 1) {
    574         return ERROR_IO;
    575     }
    576     data_offset ++;
    577 
    578     if (0x01/*OBJECT_DESCRIPTOR_UPDATE_ID_TAG*/ != updateIdTag) {
    579         return ERROR_MALFORMED;
    580     }
    581 
    582     uint8_t numOfBytes;
    583     int32_t size = readSize(data_offset, mDataSource, &numOfBytes);
    584     if (size < 0) {
    585         return ERROR_IO;
    586     }
    587     int32_t classSize = size;
    588     data_offset += numOfBytes;
    589 
    590     while(size >= 11 ) {
    591         uint8_t descriptorTag;
    592         if (mDataSource->readAt(data_offset, &descriptorTag, 1) < 1) {
    593             return ERROR_IO;
    594         }
    595         data_offset ++;
    596 
    597         if (0x11/*OBJECT_DESCRIPTOR_ID_TAG*/ != descriptorTag) {
    598             return ERROR_MALFORMED;
    599         }
    600 
    601         uint8_t buffer[8];
    602         //ObjectDescriptorID and ObjectDescriptor url flag
    603         if (mDataSource->readAt(data_offset, buffer, 2) < 2) {
    604             return ERROR_IO;
    605         }
    606         data_offset += 2;
    607 
    608         if ((buffer[1] >> 5) & 0x0001) { //url flag is set
    609             return ERROR_MALFORMED;
    610         }
    611 
    612         if (mDataSource->readAt(data_offset, buffer, 8) < 8) {
    613             return ERROR_IO;
    614         }
    615         data_offset += 8;
    616 
    617         if ((0x0F/*ES_ID_REF_TAG*/ != buffer[1])
    618                 || ( 0x0A/*IPMP_DESCRIPTOR_POINTER_ID_TAG*/ != buffer[5])) {
    619             return ERROR_MALFORMED;
    620         }
    621 
    622         SINF *sinf = new SINF;
    623         sinf->trackID = U16_AT(&buffer[3]);
    624         sinf->IPMPDescriptorID = buffer[7];
    625         sinf->next = mFirstSINF;
    626         mFirstSINF = sinf;
    627 
    628         size -= (8 + 2 + 1);
    629     }
    630 
    631     if (size != 0) {
    632         return ERROR_MALFORMED;
    633     }
    634 
    635     if (mDataSource->readAt(data_offset, &updateIdTag, 1) < 1) {
    636         return ERROR_IO;
    637     }
    638     data_offset ++;
    639 
    640     if(0x05/*IPMP_DESCRIPTOR_UPDATE_ID_TAG*/ != updateIdTag) {
    641         return ERROR_MALFORMED;
    642     }
    643 
    644     size = readSize(data_offset, mDataSource, &numOfBytes);
    645     if (size < 0) {
    646         return ERROR_IO;
    647     }
    648     classSize = size;
    649     data_offset += numOfBytes;
    650 
    651     while (size > 0) {
    652         uint8_t tag;
    653         int32_t dataLen;
    654         if (mDataSource->readAt(data_offset, &tag, 1) < 1) {
    655             return ERROR_IO;
    656         }
    657         data_offset ++;
    658 
    659         if (0x0B/*IPMP_DESCRIPTOR_ID_TAG*/ == tag) {
    660             uint8_t id;
    661             dataLen = readSize(data_offset, mDataSource, &numOfBytes);
    662             if (dataLen < 0) {
    663                 return ERROR_IO;
    664             } else if (dataLen < 4) {
    665                 return ERROR_MALFORMED;
    666             }
    667             data_offset += numOfBytes;
    668 
    669             if (mDataSource->readAt(data_offset, &id, 1) < 1) {
    670                 return ERROR_IO;
    671             }
    672             data_offset ++;
    673 
    674             SINF *sinf = mFirstSINF;
    675             while (sinf && (sinf->IPMPDescriptorID != id)) {
    676                 sinf = sinf->next;
    677             }
    678             if (sinf == NULL) {
    679                 return ERROR_MALFORMED;
    680             }
    681             sinf->len = dataLen - 3;
    682             sinf->IPMPData = new char[sinf->len];
    683 
    684             if (mDataSource->readAt(data_offset + 2, sinf->IPMPData, sinf->len) < sinf->len) {
    685                 return ERROR_IO;
    686             }
    687             data_offset += sinf->len;
    688 
    689             size -= (dataLen + numOfBytes + 1);
    690         }
    691     }
    692 
    693     if (size != 0) {
    694         return ERROR_MALFORMED;
    695     }
    696 
    697     return UNKNOWN_ERROR;  // Return a dummy error.
    698 }
    699 
    700 struct PathAdder {
    701     PathAdder(Vector<uint32_t> *path, uint32_t chunkType)
    702         : mPath(path) {
    703         mPath->push(chunkType);
    704     }
    705 
    706     ~PathAdder() {
    707         mPath->pop();
    708     }
    709 
    710 private:
    711     Vector<uint32_t> *mPath;
    712 
    713     PathAdder(const PathAdder &);
    714     PathAdder &operator=(const PathAdder &);
    715 };
    716 
    717 static bool underMetaDataPath(const Vector<uint32_t> &path) {
    718     return path.size() >= 5
    719         && path[0] == FOURCC('m', 'o', 'o', 'v')
    720         && path[1] == FOURCC('u', 'd', 't', 'a')
    721         && path[2] == FOURCC('m', 'e', 't', 'a')
    722         && path[3] == FOURCC('i', 'l', 's', 't');
    723 }
    724 
    725 // Given a time in seconds since Jan 1 1904, produce a human-readable string.
    726 static void convertTimeToDate(int64_t time_1904, String8 *s) {
    727     time_t time_1970 = time_1904 - (((66 * 365 + 17) * 24) * 3600);
    728 
    729     char tmp[32];
    730     strftime(tmp, sizeof(tmp), "%Y%m%dT%H%M%S.000Z", gmtime(&time_1970));
    731 
    732     s->setTo(tmp);
    733 }
    734 
    735 status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
    736     ALOGV("entering parseChunk %lld/%d", *offset, depth);
    737     uint32_t hdr[2];
    738     if (mDataSource->readAt(*offset, hdr, 8) < 8) {
    739         return ERROR_IO;
    740     }
    741     uint64_t chunk_size = ntohl(hdr[0]);
    742     uint32_t chunk_type = ntohl(hdr[1]);
    743     off64_t data_offset = *offset + 8;
    744 
    745     if (chunk_size == 1) {
    746         if (mDataSource->readAt(*offset + 8, &chunk_size, 8) < 8) {
    747             return ERROR_IO;
    748         }
    749         chunk_size = ntoh64(chunk_size);
    750         data_offset += 8;
    751 
    752         if (chunk_size < 16) {
    753             // The smallest valid chunk is 16 bytes long in this case.
    754             return ERROR_MALFORMED;
    755         }
    756     } else if (chunk_size < 8) {
    757         // The smallest valid chunk is 8 bytes long.
    758         return ERROR_MALFORMED;
    759     }
    760 
    761     char chunk[5];
    762     MakeFourCCString(chunk_type, chunk);
    763     ALOGV("chunk: %s @ %lld, %d", chunk, *offset, depth);
    764 
    765 #if 0
    766     static const char kWhitespace[] = "                                        ";
    767     const char *indent = &kWhitespace[sizeof(kWhitespace) - 1 - 2 * depth];
    768     printf("%sfound chunk '%s' of size %lld\n", indent, chunk, chunk_size);
    769 
    770     char buffer[256];
    771     size_t n = chunk_size;
    772     if (n > sizeof(buffer)) {
    773         n = sizeof(buffer);
    774     }
    775     if (mDataSource->readAt(*offset, buffer, n)
    776             < (ssize_t)n) {
    777         return ERROR_IO;
    778     }
    779 
    780     hexdump(buffer, n);
    781 #endif
    782 
    783     PathAdder autoAdder(&mPath, chunk_type);
    784 
    785     off64_t chunk_data_size = *offset + chunk_size - data_offset;
    786 
    787     if (chunk_type != FOURCC('c', 'p', 'r', 't')
    788             && chunk_type != FOURCC('c', 'o', 'v', 'r')
    789             && mPath.size() == 5 && underMetaDataPath(mPath)) {
    790         off64_t stop_offset = *offset + chunk_size;
    791         *offset = data_offset;
    792         while (*offset < stop_offset) {
    793             status_t err = parseChunk(offset, depth + 1);
    794             if (err != OK) {
    795                 return err;
    796             }
    797         }
    798 
    799         if (*offset != stop_offset) {
    800             return ERROR_MALFORMED;
    801         }
    802 
    803         return OK;
    804     }
    805 
    806     switch(chunk_type) {
    807         case FOURCC('m', 'o', 'o', 'v'):
    808         case FOURCC('t', 'r', 'a', 'k'):
    809         case FOURCC('m', 'd', 'i', 'a'):
    810         case FOURCC('m', 'i', 'n', 'f'):
    811         case FOURCC('d', 'i', 'n', 'f'):
    812         case FOURCC('s', 't', 'b', 'l'):
    813         case FOURCC('m', 'v', 'e', 'x'):
    814         case FOURCC('m', 'o', 'o', 'f'):
    815         case FOURCC('t', 'r', 'a', 'f'):
    816         case FOURCC('m', 'f', 'r', 'a'):
    817         case FOURCC('u', 'd', 't', 'a'):
    818         case FOURCC('i', 'l', 's', 't'):
    819         case FOURCC('s', 'i', 'n', 'f'):
    820         case FOURCC('s', 'c', 'h', 'i'):
    821         case FOURCC('e', 'd', 't', 's'):
    822         {
    823             if (chunk_type == FOURCC('s', 't', 'b', 'l')) {
    824                 ALOGV("sampleTable chunk is %d bytes long.", (size_t)chunk_size);
    825 
    826                 if (mDataSource->flags()
    827                         & (DataSource::kWantsPrefetching
    828                             | DataSource::kIsCachingDataSource)) {
    829                     sp<MPEG4DataSource> cachedSource =
    830                         new MPEG4DataSource(mDataSource);
    831 
    832                     if (cachedSource->setCachedRange(*offset, chunk_size) == OK) {
    833                         mDataSource = cachedSource;
    834                     }
    835                 }
    836 
    837                 mLastTrack->sampleTable = new SampleTable(mDataSource);
    838             }
    839 
    840             bool isTrack = false;
    841             if (chunk_type == FOURCC('t', 'r', 'a', 'k')) {
    842                 isTrack = true;
    843 
    844                 Track *track = new Track;
    845                 track->next = NULL;
    846                 if (mLastTrack) {
    847                     mLastTrack->next = track;
    848                 } else {
    849                     mFirstTrack = track;
    850                 }
    851                 mLastTrack = track;
    852 
    853                 track->meta = new MetaData;
    854                 track->includes_expensive_metadata = false;
    855                 track->skipTrack = false;
    856                 track->timescale = 0;
    857                 track->meta->setCString(kKeyMIMEType, "application/octet-stream");
    858             }
    859 
    860             off64_t stop_offset = *offset + chunk_size;
    861             *offset = data_offset;
    862             while (*offset < stop_offset) {
    863                 status_t err = parseChunk(offset, depth + 1);
    864                 if (err != OK) {
    865                     return err;
    866                 }
    867             }
    868 
    869             if (*offset != stop_offset) {
    870                 return ERROR_MALFORMED;
    871             }
    872 
    873             if (isTrack) {
    874                 if (mLastTrack->skipTrack) {
    875                     Track *cur = mFirstTrack;
    876 
    877                     if (cur == mLastTrack) {
    878                         delete cur;
    879                         mFirstTrack = mLastTrack = NULL;
    880                     } else {
    881                         while (cur && cur->next != mLastTrack) {
    882                             cur = cur->next;
    883                         }
    884                         cur->next = NULL;
    885                         delete mLastTrack;
    886                         mLastTrack = cur;
    887                     }
    888 
    889                     return OK;
    890                 }
    891 
    892                 status_t err = verifyTrack(mLastTrack);
    893 
    894                 if (err != OK) {
    895                     return err;
    896                 }
    897             } else if (chunk_type == FOURCC('m', 'o', 'o', 'v')) {
    898                 mInitCheck = OK;
    899 
    900                 if (!mIsDrm) {
    901                     return UNKNOWN_ERROR;  // Return a dummy error.
    902                 } else {
    903                     return OK;
    904                 }
    905             }
    906             break;
    907         }
    908 
    909         case FOURCC('e', 'l', 's', 't'):
    910         {
    911             // See 14496-12 8.6.6
    912             uint8_t version;
    913             if (mDataSource->readAt(data_offset, &version, 1) < 1) {
    914                 return ERROR_IO;
    915             }
    916 
    917             uint32_t entry_count;
    918             if (!mDataSource->getUInt32(data_offset + 4, &entry_count)) {
    919                 return ERROR_IO;
    920             }
    921 
    922             if (entry_count != 1) {
    923                 // we only support a single entry at the moment, for gapless playback
    924                 ALOGW("ignoring edit list with %d entries", entry_count);
    925             } else if (mHeaderTimescale == 0) {
    926                 ALOGW("ignoring edit list because timescale is 0");
    927             } else {
    928                 off64_t entriesoffset = data_offset + 8;
    929                 uint64_t segment_duration;
    930                 int64_t media_time;
    931 
    932                 if (version == 1) {
    933                     if (!mDataSource->getUInt64(entriesoffset, &segment_duration) ||
    934                             !mDataSource->getUInt64(entriesoffset + 8, (uint64_t*)&media_time)) {
    935                         return ERROR_IO;
    936                     }
    937                 } else if (version == 0) {
    938                     uint32_t sd;
    939                     int32_t mt;
    940                     if (!mDataSource->getUInt32(entriesoffset, &sd) ||
    941                             !mDataSource->getUInt32(entriesoffset + 4, (uint32_t*)&mt)) {
    942                         return ERROR_IO;
    943                     }
    944                     segment_duration = sd;
    945                     media_time = mt;
    946                 } else {
    947                     return ERROR_IO;
    948                 }
    949 
    950                 uint64_t halfscale = mHeaderTimescale / 2;
    951                 segment_duration = (segment_duration * 1000000 + halfscale)/ mHeaderTimescale;
    952                 media_time = (media_time * 1000000 + halfscale) / mHeaderTimescale;
    953 
    954                 int64_t duration;
    955                 int32_t samplerate;
    956                 if (mLastTrack->meta->findInt64(kKeyDuration, &duration) &&
    957                         mLastTrack->meta->findInt32(kKeySampleRate, &samplerate)) {
    958 
    959                     int64_t delay = (media_time  * samplerate + 500000) / 1000000;
    960                     mLastTrack->meta->setInt32(kKeyEncoderDelay, delay);
    961 
    962                     int64_t paddingus = duration - (segment_duration + media_time);
    963                     int64_t paddingsamples = (paddingus * samplerate + 500000) / 1000000;
    964                     mLastTrack->meta->setInt32(kKeyEncoderPadding, paddingsamples);
    965                 }
    966             }
    967             *offset += chunk_size;
    968             break;
    969         }
    970 
    971         case FOURCC('f', 'r', 'm', 'a'):
    972         {
    973             uint32_t original_fourcc;
    974             if (mDataSource->readAt(data_offset, &original_fourcc, 4) < 4) {
    975                 return ERROR_IO;
    976             }
    977             original_fourcc = ntohl(original_fourcc);
    978             ALOGV("read original format: %d", original_fourcc);
    979             mLastTrack->meta->setCString(kKeyMIMEType, FourCC2MIME(original_fourcc));
    980             uint32_t num_channels = 0;
    981             uint32_t sample_rate = 0;
    982             if (AdjustChannelsAndRate(original_fourcc, &num_channels, &sample_rate)) {
    983                 mLastTrack->meta->setInt32(kKeyChannelCount, num_channels);
    984                 mLastTrack->meta->setInt32(kKeySampleRate, sample_rate);
    985             }
    986             *offset += chunk_size;
    987             break;
    988         }
    989 
    990         case FOURCC('t', 'e', 'n', 'c'):
    991         {
    992             if (chunk_size < 32) {
    993                 return ERROR_MALFORMED;
    994             }
    995 
    996             // tenc box contains 1 byte version, 3 byte flags, 3 byte default algorithm id, one byte
    997             // default IV size, 16 bytes default KeyID
    998             // (ISO 23001-7)
    999             char buf[4];
   1000             memset(buf, 0, 4);
   1001             if (mDataSource->readAt(data_offset + 4, buf + 1, 3) < 3) {
   1002                 return ERROR_IO;
   1003             }
   1004             uint32_t defaultAlgorithmId = ntohl(*((int32_t*)buf));
   1005             if (defaultAlgorithmId > 1) {
   1006                 // only 0 (clear) and 1 (AES-128) are valid
   1007                 return ERROR_MALFORMED;
   1008             }
   1009 
   1010             memset(buf, 0, 4);
   1011             if (mDataSource->readAt(data_offset + 7, buf + 3, 1) < 1) {
   1012                 return ERROR_IO;
   1013             }
   1014             uint32_t defaultIVSize = ntohl(*((int32_t*)buf));
   1015 
   1016             if ((defaultAlgorithmId == 0 && defaultIVSize != 0) ||
   1017                     (defaultAlgorithmId != 0 && defaultIVSize == 0)) {
   1018                 // only unencrypted data must have 0 IV size
   1019                 return ERROR_MALFORMED;
   1020             } else if (defaultIVSize != 0 &&
   1021                     defaultIVSize != 8 &&
   1022                     defaultIVSize != 16) {
   1023                 // only supported sizes are 0, 8 and 16
   1024                 return ERROR_MALFORMED;
   1025             }
   1026 
   1027             uint8_t defaultKeyId[16];
   1028 
   1029             if (mDataSource->readAt(data_offset + 8, &defaultKeyId, 16) < 16) {
   1030                 return ERROR_IO;
   1031             }
   1032 
   1033             mLastTrack->meta->setInt32(kKeyCryptoMode, defaultAlgorithmId);
   1034             mLastTrack->meta->setInt32(kKeyCryptoDefaultIVSize, defaultIVSize);
   1035             mLastTrack->meta->setData(kKeyCryptoKey, 'tenc', defaultKeyId, 16);
   1036             *offset += chunk_size;
   1037             break;
   1038         }
   1039 
   1040         case FOURCC('t', 'k', 'h', 'd'):
   1041         {
   1042             status_t err;
   1043             if ((err = parseTrackHeader(data_offset, chunk_data_size)) != OK) {
   1044                 return err;
   1045             }
   1046 
   1047             *offset += chunk_size;
   1048             break;
   1049         }
   1050 
   1051         case FOURCC('p', 's', 's', 'h'):
   1052         {
   1053             PsshInfo pssh;
   1054 
   1055             if (mDataSource->readAt(data_offset + 4, &pssh.uuid, 16) < 16) {
   1056                 return ERROR_IO;
   1057             }
   1058 
   1059             uint32_t psshdatalen = 0;
   1060             if (mDataSource->readAt(data_offset + 20, &psshdatalen, 4) < 4) {
   1061                 return ERROR_IO;
   1062             }
   1063             pssh.datalen = ntohl(psshdatalen);
   1064             ALOGV("pssh data size: %d", pssh.datalen);
   1065             if (pssh.datalen + 20 > chunk_size) {
   1066                 // pssh data length exceeds size of containing box
   1067                 return ERROR_MALFORMED;
   1068             }
   1069 
   1070             pssh.data = new uint8_t[pssh.datalen];
   1071             ALOGV("allocated pssh @ %p", pssh.data);
   1072             ssize_t requested = (ssize_t) pssh.datalen;
   1073             if (mDataSource->readAt(data_offset + 24, pssh.data, requested) < requested) {
   1074                 return ERROR_IO;
   1075             }
   1076             mPssh.push_back(pssh);
   1077 
   1078             *offset += chunk_size;
   1079             break;
   1080         }
   1081 
   1082         case FOURCC('m', 'd', 'h', 'd'):
   1083         {
   1084             if (chunk_data_size < 4) {
   1085                 return ERROR_MALFORMED;
   1086             }
   1087 
   1088             uint8_t version;
   1089             if (mDataSource->readAt(
   1090                         data_offset, &version, sizeof(version))
   1091                     < (ssize_t)sizeof(version)) {
   1092                 return ERROR_IO;
   1093             }
   1094 
   1095             off64_t timescale_offset;
   1096 
   1097             if (version == 1) {
   1098                 timescale_offset = data_offset + 4 + 16;
   1099             } else if (version == 0) {
   1100                 timescale_offset = data_offset + 4 + 8;
   1101             } else {
   1102                 return ERROR_IO;
   1103             }
   1104 
   1105             uint32_t timescale;
   1106             if (mDataSource->readAt(
   1107                         timescale_offset, &timescale, sizeof(timescale))
   1108                     < (ssize_t)sizeof(timescale)) {
   1109                 return ERROR_IO;
   1110             }
   1111 
   1112             mLastTrack->timescale = ntohl(timescale);
   1113 
   1114             int64_t duration = 0;
   1115             if (version == 1) {
   1116                 if (mDataSource->readAt(
   1117                             timescale_offset + 4, &duration, sizeof(duration))
   1118                         < (ssize_t)sizeof(duration)) {
   1119                     return ERROR_IO;
   1120                 }
   1121                 duration = ntoh64(duration);
   1122             } else {
   1123                 uint32_t duration32;
   1124                 if (mDataSource->readAt(
   1125                             timescale_offset + 4, &duration32, sizeof(duration32))
   1126                         < (ssize_t)sizeof(duration32)) {
   1127                     return ERROR_IO;
   1128                 }
   1129                 // ffmpeg sets duration to -1, which is incorrect.
   1130                 if (duration32 != 0xffffffff) {
   1131                     duration = ntohl(duration32);
   1132                 }
   1133             }
   1134             mLastTrack->meta->setInt64(
   1135                     kKeyDuration, (duration * 1000000) / mLastTrack->timescale);
   1136 
   1137             uint8_t lang[2];
   1138             off64_t lang_offset;
   1139             if (version == 1) {
   1140                 lang_offset = timescale_offset + 4 + 8;
   1141             } else if (version == 0) {
   1142                 lang_offset = timescale_offset + 4 + 4;
   1143             } else {
   1144                 return ERROR_IO;
   1145             }
   1146 
   1147             if (mDataSource->readAt(lang_offset, &lang, sizeof(lang))
   1148                     < (ssize_t)sizeof(lang)) {
   1149                 return ERROR_IO;
   1150             }
   1151 
   1152             // To get the ISO-639-2/T three character language code
   1153             // 1 bit pad followed by 3 5-bits characters. Each character
   1154             // is packed as the difference between its ASCII value and 0x60.
   1155             char lang_code[4];
   1156             lang_code[0] = ((lang[0] >> 2) & 0x1f) + 0x60;
   1157             lang_code[1] = ((lang[0] & 0x3) << 3 | (lang[1] >> 5)) + 0x60;
   1158             lang_code[2] = (lang[1] & 0x1f) + 0x60;
   1159             lang_code[3] = '\0';
   1160 
   1161             mLastTrack->meta->setCString(
   1162                     kKeyMediaLanguage, lang_code);
   1163 
   1164             *offset += chunk_size;
   1165             break;
   1166         }
   1167 
   1168         case FOURCC('s', 't', 's', 'd'):
   1169         {
   1170             if (chunk_data_size < 8) {
   1171                 return ERROR_MALFORMED;
   1172             }
   1173 
   1174             uint8_t buffer[8];
   1175             if (chunk_data_size < (off64_t)sizeof(buffer)) {
   1176                 return ERROR_MALFORMED;
   1177             }
   1178 
   1179             if (mDataSource->readAt(
   1180                         data_offset, buffer, 8) < 8) {
   1181                 return ERROR_IO;
   1182             }
   1183 
   1184             if (U32_AT(buffer) != 0) {
   1185                 // Should be version 0, flags 0.
   1186                 return ERROR_MALFORMED;
   1187             }
   1188 
   1189             uint32_t entry_count = U32_AT(&buffer[4]);
   1190 
   1191             if (entry_count > 1) {
   1192                 // For 3GPP timed text, there could be multiple tx3g boxes contain
   1193                 // multiple text display formats. These formats will be used to
   1194                 // display the timed text.
   1195                 // For encrypted files, there may also be more than one entry.
   1196                 const char *mime;
   1197                 CHECK(mLastTrack->meta->findCString(kKeyMIMEType, &mime));
   1198                 if (strcasecmp(mime, MEDIA_MIMETYPE_TEXT_3GPP) &&
   1199                         strcasecmp(mime, "application/octet-stream")) {
   1200                     // For now we only support a single type of media per track.
   1201                     mLastTrack->skipTrack = true;
   1202                     *offset += chunk_size;
   1203                     break;
   1204                 }
   1205             }
   1206             off64_t stop_offset = *offset + chunk_size;
   1207             *offset = data_offset + 8;
   1208             for (uint32_t i = 0; i < entry_count; ++i) {
   1209                 status_t err = parseChunk(offset, depth + 1);
   1210                 if (err != OK) {
   1211                     return err;
   1212                 }
   1213             }
   1214 
   1215             if (*offset != stop_offset) {
   1216                 return ERROR_MALFORMED;
   1217             }
   1218             break;
   1219         }
   1220 
   1221         case FOURCC('m', 'p', '4', 'a'):
   1222         case FOURCC('e', 'n', 'c', 'a'):
   1223         case FOURCC('s', 'a', 'm', 'r'):
   1224         case FOURCC('s', 'a', 'w', 'b'):
   1225         {
   1226             uint8_t buffer[8 + 20];
   1227             if (chunk_data_size < (ssize_t)sizeof(buffer)) {
   1228                 // Basic AudioSampleEntry size.
   1229                 return ERROR_MALFORMED;
   1230             }
   1231 
   1232             if (mDataSource->readAt(
   1233                         data_offset, buffer, sizeof(buffer)) < (ssize_t)sizeof(buffer)) {
   1234                 return ERROR_IO;
   1235             }
   1236 
   1237             uint16_t data_ref_index = U16_AT(&buffer[6]);
   1238             uint32_t num_channels = U16_AT(&buffer[16]);
   1239 
   1240             uint16_t sample_size = U16_AT(&buffer[18]);
   1241             uint32_t sample_rate = U32_AT(&buffer[24]) >> 16;
   1242 
   1243             if (chunk_type != FOURCC('e', 'n', 'c', 'a')) {
   1244                 // if the chunk type is enca, we'll get the type from the sinf/frma box later
   1245                 mLastTrack->meta->setCString(kKeyMIMEType, FourCC2MIME(chunk_type));
   1246                 AdjustChannelsAndRate(chunk_type, &num_channels, &sample_rate);
   1247             }
   1248             ALOGV("*** coding='%s' %d channels, size %d, rate %d\n",
   1249                    chunk, num_channels, sample_size, sample_rate);
   1250             mLastTrack->meta->setInt32(kKeyChannelCount, num_channels);
   1251             mLastTrack->meta->setInt32(kKeySampleRate, sample_rate);
   1252 
   1253             off64_t stop_offset = *offset + chunk_size;
   1254             *offset = data_offset + sizeof(buffer);
   1255             while (*offset < stop_offset) {
   1256                 status_t err = parseChunk(offset, depth + 1);
   1257                 if (err != OK) {
   1258                     return err;
   1259                 }
   1260             }
   1261 
   1262             if (*offset != stop_offset) {
   1263                 return ERROR_MALFORMED;
   1264             }
   1265             break;
   1266         }
   1267 
   1268         case FOURCC('m', 'p', '4', 'v'):
   1269         case FOURCC('e', 'n', 'c', 'v'):
   1270         case FOURCC('s', '2', '6', '3'):
   1271         case FOURCC('H', '2', '6', '3'):
   1272         case FOURCC('h', '2', '6', '3'):
   1273         case FOURCC('a', 'v', 'c', '1'):
   1274         {
   1275             mHasVideo = true;
   1276 
   1277             uint8_t buffer[78];
   1278             if (chunk_data_size < (ssize_t)sizeof(buffer)) {
   1279                 // Basic VideoSampleEntry size.
   1280                 return ERROR_MALFORMED;
   1281             }
   1282 
   1283             if (mDataSource->readAt(
   1284                         data_offset, buffer, sizeof(buffer)) < (ssize_t)sizeof(buffer)) {
   1285                 return ERROR_IO;
   1286             }
   1287 
   1288             uint16_t data_ref_index = U16_AT(&buffer[6]);
   1289             uint16_t width = U16_AT(&buffer[6 + 18]);
   1290             uint16_t height = U16_AT(&buffer[6 + 20]);
   1291 
   1292             // The video sample is not standard-compliant if it has invalid dimension.
   1293             // Use some default width and height value, and
   1294             // let the decoder figure out the actual width and height (and thus
   1295             // be prepared for INFO_FOMRAT_CHANGED event).
   1296             if (width == 0)  width  = 352;
   1297             if (height == 0) height = 288;
   1298 
   1299             // printf("*** coding='%s' width=%d height=%d\n",
   1300             //        chunk, width, height);
   1301 
   1302             if (chunk_type != FOURCC('e', 'n', 'c', 'v')) {
   1303                 // if the chunk type is encv, we'll get the type from the sinf/frma box later
   1304                 mLastTrack->meta->setCString(kKeyMIMEType, FourCC2MIME(chunk_type));
   1305             }
   1306             mLastTrack->meta->setInt32(kKeyWidth, width);
   1307             mLastTrack->meta->setInt32(kKeyHeight, height);
   1308 
   1309             off64_t stop_offset = *offset + chunk_size;
   1310             *offset = data_offset + sizeof(buffer);
   1311             while (*offset < stop_offset) {
   1312                 status_t err = parseChunk(offset, depth + 1);
   1313                 if (err != OK) {
   1314                     return err;
   1315                 }
   1316             }
   1317 
   1318             if (*offset != stop_offset) {
   1319                 return ERROR_MALFORMED;
   1320             }
   1321             break;
   1322         }
   1323 
   1324         case FOURCC('s', 't', 'c', 'o'):
   1325         case FOURCC('c', 'o', '6', '4'):
   1326         {
   1327             status_t err =
   1328                 mLastTrack->sampleTable->setChunkOffsetParams(
   1329                         chunk_type, data_offset, chunk_data_size);
   1330 
   1331             if (err != OK) {
   1332                 return err;
   1333             }
   1334 
   1335             *offset += chunk_size;
   1336             break;
   1337         }
   1338 
   1339         case FOURCC('s', 't', 's', 'c'):
   1340         {
   1341             status_t err =
   1342                 mLastTrack->sampleTable->setSampleToChunkParams(
   1343                         data_offset, chunk_data_size);
   1344 
   1345             if (err != OK) {
   1346                 return err;
   1347             }
   1348 
   1349             *offset += chunk_size;
   1350             break;
   1351         }
   1352 
   1353         case FOURCC('s', 't', 's', 'z'):
   1354         case FOURCC('s', 't', 'z', '2'):
   1355         {
   1356             status_t err =
   1357                 mLastTrack->sampleTable->setSampleSizeParams(
   1358                         chunk_type, data_offset, chunk_data_size);
   1359 
   1360             if (err != OK) {
   1361                 return err;
   1362             }
   1363 
   1364             size_t max_size;
   1365             err = mLastTrack->sampleTable->getMaxSampleSize(&max_size);
   1366 
   1367             if (err != OK) {
   1368                 return err;
   1369             }
   1370 
   1371             if (max_size != 0) {
   1372                 // Assume that a given buffer only contains at most 10 chunks,
   1373                 // each chunk originally prefixed with a 2 byte length will
   1374                 // have a 4 byte header (0x00 0x00 0x00 0x01) after conversion,
   1375                 // and thus will grow by 2 bytes per chunk.
   1376                 mLastTrack->meta->setInt32(kKeyMaxInputSize, max_size + 10 * 2);
   1377             } else {
   1378                 // No size was specified. Pick a conservatively large size.
   1379                 int32_t width, height;
   1380                 if (!mLastTrack->meta->findInt32(kKeyWidth, &width) ||
   1381                     !mLastTrack->meta->findInt32(kKeyHeight, &height)) {
   1382                     ALOGE("No width or height, assuming worst case 1080p");
   1383                     width = 1920;
   1384                     height = 1080;
   1385                 }
   1386 
   1387                 const char *mime;
   1388                 CHECK(mLastTrack->meta->findCString(kKeyMIMEType, &mime));
   1389                 if (!strcmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) {
   1390                     // AVC requires compression ratio of at least 2, and uses
   1391                     // macroblocks
   1392                     max_size = ((width + 15) / 16) * ((height + 15) / 16) * 192;
   1393                 } else {
   1394                     // For all other formats there is no minimum compression
   1395                     // ratio. Use compression ratio of 1.
   1396                     max_size = width * height * 3 / 2;
   1397                 }
   1398                 mLastTrack->meta->setInt32(kKeyMaxInputSize, max_size);
   1399             }
   1400             *offset += chunk_size;
   1401 
   1402             // NOTE: setting another piece of metadata invalidates any pointers (such as the
   1403             // mimetype) previously obtained, so don't cache them.
   1404             const char *mime;
   1405             CHECK(mLastTrack->meta->findCString(kKeyMIMEType, &mime));
   1406             // Calculate average frame rate.
   1407             if (!strncasecmp("video/", mime, 6)) {
   1408                 size_t nSamples = mLastTrack->sampleTable->countSamples();
   1409                 int64_t durationUs;
   1410                 if (mLastTrack->meta->findInt64(kKeyDuration, &durationUs)) {
   1411                     if (durationUs > 0) {
   1412                         int32_t frameRate = (nSamples * 1000000LL +
   1413                                     (durationUs >> 1)) / durationUs;
   1414                         mLastTrack->meta->setInt32(kKeyFrameRate, frameRate);
   1415                     }
   1416                 }
   1417             }
   1418 
   1419             break;
   1420         }
   1421 
   1422         case FOURCC('s', 't', 't', 's'):
   1423         {
   1424             status_t err =
   1425                 mLastTrack->sampleTable->setTimeToSampleParams(
   1426                         data_offset, chunk_data_size);
   1427 
   1428             if (err != OK) {
   1429                 return err;
   1430             }
   1431 
   1432             *offset += chunk_size;
   1433             break;
   1434         }
   1435 
   1436         case FOURCC('c', 't', 't', 's'):
   1437         {
   1438             status_t err =
   1439                 mLastTrack->sampleTable->setCompositionTimeToSampleParams(
   1440                         data_offset, chunk_data_size);
   1441 
   1442             if (err != OK) {
   1443                 return err;
   1444             }
   1445 
   1446             *offset += chunk_size;
   1447             break;
   1448         }
   1449 
   1450         case FOURCC('s', 't', 's', 's'):
   1451         {
   1452             status_t err =
   1453                 mLastTrack->sampleTable->setSyncSampleParams(
   1454                         data_offset, chunk_data_size);
   1455 
   1456             if (err != OK) {
   1457                 return err;
   1458             }
   1459 
   1460             *offset += chunk_size;
   1461             break;
   1462         }
   1463 
   1464         // @xyz
   1465         case FOURCC('\xA9', 'x', 'y', 'z'):
   1466         {
   1467             // Best case the total data length inside "@xyz" box
   1468             // would be 8, for instance "@xyz" + "\x00\x04\x15\xc7" + "0+0/",
   1469             // where "\x00\x04" is the text string length with value = 4,
   1470             // "\0x15\xc7" is the language code = en, and "0+0" is a
   1471             // location (string) value with longitude = 0 and latitude = 0.
   1472             if (chunk_data_size < 8) {
   1473                 return ERROR_MALFORMED;
   1474             }
   1475 
   1476             // Worst case the location string length would be 18,
   1477             // for instance +90.0000-180.0000, without the trailing "/" and
   1478             // the string length + language code.
   1479             char buffer[18];
   1480 
   1481             // Substracting 5 from the data size is because the text string length +
   1482             // language code takes 4 bytes, and the trailing slash "/" takes 1 byte.
   1483             off64_t location_length = chunk_data_size - 5;
   1484             if (location_length >= (off64_t) sizeof(buffer)) {
   1485                 return ERROR_MALFORMED;
   1486             }
   1487 
   1488             if (mDataSource->readAt(
   1489                         data_offset + 4, buffer, location_length) < location_length) {
   1490                 return ERROR_IO;
   1491             }
   1492 
   1493             buffer[location_length] = '\0';
   1494             mFileMetaData->setCString(kKeyLocation, buffer);
   1495             *offset += chunk_size;
   1496             break;
   1497         }
   1498 
   1499         case FOURCC('e', 's', 'd', 's'):
   1500         {
   1501             if (chunk_data_size < 4) {
   1502                 return ERROR_MALFORMED;
   1503             }
   1504 
   1505             uint8_t buffer[256];
   1506             if (chunk_data_size > (off64_t)sizeof(buffer)) {
   1507                 return ERROR_BUFFER_TOO_SMALL;
   1508             }
   1509 
   1510             if (mDataSource->readAt(
   1511                         data_offset, buffer, chunk_data_size) < chunk_data_size) {
   1512                 return ERROR_IO;
   1513             }
   1514 
   1515             if (U32_AT(buffer) != 0) {
   1516                 // Should be version 0, flags 0.
   1517                 return ERROR_MALFORMED;
   1518             }
   1519 
   1520             mLastTrack->meta->setData(
   1521                     kKeyESDS, kTypeESDS, &buffer[4], chunk_data_size - 4);
   1522 
   1523             if (mPath.size() >= 2
   1524                     && mPath[mPath.size() - 2] == FOURCC('m', 'p', '4', 'a')) {
   1525                 // Information from the ESDS must be relied on for proper
   1526                 // setup of sample rate and channel count for MPEG4 Audio.
   1527                 // The generic header appears to only contain generic
   1528                 // information...
   1529 
   1530                 status_t err = updateAudioTrackInfoFromESDS_MPEG4Audio(
   1531                         &buffer[4], chunk_data_size - 4);
   1532 
   1533                 if (err != OK) {
   1534                     return err;
   1535                 }
   1536             }
   1537 
   1538             *offset += chunk_size;
   1539             break;
   1540         }
   1541 
   1542         case FOURCC('a', 'v', 'c', 'C'):
   1543         {
   1544             sp<ABuffer> buffer = new ABuffer(chunk_data_size);
   1545 
   1546             if (mDataSource->readAt(
   1547                         data_offset, buffer->data(), chunk_data_size) < chunk_data_size) {
   1548                 return ERROR_IO;
   1549             }
   1550 
   1551             mLastTrack->meta->setData(
   1552                     kKeyAVCC, kTypeAVCC, buffer->data(), chunk_data_size);
   1553 
   1554             *offset += chunk_size;
   1555             break;
   1556         }
   1557 
   1558         case FOURCC('d', '2', '6', '3'):
   1559         {
   1560             /*
   1561              * d263 contains a fixed 7 bytes part:
   1562              *   vendor - 4 bytes
   1563              *   version - 1 byte
   1564              *   level - 1 byte
   1565              *   profile - 1 byte
   1566              * optionally, "d263" box itself may contain a 16-byte
   1567              * bit rate box (bitr)
   1568              *   average bit rate - 4 bytes
   1569              *   max bit rate - 4 bytes
   1570              */
   1571             char buffer[23];
   1572             if (chunk_data_size != 7 &&
   1573                 chunk_data_size != 23) {
   1574                 ALOGE("Incorrect D263 box size %lld", chunk_data_size);
   1575                 return ERROR_MALFORMED;
   1576             }
   1577 
   1578             if (mDataSource->readAt(
   1579                     data_offset, buffer, chunk_data_size) < chunk_data_size) {
   1580                 return ERROR_IO;
   1581             }
   1582 
   1583             mLastTrack->meta->setData(kKeyD263, kTypeD263, buffer, chunk_data_size);
   1584 
   1585             *offset += chunk_size;
   1586             break;
   1587         }
   1588 
   1589         case FOURCC('m', 'e', 't', 'a'):
   1590         {
   1591             uint8_t buffer[4];
   1592             if (chunk_data_size < (off64_t)sizeof(buffer)) {
   1593                 return ERROR_MALFORMED;
   1594             }
   1595 
   1596             if (mDataSource->readAt(
   1597                         data_offset, buffer, 4) < 4) {
   1598                 return ERROR_IO;
   1599             }
   1600 
   1601             if (U32_AT(buffer) != 0) {
   1602                 // Should be version 0, flags 0.
   1603 
   1604                 // If it's not, let's assume this is one of those
   1605                 // apparently malformed chunks that don't have flags
   1606                 // and completely different semantics than what's
   1607                 // in the MPEG4 specs and skip it.
   1608                 *offset += chunk_size;
   1609                 return OK;
   1610             }
   1611 
   1612             off64_t stop_offset = *offset + chunk_size;
   1613             *offset = data_offset + sizeof(buffer);
   1614             while (*offset < stop_offset) {
   1615                 status_t err = parseChunk(offset, depth + 1);
   1616                 if (err != OK) {
   1617                     return err;
   1618                 }
   1619             }
   1620 
   1621             if (*offset != stop_offset) {
   1622                 return ERROR_MALFORMED;
   1623             }
   1624             break;
   1625         }
   1626 
   1627         case FOURCC('m', 'e', 'a', 'n'):
   1628         case FOURCC('n', 'a', 'm', 'e'):
   1629         case FOURCC('d', 'a', 't', 'a'):
   1630         {
   1631             if (mPath.size() == 6 && underMetaDataPath(mPath)) {
   1632                 status_t err = parseMetaData(data_offset, chunk_data_size);
   1633 
   1634                 if (err != OK) {
   1635                     return err;
   1636                 }
   1637             }
   1638 
   1639             *offset += chunk_size;
   1640             break;
   1641         }
   1642 
   1643         case FOURCC('m', 'v', 'h', 'd'):
   1644         {
   1645             if (chunk_data_size < 24) {
   1646                 return ERROR_MALFORMED;
   1647             }
   1648 
   1649             uint8_t header[24];
   1650             if (mDataSource->readAt(
   1651                         data_offset, header, sizeof(header))
   1652                     < (ssize_t)sizeof(header)) {
   1653                 return ERROR_IO;
   1654             }
   1655 
   1656             uint64_t creationTime;
   1657             if (header[0] == 1) {
   1658                 creationTime = U64_AT(&header[4]);
   1659                 mHeaderTimescale = U32_AT(&header[20]);
   1660             } else if (header[0] != 0) {
   1661                 return ERROR_MALFORMED;
   1662             } else {
   1663                 creationTime = U32_AT(&header[4]);
   1664                 mHeaderTimescale = U32_AT(&header[12]);
   1665             }
   1666 
   1667             String8 s;
   1668             convertTimeToDate(creationTime, &s);
   1669 
   1670             mFileMetaData->setCString(kKeyDate, s.string());
   1671 
   1672             *offset += chunk_size;
   1673             break;
   1674         }
   1675 
   1676         case FOURCC('m', 'd', 'a', 't'):
   1677         {
   1678             ALOGV("mdat chunk, drm: %d", mIsDrm);
   1679             if (!mIsDrm) {
   1680                 *offset += chunk_size;
   1681                 break;
   1682             }
   1683 
   1684             if (chunk_size < 8) {
   1685                 return ERROR_MALFORMED;
   1686             }
   1687 
   1688             return parseDrmSINF(offset, data_offset);
   1689         }
   1690 
   1691         case FOURCC('h', 'd', 'l', 'r'):
   1692         {
   1693             uint32_t buffer;
   1694             if (mDataSource->readAt(
   1695                         data_offset + 8, &buffer, 4) < 4) {
   1696                 return ERROR_IO;
   1697             }
   1698 
   1699             uint32_t type = ntohl(buffer);
   1700             // For the 3GPP file format, the handler-type within the 'hdlr' box
   1701             // shall be 'text'. We also want to support 'sbtl' handler type
   1702             // for a practical reason as various MPEG4 containers use it.
   1703             if (type == FOURCC('t', 'e', 'x', 't') || type == FOURCC('s', 'b', 't', 'l')) {
   1704                 mLastTrack->meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_TEXT_3GPP);
   1705             }
   1706 
   1707             *offset += chunk_size;
   1708             break;
   1709         }
   1710 
   1711         case FOURCC('t', 'x', '3', 'g'):
   1712         {
   1713             uint32_t type;
   1714             const void *data;
   1715             size_t size = 0;
   1716             if (!mLastTrack->meta->findData(
   1717                     kKeyTextFormatData, &type, &data, &size)) {
   1718                 size = 0;
   1719             }
   1720 
   1721             uint8_t *buffer = new uint8_t[size + chunk_size];
   1722 
   1723             if (size > 0) {
   1724                 memcpy(buffer, data, size);
   1725             }
   1726 
   1727             if ((size_t)(mDataSource->readAt(*offset, buffer + size, chunk_size))
   1728                     < chunk_size) {
   1729                 delete[] buffer;
   1730                 buffer = NULL;
   1731 
   1732                 return ERROR_IO;
   1733             }
   1734 
   1735             mLastTrack->meta->setData(
   1736                     kKeyTextFormatData, 0, buffer, size + chunk_size);
   1737 
   1738             delete[] buffer;
   1739 
   1740             *offset += chunk_size;
   1741             break;
   1742         }
   1743 
   1744         case FOURCC('c', 'o', 'v', 'r'):
   1745         {
   1746             if (mFileMetaData != NULL) {
   1747                 ALOGV("chunk_data_size = %lld and data_offset = %lld",
   1748                         chunk_data_size, data_offset);
   1749                 sp<ABuffer> buffer = new ABuffer(chunk_data_size + 1);
   1750                 if (mDataSource->readAt(
   1751                     data_offset, buffer->data(), chunk_data_size) != (ssize_t)chunk_data_size) {
   1752                     return ERROR_IO;
   1753                 }
   1754                 const int kSkipBytesOfDataBox = 16;
   1755                 mFileMetaData->setData(
   1756                     kKeyAlbumArt, MetaData::TYPE_NONE,
   1757                     buffer->data() + kSkipBytesOfDataBox, chunk_data_size - kSkipBytesOfDataBox);
   1758             }
   1759 
   1760             *offset += chunk_size;
   1761             break;
   1762         }
   1763 
   1764         case FOURCC('-', '-', '-', '-'):
   1765         {
   1766             mLastCommentMean.clear();
   1767             mLastCommentName.clear();
   1768             mLastCommentData.clear();
   1769             *offset += chunk_size;
   1770             break;
   1771         }
   1772 
   1773         case FOURCC('s', 'i', 'd', 'x'):
   1774         {
   1775             parseSegmentIndex(data_offset, chunk_data_size);
   1776             *offset += chunk_size;
   1777             return UNKNOWN_ERROR; // stop parsing after sidx
   1778         }
   1779 
   1780         default:
   1781         {
   1782             *offset += chunk_size;
   1783             break;
   1784         }
   1785     }
   1786 
   1787     return OK;
   1788 }
   1789 
   1790 status_t MPEG4Extractor::parseSegmentIndex(off64_t offset, size_t size) {
   1791   ALOGV("MPEG4Extractor::parseSegmentIndex");
   1792 
   1793     if (size < 12) {
   1794       return -EINVAL;
   1795     }
   1796 
   1797     uint32_t flags;
   1798     if (!mDataSource->getUInt32(offset, &flags)) {
   1799         return ERROR_MALFORMED;
   1800     }
   1801 
   1802     uint32_t version = flags >> 24;
   1803     flags &= 0xffffff;
   1804 
   1805     ALOGV("sidx version %d", version);
   1806 
   1807     uint32_t referenceId;
   1808     if (!mDataSource->getUInt32(offset + 4, &referenceId)) {
   1809         return ERROR_MALFORMED;
   1810     }
   1811 
   1812     uint32_t timeScale;
   1813     if (!mDataSource->getUInt32(offset + 8, &timeScale)) {
   1814         return ERROR_MALFORMED;
   1815     }
   1816     ALOGV("sidx refid/timescale: %d/%d", referenceId, timeScale);
   1817 
   1818     uint64_t earliestPresentationTime;
   1819     uint64_t firstOffset;
   1820 
   1821     offset += 12;
   1822     size -= 12;
   1823 
   1824     if (version == 0) {
   1825         if (size < 8) {
   1826             return -EINVAL;
   1827         }
   1828         uint32_t tmp;
   1829         if (!mDataSource->getUInt32(offset, &tmp)) {
   1830             return ERROR_MALFORMED;
   1831         }
   1832         earliestPresentationTime = tmp;
   1833         if (!mDataSource->getUInt32(offset + 4, &tmp)) {
   1834             return ERROR_MALFORMED;
   1835         }
   1836         firstOffset = tmp;
   1837         offset += 8;
   1838         size -= 8;
   1839     } else {
   1840         if (size < 16) {
   1841             return -EINVAL;
   1842         }
   1843         if (!mDataSource->getUInt64(offset, &earliestPresentationTime)) {
   1844             return ERROR_MALFORMED;
   1845         }
   1846         if (!mDataSource->getUInt64(offset + 8, &firstOffset)) {
   1847             return ERROR_MALFORMED;
   1848         }
   1849         offset += 16;
   1850         size -= 16;
   1851     }
   1852     ALOGV("sidx pres/off: %Ld/%Ld", earliestPresentationTime, firstOffset);
   1853 
   1854     if (size < 4) {
   1855         return -EINVAL;
   1856     }
   1857 
   1858     uint16_t referenceCount;
   1859     if (!mDataSource->getUInt16(offset + 2, &referenceCount)) {
   1860         return ERROR_MALFORMED;
   1861     }
   1862     offset += 4;
   1863     size -= 4;
   1864     ALOGV("refcount: %d", referenceCount);
   1865 
   1866     if (size < referenceCount * 12) {
   1867         return -EINVAL;
   1868     }
   1869 
   1870     uint64_t total_duration = 0;
   1871     for (unsigned int i = 0; i < referenceCount; i++) {
   1872         uint32_t d1, d2, d3;
   1873 
   1874         if (!mDataSource->getUInt32(offset, &d1) ||     // size
   1875             !mDataSource->getUInt32(offset + 4, &d2) || // duration
   1876             !mDataSource->getUInt32(offset + 8, &d3)) { // flags
   1877             return ERROR_MALFORMED;
   1878         }
   1879 
   1880         if (d1 & 0x80000000) {
   1881             ALOGW("sub-sidx boxes not supported yet");
   1882         }
   1883         bool sap = d3 & 0x80000000;
   1884         bool saptype = d3 >> 28;
   1885         if (!sap || saptype > 2) {
   1886             ALOGW("not a stream access point, or unsupported type");
   1887         }
   1888         total_duration += d2;
   1889         offset += 12;
   1890         ALOGV(" item %d, %08x %08x %08x", i, d1, d2, d3);
   1891         SidxEntry se;
   1892         se.mSize = d1 & 0x7fffffff;
   1893         se.mDurationUs = 1000000LL * d2 / timeScale;
   1894         mSidxEntries.add(se);
   1895     }
   1896 
   1897     mSidxDuration = total_duration * 1000000 / timeScale;
   1898     ALOGV("duration: %lld", mSidxDuration);
   1899 
   1900     int64_t metaDuration;
   1901     if (!mLastTrack->meta->findInt64(kKeyDuration, &metaDuration) || metaDuration == 0) {
   1902         mLastTrack->meta->setInt64(kKeyDuration, mSidxDuration);
   1903     }
   1904     return OK;
   1905 }
   1906 
   1907 
   1908 
   1909 status_t MPEG4Extractor::parseTrackHeader(
   1910         off64_t data_offset, off64_t data_size) {
   1911     if (data_size < 4) {
   1912         return ERROR_MALFORMED;
   1913     }
   1914 
   1915     uint8_t version;
   1916     if (mDataSource->readAt(data_offset, &version, 1) < 1) {
   1917         return ERROR_IO;
   1918     }
   1919 
   1920     size_t dynSize = (version == 1) ? 36 : 24;
   1921 
   1922     uint8_t buffer[36 + 60];
   1923 
   1924     if (data_size != (off64_t)dynSize + 60) {
   1925         return ERROR_MALFORMED;
   1926     }
   1927 
   1928     if (mDataSource->readAt(
   1929                 data_offset, buffer, data_size) < (ssize_t)data_size) {
   1930         return ERROR_IO;
   1931     }
   1932 
   1933     uint64_t ctime, mtime, duration;
   1934     int32_t id;
   1935 
   1936     if (version == 1) {
   1937         ctime = U64_AT(&buffer[4]);
   1938         mtime = U64_AT(&buffer[12]);
   1939         id = U32_AT(&buffer[20]);
   1940         duration = U64_AT(&buffer[28]);
   1941     } else if (version == 0) {
   1942         ctime = U32_AT(&buffer[4]);
   1943         mtime = U32_AT(&buffer[8]);
   1944         id = U32_AT(&buffer[12]);
   1945         duration = U32_AT(&buffer[20]);
   1946     } else {
   1947         return ERROR_UNSUPPORTED;
   1948     }
   1949 
   1950     mLastTrack->meta->setInt32(kKeyTrackID, id);
   1951 
   1952     size_t matrixOffset = dynSize + 16;
   1953     int32_t a00 = U32_AT(&buffer[matrixOffset]);
   1954     int32_t a01 = U32_AT(&buffer[matrixOffset + 4]);
   1955     int32_t dx = U32_AT(&buffer[matrixOffset + 8]);
   1956     int32_t a10 = U32_AT(&buffer[matrixOffset + 12]);
   1957     int32_t a11 = U32_AT(&buffer[matrixOffset + 16]);
   1958     int32_t dy = U32_AT(&buffer[matrixOffset + 20]);
   1959 
   1960 #if 0
   1961     ALOGI("x' = %.2f * x + %.2f * y + %.2f",
   1962          a00 / 65536.0f, a01 / 65536.0f, dx / 65536.0f);
   1963     ALOGI("y' = %.2f * x + %.2f * y + %.2f",
   1964          a10 / 65536.0f, a11 / 65536.0f, dy / 65536.0f);
   1965 #endif
   1966 
   1967     uint32_t rotationDegrees;
   1968 
   1969     static const int32_t kFixedOne = 0x10000;
   1970     if (a00 == kFixedOne && a01 == 0 && a10 == 0 && a11 == kFixedOne) {
   1971         // Identity, no rotation
   1972         rotationDegrees = 0;
   1973     } else if (a00 == 0 && a01 == kFixedOne && a10 == -kFixedOne && a11 == 0) {
   1974         rotationDegrees = 90;
   1975     } else if (a00 == 0 && a01 == -kFixedOne && a10 == kFixedOne && a11 == 0) {
   1976         rotationDegrees = 270;
   1977     } else if (a00 == -kFixedOne && a01 == 0 && a10 == 0 && a11 == -kFixedOne) {
   1978         rotationDegrees = 180;
   1979     } else {
   1980         ALOGW("We only support 0,90,180,270 degree rotation matrices");
   1981         rotationDegrees = 0;
   1982     }
   1983 
   1984     if (rotationDegrees != 0) {
   1985         mLastTrack->meta->setInt32(kKeyRotation, rotationDegrees);
   1986     }
   1987 
   1988     // Handle presentation display size, which could be different
   1989     // from the image size indicated by kKeyWidth and kKeyHeight.
   1990     uint32_t width = U32_AT(&buffer[dynSize + 52]);
   1991     uint32_t height = U32_AT(&buffer[dynSize + 56]);
   1992     mLastTrack->meta->setInt32(kKeyDisplayWidth, width >> 16);
   1993     mLastTrack->meta->setInt32(kKeyDisplayHeight, height >> 16);
   1994 
   1995     return OK;
   1996 }
   1997 
   1998 status_t MPEG4Extractor::parseMetaData(off64_t offset, size_t size) {
   1999     if (size < 4) {
   2000         return ERROR_MALFORMED;
   2001     }
   2002 
   2003     uint8_t *buffer = new uint8_t[size + 1];
   2004     if (mDataSource->readAt(
   2005                 offset, buffer, size) != (ssize_t)size) {
   2006         delete[] buffer;
   2007         buffer = NULL;
   2008 
   2009         return ERROR_IO;
   2010     }
   2011 
   2012     uint32_t flags = U32_AT(buffer);
   2013 
   2014     uint32_t metadataKey = 0;
   2015     char chunk[5];
   2016     MakeFourCCString(mPath[4], chunk);
   2017     ALOGV("meta: %s @ %lld", chunk, offset);
   2018     switch (mPath[4]) {
   2019         case FOURCC(0xa9, 'a', 'l', 'b'):
   2020         {
   2021             metadataKey = kKeyAlbum;
   2022             break;
   2023         }
   2024         case FOURCC(0xa9, 'A', 'R', 'T'):
   2025         {
   2026             metadataKey = kKeyArtist;
   2027             break;
   2028         }
   2029         case FOURCC('a', 'A', 'R', 'T'):
   2030         {
   2031             metadataKey = kKeyAlbumArtist;
   2032             break;
   2033         }
   2034         case FOURCC(0xa9, 'd', 'a', 'y'):
   2035         {
   2036             metadataKey = kKeyYear;
   2037             break;
   2038         }
   2039         case FOURCC(0xa9, 'n', 'a', 'm'):
   2040         {
   2041             metadataKey = kKeyTitle;
   2042             break;
   2043         }
   2044         case FOURCC(0xa9, 'w', 'r', 't'):
   2045         {
   2046             metadataKey = kKeyWriter;
   2047             break;
   2048         }
   2049         case FOURCC('c', 'o', 'v', 'r'):
   2050         {
   2051             metadataKey = kKeyAlbumArt;
   2052             break;
   2053         }
   2054         case FOURCC('g', 'n', 'r', 'e'):
   2055         {
   2056             metadataKey = kKeyGenre;
   2057             break;
   2058         }
   2059         case FOURCC(0xa9, 'g', 'e', 'n'):
   2060         {
   2061             metadataKey = kKeyGenre;
   2062             break;
   2063         }
   2064         case FOURCC('c', 'p', 'i', 'l'):
   2065         {
   2066             if (size == 9 && flags == 21) {
   2067                 char tmp[16];
   2068                 sprintf(tmp, "%d",
   2069                         (int)buffer[size - 1]);
   2070 
   2071                 mFileMetaData->setCString(kKeyCompilation, tmp);
   2072             }
   2073             break;
   2074         }
   2075         case FOURCC('t', 'r', 'k', 'n'):
   2076         {
   2077             if (size == 16 && flags == 0) {
   2078                 char tmp[16];
   2079                 uint16_t* pTrack = (uint16_t*)&buffer[10];
   2080                 uint16_t* pTotalTracks = (uint16_t*)&buffer[12];
   2081                 sprintf(tmp, "%d/%d", ntohs(*pTrack), ntohs(*pTotalTracks));
   2082 
   2083                 mFileMetaData->setCString(kKeyCDTrackNumber, tmp);
   2084             }
   2085             break;
   2086         }
   2087         case FOURCC('d', 'i', 's', 'k'):
   2088         {
   2089             if ((size == 14 || size == 16) && flags == 0) {
   2090                 char tmp[16];
   2091                 uint16_t* pDisc = (uint16_t*)&buffer[10];
   2092                 uint16_t* pTotalDiscs = (uint16_t*)&buffer[12];
   2093                 sprintf(tmp, "%d/%d", ntohs(*pDisc), ntohs(*pTotalDiscs));
   2094 
   2095                 mFileMetaData->setCString(kKeyDiscNumber, tmp);
   2096             }
   2097             break;
   2098         }
   2099         case FOURCC('-', '-', '-', '-'):
   2100         {
   2101             buffer[size] = '\0';
   2102             switch (mPath[5]) {
   2103                 case FOURCC('m', 'e', 'a', 'n'):
   2104                     mLastCommentMean.setTo((const char *)buffer + 4);
   2105                     break;
   2106                 case FOURCC('n', 'a', 'm', 'e'):
   2107                     mLastCommentName.setTo((const char *)buffer + 4);
   2108                     break;
   2109                 case FOURCC('d', 'a', 't', 'a'):
   2110                     mLastCommentData.setTo((const char *)buffer + 8);
   2111                     break;
   2112             }
   2113 
   2114             // Once we have a set of mean/name/data info, go ahead and process
   2115             // it to see if its something we are interested in.  Whether or not
   2116             // were are interested in the specific tag, make sure to clear out
   2117             // the set so we can be ready to process another tuple should one
   2118             // show up later in the file.
   2119             if ((mLastCommentMean.length() != 0) &&
   2120                 (mLastCommentName.length() != 0) &&
   2121                 (mLastCommentData.length() != 0)) {
   2122 
   2123                 if (mLastCommentMean == "com.apple.iTunes"
   2124                         && mLastCommentName == "iTunSMPB") {
   2125                     int32_t delay, padding;
   2126                     if (sscanf(mLastCommentData,
   2127                                " %*x %x %x %*x", &delay, &padding) == 2) {
   2128                         mLastTrack->meta->setInt32(kKeyEncoderDelay, delay);
   2129                         mLastTrack->meta->setInt32(kKeyEncoderPadding, padding);
   2130                     }
   2131                 }
   2132 
   2133                 mLastCommentMean.clear();
   2134                 mLastCommentName.clear();
   2135                 mLastCommentData.clear();
   2136             }
   2137             break;
   2138         }
   2139 
   2140         default:
   2141             break;
   2142     }
   2143 
   2144     if (size >= 8 && metadataKey) {
   2145         if (metadataKey == kKeyAlbumArt) {
   2146             mFileMetaData->setData(
   2147                     kKeyAlbumArt, MetaData::TYPE_NONE,
   2148                     buffer + 8, size - 8);
   2149         } else if (metadataKey == kKeyGenre) {
   2150             if (flags == 0) {
   2151                 // uint8_t genre code, iTunes genre codes are
   2152                 // the standard id3 codes, except they start
   2153                 // at 1 instead of 0 (e.g. Pop is 14, not 13)
   2154                 // We use standard id3 numbering, so subtract 1.
   2155                 int genrecode = (int)buffer[size - 1];
   2156                 genrecode--;
   2157                 if (genrecode < 0) {
   2158                     genrecode = 255; // reserved for 'unknown genre'
   2159                 }
   2160                 char genre[10];
   2161                 sprintf(genre, "%d", genrecode);
   2162 
   2163                 mFileMetaData->setCString(metadataKey, genre);
   2164             } else if (flags == 1) {
   2165                 // custom genre string
   2166                 buffer[size] = '\0';
   2167 
   2168                 mFileMetaData->setCString(
   2169                         metadataKey, (const char *)buffer + 8);
   2170             }
   2171         } else {
   2172             buffer[size] = '\0';
   2173 
   2174             mFileMetaData->setCString(
   2175                     metadataKey, (const char *)buffer + 8);
   2176         }
   2177     }
   2178 
   2179     delete[] buffer;
   2180     buffer = NULL;
   2181 
   2182     return OK;
   2183 }
   2184 
   2185 sp<MediaSource> MPEG4Extractor::getTrack(size_t index) {
   2186     status_t err;
   2187     if ((err = readMetaData()) != OK) {
   2188         return NULL;
   2189     }
   2190 
   2191     Track *track = mFirstTrack;
   2192     while (index > 0) {
   2193         if (track == NULL) {
   2194             return NULL;
   2195         }
   2196 
   2197         track = track->next;
   2198         --index;
   2199     }
   2200 
   2201     if (track == NULL) {
   2202         return NULL;
   2203     }
   2204 
   2205     ALOGV("getTrack called, pssh: %d", mPssh.size());
   2206 
   2207     return new MPEG4Source(
   2208             track->meta, mDataSource, track->timescale, track->sampleTable,
   2209             mSidxEntries, mMoofOffset);
   2210 }
   2211 
   2212 // static
   2213 status_t MPEG4Extractor::verifyTrack(Track *track) {
   2214     const char *mime;
   2215     CHECK(track->meta->findCString(kKeyMIMEType, &mime));
   2216 
   2217     uint32_t type;
   2218     const void *data;
   2219     size_t size;
   2220     if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) {
   2221         if (!track->meta->findData(kKeyAVCC, &type, &data, &size)
   2222                 || type != kTypeAVCC) {
   2223             return ERROR_MALFORMED;
   2224         }
   2225     } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_MPEG4)
   2226             || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) {
   2227         if (!track->meta->findData(kKeyESDS, &type, &data, &size)
   2228                 || type != kTypeESDS) {
   2229             return ERROR_MALFORMED;
   2230         }
   2231     }
   2232 
   2233     if (!track->sampleTable->isValid()) {
   2234         // Make sure we have all the metadata we need.
   2235         return ERROR_MALFORMED;
   2236     }
   2237 
   2238     return OK;
   2239 }
   2240 
   2241 status_t MPEG4Extractor::updateAudioTrackInfoFromESDS_MPEG4Audio(
   2242         const void *esds_data, size_t esds_size) {
   2243     ESDS esds(esds_data, esds_size);
   2244 
   2245     uint8_t objectTypeIndication;
   2246     if (esds.getObjectTypeIndication(&objectTypeIndication) != OK) {
   2247         return ERROR_MALFORMED;
   2248     }
   2249 
   2250     if (objectTypeIndication == 0xe1) {
   2251         // This isn't MPEG4 audio at all, it's QCELP 14k...
   2252         mLastTrack->meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_QCELP);
   2253         return OK;
   2254     }
   2255 
   2256     if (objectTypeIndication  == 0x6b) {
   2257         // The media subtype is MP3 audio
   2258         // Our software MP3 audio decoder may not be able to handle
   2259         // packetized MP3 audio; for now, lets just return ERROR_UNSUPPORTED
   2260         ALOGE("MP3 track in MP4/3GPP file is not supported");
   2261         return ERROR_UNSUPPORTED;
   2262     }
   2263 
   2264     const uint8_t *csd;
   2265     size_t csd_size;
   2266     if (esds.getCodecSpecificInfo(
   2267                 (const void **)&csd, &csd_size) != OK) {
   2268         return ERROR_MALFORMED;
   2269     }
   2270 
   2271 #if 0
   2272     printf("ESD of size %d\n", csd_size);
   2273     hexdump(csd, csd_size);
   2274 #endif
   2275 
   2276     if (csd_size == 0) {
   2277         // There's no further information, i.e. no codec specific data
   2278         // Let's assume that the information provided in the mpeg4 headers
   2279         // is accurate and hope for the best.
   2280 
   2281         return OK;
   2282     }
   2283 
   2284     if (csd_size < 2) {
   2285         return ERROR_MALFORMED;
   2286     }
   2287 
   2288     ABitReader br(csd, csd_size);
   2289     uint32_t objectType = br.getBits(5);
   2290 
   2291     if (objectType == 31) {  // AAC-ELD => additional 6 bits
   2292         objectType = 32 + br.getBits(6);
   2293     }
   2294 
   2295     uint32_t freqIndex = br.getBits(4);
   2296 
   2297     int32_t sampleRate = 0;
   2298     int32_t numChannels = 0;
   2299     if (freqIndex == 15) {
   2300         if (csd_size < 5) {
   2301             return ERROR_MALFORMED;
   2302         }
   2303         sampleRate = br.getBits(24);
   2304         numChannels = br.getBits(4);
   2305     } else {
   2306         numChannels = br.getBits(4);
   2307         if (objectType == 5) {
   2308             // SBR specific config per 14496-3 table 1.13
   2309             freqIndex = br.getBits(4);
   2310             if (freqIndex == 15) {
   2311                 if (csd_size < 8) {
   2312                     return ERROR_MALFORMED;
   2313                 }
   2314                 sampleRate = br.getBits(24);
   2315             }
   2316         }
   2317 
   2318         if (sampleRate == 0) {
   2319             static uint32_t kSamplingRate[] = {
   2320                 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
   2321                 16000, 12000, 11025, 8000, 7350
   2322             };
   2323 
   2324             if (freqIndex == 13 || freqIndex == 14) {
   2325                 return ERROR_MALFORMED;
   2326             }
   2327 
   2328             sampleRate = kSamplingRate[freqIndex];
   2329         }
   2330     }
   2331 
   2332     if (numChannels == 0) {
   2333         return ERROR_UNSUPPORTED;
   2334     }
   2335 
   2336     int32_t prevSampleRate;
   2337     CHECK(mLastTrack->meta->findInt32(kKeySampleRate, &prevSampleRate));
   2338 
   2339     if (prevSampleRate != sampleRate) {
   2340         ALOGV("mpeg4 audio sample rate different from previous setting. "
   2341              "was: %d, now: %d", prevSampleRate, sampleRate);
   2342     }
   2343 
   2344     mLastTrack->meta->setInt32(kKeySampleRate, sampleRate);
   2345 
   2346     int32_t prevChannelCount;
   2347     CHECK(mLastTrack->meta->findInt32(kKeyChannelCount, &prevChannelCount));
   2348 
   2349     if (prevChannelCount != numChannels) {
   2350         ALOGV("mpeg4 audio channel count different from previous setting. "
   2351              "was: %d, now: %d", prevChannelCount, numChannels);
   2352     }
   2353 
   2354     mLastTrack->meta->setInt32(kKeyChannelCount, numChannels);
   2355 
   2356     return OK;
   2357 }
   2358 
   2359 ////////////////////////////////////////////////////////////////////////////////
   2360 
   2361 MPEG4Source::MPEG4Source(
   2362         const sp<MetaData> &format,
   2363         const sp<DataSource> &dataSource,
   2364         int32_t timeScale,
   2365         const sp<SampleTable> &sampleTable,
   2366         Vector<SidxEntry> &sidx,
   2367         off64_t firstMoofOffset)
   2368     : mFormat(format),
   2369       mDataSource(dataSource),
   2370       mTimescale(timeScale),
   2371       mSampleTable(sampleTable),
   2372       mCurrentSampleIndex(0),
   2373       mCurrentFragmentIndex(0),
   2374       mSegments(sidx),
   2375       mFirstMoofOffset(firstMoofOffset),
   2376       mCurrentMoofOffset(firstMoofOffset),
   2377       mCurrentTime(0),
   2378       mCurrentSampleInfoAllocSize(0),
   2379       mCurrentSampleInfoSizes(NULL),
   2380       mCurrentSampleInfoOffsetsAllocSize(0),
   2381       mCurrentSampleInfoOffsets(NULL),
   2382       mIsAVC(false),
   2383       mNALLengthSize(0),
   2384       mStarted(false),
   2385       mGroup(NULL),
   2386       mBuffer(NULL),
   2387       mWantsNALFragments(false),
   2388       mSrcBuffer(NULL) {
   2389 
   2390     mFormat->findInt32(kKeyCryptoMode, &mCryptoMode);
   2391     mDefaultIVSize = 0;
   2392     mFormat->findInt32(kKeyCryptoDefaultIVSize, &mDefaultIVSize);
   2393     uint32_t keytype;
   2394     const void *key;
   2395     size_t keysize;
   2396     if (mFormat->findData(kKeyCryptoKey, &keytype, &key, &keysize)) {
   2397         CHECK(keysize <= 16);
   2398         memset(mCryptoKey, 0, 16);
   2399         memcpy(mCryptoKey, key, keysize);
   2400     }
   2401 
   2402     const char *mime;
   2403     bool success = mFormat->findCString(kKeyMIMEType, &mime);
   2404     CHECK(success);
   2405 
   2406     mIsAVC = !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC);
   2407 
   2408     if (mIsAVC) {
   2409         uint32_t type;
   2410         const void *data;
   2411         size_t size;
   2412         CHECK(format->findData(kKeyAVCC, &type, &data, &size));
   2413 
   2414         const uint8_t *ptr = (const uint8_t *)data;
   2415 
   2416         CHECK(size >= 7);
   2417         CHECK_EQ((unsigned)ptr[0], 1u);  // configurationVersion == 1
   2418 
   2419         // The number of bytes used to encode the length of a NAL unit.
   2420         mNALLengthSize = 1 + (ptr[4] & 3);
   2421     }
   2422 
   2423     CHECK(format->findInt32(kKeyTrackID, &mTrackId));
   2424 
   2425     if (mFirstMoofOffset != 0) {
   2426         off64_t offset = mFirstMoofOffset;
   2427         parseChunk(&offset);
   2428     }
   2429 }
   2430 
   2431 MPEG4Source::~MPEG4Source() {
   2432     if (mStarted) {
   2433         stop();
   2434     }
   2435     free(mCurrentSampleInfoSizes);
   2436     free(mCurrentSampleInfoOffsets);
   2437 }
   2438 
   2439 status_t MPEG4Source::start(MetaData *params) {
   2440     Mutex::Autolock autoLock(mLock);
   2441 
   2442     CHECK(!mStarted);
   2443 
   2444     int32_t val;
   2445     if (params && params->findInt32(kKeyWantsNALFragments, &val)
   2446         && val != 0) {
   2447         mWantsNALFragments = true;
   2448     } else {
   2449         mWantsNALFragments = false;
   2450     }
   2451 
   2452     mGroup = new MediaBufferGroup;
   2453 
   2454     int32_t max_size;
   2455     CHECK(mFormat->findInt32(kKeyMaxInputSize, &max_size));
   2456 
   2457     mGroup->add_buffer(new MediaBuffer(max_size));
   2458 
   2459     mSrcBuffer = new uint8_t[max_size];
   2460 
   2461     mStarted = true;
   2462 
   2463     return OK;
   2464 }
   2465 
   2466 status_t MPEG4Source::stop() {
   2467     Mutex::Autolock autoLock(mLock);
   2468 
   2469     CHECK(mStarted);
   2470 
   2471     if (mBuffer != NULL) {
   2472         mBuffer->release();
   2473         mBuffer = NULL;
   2474     }
   2475 
   2476     delete[] mSrcBuffer;
   2477     mSrcBuffer = NULL;
   2478 
   2479     delete mGroup;
   2480     mGroup = NULL;
   2481 
   2482     mStarted = false;
   2483     mCurrentSampleIndex = 0;
   2484 
   2485     return OK;
   2486 }
   2487 
   2488 status_t MPEG4Source::parseChunk(off64_t *offset) {
   2489     uint32_t hdr[2];
   2490     if (mDataSource->readAt(*offset, hdr, 8) < 8) {
   2491         return ERROR_IO;
   2492     }
   2493     uint64_t chunk_size = ntohl(hdr[0]);
   2494     uint32_t chunk_type = ntohl(hdr[1]);
   2495     off64_t data_offset = *offset + 8;
   2496 
   2497     if (chunk_size == 1) {
   2498         if (mDataSource->readAt(*offset + 8, &chunk_size, 8) < 8) {
   2499             return ERROR_IO;
   2500         }
   2501         chunk_size = ntoh64(chunk_size);
   2502         data_offset += 8;
   2503 
   2504         if (chunk_size < 16) {
   2505             // The smallest valid chunk is 16 bytes long in this case.
   2506             return ERROR_MALFORMED;
   2507         }
   2508     } else if (chunk_size < 8) {
   2509         // The smallest valid chunk is 8 bytes long.
   2510         return ERROR_MALFORMED;
   2511     }
   2512 
   2513     char chunk[5];
   2514     MakeFourCCString(chunk_type, chunk);
   2515     ALOGV("MPEG4Source chunk %s @ %llx", chunk, *offset);
   2516 
   2517     off64_t chunk_data_size = *offset + chunk_size - data_offset;
   2518 
   2519     switch(chunk_type) {
   2520 
   2521         case FOURCC('t', 'r', 'a', 'f'):
   2522         case FOURCC('m', 'o', 'o', 'f'): {
   2523             off64_t stop_offset = *offset + chunk_size;
   2524             *offset = data_offset;
   2525             while (*offset < stop_offset) {
   2526                 status_t err = parseChunk(offset);
   2527                 if (err != OK) {
   2528                     return err;
   2529                 }
   2530             }
   2531             if (chunk_type == FOURCC('m', 'o', 'o', 'f')) {
   2532                 // *offset points to the mdat box following this moof
   2533                 parseChunk(offset); // doesn't actually parse it, just updates offset
   2534                 mNextMoofOffset = *offset;
   2535             }
   2536             break;
   2537         }
   2538 
   2539         case FOURCC('t', 'f', 'h', 'd'): {
   2540                 status_t err;
   2541                 if ((err = parseTrackFragmentHeader(data_offset, chunk_data_size)) != OK) {
   2542                     return err;
   2543                 }
   2544                 *offset += chunk_size;
   2545                 break;
   2546         }
   2547 
   2548         case FOURCC('t', 'r', 'u', 'n'): {
   2549                 status_t err;
   2550                 if (mLastParsedTrackId == mTrackId) {
   2551                     if ((err = parseTrackFragmentRun(data_offset, chunk_data_size)) != OK) {
   2552                         return err;
   2553                     }
   2554                 }
   2555 
   2556                 *offset += chunk_size;
   2557                 break;
   2558         }
   2559 
   2560         case FOURCC('s', 'a', 'i', 'z'): {
   2561             status_t err;
   2562             if ((err = parseSampleAuxiliaryInformationSizes(data_offset, chunk_data_size)) != OK) {
   2563                 return err;
   2564             }
   2565             *offset += chunk_size;
   2566             break;
   2567         }
   2568         case FOURCC('s', 'a', 'i', 'o'): {
   2569             status_t err;
   2570             if ((err = parseSampleAuxiliaryInformationOffsets(data_offset, chunk_data_size)) != OK) {
   2571                 return err;
   2572             }
   2573             *offset += chunk_size;
   2574             break;
   2575         }
   2576 
   2577         case FOURCC('m', 'd', 'a', 't'): {
   2578             // parse DRM info if present
   2579             ALOGV("MPEG4Source::parseChunk mdat");
   2580             // if saiz/saoi was previously observed, do something with the sampleinfos
   2581             *offset += chunk_size;
   2582             break;
   2583         }
   2584 
   2585         default: {
   2586             *offset += chunk_size;
   2587             break;
   2588         }
   2589     }
   2590     return OK;
   2591 }
   2592 
   2593 status_t MPEG4Source::parseSampleAuxiliaryInformationSizes(off64_t offset, off64_t size) {
   2594     ALOGV("parseSampleAuxiliaryInformationSizes");
   2595     // 14496-12 8.7.12
   2596     uint8_t version;
   2597     if (mDataSource->readAt(
   2598             offset, &version, sizeof(version))
   2599             < (ssize_t)sizeof(version)) {
   2600         return ERROR_IO;
   2601     }
   2602 
   2603     if (version != 0) {
   2604         return ERROR_UNSUPPORTED;
   2605     }
   2606     offset++;
   2607 
   2608     uint32_t flags;
   2609     if (!mDataSource->getUInt24(offset, &flags)) {
   2610         return ERROR_IO;
   2611     }
   2612     offset += 3;
   2613 
   2614     if (flags & 1) {
   2615         uint32_t tmp;
   2616         if (!mDataSource->getUInt32(offset, &tmp)) {
   2617             return ERROR_MALFORMED;
   2618         }
   2619         mCurrentAuxInfoType = tmp;
   2620         offset += 4;
   2621         if (!mDataSource->getUInt32(offset, &tmp)) {
   2622             return ERROR_MALFORMED;
   2623         }
   2624         mCurrentAuxInfoTypeParameter = tmp;
   2625         offset += 4;
   2626     }
   2627 
   2628     uint8_t defsize;
   2629     if (mDataSource->readAt(offset, &defsize, 1) != 1) {
   2630         return ERROR_MALFORMED;
   2631     }
   2632     mCurrentDefaultSampleInfoSize = defsize;
   2633     offset++;
   2634 
   2635     uint32_t smplcnt;
   2636     if (!mDataSource->getUInt32(offset, &smplcnt)) {
   2637         return ERROR_MALFORMED;
   2638     }
   2639     mCurrentSampleInfoCount = smplcnt;
   2640     offset += 4;
   2641 
   2642     if (mCurrentDefaultSampleInfoSize != 0) {
   2643         ALOGV("@@@@ using default sample info size of %d", mCurrentDefaultSampleInfoSize);
   2644         return OK;
   2645     }
   2646     if (smplcnt > mCurrentSampleInfoAllocSize) {
   2647         mCurrentSampleInfoSizes = (uint8_t*) realloc(mCurrentSampleInfoSizes, smplcnt);
   2648         mCurrentSampleInfoAllocSize = smplcnt;
   2649     }
   2650 
   2651     mDataSource->readAt(offset, mCurrentSampleInfoSizes, smplcnt);
   2652     return OK;
   2653 }
   2654 
   2655 status_t MPEG4Source::parseSampleAuxiliaryInformationOffsets(off64_t offset, off64_t size) {
   2656     ALOGV("parseSampleAuxiliaryInformationOffsets");
   2657     // 14496-12 8.7.13
   2658     uint8_t version;
   2659     if (mDataSource->readAt(offset, &version, sizeof(version)) != 1) {
   2660         return ERROR_IO;
   2661     }
   2662     offset++;
   2663 
   2664     uint32_t flags;
   2665     if (!mDataSource->getUInt24(offset, &flags)) {
   2666         return ERROR_IO;
   2667     }
   2668     offset += 3;
   2669 
   2670     uint32_t entrycount;
   2671     if (!mDataSource->getUInt32(offset, &entrycount)) {
   2672         return ERROR_IO;
   2673     }
   2674     offset += 4;
   2675 
   2676     if (entrycount > mCurrentSampleInfoOffsetsAllocSize) {
   2677         mCurrentSampleInfoOffsets = (uint64_t*) realloc(mCurrentSampleInfoOffsets, entrycount * 8);
   2678         mCurrentSampleInfoOffsetsAllocSize = entrycount;
   2679     }
   2680     mCurrentSampleInfoOffsetCount = entrycount;
   2681 
   2682     for (size_t i = 0; i < entrycount; i++) {
   2683         if (version == 0) {
   2684             uint32_t tmp;
   2685             if (!mDataSource->getUInt32(offset, &tmp)) {
   2686                 return ERROR_IO;
   2687             }
   2688             mCurrentSampleInfoOffsets[i] = tmp;
   2689             offset += 4;
   2690         } else {
   2691             uint64_t tmp;
   2692             if (!mDataSource->getUInt64(offset, &tmp)) {
   2693                 return ERROR_IO;
   2694             }
   2695             mCurrentSampleInfoOffsets[i] = tmp;
   2696             offset += 8;
   2697         }
   2698     }
   2699 
   2700     // parse clear/encrypted data
   2701 
   2702     off64_t drmoffset = mCurrentSampleInfoOffsets[0]; // from moof
   2703 
   2704     drmoffset += mCurrentMoofOffset;
   2705     int ivlength;
   2706     CHECK(mFormat->findInt32(kKeyCryptoDefaultIVSize, &ivlength));
   2707 
   2708     // read CencSampleAuxiliaryDataFormats
   2709     for (size_t i = 0; i < mCurrentSampleInfoCount; i++) {
   2710         Sample *smpl = &mCurrentSamples.editItemAt(i);
   2711 
   2712         memset(smpl->iv, 0, 16);
   2713         if (mDataSource->readAt(drmoffset, smpl->iv, ivlength) != ivlength) {
   2714             return ERROR_IO;
   2715         }
   2716 
   2717         drmoffset += ivlength;
   2718 
   2719         int32_t smplinfosize = mCurrentDefaultSampleInfoSize;
   2720         if (smplinfosize == 0) {
   2721             smplinfosize = mCurrentSampleInfoSizes[i];
   2722         }
   2723         if (smplinfosize > ivlength) {
   2724             uint16_t numsubsamples;
   2725             if (!mDataSource->getUInt16(drmoffset, &numsubsamples)) {
   2726                 return ERROR_IO;
   2727             }
   2728             drmoffset += 2;
   2729             for (size_t j = 0; j < numsubsamples; j++) {
   2730                 uint16_t numclear;
   2731                 uint32_t numencrypted;
   2732                 if (!mDataSource->getUInt16(drmoffset, &numclear)) {
   2733                     return ERROR_IO;
   2734                 }
   2735                 drmoffset += 2;
   2736                 if (!mDataSource->getUInt32(drmoffset, &numencrypted)) {
   2737                     return ERROR_IO;
   2738                 }
   2739                 drmoffset += 4;
   2740                 smpl->clearsizes.add(numclear);
   2741                 smpl->encryptedsizes.add(numencrypted);
   2742             }
   2743         } else {
   2744             smpl->clearsizes.add(0);
   2745             smpl->encryptedsizes.add(smpl->size);
   2746         }
   2747     }
   2748 
   2749 
   2750     return OK;
   2751 }
   2752 
   2753 status_t MPEG4Source::parseTrackFragmentHeader(off64_t offset, off64_t size) {
   2754 
   2755     if (size < 8) {
   2756         return -EINVAL;
   2757     }
   2758 
   2759     uint32_t flags;
   2760     if (!mDataSource->getUInt32(offset, &flags)) { // actually version + flags
   2761         return ERROR_MALFORMED;
   2762     }
   2763 
   2764     if (flags & 0xff000000) {
   2765         return -EINVAL;
   2766     }
   2767 
   2768     if (!mDataSource->getUInt32(offset + 4, (uint32_t*)&mLastParsedTrackId)) {
   2769         return ERROR_MALFORMED;
   2770     }
   2771 
   2772     if (mLastParsedTrackId != mTrackId) {
   2773         // this is not the right track, skip it
   2774         return OK;
   2775     }
   2776 
   2777     mTrackFragmentHeaderInfo.mFlags = flags;
   2778     mTrackFragmentHeaderInfo.mTrackID = mLastParsedTrackId;
   2779     offset += 8;
   2780     size -= 8;
   2781 
   2782     ALOGV("fragment header: %08x %08x", flags, mTrackFragmentHeaderInfo.mTrackID);
   2783 
   2784     if (flags & TrackFragmentHeaderInfo::kBaseDataOffsetPresent) {
   2785         if (size < 8) {
   2786             return -EINVAL;
   2787         }
   2788 
   2789         if (!mDataSource->getUInt64(offset, &mTrackFragmentHeaderInfo.mBaseDataOffset)) {
   2790             return ERROR_MALFORMED;
   2791         }
   2792         offset += 8;
   2793         size -= 8;
   2794     }
   2795 
   2796     if (flags & TrackFragmentHeaderInfo::kSampleDescriptionIndexPresent) {
   2797         if (size < 4) {
   2798             return -EINVAL;
   2799         }
   2800 
   2801         if (!mDataSource->getUInt32(offset, &mTrackFragmentHeaderInfo.mSampleDescriptionIndex)) {
   2802             return ERROR_MALFORMED;
   2803         }
   2804         offset += 4;
   2805         size -= 4;
   2806     }
   2807 
   2808     if (flags & TrackFragmentHeaderInfo::kDefaultSampleDurationPresent) {
   2809         if (size < 4) {
   2810             return -EINVAL;
   2811         }
   2812 
   2813         if (!mDataSource->getUInt32(offset, &mTrackFragmentHeaderInfo.mDefaultSampleDuration)) {
   2814             return ERROR_MALFORMED;
   2815         }
   2816         offset += 4;
   2817         size -= 4;
   2818     }
   2819 
   2820     if (flags & TrackFragmentHeaderInfo::kDefaultSampleSizePresent) {
   2821         if (size < 4) {
   2822             return -EINVAL;
   2823         }
   2824 
   2825         if (!mDataSource->getUInt32(offset, &mTrackFragmentHeaderInfo.mDefaultSampleSize)) {
   2826             return ERROR_MALFORMED;
   2827         }
   2828         offset += 4;
   2829         size -= 4;
   2830     }
   2831 
   2832     if (flags & TrackFragmentHeaderInfo::kDefaultSampleFlagsPresent) {
   2833         if (size < 4) {
   2834             return -EINVAL;
   2835         }
   2836 
   2837         if (!mDataSource->getUInt32(offset, &mTrackFragmentHeaderInfo.mDefaultSampleFlags)) {
   2838             return ERROR_MALFORMED;
   2839         }
   2840         offset += 4;
   2841         size -= 4;
   2842     }
   2843 
   2844     if (!(flags & TrackFragmentHeaderInfo::kBaseDataOffsetPresent)) {
   2845         mTrackFragmentHeaderInfo.mBaseDataOffset = mCurrentMoofOffset;
   2846     }
   2847 
   2848     mTrackFragmentHeaderInfo.mDataOffset = 0;
   2849     return OK;
   2850 }
   2851 
   2852 status_t MPEG4Source::parseTrackFragmentRun(off64_t offset, off64_t size) {
   2853 
   2854     ALOGV("MPEG4Extractor::parseTrackFragmentRun");
   2855     if (size < 8) {
   2856         return -EINVAL;
   2857     }
   2858 
   2859     enum {
   2860         kDataOffsetPresent                  = 0x01,
   2861         kFirstSampleFlagsPresent            = 0x04,
   2862         kSampleDurationPresent              = 0x100,
   2863         kSampleSizePresent                  = 0x200,
   2864         kSampleFlagsPresent                 = 0x400,
   2865         kSampleCompositionTimeOffsetPresent = 0x800,
   2866     };
   2867 
   2868     uint32_t flags;
   2869     if (!mDataSource->getUInt32(offset, &flags)) {
   2870         return ERROR_MALFORMED;
   2871     }
   2872     ALOGV("fragment run flags: %08x", flags);
   2873 
   2874     if (flags & 0xff000000) {
   2875         return -EINVAL;
   2876     }
   2877 
   2878     if ((flags & kFirstSampleFlagsPresent) && (flags & kSampleFlagsPresent)) {
   2879         // These two shall not be used together.
   2880         return -EINVAL;
   2881     }
   2882 
   2883     uint32_t sampleCount;
   2884     if (!mDataSource->getUInt32(offset + 4, &sampleCount)) {
   2885         return ERROR_MALFORMED;
   2886     }
   2887     offset += 8;
   2888     size -= 8;
   2889 
   2890     uint64_t dataOffset = mTrackFragmentHeaderInfo.mDataOffset;
   2891 
   2892     uint32_t firstSampleFlags = 0;
   2893 
   2894     if (flags & kDataOffsetPresent) {
   2895         if (size < 4) {
   2896             return -EINVAL;
   2897         }
   2898 
   2899         int32_t dataOffsetDelta;
   2900         if (!mDataSource->getUInt32(offset, (uint32_t*)&dataOffsetDelta)) {
   2901             return ERROR_MALFORMED;
   2902         }
   2903 
   2904         dataOffset = mTrackFragmentHeaderInfo.mBaseDataOffset + dataOffsetDelta;
   2905 
   2906         offset += 4;
   2907         size -= 4;
   2908     }
   2909 
   2910     if (flags & kFirstSampleFlagsPresent) {
   2911         if (size < 4) {
   2912             return -EINVAL;
   2913         }
   2914 
   2915         if (!mDataSource->getUInt32(offset, &firstSampleFlags)) {
   2916             return ERROR_MALFORMED;
   2917         }
   2918         offset += 4;
   2919         size -= 4;
   2920     }
   2921 
   2922     uint32_t sampleDuration = 0, sampleSize = 0, sampleFlags = 0,
   2923              sampleCtsOffset = 0;
   2924 
   2925     size_t bytesPerSample = 0;
   2926     if (flags & kSampleDurationPresent) {
   2927         bytesPerSample += 4;
   2928     } else if (mTrackFragmentHeaderInfo.mFlags
   2929             & TrackFragmentHeaderInfo::kDefaultSampleDurationPresent) {
   2930         sampleDuration = mTrackFragmentHeaderInfo.mDefaultSampleDuration;
   2931     } else {
   2932         sampleDuration = mTrackFragmentHeaderInfo.mDefaultSampleDuration;
   2933     }
   2934 
   2935     if (flags & kSampleSizePresent) {
   2936         bytesPerSample += 4;
   2937     } else if (mTrackFragmentHeaderInfo.mFlags
   2938             & TrackFragmentHeaderInfo::kDefaultSampleSizePresent) {
   2939         sampleSize = mTrackFragmentHeaderInfo.mDefaultSampleSize;
   2940     } else {
   2941         sampleSize = mTrackFragmentHeaderInfo.mDefaultSampleSize;
   2942     }
   2943 
   2944     if (flags & kSampleFlagsPresent) {
   2945         bytesPerSample += 4;
   2946     } else if (mTrackFragmentHeaderInfo.mFlags
   2947             & TrackFragmentHeaderInfo::kDefaultSampleFlagsPresent) {
   2948         sampleFlags = mTrackFragmentHeaderInfo.mDefaultSampleFlags;
   2949     } else {
   2950         sampleFlags = mTrackFragmentHeaderInfo.mDefaultSampleFlags;
   2951     }
   2952 
   2953     if (flags & kSampleCompositionTimeOffsetPresent) {
   2954         bytesPerSample += 4;
   2955     } else {
   2956         sampleCtsOffset = 0;
   2957     }
   2958 
   2959     if (size < sampleCount * bytesPerSample) {
   2960         return -EINVAL;
   2961     }
   2962 
   2963     Sample tmp;
   2964     for (uint32_t i = 0; i < sampleCount; ++i) {
   2965         if (flags & kSampleDurationPresent) {
   2966             if (!mDataSource->getUInt32(offset, &sampleDuration)) {
   2967                 return ERROR_MALFORMED;
   2968             }
   2969             offset += 4;
   2970         }
   2971 
   2972         if (flags & kSampleSizePresent) {
   2973             if (!mDataSource->getUInt32(offset, &sampleSize)) {
   2974                 return ERROR_MALFORMED;
   2975             }
   2976             offset += 4;
   2977         }
   2978 
   2979         if (flags & kSampleFlagsPresent) {
   2980             if (!mDataSource->getUInt32(offset, &sampleFlags)) {
   2981                 return ERROR_MALFORMED;
   2982             }
   2983             offset += 4;
   2984         }
   2985 
   2986         if (flags & kSampleCompositionTimeOffsetPresent) {
   2987             if (!mDataSource->getUInt32(offset, &sampleCtsOffset)) {
   2988                 return ERROR_MALFORMED;
   2989             }
   2990             offset += 4;
   2991         }
   2992 
   2993         ALOGV("adding sample %d at offset 0x%08llx, size %u, duration %u, "
   2994               " flags 0x%08x", i + 1,
   2995                 dataOffset, sampleSize, sampleDuration,
   2996                 (flags & kFirstSampleFlagsPresent) && i == 0
   2997                     ? firstSampleFlags : sampleFlags);
   2998         tmp.offset = dataOffset;
   2999         tmp.size = sampleSize;
   3000         tmp.duration = sampleDuration;
   3001         mCurrentSamples.add(tmp);
   3002 
   3003         dataOffset += sampleSize;
   3004     }
   3005 
   3006     mTrackFragmentHeaderInfo.mDataOffset = dataOffset;
   3007 
   3008     return OK;
   3009 }
   3010 
   3011 sp<MetaData> MPEG4Source::getFormat() {
   3012     Mutex::Autolock autoLock(mLock);
   3013 
   3014     return mFormat;
   3015 }
   3016 
   3017 size_t MPEG4Source::parseNALSize(const uint8_t *data) const {
   3018     switch (mNALLengthSize) {
   3019         case 1:
   3020             return *data;
   3021         case 2:
   3022             return U16_AT(data);
   3023         case 3:
   3024             return ((size_t)data[0] << 16) | U16_AT(&data[1]);
   3025         case 4:
   3026             return U32_AT(data);
   3027     }
   3028 
   3029     // This cannot happen, mNALLengthSize springs to life by adding 1 to
   3030     // a 2-bit integer.
   3031     CHECK(!"Should not be here.");
   3032 
   3033     return 0;
   3034 }
   3035 
   3036 status_t MPEG4Source::read(
   3037         MediaBuffer **out, const ReadOptions *options) {
   3038     Mutex::Autolock autoLock(mLock);
   3039 
   3040     CHECK(mStarted);
   3041 
   3042     if (mFirstMoofOffset > 0) {
   3043         return fragmentedRead(out, options);
   3044     }
   3045 
   3046     *out = NULL;
   3047 
   3048     int64_t targetSampleTimeUs = -1;
   3049 
   3050     int64_t seekTimeUs;
   3051     ReadOptions::SeekMode mode;
   3052     if (options && options->getSeekTo(&seekTimeUs, &mode)) {
   3053         uint32_t findFlags = 0;
   3054         switch (mode) {
   3055             case ReadOptions::SEEK_PREVIOUS_SYNC:
   3056                 findFlags = SampleTable::kFlagBefore;
   3057                 break;
   3058             case ReadOptions::SEEK_NEXT_SYNC:
   3059                 findFlags = SampleTable::kFlagAfter;
   3060                 break;
   3061             case ReadOptions::SEEK_CLOSEST_SYNC:
   3062             case ReadOptions::SEEK_CLOSEST:
   3063                 findFlags = SampleTable::kFlagClosest;
   3064                 break;
   3065             default:
   3066                 CHECK(!"Should not be here.");
   3067                 break;
   3068         }
   3069 
   3070         uint32_t sampleIndex;
   3071         status_t err = mSampleTable->findSampleAtTime(
   3072                 seekTimeUs * mTimescale / 1000000,
   3073                 &sampleIndex, findFlags);
   3074 
   3075         if (mode == ReadOptions::SEEK_CLOSEST) {
   3076             // We found the closest sample already, now we want the sync
   3077             // sample preceding it (or the sample itself of course), even
   3078             // if the subsequent sync sample is closer.
   3079             findFlags = SampleTable::kFlagBefore;
   3080         }
   3081 
   3082         uint32_t syncSampleIndex;
   3083         if (err == OK) {
   3084             err = mSampleTable->findSyncSampleNear(
   3085                     sampleIndex, &syncSampleIndex, findFlags);
   3086         }
   3087 
   3088         uint32_t sampleTime;
   3089         if (err == OK) {
   3090             err = mSampleTable->getMetaDataForSample(
   3091                     sampleIndex, NULL, NULL, &sampleTime);
   3092         }
   3093 
   3094         if (err != OK) {
   3095             if (err == ERROR_OUT_OF_RANGE) {
   3096                 // An attempt to seek past the end of the stream would
   3097                 // normally cause this ERROR_OUT_OF_RANGE error. Propagating
   3098                 // this all the way to the MediaPlayer would cause abnormal
   3099                 // termination. Legacy behaviour appears to be to behave as if
   3100                 // we had seeked to the end of stream, ending normally.
   3101                 err = ERROR_END_OF_STREAM;
   3102             }
   3103             ALOGV("end of stream");
   3104             return err;
   3105         }
   3106 
   3107         if (mode == ReadOptions::SEEK_CLOSEST) {
   3108             targetSampleTimeUs = (sampleTime * 1000000ll) / mTimescale;
   3109         }
   3110 
   3111 #if 0
   3112         uint32_t syncSampleTime;
   3113         CHECK_EQ(OK, mSampleTable->getMetaDataForSample(
   3114                     syncSampleIndex, NULL, NULL, &syncSampleTime));
   3115 
   3116         ALOGI("seek to time %lld us => sample at time %lld us, "
   3117              "sync sample at time %lld us",
   3118              seekTimeUs,
   3119              sampleTime * 1000000ll / mTimescale,
   3120              syncSampleTime * 1000000ll / mTimescale);
   3121 #endif
   3122 
   3123         mCurrentSampleIndex = syncSampleIndex;
   3124         if (mBuffer != NULL) {
   3125             mBuffer->release();
   3126             mBuffer = NULL;
   3127         }
   3128 
   3129         // fall through
   3130     }
   3131 
   3132     off64_t offset;
   3133     size_t size;
   3134     uint32_t cts;
   3135     bool isSyncSample;
   3136     bool newBuffer = false;
   3137     if (mBuffer == NULL) {
   3138         newBuffer = true;
   3139 
   3140         status_t err =
   3141             mSampleTable->getMetaDataForSample(
   3142                     mCurrentSampleIndex, &offset, &size, &cts, &isSyncSample);
   3143 
   3144         if (err != OK) {
   3145             return err;
   3146         }
   3147 
   3148         err = mGroup->acquire_buffer(&mBuffer);
   3149 
   3150         if (err != OK) {
   3151             CHECK(mBuffer == NULL);
   3152             return err;
   3153         }
   3154     }
   3155 
   3156     if (!mIsAVC || mWantsNALFragments) {
   3157         if (newBuffer) {
   3158             ssize_t num_bytes_read =
   3159                 mDataSource->readAt(offset, (uint8_t *)mBuffer->data(), size);
   3160 
   3161             if (num_bytes_read < (ssize_t)size) {
   3162                 mBuffer->release();
   3163                 mBuffer = NULL;
   3164 
   3165                 return ERROR_IO;
   3166             }
   3167 
   3168             CHECK(mBuffer != NULL);
   3169             mBuffer->set_range(0, size);
   3170             mBuffer->meta_data()->clear();
   3171             mBuffer->meta_data()->setInt64(
   3172                     kKeyTime, ((int64_t)cts * 1000000) / mTimescale);
   3173 
   3174             if (targetSampleTimeUs >= 0) {
   3175                 mBuffer->meta_data()->setInt64(
   3176                         kKeyTargetTime, targetSampleTimeUs);
   3177             }
   3178 
   3179             if (isSyncSample) {
   3180                 mBuffer->meta_data()->setInt32(kKeyIsSyncFrame, 1);
   3181             }
   3182 
   3183             ++mCurrentSampleIndex;
   3184         }
   3185 
   3186         if (!mIsAVC) {
   3187             *out = mBuffer;
   3188             mBuffer = NULL;
   3189 
   3190             return OK;
   3191         }
   3192 
   3193         // Each NAL unit is split up into its constituent fragments and
   3194         // each one of them returned in its own buffer.
   3195 
   3196         CHECK(mBuffer->range_length() >= mNALLengthSize);
   3197 
   3198         const uint8_t *src =
   3199             (const uint8_t *)mBuffer->data() + mBuffer->range_offset();
   3200 
   3201         size_t nal_size = parseNALSize(src);
   3202         if (mBuffer->range_length() < mNALLengthSize + nal_size) {
   3203             ALOGE("incomplete NAL unit.");
   3204 
   3205             mBuffer->release();
   3206             mBuffer = NULL;
   3207 
   3208             return ERROR_MALFORMED;
   3209         }
   3210 
   3211         MediaBuffer *clone = mBuffer->clone();
   3212         CHECK(clone != NULL);
   3213         clone->set_range(mBuffer->range_offset() + mNALLengthSize, nal_size);
   3214 
   3215         CHECK(mBuffer != NULL);
   3216         mBuffer->set_range(
   3217                 mBuffer->range_offset() + mNALLengthSize + nal_size,
   3218                 mBuffer->range_length() - mNALLengthSize - nal_size);
   3219 
   3220         if (mBuffer->range_length() == 0) {
   3221             mBuffer->release();
   3222             mBuffer = NULL;
   3223         }
   3224 
   3225         *out = clone;
   3226 
   3227         return OK;
   3228     } else {
   3229         // Whole NAL units are returned but each fragment is prefixed by
   3230         // the start code (0x00 00 00 01).
   3231         ssize_t num_bytes_read = 0;
   3232         int32_t drm = 0;
   3233         bool usesDRM = (mFormat->findInt32(kKeyIsDRM, &drm) && drm != 0);
   3234         if (usesDRM) {
   3235             num_bytes_read =
   3236                 mDataSource->readAt(offset, (uint8_t*)mBuffer->data(), size);
   3237         } else {
   3238             num_bytes_read = mDataSource->readAt(offset, mSrcBuffer, size);
   3239         }
   3240 
   3241         if (num_bytes_read < (ssize_t)size) {
   3242             mBuffer->release();
   3243             mBuffer = NULL;
   3244 
   3245             return ERROR_IO;
   3246         }
   3247 
   3248         if (usesDRM) {
   3249             CHECK(mBuffer != NULL);
   3250             mBuffer->set_range(0, size);
   3251 
   3252         } else {
   3253             uint8_t *dstData = (uint8_t *)mBuffer->data();
   3254             size_t srcOffset = 0;
   3255             size_t dstOffset = 0;
   3256 
   3257             while (srcOffset < size) {
   3258                 bool isMalFormed = (srcOffset + mNALLengthSize > size);
   3259                 size_t nalLength = 0;
   3260                 if (!isMalFormed) {
   3261                     nalLength = parseNALSize(&mSrcBuffer[srcOffset]);
   3262                     srcOffset += mNALLengthSize;
   3263                     isMalFormed = srcOffset + nalLength > size;
   3264                 }
   3265 
   3266                 if (isMalFormed) {
   3267                     ALOGE("Video is malformed");
   3268                     mBuffer->release();
   3269                     mBuffer = NULL;
   3270                     return ERROR_MALFORMED;
   3271                 }
   3272 
   3273                 if (nalLength == 0) {
   3274                     continue;
   3275                 }
   3276 
   3277                 CHECK(dstOffset + 4 <= mBuffer->size());
   3278 
   3279                 dstData[dstOffset++] = 0;
   3280                 dstData[dstOffset++] = 0;
   3281                 dstData[dstOffset++] = 0;
   3282                 dstData[dstOffset++] = 1;
   3283                 memcpy(&dstData[dstOffset], &mSrcBuffer[srcOffset], nalLength);
   3284                 srcOffset += nalLength;
   3285                 dstOffset += nalLength;
   3286             }
   3287             CHECK_EQ(srcOffset, size);
   3288             CHECK(mBuffer != NULL);
   3289             mBuffer->set_range(0, dstOffset);
   3290         }
   3291 
   3292         mBuffer->meta_data()->clear();
   3293         mBuffer->meta_data()->setInt64(
   3294                 kKeyTime, ((int64_t)cts * 1000000) / mTimescale);
   3295 
   3296         if (targetSampleTimeUs >= 0) {
   3297             mBuffer->meta_data()->setInt64(
   3298                     kKeyTargetTime, targetSampleTimeUs);
   3299         }
   3300 
   3301         if (isSyncSample) {
   3302             mBuffer->meta_data()->setInt32(kKeyIsSyncFrame, 1);
   3303         }
   3304 
   3305         ++mCurrentSampleIndex;
   3306 
   3307         *out = mBuffer;
   3308         mBuffer = NULL;
   3309 
   3310         return OK;
   3311     }
   3312 }
   3313 
   3314 status_t MPEG4Source::fragmentedRead(
   3315         MediaBuffer **out, const ReadOptions *options) {
   3316 
   3317     ALOGV("MPEG4Source::fragmentedRead");
   3318 
   3319     CHECK(mStarted);
   3320 
   3321     *out = NULL;
   3322 
   3323     int64_t targetSampleTimeUs = -1;
   3324 
   3325     int64_t seekTimeUs;
   3326     ReadOptions::SeekMode mode;
   3327     if (options && options->getSeekTo(&seekTimeUs, &mode)) {
   3328 
   3329         int numSidxEntries = mSegments.size();
   3330         if (numSidxEntries != 0) {
   3331             int64_t totalTime = 0;
   3332             off64_t totalOffset = mFirstMoofOffset;
   3333             for (int i = 0; i < numSidxEntries; i++) {
   3334                 const SidxEntry *se = &mSegments[i];
   3335                 if (totalTime + se->mDurationUs > seekTimeUs) {
   3336                     // The requested time is somewhere in this segment
   3337                     if ((mode == ReadOptions::SEEK_NEXT_SYNC) ||
   3338                         (mode == ReadOptions::SEEK_CLOSEST_SYNC &&
   3339                         (seekTimeUs - totalTime) > (totalTime + se->mDurationUs - seekTimeUs))) {
   3340                         // requested next sync, or closest sync and it was closer to the end of
   3341                         // this segment
   3342                         totalTime += se->mDurationUs;
   3343                         totalOffset += se->mSize;
   3344                     }
   3345                     break;
   3346                 }
   3347                 totalTime += se->mDurationUs;
   3348                 totalOffset += se->mSize;
   3349             }
   3350         mCurrentMoofOffset = totalOffset;
   3351         mCurrentSamples.clear();
   3352         mCurrentSampleIndex = 0;
   3353         parseChunk(&totalOffset);
   3354         mCurrentTime = totalTime * mTimescale / 1000000ll;
   3355         }
   3356 
   3357         if (mBuffer != NULL) {
   3358             mBuffer->release();
   3359             mBuffer = NULL;
   3360         }
   3361 
   3362         // fall through
   3363     }
   3364 
   3365     off64_t offset = 0;
   3366     size_t size;
   3367     uint32_t cts = 0;
   3368     bool isSyncSample = false;
   3369     bool newBuffer = false;
   3370     if (mBuffer == NULL) {
   3371         newBuffer = true;
   3372 
   3373         if (mCurrentSampleIndex >= mCurrentSamples.size()) {
   3374             // move to next fragment
   3375             Sample lastSample = mCurrentSamples[mCurrentSamples.size() - 1];
   3376             off64_t nextMoof = mNextMoofOffset; // lastSample.offset + lastSample.size;
   3377             mCurrentMoofOffset = nextMoof;
   3378             mCurrentSamples.clear();
   3379             mCurrentSampleIndex = 0;
   3380             parseChunk(&nextMoof);
   3381                 if (mCurrentSampleIndex >= mCurrentSamples.size()) {
   3382                     return ERROR_END_OF_STREAM;
   3383                 }
   3384         }
   3385 
   3386         const Sample *smpl = &mCurrentSamples[mCurrentSampleIndex];
   3387         offset = smpl->offset;
   3388         size = smpl->size;
   3389         cts = mCurrentTime;
   3390         mCurrentTime += smpl->duration;
   3391         isSyncSample = (mCurrentSampleIndex == 0); // XXX
   3392 
   3393         status_t err = mGroup->acquire_buffer(&mBuffer);
   3394 
   3395         if (err != OK) {
   3396             CHECK(mBuffer == NULL);
   3397             ALOGV("acquire_buffer returned %d", err);
   3398             return err;
   3399         }
   3400     }
   3401 
   3402     const Sample *smpl = &mCurrentSamples[mCurrentSampleIndex];
   3403     const sp<MetaData> bufmeta = mBuffer->meta_data();
   3404     bufmeta->clear();
   3405     if (smpl->encryptedsizes.size()) {
   3406         // store clear/encrypted lengths in metadata
   3407         bufmeta->setData(kKeyPlainSizes, 0,
   3408                 smpl->clearsizes.array(), smpl->clearsizes.size() * 4);
   3409         bufmeta->setData(kKeyEncryptedSizes, 0,
   3410                 smpl->encryptedsizes.array(), smpl->encryptedsizes.size() * 4);
   3411         bufmeta->setData(kKeyCryptoIV, 0, smpl->iv, 16); // use 16 or the actual size?
   3412         bufmeta->setInt32(kKeyCryptoDefaultIVSize, mDefaultIVSize);
   3413         bufmeta->setInt32(kKeyCryptoMode, mCryptoMode);
   3414         bufmeta->setData(kKeyCryptoKey, 0, mCryptoKey, 16);
   3415     }
   3416 
   3417     if (!mIsAVC || mWantsNALFragments) {
   3418         if (newBuffer) {
   3419             ssize_t num_bytes_read =
   3420                 mDataSource->readAt(offset, (uint8_t *)mBuffer->data(), size);
   3421 
   3422             if (num_bytes_read < (ssize_t)size) {
   3423                 mBuffer->release();
   3424                 mBuffer = NULL;
   3425 
   3426                 ALOGV("i/o error");
   3427                 return ERROR_IO;
   3428             }
   3429 
   3430             CHECK(mBuffer != NULL);
   3431             mBuffer->set_range(0, size);
   3432             mBuffer->meta_data()->setInt64(
   3433                     kKeyTime, ((int64_t)cts * 1000000) / mTimescale);
   3434 
   3435             if (targetSampleTimeUs >= 0) {
   3436                 mBuffer->meta_data()->setInt64(
   3437                         kKeyTargetTime, targetSampleTimeUs);
   3438             }
   3439 
   3440             if (isSyncSample) {
   3441                 mBuffer->meta_data()->setInt32(kKeyIsSyncFrame, 1);
   3442             }
   3443 
   3444             ++mCurrentSampleIndex;
   3445         }
   3446 
   3447         if (!mIsAVC) {
   3448             *out = mBuffer;
   3449             mBuffer = NULL;
   3450 
   3451             return OK;
   3452         }
   3453 
   3454         // Each NAL unit is split up into its constituent fragments and
   3455         // each one of them returned in its own buffer.
   3456 
   3457         CHECK(mBuffer->range_length() >= mNALLengthSize);
   3458 
   3459         const uint8_t *src =
   3460             (const uint8_t *)mBuffer->data() + mBuffer->range_offset();
   3461 
   3462         size_t nal_size = parseNALSize(src);
   3463         if (mBuffer->range_length() < mNALLengthSize + nal_size) {
   3464             ALOGE("incomplete NAL unit.");
   3465 
   3466             mBuffer->release();
   3467             mBuffer = NULL;
   3468 
   3469             return ERROR_MALFORMED;
   3470         }
   3471 
   3472         MediaBuffer *clone = mBuffer->clone();
   3473         CHECK(clone != NULL);
   3474         clone->set_range(mBuffer->range_offset() + mNALLengthSize, nal_size);
   3475 
   3476         CHECK(mBuffer != NULL);
   3477         mBuffer->set_range(
   3478                 mBuffer->range_offset() + mNALLengthSize + nal_size,
   3479                 mBuffer->range_length() - mNALLengthSize - nal_size);
   3480 
   3481         if (mBuffer->range_length() == 0) {
   3482             mBuffer->release();
   3483             mBuffer = NULL;
   3484         }
   3485 
   3486         *out = clone;
   3487 
   3488         return OK;
   3489     } else {
   3490         ALOGV("whole NAL");
   3491         // Whole NAL units are returned but each fragment is prefixed by
   3492         // the start code (0x00 00 00 01).
   3493         ssize_t num_bytes_read = 0;
   3494         int32_t drm = 0;
   3495         bool usesDRM = (mFormat->findInt32(kKeyIsDRM, &drm) && drm != 0);
   3496         if (usesDRM) {
   3497             num_bytes_read =
   3498                 mDataSource->readAt(offset, (uint8_t*)mBuffer->data(), size);
   3499         } else {
   3500             num_bytes_read = mDataSource->readAt(offset, mSrcBuffer, size);
   3501         }
   3502 
   3503         if (num_bytes_read < (ssize_t)size) {
   3504             mBuffer->release();
   3505             mBuffer = NULL;
   3506 
   3507             ALOGV("i/o error");
   3508             return ERROR_IO;
   3509         }
   3510 
   3511         if (usesDRM) {
   3512             CHECK(mBuffer != NULL);
   3513             mBuffer->set_range(0, size);
   3514 
   3515         } else {
   3516             uint8_t *dstData = (uint8_t *)mBuffer->data();
   3517             size_t srcOffset = 0;
   3518             size_t dstOffset = 0;
   3519 
   3520             while (srcOffset < size) {
   3521                 bool isMalFormed = (srcOffset + mNALLengthSize > size);
   3522                 size_t nalLength = 0;
   3523                 if (!isMalFormed) {
   3524                     nalLength = parseNALSize(&mSrcBuffer[srcOffset]);
   3525                     srcOffset += mNALLengthSize;
   3526                     isMalFormed = srcOffset + nalLength > size;
   3527                 }
   3528 
   3529                 if (isMalFormed) {
   3530                     ALOGE("Video is malformed");
   3531                     mBuffer->release();
   3532                     mBuffer = NULL;
   3533                     return ERROR_MALFORMED;
   3534                 }
   3535 
   3536                 if (nalLength == 0) {
   3537                     continue;
   3538                 }
   3539 
   3540                 CHECK(dstOffset + 4 <= mBuffer->size());
   3541 
   3542                 dstData[dstOffset++] = 0;
   3543                 dstData[dstOffset++] = 0;
   3544                 dstData[dstOffset++] = 0;
   3545                 dstData[dstOffset++] = 1;
   3546                 memcpy(&dstData[dstOffset], &mSrcBuffer[srcOffset], nalLength);
   3547                 srcOffset += nalLength;
   3548                 dstOffset += nalLength;
   3549             }
   3550             CHECK_EQ(srcOffset, size);
   3551             CHECK(mBuffer != NULL);
   3552             mBuffer->set_range(0, dstOffset);
   3553         }
   3554 
   3555         mBuffer->meta_data()->setInt64(
   3556                 kKeyTime, ((int64_t)cts * 1000000) / mTimescale);
   3557 
   3558         if (targetSampleTimeUs >= 0) {
   3559             mBuffer->meta_data()->setInt64(
   3560                     kKeyTargetTime, targetSampleTimeUs);
   3561         }
   3562 
   3563         if (isSyncSample) {
   3564             mBuffer->meta_data()->setInt32(kKeyIsSyncFrame, 1);
   3565         }
   3566 
   3567         ++mCurrentSampleIndex;
   3568 
   3569         *out = mBuffer;
   3570         mBuffer = NULL;
   3571 
   3572         return OK;
   3573     }
   3574 }
   3575 
   3576 MPEG4Extractor::Track *MPEG4Extractor::findTrackByMimePrefix(
   3577         const char *mimePrefix) {
   3578     for (Track *track = mFirstTrack; track != NULL; track = track->next) {
   3579         const char *mime;
   3580         if (track->meta != NULL
   3581                 && track->meta->findCString(kKeyMIMEType, &mime)
   3582                 && !strncasecmp(mime, mimePrefix, strlen(mimePrefix))) {
   3583             return track;
   3584         }
   3585     }
   3586 
   3587     return NULL;
   3588 }
   3589 
   3590 static bool LegacySniffMPEG4(
   3591         const sp<DataSource> &source, String8 *mimeType, float *confidence) {
   3592     uint8_t header[8];
   3593 
   3594     ssize_t n = source->readAt(4, header, sizeof(header));
   3595     if (n < (ssize_t)sizeof(header)) {
   3596         return false;
   3597     }
   3598 
   3599     if (!memcmp(header, "ftyp3gp", 7) || !memcmp(header, "ftypmp42", 8)
   3600         || !memcmp(header, "ftyp3gr6", 8) || !memcmp(header, "ftyp3gs6", 8)
   3601         || !memcmp(header, "ftyp3ge6", 8) || !memcmp(header, "ftyp3gg6", 8)
   3602         || !memcmp(header, "ftypisom", 8) || !memcmp(header, "ftypM4V ", 8)
   3603         || !memcmp(header, "ftypM4A ", 8) || !memcmp(header, "ftypf4v ", 8)
   3604         || !memcmp(header, "ftypkddi", 8) || !memcmp(header, "ftypM4VP", 8)) {
   3605         *mimeType = MEDIA_MIMETYPE_CONTAINER_MPEG4;
   3606         *confidence = 0.4;
   3607 
   3608         return true;
   3609     }
   3610 
   3611     return false;
   3612 }
   3613 
   3614 static bool isCompatibleBrand(uint32_t fourcc) {
   3615     static const uint32_t kCompatibleBrands[] = {
   3616         FOURCC('i', 's', 'o', 'm'),
   3617         FOURCC('i', 's', 'o', '2'),
   3618         FOURCC('a', 'v', 'c', '1'),
   3619         FOURCC('3', 'g', 'p', '4'),
   3620         FOURCC('m', 'p', '4', '1'),
   3621         FOURCC('m', 'p', '4', '2'),
   3622 
   3623         // Won't promise that the following file types can be played.
   3624         // Just give these file types a chance.
   3625         FOURCC('q', 't', ' ', ' '),  // Apple's QuickTime
   3626         FOURCC('M', 'S', 'N', 'V'),  // Sony's PSP
   3627 
   3628         FOURCC('3', 'g', '2', 'a'),  // 3GPP2
   3629         FOURCC('3', 'g', '2', 'b'),
   3630     };
   3631 
   3632     for (size_t i = 0;
   3633          i < sizeof(kCompatibleBrands) / sizeof(kCompatibleBrands[0]);
   3634          ++i) {
   3635         if (kCompatibleBrands[i] == fourcc) {
   3636             return true;
   3637         }
   3638     }
   3639 
   3640     return false;
   3641 }
   3642 
   3643 // Attempt to actually parse the 'ftyp' atom and determine if a suitable
   3644 // compatible brand is present.
   3645 // Also try to identify where this file's metadata ends
   3646 // (end of the 'moov' atom) and report it to the caller as part of
   3647 // the metadata.
   3648 static bool BetterSniffMPEG4(
   3649         const sp<DataSource> &source, String8 *mimeType, float *confidence,
   3650         sp<AMessage> *meta) {
   3651     // We scan up to 128 bytes to identify this file as an MP4.
   3652     static const off64_t kMaxScanOffset = 128ll;
   3653 
   3654     off64_t offset = 0ll;
   3655     bool foundGoodFileType = false;
   3656     off64_t moovAtomEndOffset = -1ll;
   3657     bool done = false;
   3658 
   3659     while (!done && offset < kMaxScanOffset) {
   3660         uint32_t hdr[2];
   3661         if (source->readAt(offset, hdr, 8) < 8) {
   3662             return false;
   3663         }
   3664 
   3665         uint64_t chunkSize = ntohl(hdr[0]);
   3666         uint32_t chunkType = ntohl(hdr[1]);
   3667         off64_t chunkDataOffset = offset + 8;
   3668 
   3669         if (chunkSize == 1) {
   3670             if (source->readAt(offset + 8, &chunkSize, 8) < 8) {
   3671                 return false;
   3672             }
   3673 
   3674             chunkSize = ntoh64(chunkSize);
   3675             chunkDataOffset += 8;
   3676 
   3677             if (chunkSize < 16) {
   3678                 // The smallest valid chunk is 16 bytes long in this case.
   3679                 return false;
   3680             }
   3681         } else if (chunkSize < 8) {
   3682             // The smallest valid chunk is 8 bytes long.
   3683             return false;
   3684         }
   3685 
   3686         off64_t chunkDataSize = offset + chunkSize - chunkDataOffset;
   3687 
   3688         char chunkstring[5];
   3689         MakeFourCCString(chunkType, chunkstring);
   3690         ALOGV("saw chunk type %s, size %lld @ %lld", chunkstring, chunkSize, offset);
   3691         switch (chunkType) {
   3692             case FOURCC('f', 't', 'y', 'p'):
   3693             {
   3694                 if (chunkDataSize < 8) {
   3695                     return false;
   3696                 }
   3697 
   3698                 uint32_t numCompatibleBrands = (chunkDataSize - 8) / 4;
   3699                 for (size_t i = 0; i < numCompatibleBrands + 2; ++i) {
   3700                     if (i == 1) {
   3701                         // Skip this index, it refers to the minorVersion,
   3702                         // not a brand.
   3703                         continue;
   3704                     }
   3705 
   3706                     uint32_t brand;
   3707                     if (source->readAt(
   3708                                 chunkDataOffset + 4 * i, &brand, 4) < 4) {
   3709                         return false;
   3710                     }
   3711 
   3712                     brand = ntohl(brand);
   3713 
   3714                     if (isCompatibleBrand(brand)) {
   3715                         foundGoodFileType = true;
   3716                         break;
   3717                     }
   3718                 }
   3719 
   3720                 if (!foundGoodFileType) {
   3721                     return false;
   3722                 }
   3723 
   3724                 break;
   3725             }
   3726 
   3727             case FOURCC('m', 'o', 'o', 'v'):
   3728             {
   3729                 moovAtomEndOffset = offset + chunkSize;
   3730 
   3731                 done = true;
   3732                 break;
   3733             }
   3734 
   3735             default:
   3736                 break;
   3737         }
   3738 
   3739         offset += chunkSize;
   3740     }
   3741 
   3742     if (!foundGoodFileType) {
   3743         return false;
   3744     }
   3745 
   3746     *mimeType = MEDIA_MIMETYPE_CONTAINER_MPEG4;
   3747     *confidence = 0.4f;
   3748 
   3749     if (moovAtomEndOffset >= 0) {
   3750         *meta = new AMessage;
   3751         (*meta)->setInt64("meta-data-size", moovAtomEndOffset);
   3752 
   3753         ALOGV("found metadata size: %lld", moovAtomEndOffset);
   3754     }
   3755 
   3756     return true;
   3757 }
   3758 
   3759 bool SniffMPEG4(
   3760         const sp<DataSource> &source, String8 *mimeType, float *confidence,
   3761         sp<AMessage> *meta) {
   3762     if (BetterSniffMPEG4(source, mimeType, confidence, meta)) {
   3763         return true;
   3764     }
   3765 
   3766     if (LegacySniffMPEG4(source, mimeType, confidence)) {
   3767         ALOGW("Identified supported mpeg4 through LegacySniffMPEG4.");
   3768         return true;
   3769     }
   3770 
   3771     return false;
   3772 }
   3773 
   3774 }  // namespace android
   3775