Home | History | Annotate | Download | only in mpeg2ts
      1 /*
      2  * Copyright (C) 2010 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 "ESQueue"
     19 #include <media/stagefright/foundation/ADebug.h>
     20 
     21 #include "ESQueue.h"
     22 
     23 #include <media/stagefright/foundation/hexdump.h>
     24 #include <media/stagefright/foundation/ABitReader.h>
     25 #include <media/stagefright/foundation/ABuffer.h>
     26 #include <media/stagefright/foundation/AMessage.h>
     27 #include <media/stagefright/MediaErrors.h>
     28 #include <media/stagefright/MediaDefs.h>
     29 #include <media/stagefright/MetaData.h>
     30 #include <media/stagefright/Utils.h>
     31 #include <media/cas/DescramblerAPI.h>
     32 #include <media/hardware/CryptoAPI.h>
     33 
     34 #include "include/avc_utils.h"
     35 
     36 #include <inttypes.h>
     37 #include <netinet/in.h>
     38 
     39 namespace android {
     40 
     41 ElementaryStreamQueue::ElementaryStreamQueue(Mode mode, uint32_t flags)
     42     : mMode(mode),
     43       mFlags(flags),
     44       mEOSReached(false),
     45       mCASystemId(0),
     46       mAUIndex(0) {
     47 
     48     ALOGV("ElementaryStreamQueue(%p) mode %x  flags %x  isScrambled %d  isSampleEncrypted %d",
     49             this, mode, flags, isScrambled(), isSampleEncrypted());
     50 
     51     // Create the decryptor anyway since we don't know the use-case unless key is provided
     52     // Won't decrypt if key info not available (e.g., scanner/extractor just parsing ts files)
     53     mSampleDecryptor = isSampleEncrypted() ? new HlsSampleDecryptor : NULL;
     54 }
     55 
     56 sp<MetaData> ElementaryStreamQueue::getFormat() {
     57     return mFormat;
     58 }
     59 
     60 void ElementaryStreamQueue::clear(bool clearFormat) {
     61     if (mBuffer != NULL) {
     62         mBuffer->setRange(0, 0);
     63     }
     64 
     65     mRangeInfos.clear();
     66 
     67     if (mScrambledBuffer != NULL) {
     68         mScrambledBuffer->setRange(0, 0);
     69     }
     70     mScrambledRangeInfos.clear();
     71 
     72     if (clearFormat) {
     73         mFormat.clear();
     74     }
     75 
     76     mEOSReached = false;
     77 }
     78 
     79 bool ElementaryStreamQueue::isScrambled() const {
     80     return (mFlags & kFlag_ScrambledData) != 0;
     81 }
     82 
     83 void ElementaryStreamQueue::setCasInfo(
     84         int32_t systemId, const std::vector<uint8_t> &sessionId) {
     85     mCASystemId = systemId;
     86     mCasSessionId = sessionId;
     87 }
     88 
     89 // Parse AC3 header assuming the current ptr is start position of syncframe,
     90 // update metadata only applicable, and return the payload size
     91 static unsigned parseAC3SyncFrame(
     92         const uint8_t *ptr, size_t size, sp<MetaData> *metaData) {
     93     static const unsigned channelCountTable[] = {2, 1, 2, 3, 3, 4, 4, 5};
     94     static const unsigned samplingRateTable[] = {48000, 44100, 32000};
     95 
     96     static const unsigned frameSizeTable[19][3] = {
     97         { 64, 69, 96 },
     98         { 80, 87, 120 },
     99         { 96, 104, 144 },
    100         { 112, 121, 168 },
    101         { 128, 139, 192 },
    102         { 160, 174, 240 },
    103         { 192, 208, 288 },
    104         { 224, 243, 336 },
    105         { 256, 278, 384 },
    106         { 320, 348, 480 },
    107         { 384, 417, 576 },
    108         { 448, 487, 672 },
    109         { 512, 557, 768 },
    110         { 640, 696, 960 },
    111         { 768, 835, 1152 },
    112         { 896, 975, 1344 },
    113         { 1024, 1114, 1536 },
    114         { 1152, 1253, 1728 },
    115         { 1280, 1393, 1920 },
    116     };
    117 
    118     ABitReader bits(ptr, size);
    119     if (bits.numBitsLeft() < 16) {
    120         return 0;
    121     }
    122     if (bits.getBits(16) != 0x0B77) {
    123         return 0;
    124     }
    125 
    126     if (bits.numBitsLeft() < 16 + 2 + 6 + 5 + 3 + 3) {
    127         ALOGV("Not enough bits left for further parsing");
    128         return 0;
    129     }
    130     bits.skipBits(16);  // crc1
    131 
    132     unsigned fscod = bits.getBits(2);
    133     if (fscod == 3) {
    134         ALOGW("Incorrect fscod in AC3 header");
    135         return 0;
    136     }
    137 
    138     unsigned frmsizecod = bits.getBits(6);
    139     if (frmsizecod > 37) {
    140         ALOGW("Incorrect frmsizecod in AC3 header");
    141         return 0;
    142     }
    143 
    144     unsigned bsid = bits.getBits(5);
    145     if (bsid > 8) {
    146         ALOGW("Incorrect bsid in AC3 header. Possibly E-AC-3?");
    147         return 0;
    148     }
    149 
    150     unsigned bsmod __unused = bits.getBits(3);
    151     unsigned acmod = bits.getBits(3);
    152     unsigned cmixlev __unused = 0;
    153     unsigned surmixlev __unused = 0;
    154     unsigned dsurmod __unused = 0;
    155 
    156     if ((acmod & 1) > 0 && acmod != 1) {
    157         if (bits.numBitsLeft() < 2) {
    158             return 0;
    159         }
    160         cmixlev = bits.getBits(2);
    161     }
    162     if ((acmod & 4) > 0) {
    163         if (bits.numBitsLeft() < 2) {
    164             return 0;
    165         }
    166         surmixlev = bits.getBits(2);
    167     }
    168     if (acmod == 2) {
    169         if (bits.numBitsLeft() < 2) {
    170             return 0;
    171         }
    172         dsurmod = bits.getBits(2);
    173     }
    174 
    175     if (bits.numBitsLeft() < 1) {
    176         return 0;
    177     }
    178     unsigned lfeon = bits.getBits(1);
    179 
    180     unsigned samplingRate = samplingRateTable[fscod];
    181     unsigned payloadSize = frameSizeTable[frmsizecod >> 1][fscod];
    182     if (fscod == 1) {
    183         payloadSize += frmsizecod & 1;
    184     }
    185     payloadSize <<= 1;  // convert from 16-bit words to bytes
    186 
    187     unsigned channelCount = channelCountTable[acmod] + lfeon;
    188 
    189     if (metaData != NULL) {
    190         (*metaData)->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AC3);
    191         (*metaData)->setInt32(kKeyChannelCount, channelCount);
    192         (*metaData)->setInt32(kKeySampleRate, samplingRate);
    193     }
    194 
    195     return payloadSize;
    196 }
    197 
    198 static bool IsSeeminglyValidAC3Header(const uint8_t *ptr, size_t size) {
    199     return parseAC3SyncFrame(ptr, size, NULL) > 0;
    200 }
    201 
    202 static bool IsSeeminglyValidADTSHeader(
    203         const uint8_t *ptr, size_t size, size_t *frameLength) {
    204     if (size < 7) {
    205         // Not enough data to verify header.
    206         return false;
    207     }
    208 
    209     if (ptr[0] != 0xff || (ptr[1] >> 4) != 0x0f) {
    210         return false;
    211     }
    212 
    213     unsigned layer = (ptr[1] >> 1) & 3;
    214 
    215     if (layer != 0) {
    216         return false;
    217     }
    218 
    219     unsigned ID = (ptr[1] >> 3) & 1;
    220     unsigned profile_ObjectType = ptr[2] >> 6;
    221 
    222     if (ID == 1 && profile_ObjectType == 3) {
    223         // MPEG-2 profile 3 is reserved.
    224         return false;
    225     }
    226 
    227     size_t frameLengthInHeader =
    228             ((ptr[3] & 3) << 11) + (ptr[4] << 3) + ((ptr[5] >> 5) & 7);
    229     if (frameLengthInHeader > size) {
    230         return false;
    231     }
    232 
    233     *frameLength = frameLengthInHeader;
    234     return true;
    235 }
    236 
    237 static bool IsSeeminglyValidMPEGAudioHeader(const uint8_t *ptr, size_t size) {
    238     if (size < 3) {
    239         // Not enough data to verify header.
    240         return false;
    241     }
    242 
    243     if (ptr[0] != 0xff || (ptr[1] >> 5) != 0x07) {
    244         return false;
    245     }
    246 
    247     unsigned ID = (ptr[1] >> 3) & 3;
    248 
    249     if (ID == 1) {
    250         return false;  // reserved
    251     }
    252 
    253     unsigned layer = (ptr[1] >> 1) & 3;
    254 
    255     if (layer == 0) {
    256         return false;  // reserved
    257     }
    258 
    259     unsigned bitrateIndex = (ptr[2] >> 4);
    260 
    261     if (bitrateIndex == 0x0f) {
    262         return false;  // reserved
    263     }
    264 
    265     unsigned samplingRateIndex = (ptr[2] >> 2) & 3;
    266 
    267     if (samplingRateIndex == 3) {
    268         return false;  // reserved
    269     }
    270 
    271     return true;
    272 }
    273 
    274 status_t ElementaryStreamQueue::appendData(
    275         const void *data, size_t size, int64_t timeUs,
    276         int32_t payloadOffset, uint32_t pesScramblingControl) {
    277 
    278     if (mEOSReached) {
    279         ALOGE("appending data after EOS");
    280         return ERROR_MALFORMED;
    281     }
    282     if (mBuffer == NULL || mBuffer->size() == 0) {
    283         switch (mMode) {
    284             case H264:
    285             case MPEG_VIDEO:
    286             {
    287 #if 0
    288                 if (size < 4 || memcmp("\x00\x00\x00\x01", data, 4)) {
    289                     return ERROR_MALFORMED;
    290                 }
    291 #else
    292                 uint8_t *ptr = (uint8_t *)data;
    293 
    294                 ssize_t startOffset = -1;
    295                 for (size_t i = 0; i + 2 < size; ++i) {
    296                     if (!memcmp("\x00\x00\x01", &ptr[i], 3)) {
    297                         startOffset = i;
    298                         break;
    299                     }
    300                 }
    301 
    302                 if (startOffset < 0) {
    303                     return ERROR_MALFORMED;
    304                 }
    305 
    306                 if (mFormat == NULL && startOffset > 0) {
    307                     ALOGI("found something resembling an H.264/MPEG syncword "
    308                           "at offset %zd",
    309                           startOffset);
    310                 }
    311 
    312                 data = &ptr[startOffset];
    313                 size -= startOffset;
    314 #endif
    315                 break;
    316             }
    317 
    318             case MPEG4_VIDEO:
    319             {
    320 #if 0
    321                 if (size < 3 || memcmp("\x00\x00\x01", data, 3)) {
    322                     return ERROR_MALFORMED;
    323                 }
    324 #else
    325                 uint8_t *ptr = (uint8_t *)data;
    326 
    327                 ssize_t startOffset = -1;
    328                 for (size_t i = 0; i + 2 < size; ++i) {
    329                     if (!memcmp("\x00\x00\x01", &ptr[i], 3)) {
    330                         startOffset = i;
    331                         break;
    332                     }
    333                 }
    334 
    335                 if (startOffset < 0) {
    336                     return ERROR_MALFORMED;
    337                 }
    338 
    339                 if (startOffset > 0) {
    340                     ALOGI("found something resembling an H.264/MPEG syncword "
    341                           "at offset %zd",
    342                           startOffset);
    343                 }
    344 
    345                 data = &ptr[startOffset];
    346                 size -= startOffset;
    347 #endif
    348                 break;
    349             }
    350 
    351             case AAC:
    352             {
    353                 uint8_t *ptr = (uint8_t *)data;
    354 
    355 #if 0
    356                 if (size < 2 || ptr[0] != 0xff || (ptr[1] >> 4) != 0x0f) {
    357                     return ERROR_MALFORMED;
    358                 }
    359 #else
    360                 ssize_t startOffset = -1;
    361                 size_t frameLength;
    362                 for (size_t i = 0; i < size; ++i) {
    363                     if (IsSeeminglyValidADTSHeader(
    364                             &ptr[i], size - i, &frameLength)) {
    365                         startOffset = i;
    366                         break;
    367                     }
    368                 }
    369 
    370                 if (startOffset < 0) {
    371                     return ERROR_MALFORMED;
    372                 }
    373 
    374                 if (startOffset > 0) {
    375                     ALOGI("found something resembling an AAC syncword at "
    376                           "offset %zd",
    377                           startOffset);
    378                 }
    379 
    380                 if (frameLength != size - startOffset) {
    381                     ALOGV("First ADTS AAC frame length is %zd bytes, "
    382                           "while the buffer size is %zd bytes.",
    383                           frameLength, size - startOffset);
    384                 }
    385 
    386                 data = &ptr[startOffset];
    387                 size -= startOffset;
    388 #endif
    389                 break;
    390             }
    391 
    392             case AC3:
    393             {
    394                 uint8_t *ptr = (uint8_t *)data;
    395 
    396                 ssize_t startOffset = -1;
    397                 for (size_t i = 0; i < size; ++i) {
    398                     if (IsSeeminglyValidAC3Header(&ptr[i], size - i)) {
    399                         startOffset = i;
    400                         break;
    401                     }
    402                 }
    403 
    404                 if (startOffset < 0) {
    405                     return ERROR_MALFORMED;
    406                 }
    407 
    408                 if (startOffset > 0) {
    409                     ALOGI("found something resembling an AC3 syncword at "
    410                           "offset %zd",
    411                           startOffset);
    412                 }
    413 
    414                 data = &ptr[startOffset];
    415                 size -= startOffset;
    416                 break;
    417             }
    418 
    419             case MPEG_AUDIO:
    420             {
    421                 uint8_t *ptr = (uint8_t *)data;
    422 
    423                 ssize_t startOffset = -1;
    424                 for (size_t i = 0; i < size; ++i) {
    425                     if (IsSeeminglyValidMPEGAudioHeader(&ptr[i], size - i)) {
    426                         startOffset = i;
    427                         break;
    428                     }
    429                 }
    430 
    431                 if (startOffset < 0) {
    432                     return ERROR_MALFORMED;
    433                 }
    434 
    435                 if (startOffset > 0) {
    436                     ALOGI("found something resembling an MPEG audio "
    437                           "syncword at offset %zd",
    438                           startOffset);
    439                 }
    440 
    441                 data = &ptr[startOffset];
    442                 size -= startOffset;
    443                 break;
    444             }
    445 
    446             case PCM_AUDIO:
    447             case METADATA:
    448             {
    449                 break;
    450             }
    451 
    452             default:
    453                 ALOGE("Unknown mode: %d", mMode);
    454                 return ERROR_MALFORMED;
    455         }
    456     }
    457 
    458     size_t neededSize = (mBuffer == NULL ? 0 : mBuffer->size()) + size;
    459     if (mBuffer == NULL || neededSize > mBuffer->capacity()) {
    460         neededSize = (neededSize + 65535) & ~65535;
    461 
    462         ALOGV("resizing buffer to size %zu", neededSize);
    463 
    464         sp<ABuffer> buffer = new ABuffer(neededSize);
    465         if (mBuffer != NULL) {
    466             memcpy(buffer->data(), mBuffer->data(), mBuffer->size());
    467             buffer->setRange(0, mBuffer->size());
    468         } else {
    469             buffer->setRange(0, 0);
    470         }
    471 
    472         mBuffer = buffer;
    473     }
    474 
    475     memcpy(mBuffer->data() + mBuffer->size(), data, size);
    476     mBuffer->setRange(0, mBuffer->size() + size);
    477 
    478     RangeInfo info;
    479     info.mLength = size;
    480     info.mTimestampUs = timeUs;
    481     info.mPesOffset = payloadOffset;
    482     info.mPesScramblingControl = pesScramblingControl;
    483     mRangeInfos.push_back(info);
    484 
    485 #if 0
    486     if (mMode == AAC) {
    487         ALOGI("size = %zu, timeUs = %.2f secs", size, timeUs / 1E6);
    488         hexdump(data, size);
    489     }
    490 #endif
    491 
    492     return OK;
    493 }
    494 
    495 void ElementaryStreamQueue::appendScrambledData(
    496         const void *data, size_t size,
    497         int32_t keyId, bool isSync,
    498         sp<ABuffer> clearSizes, sp<ABuffer> encSizes) {
    499     if (!isScrambled()) {
    500         return;
    501     }
    502 
    503     size_t neededSize = (mScrambledBuffer == NULL ? 0 : mScrambledBuffer->size()) + size;
    504     if (mScrambledBuffer == NULL || neededSize > mScrambledBuffer->capacity()) {
    505         neededSize = (neededSize + 65535) & ~65535;
    506 
    507         ALOGI("resizing scrambled buffer to size %zu", neededSize);
    508 
    509         sp<ABuffer> buffer = new ABuffer(neededSize);
    510         if (mScrambledBuffer != NULL) {
    511             memcpy(buffer->data(), mScrambledBuffer->data(), mScrambledBuffer->size());
    512             buffer->setRange(0, mScrambledBuffer->size());
    513         } else {
    514             buffer->setRange(0, 0);
    515         }
    516 
    517         mScrambledBuffer = buffer;
    518     }
    519     memcpy(mScrambledBuffer->data() + mScrambledBuffer->size(), data, size);
    520     mScrambledBuffer->setRange(0, mScrambledBuffer->size() + size);
    521 
    522     ScrambledRangeInfo scrambledInfo;
    523     scrambledInfo.mLength = size;
    524     scrambledInfo.mKeyId = keyId;
    525     scrambledInfo.mIsSync = isSync;
    526     scrambledInfo.mClearSizes = clearSizes;
    527     scrambledInfo.mEncSizes = encSizes;
    528 
    529     ALOGV("[stream %d] appending scrambled range: size=%zu", mMode, size);
    530 
    531     mScrambledRangeInfos.push_back(scrambledInfo);
    532 }
    533 
    534 sp<ABuffer> ElementaryStreamQueue::dequeueScrambledAccessUnit() {
    535     size_t nextScan = mBuffer->size();
    536     mBuffer->setRange(0, 0);
    537     int32_t pesOffset = 0, pesScramblingControl = 0;
    538     int64_t timeUs = fetchTimestamp(nextScan, &pesOffset, &pesScramblingControl);
    539     if (timeUs < 0ll) {
    540         ALOGE("Negative timeUs");
    541         return NULL;
    542     }
    543 
    544     // return scrambled unit
    545     int32_t keyId = pesScramblingControl, isSync = 0, scrambledLength = 0;
    546     sp<ABuffer> clearSizes, encSizes;
    547     while (mScrambledRangeInfos.size() > mRangeInfos.size()) {
    548         auto it = mScrambledRangeInfos.begin();
    549         ALOGV("[stream %d] fetching scrambled range: size=%zu", mMode, it->mLength);
    550 
    551         if (scrambledLength > 0) {
    552             // This shouldn't happen since we always dequeue the entire PES.
    553             ALOGW("Discarding srambled length %d", scrambledLength);
    554         }
    555         scrambledLength = it->mLength;
    556 
    557         // TODO: handle key id change, use first non-zero keyId for now
    558         if (keyId == 0) {
    559             keyId = it->mKeyId;
    560         }
    561         clearSizes = it->mClearSizes;
    562         encSizes = it->mEncSizes;
    563         isSync = it->mIsSync;
    564         mScrambledRangeInfos.erase(it);
    565     }
    566     if (scrambledLength == 0) {
    567         ALOGE("[stream %d] empty scrambled unit!", mMode);
    568         return NULL;
    569     }
    570 
    571     // skip the PES header, and copy the rest into scrambled access unit
    572     sp<ABuffer> scrambledAccessUnit = ABuffer::CreateAsCopy(
    573             mScrambledBuffer->data() + pesOffset,
    574             scrambledLength - pesOffset);
    575 
    576     // fix up first sample size after skipping the PES header
    577     if (pesOffset > 0) {
    578         int32_t &firstClearSize = *(int32_t*)clearSizes->data();
    579         int32_t &firstEncSize = *(int32_t*)encSizes->data();
    580         // Cut away the PES header
    581         if (firstClearSize >= pesOffset) {
    582             // This is for TS-level scrambling, we descrambled the first
    583             // (or it was clear to begin with)
    584             firstClearSize -= pesOffset;
    585         } else if (firstEncSize >= pesOffset) {
    586             // This can only be PES-level scrambling
    587             firstEncSize -= pesOffset;
    588         }
    589     }
    590 
    591     scrambledAccessUnit->meta()->setInt64("timeUs", timeUs);
    592     if (isSync) {
    593         scrambledAccessUnit->meta()->setInt32("isSync", 1);
    594     }
    595 
    596     // fill in CryptoInfo fields for AnotherPacketSource::read()
    597     // MediaCas doesn't use cryptoMode, but set to non-zero value here.
    598     scrambledAccessUnit->meta()->setInt32(
    599             "cryptoMode", CryptoPlugin::kMode_AES_CTR);
    600     scrambledAccessUnit->meta()->setInt32("cryptoKey", keyId);
    601     scrambledAccessUnit->meta()->setBuffer("clearBytes", clearSizes);
    602     scrambledAccessUnit->meta()->setBuffer("encBytes", encSizes);
    603 
    604     memmove(mScrambledBuffer->data(),
    605             mScrambledBuffer->data() + scrambledLength,
    606             mScrambledBuffer->size() - scrambledLength);
    607 
    608     mScrambledBuffer->setRange(0, mScrambledBuffer->size() - scrambledLength);
    609 
    610     ALOGV("[stream %d] dequeued scrambled AU: timeUs=%lld, size=%zu",
    611             mMode, (long long)timeUs, scrambledAccessUnit->size());
    612 
    613     return scrambledAccessUnit;
    614 }
    615 
    616 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnit() {
    617     if ((mFlags & kFlag_AlignedData) && mMode == H264 && !isScrambled()) {
    618         if (mRangeInfos.empty()) {
    619             return NULL;
    620         }
    621 
    622         RangeInfo info = *mRangeInfos.begin();
    623         mRangeInfos.erase(mRangeInfos.begin());
    624 
    625         sp<ABuffer> accessUnit = new ABuffer(info.mLength);
    626         memcpy(accessUnit->data(), mBuffer->data(), info.mLength);
    627         accessUnit->meta()->setInt64("timeUs", info.mTimestampUs);
    628 
    629         memmove(mBuffer->data(),
    630                 mBuffer->data() + info.mLength,
    631                 mBuffer->size() - info.mLength);
    632 
    633         mBuffer->setRange(0, mBuffer->size() - info.mLength);
    634 
    635         if (mFormat == NULL) {
    636             mFormat = MakeAVCCodecSpecificData(accessUnit);
    637         }
    638 
    639         return accessUnit;
    640     }
    641 
    642     switch (mMode) {
    643         case H264:
    644             return dequeueAccessUnitH264();
    645         case AAC:
    646             return dequeueAccessUnitAAC();
    647         case AC3:
    648             return dequeueAccessUnitAC3();
    649         case MPEG_VIDEO:
    650             return dequeueAccessUnitMPEGVideo();
    651         case MPEG4_VIDEO:
    652             return dequeueAccessUnitMPEG4Video();
    653         case PCM_AUDIO:
    654             return dequeueAccessUnitPCMAudio();
    655         case METADATA:
    656             return dequeueAccessUnitMetadata();
    657         default:
    658             if (mMode != MPEG_AUDIO) {
    659                 ALOGE("Unknown mode");
    660                 return NULL;
    661             }
    662             return dequeueAccessUnitMPEGAudio();
    663     }
    664 }
    665 
    666 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAC3() {
    667     unsigned syncStartPos = 0;  // in bytes
    668     unsigned payloadSize = 0;
    669     sp<MetaData> format = new MetaData;
    670 
    671     ALOGV("dequeueAccessUnit_AC3[%d]: mBuffer %p(%zu)", mAUIndex, mBuffer->data(), mBuffer->size());
    672 
    673     while (true) {
    674         if (syncStartPos + 2 >= mBuffer->size()) {
    675             return NULL;
    676         }
    677 
    678         payloadSize = parseAC3SyncFrame(
    679                 mBuffer->data() + syncStartPos,
    680                 mBuffer->size() - syncStartPos,
    681                 &format);
    682         if (payloadSize > 0) {
    683             break;
    684         }
    685 
    686         ALOGV("dequeueAccessUnit_AC3[%d]: syncStartPos %u payloadSize %u",
    687                 mAUIndex, syncStartPos, payloadSize);
    688 
    689         ++syncStartPos;
    690     }
    691 
    692     if (mBuffer->size() < syncStartPos + payloadSize) {
    693         ALOGV("Not enough buffer size for AC3");
    694         return NULL;
    695     }
    696 
    697     if (mFormat == NULL) {
    698         mFormat = format;
    699     }
    700 
    701 
    702     int64_t timeUs = fetchTimestamp(syncStartPos + payloadSize);
    703     if (timeUs < 0ll) {
    704         ALOGE("negative timeUs");
    705         return NULL;
    706     }
    707 
    708     // Not decrypting if key info not available (e.g., scanner/extractor parsing ts files)
    709     if (mSampleDecryptor != NULL) {
    710         mSampleDecryptor->processAC3(mBuffer->data() + syncStartPos, payloadSize);
    711     }
    712     mAUIndex++;
    713 
    714     sp<ABuffer> accessUnit = new ABuffer(syncStartPos + payloadSize);
    715     memcpy(accessUnit->data(), mBuffer->data(), syncStartPos + payloadSize);
    716 
    717     accessUnit->meta()->setInt64("timeUs", timeUs);
    718     accessUnit->meta()->setInt32("isSync", 1);
    719 
    720     memmove(
    721             mBuffer->data(),
    722             mBuffer->data() + syncStartPos + payloadSize,
    723             mBuffer->size() - syncStartPos - payloadSize);
    724 
    725     mBuffer->setRange(0, mBuffer->size() - syncStartPos - payloadSize);
    726 
    727     return accessUnit;
    728 }
    729 
    730 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitPCMAudio() {
    731     if (mBuffer->size() < 4) {
    732         return NULL;
    733     }
    734 
    735     ABitReader bits(mBuffer->data(), 4);
    736     if (bits.getBits(8) != 0xa0) {
    737         ALOGE("Unexpected bit values");
    738         return NULL;
    739     }
    740     unsigned numAUs = bits.getBits(8);
    741     bits.skipBits(8);
    742     unsigned quantization_word_length __unused = bits.getBits(2);
    743     unsigned audio_sampling_frequency = bits.getBits(3);
    744     unsigned num_channels = bits.getBits(3);
    745 
    746     if (audio_sampling_frequency != 2) {
    747         ALOGE("Wrong sampling freq");
    748         return NULL;
    749     }
    750     if (num_channels != 1u) {
    751         ALOGE("Wrong channel #");
    752         return NULL;
    753     }
    754 
    755     if (mFormat == NULL) {
    756         mFormat = new MetaData;
    757         mFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);
    758         mFormat->setInt32(kKeyChannelCount, 2);
    759         mFormat->setInt32(kKeySampleRate, 48000);
    760         mFormat->setInt32(kKeyPcmEncoding, kAudioEncodingPcm16bit);
    761     }
    762 
    763     static const size_t kFramesPerAU = 80;
    764     size_t frameSize = 2 /* numChannels */ * sizeof(int16_t);
    765 
    766     size_t payloadSize = numAUs * frameSize * kFramesPerAU;
    767 
    768     if (mBuffer->size() < 4 + payloadSize) {
    769         return NULL;
    770     }
    771 
    772     sp<ABuffer> accessUnit = new ABuffer(payloadSize);
    773     memcpy(accessUnit->data(), mBuffer->data() + 4, payloadSize);
    774 
    775     int64_t timeUs = fetchTimestamp(payloadSize + 4);
    776     if (timeUs < 0ll) {
    777         ALOGE("Negative timeUs");
    778         return NULL;
    779     }
    780     accessUnit->meta()->setInt64("timeUs", timeUs);
    781     accessUnit->meta()->setInt32("isSync", 1);
    782 
    783     int16_t *ptr = (int16_t *)accessUnit->data();
    784     for (size_t i = 0; i < payloadSize / sizeof(int16_t); ++i) {
    785         ptr[i] = ntohs(ptr[i]);
    786     }
    787 
    788     memmove(
    789             mBuffer->data(),
    790             mBuffer->data() + 4 + payloadSize,
    791             mBuffer->size() - 4 - payloadSize);
    792 
    793     mBuffer->setRange(0, mBuffer->size() - 4 - payloadSize);
    794 
    795     return accessUnit;
    796 }
    797 
    798 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAAC() {
    799     if (mBuffer->size() == 0) {
    800         return NULL;
    801     }
    802 
    803     if (mRangeInfos.empty()) {
    804         return NULL;
    805     }
    806 
    807     const RangeInfo &info = *mRangeInfos.begin();
    808     if (mBuffer->size() < info.mLength) {
    809         return NULL;
    810     }
    811 
    812     if (info.mTimestampUs < 0ll) {
    813         ALOGE("Negative info.mTimestampUs");
    814         return NULL;
    815     }
    816 
    817     ALOGV("dequeueAccessUnit_AAC[%d]: mBuffer %zu info.mLength %zu",
    818             mAUIndex, mBuffer->size(), info.mLength);
    819 
    820     struct ADTSPosition {
    821         size_t offset;
    822         size_t headerSize;
    823         size_t length;
    824     };
    825 
    826     Vector<ADTSPosition> frames;
    827 
    828     // The idea here is consume all AAC frames starting at offsets before
    829     // info.mLength so we can assign a meaningful timestamp without
    830     // having to interpolate.
    831     // The final AAC frame may well extend into the next RangeInfo but
    832     // that's ok.
    833     size_t offset = 0;
    834     while (offset < info.mLength) {
    835         if (offset + 7 > mBuffer->size()) {
    836             return NULL;
    837         }
    838 
    839         ABitReader bits(mBuffer->data() + offset, mBuffer->size() - offset);
    840 
    841         // adts_fixed_header
    842 
    843         if (bits.getBits(12) != 0xfffu) {
    844             ALOGE("Wrong atds_fixed_header");
    845             return NULL;
    846         }
    847         bits.skipBits(3);  // ID, layer
    848         bool protection_absent = bits.getBits(1) != 0;
    849 
    850         if (mFormat == NULL) {
    851             unsigned profile = bits.getBits(2);
    852             if (profile == 3u) {
    853                 ALOGE("profile should not be 3");
    854                 return NULL;
    855             }
    856             unsigned sampling_freq_index = bits.getBits(4);
    857             bits.getBits(1);  // private_bit
    858             unsigned channel_configuration = bits.getBits(3);
    859             if (channel_configuration == 0u) {
    860                 ALOGE("channel_config should not be 0");
    861                 return NULL;
    862             }
    863             bits.skipBits(2);  // original_copy, home
    864 
    865             mFormat = MakeAACCodecSpecificData(
    866                     profile, sampling_freq_index, channel_configuration);
    867 
    868             mFormat->setInt32(kKeyIsADTS, true);
    869 
    870             int32_t sampleRate;
    871             int32_t numChannels;
    872             if (!mFormat->findInt32(kKeySampleRate, &sampleRate)) {
    873                 ALOGE("SampleRate not found");
    874                 return NULL;
    875             }
    876             if (!mFormat->findInt32(kKeyChannelCount, &numChannels)) {
    877                 ALOGE("ChannelCount not found");
    878                 return NULL;
    879             }
    880 
    881             ALOGI("found AAC codec config (%d Hz, %d channels)",
    882                  sampleRate, numChannels);
    883         } else {
    884             // profile_ObjectType, sampling_frequency_index, private_bits,
    885             // channel_configuration, original_copy, home
    886             bits.skipBits(12);
    887         }
    888 
    889         // adts_variable_header
    890 
    891         // copyright_identification_bit, copyright_identification_start
    892         bits.skipBits(2);
    893 
    894         unsigned aac_frame_length = bits.getBits(13);
    895         if (aac_frame_length == 0){
    896             ALOGE("b/62673179, Invalid AAC frame length!");
    897             android_errorWriteLog(0x534e4554, "62673179");
    898             return NULL;
    899         }
    900 
    901         bits.skipBits(11);  // adts_buffer_fullness
    902 
    903         unsigned number_of_raw_data_blocks_in_frame = bits.getBits(2);
    904 
    905         if (number_of_raw_data_blocks_in_frame != 0) {
    906             // To be implemented.
    907             ALOGE("Should not reach here.");
    908             return NULL;
    909         }
    910 
    911         if (offset + aac_frame_length > mBuffer->size()) {
    912             return NULL;
    913         }
    914 
    915         size_t headerSize = protection_absent ? 7 : 9;
    916 
    917         // tracking the frame positions first then decrypt only if an accessUnit to be generated
    918         if (mSampleDecryptor != NULL) {
    919             ADTSPosition frame = {
    920                 .offset     = offset,
    921                 .headerSize = headerSize,
    922                 .length     = aac_frame_length
    923             };
    924 
    925             frames.push(frame);
    926         }
    927 
    928         offset += aac_frame_length;
    929     }
    930 
    931     // Decrypting only if the loop didn't exit early and an accessUnit is about to be generated
    932     // Not decrypting if key info not available (e.g., scanner/extractor parsing ts files)
    933     if (mSampleDecryptor != NULL) {
    934         for (size_t frameId = 0; frameId < frames.size(); frameId++) {
    935             const ADTSPosition &frame = frames.itemAt(frameId);
    936 
    937             mSampleDecryptor->processAAC(frame.headerSize,
    938                     mBuffer->data() + frame.offset, frame.length);
    939 //            ALOGV("dequeueAccessUnitAAC[%zu]: while offset %zu headerSize %zu frame_len %zu",
    940 //                    frameId, frame.offset, frame.headerSize, frame.length);
    941         }
    942     }
    943     mAUIndex++;
    944 
    945     int64_t timeUs = fetchTimestamp(offset);
    946 
    947     sp<ABuffer> accessUnit = new ABuffer(offset);
    948     memcpy(accessUnit->data(), mBuffer->data(), offset);
    949 
    950     memmove(mBuffer->data(), mBuffer->data() + offset,
    951             mBuffer->size() - offset);
    952     mBuffer->setRange(0, mBuffer->size() - offset);
    953 
    954     accessUnit->meta()->setInt64("timeUs", timeUs);
    955     accessUnit->meta()->setInt32("isSync", 1);
    956 
    957     return accessUnit;
    958 }
    959 
    960 int64_t ElementaryStreamQueue::fetchTimestamp(
    961         size_t size, int32_t *pesOffset, int32_t *pesScramblingControl) {
    962     int64_t timeUs = -1;
    963     bool first = true;
    964 
    965     while (size > 0) {
    966         if (mRangeInfos.empty()) {
    967             return timeUs;
    968         }
    969 
    970         RangeInfo *info = &*mRangeInfos.begin();
    971 
    972         if (first) {
    973             timeUs = info->mTimestampUs;
    974             if (pesOffset != NULL) {
    975                 *pesOffset = info->mPesOffset;
    976             }
    977             if (pesScramblingControl != NULL) {
    978                 *pesScramblingControl = info->mPesScramblingControl;
    979             }
    980             first = false;
    981         }
    982 
    983         if (info->mLength > size) {
    984             info->mLength -= size;
    985             size = 0;
    986         } else {
    987             size -= info->mLength;
    988 
    989             mRangeInfos.erase(mRangeInfos.begin());
    990             info = NULL;
    991         }
    992 
    993     }
    994 
    995     if (timeUs == 0ll) {
    996         ALOGV("Returning 0 timestamp");
    997     }
    998 
    999     return timeUs;
   1000 }
   1001 
   1002 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitH264() {
   1003     if (isScrambled()) {
   1004         if (mBuffer == NULL || mBuffer->size() == 0) {
   1005             return NULL;
   1006         }
   1007         if (mFormat == NULL) {
   1008             mFormat = MakeAVCCodecSpecificData(mBuffer);
   1009             if (mFormat == NULL) {
   1010                 ALOGI("Creating dummy AVC format for scrambled content");
   1011                 mFormat = new MetaData;
   1012                 mFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
   1013                 mFormat->setInt32(kKeyWidth, 1280);
   1014                 mFormat->setInt32(kKeyHeight, 720);
   1015             }
   1016             // for MediaExtractor.CasInfo
   1017             mFormat->setInt32(kKeyCASystemID, mCASystemId);
   1018             mFormat->setData(kKeyCASessionID, 0,
   1019                     mCasSessionId.data(), mCasSessionId.size());
   1020         }
   1021         return dequeueScrambledAccessUnit();
   1022     }
   1023 
   1024     const uint8_t *data = mBuffer->data();
   1025 
   1026     size_t size = mBuffer->size();
   1027     Vector<NALPosition> nals;
   1028 
   1029     size_t totalSize = 0;
   1030     size_t seiCount = 0;
   1031 
   1032     status_t err;
   1033     const uint8_t *nalStart;
   1034     size_t nalSize;
   1035     bool foundSlice = false;
   1036     bool foundIDR = false;
   1037 
   1038     ALOGV("dequeueAccessUnit_H264[%d] %p/%zu", mAUIndex, data, size);
   1039 
   1040     while ((err = getNextNALUnit(&data, &size, &nalStart, &nalSize)) == OK) {
   1041         if (nalSize == 0) continue;
   1042 
   1043         unsigned nalType = nalStart[0] & 0x1f;
   1044         bool flush = false;
   1045 
   1046         if (nalType == 1 || nalType == 5) {
   1047             if (nalType == 5) {
   1048                 foundIDR = true;
   1049             }
   1050             if (foundSlice) {
   1051                 //TODO: Shouldn't this have been called with nalSize-1?
   1052                 ABitReader br(nalStart + 1, nalSize);
   1053                 unsigned first_mb_in_slice = parseUE(&br);
   1054 
   1055                 if (first_mb_in_slice == 0) {
   1056                     // This slice starts a new frame.
   1057 
   1058                     flush = true;
   1059                 }
   1060             }
   1061 
   1062             foundSlice = true;
   1063         } else if ((nalType == 9 || nalType == 7) && foundSlice) {
   1064             // Access unit delimiter and SPS will be associated with the
   1065             // next frame.
   1066 
   1067             flush = true;
   1068         } else if (nalType == 6 && nalSize > 0) {
   1069             // found non-zero sized SEI
   1070             ++seiCount;
   1071         }
   1072 
   1073         if (flush) {
   1074             // The access unit will contain all nal units up to, but excluding
   1075             // the current one, separated by 0x00 0x00 0x00 0x01 startcodes.
   1076 
   1077             size_t auSize = 4 * nals.size() + totalSize;
   1078             sp<ABuffer> accessUnit = new ABuffer(auSize);
   1079             sp<ABuffer> sei;
   1080 
   1081             if (seiCount > 0) {
   1082                 sei = new ABuffer(seiCount * sizeof(NALPosition));
   1083                 accessUnit->meta()->setBuffer("sei", sei);
   1084             }
   1085 
   1086 #if !LOG_NDEBUG
   1087             AString out;
   1088 #endif
   1089 
   1090             size_t dstOffset = 0;
   1091             size_t seiIndex = 0;
   1092             size_t shrunkBytes = 0;
   1093             for (size_t i = 0; i < nals.size(); ++i) {
   1094                 const NALPosition &pos = nals.itemAt(i);
   1095 
   1096                 unsigned nalType = mBuffer->data()[pos.nalOffset] & 0x1f;
   1097 
   1098                 if (nalType == 6 && pos.nalSize > 0) {
   1099                     if (seiIndex >= sei->size() / sizeof(NALPosition)) {
   1100                         ALOGE("Wrong seiIndex");
   1101                         return NULL;
   1102                     }
   1103                     NALPosition &seiPos = ((NALPosition *)sei->data())[seiIndex++];
   1104                     seiPos.nalOffset = dstOffset + 4;
   1105                     seiPos.nalSize = pos.nalSize;
   1106                 }
   1107 
   1108 #if !LOG_NDEBUG
   1109                 char tmp[128];
   1110                 sprintf(tmp, "0x%02x", nalType);
   1111                 if (i > 0) {
   1112                     out.append(", ");
   1113                 }
   1114                 out.append(tmp);
   1115 #endif
   1116 
   1117                 memcpy(accessUnit->data() + dstOffset, "\x00\x00\x00\x01", 4);
   1118 
   1119                 if (mSampleDecryptor != NULL && (nalType == 1 || nalType == 5)) {
   1120                     uint8_t *nalData = mBuffer->data() + pos.nalOffset;
   1121                     size_t newSize = mSampleDecryptor->processNal(nalData, pos.nalSize);
   1122                     // Note: the data can shrink due to unescaping
   1123                     memcpy(accessUnit->data() + dstOffset + 4,
   1124                             nalData,
   1125                             newSize);
   1126                     dstOffset += newSize + 4;
   1127 
   1128                     size_t thisShrunkBytes = pos.nalSize - newSize;
   1129                     //ALOGV("dequeueAccessUnitH264[%d]: nalType: %d -> %zu (%zu)",
   1130                     //        nalType, (int)pos.nalSize, newSize, thisShrunkBytes);
   1131 
   1132                     shrunkBytes += thisShrunkBytes;
   1133                 }
   1134                 else {
   1135                     memcpy(accessUnit->data() + dstOffset + 4,
   1136                             mBuffer->data() + pos.nalOffset,
   1137                             pos.nalSize);
   1138 
   1139                     dstOffset += pos.nalSize + 4;
   1140                     //ALOGV("dequeueAccessUnitH264 [%d] %d @%d",
   1141                     //        nalType, (int)pos.nalSize, (int)pos.nalOffset);
   1142                 }
   1143             }
   1144 
   1145 #if !LOG_NDEBUG
   1146             ALOGV("accessUnit contains nal types %s", out.c_str());
   1147 #endif
   1148 
   1149             const NALPosition &pos = nals.itemAt(nals.size() - 1);
   1150             size_t nextScan = pos.nalOffset + pos.nalSize;
   1151 
   1152             memmove(mBuffer->data(),
   1153                     mBuffer->data() + nextScan,
   1154                     mBuffer->size() - nextScan);
   1155 
   1156             mBuffer->setRange(0, mBuffer->size() - nextScan);
   1157 
   1158             int64_t timeUs = fetchTimestamp(nextScan);
   1159             if (timeUs < 0ll) {
   1160                 ALOGE("Negative timeUs");
   1161                 return NULL;
   1162             }
   1163 
   1164             accessUnit->meta()->setInt64("timeUs", timeUs);
   1165             if (foundIDR) {
   1166                 accessUnit->meta()->setInt32("isSync", 1);
   1167             }
   1168 
   1169             if (mFormat == NULL) {
   1170                 mFormat = MakeAVCCodecSpecificData(accessUnit);
   1171             }
   1172 
   1173             if (mSampleDecryptor != NULL && shrunkBytes > 0) {
   1174                 size_t adjustedSize = accessUnit->size() - shrunkBytes;
   1175                 ALOGV("dequeueAccessUnitH264[%d]: AU size adjusted %zu -> %zu",
   1176                         mAUIndex, accessUnit->size(), adjustedSize);
   1177                 accessUnit->setRange(0, adjustedSize);
   1178             }
   1179 
   1180             ALOGV("dequeueAccessUnitH264[%d]: AU %p(%zu) dstOffset:%zu, nals:%zu, totalSize:%zu ",
   1181                     mAUIndex, accessUnit->data(), accessUnit->size(),
   1182                     dstOffset, nals.size(), totalSize);
   1183             mAUIndex++;
   1184 
   1185             return accessUnit;
   1186         }
   1187 
   1188         NALPosition pos;
   1189         pos.nalOffset = nalStart - mBuffer->data();
   1190         pos.nalSize = nalSize;
   1191 
   1192         nals.push(pos);
   1193 
   1194         totalSize += nalSize;
   1195     }
   1196     if (err != (status_t)-EAGAIN) {
   1197         ALOGE("Unexpeted err");
   1198         return NULL;
   1199     }
   1200 
   1201     return NULL;
   1202 }
   1203 
   1204 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitMPEGAudio() {
   1205     const uint8_t *data = mBuffer->data();
   1206     size_t size = mBuffer->size();
   1207 
   1208     if (size < 4) {
   1209         return NULL;
   1210     }
   1211 
   1212     uint32_t header = U32_AT(data);
   1213 
   1214     size_t frameSize;
   1215     int samplingRate, numChannels, bitrate, numSamples;
   1216     if (!GetMPEGAudioFrameSize(
   1217                 header, &frameSize, &samplingRate, &numChannels,
   1218                 &bitrate, &numSamples)) {
   1219         ALOGE("Failed to get audio frame size");
   1220         return NULL;
   1221     }
   1222 
   1223     if (size < frameSize) {
   1224         return NULL;
   1225     }
   1226 
   1227     unsigned layer = 4 - ((header >> 17) & 3);
   1228 
   1229     sp<ABuffer> accessUnit = new ABuffer(frameSize);
   1230     memcpy(accessUnit->data(), data, frameSize);
   1231 
   1232     memmove(mBuffer->data(),
   1233             mBuffer->data() + frameSize,
   1234             mBuffer->size() - frameSize);
   1235 
   1236     mBuffer->setRange(0, mBuffer->size() - frameSize);
   1237 
   1238     int64_t timeUs = fetchTimestamp(frameSize);
   1239     if (timeUs < 0ll) {
   1240         ALOGE("Negative timeUs");
   1241         return NULL;
   1242     }
   1243 
   1244     accessUnit->meta()->setInt64("timeUs", timeUs);
   1245     accessUnit->meta()->setInt32("isSync", 1);
   1246 
   1247     if (mFormat == NULL) {
   1248         mFormat = new MetaData;
   1249 
   1250         switch (layer) {
   1251             case 1:
   1252                 mFormat->setCString(
   1253                         kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_I);
   1254                 break;
   1255             case 2:
   1256                 mFormat->setCString(
   1257                         kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II);
   1258                 break;
   1259             case 3:
   1260                 mFormat->setCString(
   1261                         kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG);
   1262                 break;
   1263             default:
   1264                 return NULL;
   1265         }
   1266 
   1267         mFormat->setInt32(kKeySampleRate, samplingRate);
   1268         mFormat->setInt32(kKeyChannelCount, numChannels);
   1269     }
   1270 
   1271     return accessUnit;
   1272 }
   1273 
   1274 static void EncodeSize14(uint8_t **_ptr, size_t size) {
   1275     if (size > 0x3fff) {
   1276         ALOGE("Wrong size");
   1277         return;
   1278     }
   1279 
   1280     uint8_t *ptr = *_ptr;
   1281 
   1282     *ptr++ = 0x80 | (size >> 7);
   1283     *ptr++ = size & 0x7f;
   1284 
   1285     *_ptr = ptr;
   1286 }
   1287 
   1288 static sp<ABuffer> MakeMPEGVideoESDS(const sp<ABuffer> &csd) {
   1289     sp<ABuffer> esds = new ABuffer(csd->size() + 25);
   1290 
   1291     uint8_t *ptr = esds->data();
   1292     *ptr++ = 0x03;
   1293     EncodeSize14(&ptr, 22 + csd->size());
   1294 
   1295     *ptr++ = 0x00;  // ES_ID
   1296     *ptr++ = 0x00;
   1297 
   1298     *ptr++ = 0x00;  // streamDependenceFlag, URL_Flag, OCRstreamFlag
   1299 
   1300     *ptr++ = 0x04;
   1301     EncodeSize14(&ptr, 16 + csd->size());
   1302 
   1303     *ptr++ = 0x40;  // Audio ISO/IEC 14496-3
   1304 
   1305     for (size_t i = 0; i < 12; ++i) {
   1306         *ptr++ = 0x00;
   1307     }
   1308 
   1309     *ptr++ = 0x05;
   1310     EncodeSize14(&ptr, csd->size());
   1311 
   1312     memcpy(ptr, csd->data(), csd->size());
   1313 
   1314     return esds;
   1315 }
   1316 
   1317 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitMPEGVideo() {
   1318     if (isScrambled()) {
   1319         if (mBuffer == NULL || mBuffer->size() == 0) {
   1320             return NULL;
   1321         }
   1322         if (mFormat == NULL) {
   1323             ALOGI("Creating dummy MPEG format for scrambled content");
   1324             mFormat = new MetaData;
   1325             mFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG2);
   1326             mFormat->setInt32(kKeyWidth, 1280);
   1327             mFormat->setInt32(kKeyHeight, 720);
   1328 
   1329             // for MediaExtractor.CasInfo
   1330             mFormat->setInt32(kKeyCASystemID, mCASystemId);
   1331             mFormat->setData(kKeyCASessionID, 0,
   1332                     mCasSessionId.data(), mCasSessionId.size());
   1333         }
   1334         return dequeueScrambledAccessUnit();
   1335     }
   1336 
   1337     const uint8_t *data = mBuffer->data();
   1338     size_t size = mBuffer->size();
   1339 
   1340     Vector<size_t> userDataPositions;
   1341 
   1342     bool sawPictureStart = false;
   1343     int pprevStartCode = -1;
   1344     int prevStartCode = -1;
   1345     int currentStartCode = -1;
   1346     bool gopFound = false;
   1347     bool isClosedGop = false;
   1348     bool brokenLink = false;
   1349 
   1350     size_t offset = 0;
   1351     while (offset + 3 < size) {
   1352         if (memcmp(&data[offset], "\x00\x00\x01", 3)) {
   1353             ++offset;
   1354             continue;
   1355         }
   1356 
   1357         pprevStartCode = prevStartCode;
   1358         prevStartCode = currentStartCode;
   1359         currentStartCode = data[offset + 3];
   1360 
   1361         if (currentStartCode == 0xb3 && mFormat == NULL) {
   1362             memmove(mBuffer->data(), mBuffer->data() + offset, size - offset);
   1363             size -= offset;
   1364             (void)fetchTimestamp(offset);
   1365             offset = 0;
   1366             mBuffer->setRange(0, size);
   1367         }
   1368 
   1369         if ((prevStartCode == 0xb3 && currentStartCode != 0xb5)
   1370                 || (pprevStartCode == 0xb3 && prevStartCode == 0xb5)) {
   1371             // seqHeader without/with extension
   1372 
   1373             if (mFormat == NULL) {
   1374                 if (size < 7u) {
   1375                     ALOGE("Size too small");
   1376                     return NULL;
   1377                 }
   1378 
   1379                 unsigned width =
   1380                     (data[4] << 4) | data[5] >> 4;
   1381 
   1382                 unsigned height =
   1383                     ((data[5] & 0x0f) << 8) | data[6];
   1384 
   1385                 mFormat = new MetaData;
   1386                 mFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG2);
   1387                 mFormat->setInt32(kKeyWidth, width);
   1388                 mFormat->setInt32(kKeyHeight, height);
   1389 
   1390                 ALOGI("found MPEG2 video codec config (%d x %d)", width, height);
   1391 
   1392                 sp<ABuffer> csd = new ABuffer(offset);
   1393                 memcpy(csd->data(), data, offset);
   1394 
   1395                 memmove(mBuffer->data(),
   1396                         mBuffer->data() + offset,
   1397                         mBuffer->size() - offset);
   1398 
   1399                 mBuffer->setRange(0, mBuffer->size() - offset);
   1400                 size -= offset;
   1401                 (void)fetchTimestamp(offset);
   1402                 offset = 0;
   1403 
   1404                 // hexdump(csd->data(), csd->size());
   1405 
   1406                 sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
   1407                 mFormat->setData(
   1408                         kKeyESDS, kTypeESDS, esds->data(), esds->size());
   1409 
   1410                 return NULL;
   1411             }
   1412         }
   1413 
   1414         if (mFormat != NULL && currentStartCode == 0xb8) {
   1415             // GOP layer
   1416             if (offset + 7 >= size) {
   1417                 ALOGE("Size too small");
   1418                 return NULL;
   1419             }
   1420             gopFound = true;
   1421             isClosedGop = (data[offset + 7] & 0x40) != 0;
   1422             brokenLink = (data[offset + 7] & 0x20) != 0;
   1423         }
   1424 
   1425         if (mFormat != NULL && currentStartCode == 0xb2) {
   1426             userDataPositions.add(offset);
   1427         }
   1428 
   1429         if (mFormat != NULL && currentStartCode == 0x00) {
   1430             // Picture start
   1431 
   1432             if (!sawPictureStart) {
   1433                 sawPictureStart = true;
   1434             } else {
   1435                 sp<ABuffer> accessUnit = new ABuffer(offset);
   1436                 memcpy(accessUnit->data(), data, offset);
   1437 
   1438                 memmove(mBuffer->data(),
   1439                         mBuffer->data() + offset,
   1440                         mBuffer->size() - offset);
   1441 
   1442                 mBuffer->setRange(0, mBuffer->size() - offset);
   1443 
   1444                 int64_t timeUs = fetchTimestamp(offset);
   1445                 if (timeUs < 0ll) {
   1446                     ALOGE("Negative timeUs");
   1447                     return NULL;
   1448                 }
   1449 
   1450                 offset = 0;
   1451 
   1452                 accessUnit->meta()->setInt64("timeUs", timeUs);
   1453                 if (gopFound && (!brokenLink || isClosedGop)) {
   1454                     accessUnit->meta()->setInt32("isSync", 1);
   1455                 }
   1456 
   1457                 ALOGV("returning MPEG video access unit at time %" PRId64 " us",
   1458                       timeUs);
   1459 
   1460                 // hexdump(accessUnit->data(), accessUnit->size());
   1461 
   1462                 if (userDataPositions.size() > 0) {
   1463                     sp<ABuffer> mpegUserData =
   1464                         new ABuffer(userDataPositions.size() * sizeof(size_t));
   1465                     if (mpegUserData != NULL && mpegUserData->data() != NULL) {
   1466                         for (size_t i = 0; i < userDataPositions.size(); ++i) {
   1467                             memcpy(
   1468                                     mpegUserData->data() + i * sizeof(size_t),
   1469                                     &userDataPositions[i], sizeof(size_t));
   1470                         }
   1471                         accessUnit->meta()->setBuffer("mpegUserData", mpegUserData);
   1472                     }
   1473                 }
   1474 
   1475                 return accessUnit;
   1476             }
   1477         }
   1478 
   1479         ++offset;
   1480     }
   1481 
   1482     return NULL;
   1483 }
   1484 
   1485 static ssize_t getNextChunkSize(
   1486         const uint8_t *data, size_t size) {
   1487     static const char kStartCode[] = "\x00\x00\x01";
   1488 
   1489     if (size < 3) {
   1490         return -EAGAIN;
   1491     }
   1492 
   1493     if (memcmp(kStartCode, data, 3)) {
   1494         return -EAGAIN;
   1495     }
   1496 
   1497     size_t offset = 3;
   1498     while (offset + 2 < size) {
   1499         if (!memcmp(&data[offset], kStartCode, 3)) {
   1500             return offset;
   1501         }
   1502 
   1503         ++offset;
   1504     }
   1505 
   1506     return -EAGAIN;
   1507 }
   1508 
   1509 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitMPEG4Video() {
   1510     uint8_t *data = mBuffer->data();
   1511     size_t size = mBuffer->size();
   1512 
   1513     enum {
   1514         SKIP_TO_VISUAL_OBJECT_SEQ_START,
   1515         EXPECT_VISUAL_OBJECT_START,
   1516         EXPECT_VO_START,
   1517         EXPECT_VOL_START,
   1518         WAIT_FOR_VOP_START,
   1519         SKIP_TO_VOP_START,
   1520 
   1521     } state;
   1522 
   1523     if (mFormat == NULL) {
   1524         state = SKIP_TO_VISUAL_OBJECT_SEQ_START;
   1525     } else {
   1526         state = SKIP_TO_VOP_START;
   1527     }
   1528 
   1529     int32_t width = -1, height = -1;
   1530 
   1531     size_t offset = 0;
   1532     ssize_t chunkSize;
   1533     while ((chunkSize = getNextChunkSize(
   1534                     &data[offset], size - offset)) > 0) {
   1535         bool discard = false;
   1536 
   1537         unsigned chunkType = data[offset + 3];
   1538 
   1539         switch (state) {
   1540             case SKIP_TO_VISUAL_OBJECT_SEQ_START:
   1541             {
   1542                 if (chunkType == 0xb0) {
   1543                     // Discard anything before this marker.
   1544 
   1545                     state = EXPECT_VISUAL_OBJECT_START;
   1546                 } else {
   1547                     discard = true;
   1548                 }
   1549                 break;
   1550             }
   1551 
   1552             case EXPECT_VISUAL_OBJECT_START:
   1553             {
   1554                 if (chunkType != 0xb5) {
   1555                     ALOGE("Unexpected chunkType");
   1556                     return NULL;
   1557                 }
   1558                 state = EXPECT_VO_START;
   1559                 break;
   1560             }
   1561 
   1562             case EXPECT_VO_START:
   1563             {
   1564                 if (chunkType > 0x1f) {
   1565                     ALOGE("Unexpected chunkType");
   1566                     return NULL;
   1567                 }
   1568                 state = EXPECT_VOL_START;
   1569                 break;
   1570             }
   1571 
   1572             case EXPECT_VOL_START:
   1573             {
   1574                 if ((chunkType & 0xf0) != 0x20) {
   1575                     ALOGE("Wrong chunkType");
   1576                     return NULL;
   1577                 }
   1578 
   1579                 if (!ExtractDimensionsFromVOLHeader(
   1580                             &data[offset], chunkSize,
   1581                             &width, &height)) {
   1582                     ALOGE("Failed to get dimension");
   1583                     return NULL;
   1584                 }
   1585 
   1586                 state = WAIT_FOR_VOP_START;
   1587                 break;
   1588             }
   1589 
   1590             case WAIT_FOR_VOP_START:
   1591             {
   1592                 if (chunkType == 0xb3 || chunkType == 0xb6) {
   1593                     // group of VOP or VOP start.
   1594 
   1595                     mFormat = new MetaData;
   1596                     mFormat->setCString(
   1597                             kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4);
   1598 
   1599                     mFormat->setInt32(kKeyWidth, width);
   1600                     mFormat->setInt32(kKeyHeight, height);
   1601 
   1602                     ALOGI("found MPEG4 video codec config (%d x %d)",
   1603                          width, height);
   1604 
   1605                     sp<ABuffer> csd = new ABuffer(offset);
   1606                     memcpy(csd->data(), data, offset);
   1607 
   1608                     // hexdump(csd->data(), csd->size());
   1609 
   1610                     sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
   1611                     mFormat->setData(
   1612                             kKeyESDS, kTypeESDS,
   1613                             esds->data(), esds->size());
   1614 
   1615                     discard = true;
   1616                     state = SKIP_TO_VOP_START;
   1617                 }
   1618 
   1619                 break;
   1620             }
   1621 
   1622             case SKIP_TO_VOP_START:
   1623             {
   1624                 if (chunkType == 0xb6) {
   1625                     int vopCodingType = (data[offset + 4] & 0xc0) >> 6;
   1626 
   1627                     offset += chunkSize;
   1628 
   1629                     sp<ABuffer> accessUnit = new ABuffer(offset);
   1630                     memcpy(accessUnit->data(), data, offset);
   1631 
   1632                     memmove(data, &data[offset], size - offset);
   1633                     size -= offset;
   1634                     mBuffer->setRange(0, size);
   1635 
   1636                     int64_t timeUs = fetchTimestamp(offset);
   1637                     if (timeUs < 0ll) {
   1638                         ALOGE("Negative timeus");
   1639                         return NULL;
   1640                     }
   1641 
   1642                     offset = 0;
   1643 
   1644                     accessUnit->meta()->setInt64("timeUs", timeUs);
   1645                     if (vopCodingType == 0) {  // intra-coded VOP
   1646                         accessUnit->meta()->setInt32("isSync", 1);
   1647                     }
   1648 
   1649                     ALOGV("returning MPEG4 video access unit at time %" PRId64 " us",
   1650                          timeUs);
   1651 
   1652                     // hexdump(accessUnit->data(), accessUnit->size());
   1653 
   1654                     return accessUnit;
   1655                 } else if (chunkType != 0xb3) {
   1656                     offset += chunkSize;
   1657                     discard = true;
   1658                 }
   1659 
   1660                 break;
   1661             }
   1662 
   1663             default:
   1664                 ALOGE("Unknown state: %d", state);
   1665                 return NULL;
   1666         }
   1667 
   1668         if (discard) {
   1669             (void)fetchTimestamp(offset);
   1670             memmove(data, &data[offset], size - offset);
   1671             size -= offset;
   1672             offset = 0;
   1673             mBuffer->setRange(0, size);
   1674         } else {
   1675             offset += chunkSize;
   1676         }
   1677     }
   1678 
   1679     return NULL;
   1680 }
   1681 
   1682 void ElementaryStreamQueue::signalEOS() {
   1683     if (!mEOSReached) {
   1684         if (mMode == MPEG_VIDEO) {
   1685             const char *theEnd = "\x00\x00\x01\x00";
   1686             appendData(theEnd, 4, 0);
   1687         }
   1688         mEOSReached = true;
   1689     } else {
   1690         ALOGW("EOS already signaled");
   1691     }
   1692 }
   1693 
   1694 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitMetadata() {
   1695     size_t size = mBuffer->size();
   1696     if (!size) {
   1697         return NULL;
   1698     }
   1699 
   1700     sp<ABuffer> accessUnit = new ABuffer(size);
   1701     int64_t timeUs = fetchTimestamp(size);
   1702     accessUnit->meta()->setInt64("timeUs", timeUs);
   1703 
   1704     memcpy(accessUnit->data(), mBuffer->data(), size);
   1705     mBuffer->setRange(0, 0);
   1706 
   1707     if (mFormat == NULL) {
   1708         mFormat = new MetaData;
   1709         mFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_DATA_TIMED_ID3);
   1710     }
   1711 
   1712     return accessUnit;
   1713 }
   1714 
   1715 void ElementaryStreamQueue::signalNewSampleAesKey(const sp<AMessage> &keyItem) {
   1716     if (mSampleDecryptor == NULL) {
   1717         ALOGE("signalNewSampleAesKey: Stream %x is not encrypted; keyItem: %p",
   1718                 mMode, keyItem.get());
   1719         return;
   1720     }
   1721 
   1722     mSampleDecryptor->signalNewSampleAesKey(keyItem);
   1723 }
   1724 
   1725 
   1726 }  // namespace android
   1727