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 
     32 #include "include/avc_utils.h"
     33 
     34 #include <inttypes.h>
     35 #include <netinet/in.h>
     36 
     37 namespace android {
     38 
     39 ElementaryStreamQueue::ElementaryStreamQueue(Mode mode, uint32_t flags)
     40     : mMode(mode),
     41       mFlags(flags),
     42       mEOSReached(false) {
     43 }
     44 
     45 sp<MetaData> ElementaryStreamQueue::getFormat() {
     46     return mFormat;
     47 }
     48 
     49 void ElementaryStreamQueue::clear(bool clearFormat) {
     50     if (mBuffer != NULL) {
     51         mBuffer->setRange(0, 0);
     52     }
     53 
     54     mRangeInfos.clear();
     55 
     56     if (clearFormat) {
     57         mFormat.clear();
     58     }
     59 
     60     mEOSReached = false;
     61 }
     62 
     63 // Parse AC3 header assuming the current ptr is start position of syncframe,
     64 // update metadata only applicable, and return the payload size
     65 static unsigned parseAC3SyncFrame(
     66         const uint8_t *ptr, size_t size, sp<MetaData> *metaData) {
     67     static const unsigned channelCountTable[] = {2, 1, 2, 3, 3, 4, 4, 5};
     68     static const unsigned samplingRateTable[] = {48000, 44100, 32000};
     69 
     70     static const unsigned frameSizeTable[19][3] = {
     71         { 64, 69, 96 },
     72         { 80, 87, 120 },
     73         { 96, 104, 144 },
     74         { 112, 121, 168 },
     75         { 128, 139, 192 },
     76         { 160, 174, 240 },
     77         { 192, 208, 288 },
     78         { 224, 243, 336 },
     79         { 256, 278, 384 },
     80         { 320, 348, 480 },
     81         { 384, 417, 576 },
     82         { 448, 487, 672 },
     83         { 512, 557, 768 },
     84         { 640, 696, 960 },
     85         { 768, 835, 1152 },
     86         { 896, 975, 1344 },
     87         { 1024, 1114, 1536 },
     88         { 1152, 1253, 1728 },
     89         { 1280, 1393, 1920 },
     90     };
     91 
     92     ABitReader bits(ptr, size);
     93     if (bits.numBitsLeft() < 16) {
     94         return 0;
     95     }
     96     if (bits.getBits(16) != 0x0B77) {
     97         return 0;
     98     }
     99 
    100     if (bits.numBitsLeft() < 16 + 2 + 6 + 5 + 3 + 3) {
    101         ALOGV("Not enough bits left for further parsing");
    102         return 0;
    103     }
    104     bits.skipBits(16);  // crc1
    105 
    106     unsigned fscod = bits.getBits(2);
    107     if (fscod == 3) {
    108         ALOGW("Incorrect fscod in AC3 header");
    109         return 0;
    110     }
    111 
    112     unsigned frmsizecod = bits.getBits(6);
    113     if (frmsizecod > 37) {
    114         ALOGW("Incorrect frmsizecod in AC3 header");
    115         return 0;
    116     }
    117 
    118     unsigned bsid = bits.getBits(5);
    119     if (bsid > 8) {
    120         ALOGW("Incorrect bsid in AC3 header. Possibly E-AC-3?");
    121         return 0;
    122     }
    123 
    124     unsigned bsmod __unused = bits.getBits(3);
    125     unsigned acmod = bits.getBits(3);
    126     unsigned cmixlev __unused = 0;
    127     unsigned surmixlev __unused = 0;
    128     unsigned dsurmod __unused = 0;
    129 
    130     if ((acmod & 1) > 0 && acmod != 1) {
    131         if (bits.numBitsLeft() < 2) {
    132             return 0;
    133         }
    134         cmixlev = bits.getBits(2);
    135     }
    136     if ((acmod & 4) > 0) {
    137         if (bits.numBitsLeft() < 2) {
    138             return 0;
    139         }
    140         surmixlev = bits.getBits(2);
    141     }
    142     if (acmod == 2) {
    143         if (bits.numBitsLeft() < 2) {
    144             return 0;
    145         }
    146         dsurmod = bits.getBits(2);
    147     }
    148 
    149     if (bits.numBitsLeft() < 1) {
    150         return 0;
    151     }
    152     unsigned lfeon = bits.getBits(1);
    153 
    154     unsigned samplingRate = samplingRateTable[fscod];
    155     unsigned payloadSize = frameSizeTable[frmsizecod >> 1][fscod];
    156     if (fscod == 1) {
    157         payloadSize += frmsizecod & 1;
    158     }
    159     payloadSize <<= 1;  // convert from 16-bit words to bytes
    160 
    161     unsigned channelCount = channelCountTable[acmod] + lfeon;
    162 
    163     if (metaData != NULL) {
    164         (*metaData)->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AC3);
    165         (*metaData)->setInt32(kKeyChannelCount, channelCount);
    166         (*metaData)->setInt32(kKeySampleRate, samplingRate);
    167     }
    168 
    169     return payloadSize;
    170 }
    171 
    172 static bool IsSeeminglyValidAC3Header(const uint8_t *ptr, size_t size) {
    173     return parseAC3SyncFrame(ptr, size, NULL) > 0;
    174 }
    175 
    176 static bool IsSeeminglyValidADTSHeader(
    177         const uint8_t *ptr, size_t size, size_t *frameLength) {
    178     if (size < 7) {
    179         // Not enough data to verify header.
    180         return false;
    181     }
    182 
    183     if (ptr[0] != 0xff || (ptr[1] >> 4) != 0x0f) {
    184         return false;
    185     }
    186 
    187     unsigned layer = (ptr[1] >> 1) & 3;
    188 
    189     if (layer != 0) {
    190         return false;
    191     }
    192 
    193     unsigned ID = (ptr[1] >> 3) & 1;
    194     unsigned profile_ObjectType = ptr[2] >> 6;
    195 
    196     if (ID == 1 && profile_ObjectType == 3) {
    197         // MPEG-2 profile 3 is reserved.
    198         return false;
    199     }
    200 
    201     size_t frameLengthInHeader =
    202             ((ptr[3] & 3) << 11) + (ptr[4] << 3) + ((ptr[5] >> 5) & 7);
    203     if (frameLengthInHeader > size) {
    204         return false;
    205     }
    206 
    207     *frameLength = frameLengthInHeader;
    208     return true;
    209 }
    210 
    211 static bool IsSeeminglyValidMPEGAudioHeader(const uint8_t *ptr, size_t size) {
    212     if (size < 3) {
    213         // Not enough data to verify header.
    214         return false;
    215     }
    216 
    217     if (ptr[0] != 0xff || (ptr[1] >> 5) != 0x07) {
    218         return false;
    219     }
    220 
    221     unsigned ID = (ptr[1] >> 3) & 3;
    222 
    223     if (ID == 1) {
    224         return false;  // reserved
    225     }
    226 
    227     unsigned layer = (ptr[1] >> 1) & 3;
    228 
    229     if (layer == 0) {
    230         return false;  // reserved
    231     }
    232 
    233     unsigned bitrateIndex = (ptr[2] >> 4);
    234 
    235     if (bitrateIndex == 0x0f) {
    236         return false;  // reserved
    237     }
    238 
    239     unsigned samplingRateIndex = (ptr[2] >> 2) & 3;
    240 
    241     if (samplingRateIndex == 3) {
    242         return false;  // reserved
    243     }
    244 
    245     return true;
    246 }
    247 
    248 status_t ElementaryStreamQueue::appendData(
    249         const void *data, size_t size, int64_t timeUs) {
    250 
    251     if (mEOSReached) {
    252         ALOGE("appending data after EOS");
    253         return ERROR_MALFORMED;
    254     }
    255     if (mBuffer == NULL || mBuffer->size() == 0) {
    256         switch (mMode) {
    257             case H264:
    258             case MPEG_VIDEO:
    259             {
    260 #if 0
    261                 if (size < 4 || memcmp("\x00\x00\x00\x01", data, 4)) {
    262                     return ERROR_MALFORMED;
    263                 }
    264 #else
    265                 uint8_t *ptr = (uint8_t *)data;
    266 
    267                 ssize_t startOffset = -1;
    268                 for (size_t i = 0; i + 2 < size; ++i) {
    269                     if (!memcmp("\x00\x00\x01", &ptr[i], 3)) {
    270                         startOffset = i;
    271                         break;
    272                     }
    273                 }
    274 
    275                 if (startOffset < 0) {
    276                     return ERROR_MALFORMED;
    277                 }
    278 
    279                 if (startOffset > 0) {
    280                     ALOGI("found something resembling an H.264/MPEG syncword "
    281                           "at offset %zd",
    282                           startOffset);
    283                 }
    284 
    285                 data = &ptr[startOffset];
    286                 size -= startOffset;
    287 #endif
    288                 break;
    289             }
    290 
    291             case MPEG4_VIDEO:
    292             {
    293 #if 0
    294                 if (size < 3 || memcmp("\x00\x00\x01", data, 3)) {
    295                     return ERROR_MALFORMED;
    296                 }
    297 #else
    298                 uint8_t *ptr = (uint8_t *)data;
    299 
    300                 ssize_t startOffset = -1;
    301                 for (size_t i = 0; i + 2 < size; ++i) {
    302                     if (!memcmp("\x00\x00\x01", &ptr[i], 3)) {
    303                         startOffset = i;
    304                         break;
    305                     }
    306                 }
    307 
    308                 if (startOffset < 0) {
    309                     return ERROR_MALFORMED;
    310                 }
    311 
    312                 if (startOffset > 0) {
    313                     ALOGI("found something resembling an H.264/MPEG syncword "
    314                           "at offset %zd",
    315                           startOffset);
    316                 }
    317 
    318                 data = &ptr[startOffset];
    319                 size -= startOffset;
    320 #endif
    321                 break;
    322             }
    323 
    324             case AAC:
    325             {
    326                 uint8_t *ptr = (uint8_t *)data;
    327 
    328 #if 0
    329                 if (size < 2 || ptr[0] != 0xff || (ptr[1] >> 4) != 0x0f) {
    330                     return ERROR_MALFORMED;
    331                 }
    332 #else
    333                 ssize_t startOffset = -1;
    334                 size_t frameLength;
    335                 for (size_t i = 0; i < size; ++i) {
    336                     if (IsSeeminglyValidADTSHeader(
    337                             &ptr[i], size - i, &frameLength)) {
    338                         startOffset = i;
    339                         break;
    340                     }
    341                 }
    342 
    343                 if (startOffset < 0) {
    344                     return ERROR_MALFORMED;
    345                 }
    346 
    347                 if (startOffset > 0) {
    348                     ALOGI("found something resembling an AAC syncword at "
    349                           "offset %zd",
    350                           startOffset);
    351                 }
    352 
    353                 if (frameLength != size - startOffset) {
    354                     ALOGV("First ADTS AAC frame length is %zd bytes, "
    355                           "while the buffer size is %zd bytes.",
    356                           frameLength, size - startOffset);
    357                 }
    358 
    359                 data = &ptr[startOffset];
    360                 size -= startOffset;
    361 #endif
    362                 break;
    363             }
    364 
    365             case AC3:
    366             {
    367                 uint8_t *ptr = (uint8_t *)data;
    368 
    369                 ssize_t startOffset = -1;
    370                 for (size_t i = 0; i < size; ++i) {
    371                     if (IsSeeminglyValidAC3Header(&ptr[i], size - i)) {
    372                         startOffset = i;
    373                         break;
    374                     }
    375                 }
    376 
    377                 if (startOffset < 0) {
    378                     return ERROR_MALFORMED;
    379                 }
    380 
    381                 if (startOffset > 0) {
    382                     ALOGI("found something resembling an AC3 syncword at "
    383                           "offset %zd",
    384                           startOffset);
    385                 }
    386 
    387                 data = &ptr[startOffset];
    388                 size -= startOffset;
    389                 break;
    390             }
    391 
    392             case MPEG_AUDIO:
    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 (IsSeeminglyValidMPEGAudioHeader(&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 MPEG audio "
    410                           "syncword at offset %zd",
    411                           startOffset);
    412                 }
    413 
    414                 data = &ptr[startOffset];
    415                 size -= startOffset;
    416                 break;
    417             }
    418 
    419             case PCM_AUDIO:
    420             case METADATA:
    421             {
    422                 break;
    423             }
    424 
    425             default:
    426                 ALOGE("Unknown mode: %d", mMode);
    427                 return ERROR_MALFORMED;
    428         }
    429     }
    430 
    431     size_t neededSize = (mBuffer == NULL ? 0 : mBuffer->size()) + size;
    432     if (mBuffer == NULL || neededSize > mBuffer->capacity()) {
    433         neededSize = (neededSize + 65535) & ~65535;
    434 
    435         ALOGV("resizing buffer to size %zu", neededSize);
    436 
    437         sp<ABuffer> buffer = new ABuffer(neededSize);
    438         if (mBuffer != NULL) {
    439             memcpy(buffer->data(), mBuffer->data(), mBuffer->size());
    440             buffer->setRange(0, mBuffer->size());
    441         } else {
    442             buffer->setRange(0, 0);
    443         }
    444 
    445         mBuffer = buffer;
    446     }
    447 
    448     memcpy(mBuffer->data() + mBuffer->size(), data, size);
    449     mBuffer->setRange(0, mBuffer->size() + size);
    450 
    451     RangeInfo info;
    452     info.mLength = size;
    453     info.mTimestampUs = timeUs;
    454     mRangeInfos.push_back(info);
    455 
    456 #if 0
    457     if (mMode == AAC) {
    458         ALOGI("size = %zu, timeUs = %.2f secs", size, timeUs / 1E6);
    459         hexdump(data, size);
    460     }
    461 #endif
    462 
    463     return OK;
    464 }
    465 
    466 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnit() {
    467     if ((mFlags & kFlag_AlignedData) && mMode == H264) {
    468         if (mRangeInfos.empty()) {
    469             return NULL;
    470         }
    471 
    472         RangeInfo info = *mRangeInfos.begin();
    473         mRangeInfos.erase(mRangeInfos.begin());
    474 
    475         sp<ABuffer> accessUnit = new ABuffer(info.mLength);
    476         memcpy(accessUnit->data(), mBuffer->data(), info.mLength);
    477         accessUnit->meta()->setInt64("timeUs", info.mTimestampUs);
    478 
    479         memmove(mBuffer->data(),
    480                 mBuffer->data() + info.mLength,
    481                 mBuffer->size() - info.mLength);
    482 
    483         mBuffer->setRange(0, mBuffer->size() - info.mLength);
    484 
    485         if (mFormat == NULL) {
    486             mFormat = MakeAVCCodecSpecificData(accessUnit);
    487         }
    488 
    489         return accessUnit;
    490     }
    491 
    492     switch (mMode) {
    493         case H264:
    494             return dequeueAccessUnitH264();
    495         case AAC:
    496             return dequeueAccessUnitAAC();
    497         case AC3:
    498             return dequeueAccessUnitAC3();
    499         case MPEG_VIDEO:
    500             return dequeueAccessUnitMPEGVideo();
    501         case MPEG4_VIDEO:
    502             return dequeueAccessUnitMPEG4Video();
    503         case PCM_AUDIO:
    504             return dequeueAccessUnitPCMAudio();
    505         case METADATA:
    506             return dequeueAccessUnitMetadata();
    507         default:
    508             if (mMode != MPEG_AUDIO) {
    509                 ALOGE("Unknown mode");
    510                 return NULL;
    511             }
    512             return dequeueAccessUnitMPEGAudio();
    513     }
    514 }
    515 
    516 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAC3() {
    517     unsigned syncStartPos = 0;  // in bytes
    518     unsigned payloadSize = 0;
    519     sp<MetaData> format = new MetaData;
    520     while (true) {
    521         if (syncStartPos + 2 >= mBuffer->size()) {
    522             return NULL;
    523         }
    524 
    525         payloadSize = parseAC3SyncFrame(
    526                 mBuffer->data() + syncStartPos,
    527                 mBuffer->size() - syncStartPos,
    528                 &format);
    529         if (payloadSize > 0) {
    530             break;
    531         }
    532         ++syncStartPos;
    533     }
    534 
    535     if (mBuffer->size() < syncStartPos + payloadSize) {
    536         ALOGV("Not enough buffer size for AC3");
    537         return NULL;
    538     }
    539 
    540     if (mFormat == NULL) {
    541         mFormat = format;
    542     }
    543 
    544     sp<ABuffer> accessUnit = new ABuffer(syncStartPos + payloadSize);
    545     memcpy(accessUnit->data(), mBuffer->data(), syncStartPos + payloadSize);
    546 
    547     int64_t timeUs = fetchTimestamp(syncStartPos + payloadSize);
    548     if (timeUs < 0ll) {
    549         ALOGE("negative timeUs");
    550         return NULL;
    551     }
    552     accessUnit->meta()->setInt64("timeUs", timeUs);
    553     accessUnit->meta()->setInt32("isSync", 1);
    554 
    555     memmove(
    556             mBuffer->data(),
    557             mBuffer->data() + syncStartPos + payloadSize,
    558             mBuffer->size() - syncStartPos - payloadSize);
    559 
    560     mBuffer->setRange(0, mBuffer->size() - syncStartPos - payloadSize);
    561 
    562     return accessUnit;
    563 }
    564 
    565 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitPCMAudio() {
    566     if (mBuffer->size() < 4) {
    567         return NULL;
    568     }
    569 
    570     ABitReader bits(mBuffer->data(), 4);
    571     if (bits.getBits(8) != 0xa0) {
    572         ALOGE("Unexpected bit values");
    573         return NULL;
    574     }
    575     unsigned numAUs = bits.getBits(8);
    576     bits.skipBits(8);
    577     unsigned quantization_word_length __unused = bits.getBits(2);
    578     unsigned audio_sampling_frequency = bits.getBits(3);
    579     unsigned num_channels = bits.getBits(3);
    580 
    581     if (audio_sampling_frequency != 2) {
    582         ALOGE("Wrong sampling freq");
    583         return NULL;
    584     }
    585     if (num_channels != 1u) {
    586         ALOGE("Wrong channel #");
    587         return NULL;
    588     }
    589 
    590     if (mFormat == NULL) {
    591         mFormat = new MetaData;
    592         mFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);
    593         mFormat->setInt32(kKeyChannelCount, 2);
    594         mFormat->setInt32(kKeySampleRate, 48000);
    595         mFormat->setInt32(kKeyPcmEncoding, kAudioEncodingPcm16bit);
    596     }
    597 
    598     static const size_t kFramesPerAU = 80;
    599     size_t frameSize = 2 /* numChannels */ * sizeof(int16_t);
    600 
    601     size_t payloadSize = numAUs * frameSize * kFramesPerAU;
    602 
    603     if (mBuffer->size() < 4 + payloadSize) {
    604         return NULL;
    605     }
    606 
    607     sp<ABuffer> accessUnit = new ABuffer(payloadSize);
    608     memcpy(accessUnit->data(), mBuffer->data() + 4, payloadSize);
    609 
    610     int64_t timeUs = fetchTimestamp(payloadSize + 4);
    611     if (timeUs < 0ll) {
    612         ALOGE("Negative timeUs");
    613         return NULL;
    614     }
    615     accessUnit->meta()->setInt64("timeUs", timeUs);
    616     accessUnit->meta()->setInt32("isSync", 1);
    617 
    618     int16_t *ptr = (int16_t *)accessUnit->data();
    619     for (size_t i = 0; i < payloadSize / sizeof(int16_t); ++i) {
    620         ptr[i] = ntohs(ptr[i]);
    621     }
    622 
    623     memmove(
    624             mBuffer->data(),
    625             mBuffer->data() + 4 + payloadSize,
    626             mBuffer->size() - 4 - payloadSize);
    627 
    628     mBuffer->setRange(0, mBuffer->size() - 4 - payloadSize);
    629 
    630     return accessUnit;
    631 }
    632 
    633 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAAC() {
    634     if (mBuffer->size() == 0) {
    635         return NULL;
    636     }
    637 
    638     if (mRangeInfos.empty()) {
    639         return NULL;
    640     }
    641 
    642     const RangeInfo &info = *mRangeInfos.begin();
    643     if (mBuffer->size() < info.mLength) {
    644         return NULL;
    645     }
    646 
    647     if (info.mTimestampUs < 0ll) {
    648         ALOGE("Negative info.mTimestampUs");
    649         return NULL;
    650     }
    651 
    652     // The idea here is consume all AAC frames starting at offsets before
    653     // info.mLength so we can assign a meaningful timestamp without
    654     // having to interpolate.
    655     // The final AAC frame may well extend into the next RangeInfo but
    656     // that's ok.
    657     size_t offset = 0;
    658     while (offset < info.mLength) {
    659         if (offset + 7 > mBuffer->size()) {
    660             return NULL;
    661         }
    662 
    663         ABitReader bits(mBuffer->data() + offset, mBuffer->size() - offset);
    664 
    665         // adts_fixed_header
    666 
    667         if (bits.getBits(12) != 0xfffu) {
    668             ALOGE("Wrong atds_fixed_header");
    669             return NULL;
    670         }
    671         bits.skipBits(3);  // ID, layer
    672         bool protection_absent __unused = bits.getBits(1) != 0;
    673 
    674         if (mFormat == NULL) {
    675             unsigned profile = bits.getBits(2);
    676             if (profile == 3u) {
    677                 ALOGE("profile should not be 3");
    678                 return NULL;
    679             }
    680             unsigned sampling_freq_index = bits.getBits(4);
    681             bits.getBits(1);  // private_bit
    682             unsigned channel_configuration = bits.getBits(3);
    683             if (channel_configuration == 0u) {
    684                 ALOGE("channel_config should not be 0");
    685                 return NULL;
    686             }
    687             bits.skipBits(2);  // original_copy, home
    688 
    689             mFormat = MakeAACCodecSpecificData(
    690                     profile, sampling_freq_index, channel_configuration);
    691 
    692             mFormat->setInt32(kKeyIsADTS, true);
    693 
    694             int32_t sampleRate;
    695             int32_t numChannels;
    696             if (!mFormat->findInt32(kKeySampleRate, &sampleRate)) {
    697                 ALOGE("SampleRate not found");
    698                 return NULL;
    699             }
    700             if (!mFormat->findInt32(kKeyChannelCount, &numChannels)) {
    701                 ALOGE("ChannelCount not found");
    702                 return NULL;
    703             }
    704 
    705             ALOGI("found AAC codec config (%d Hz, %d channels)",
    706                  sampleRate, numChannels);
    707         } else {
    708             // profile_ObjectType, sampling_frequency_index, private_bits,
    709             // channel_configuration, original_copy, home
    710             bits.skipBits(12);
    711         }
    712 
    713         // adts_variable_header
    714 
    715         // copyright_identification_bit, copyright_identification_start
    716         bits.skipBits(2);
    717 
    718         unsigned aac_frame_length = bits.getBits(13);
    719 
    720         bits.skipBits(11);  // adts_buffer_fullness
    721 
    722         unsigned number_of_raw_data_blocks_in_frame = bits.getBits(2);
    723 
    724         if (number_of_raw_data_blocks_in_frame != 0) {
    725             // To be implemented.
    726             ALOGE("Should not reach here.");
    727             return NULL;
    728         }
    729 
    730         if (offset + aac_frame_length > mBuffer->size()) {
    731             return NULL;
    732         }
    733 
    734         size_t headerSize __unused = protection_absent ? 7 : 9;
    735 
    736         offset += aac_frame_length;
    737     }
    738 
    739     int64_t timeUs = fetchTimestamp(offset);
    740 
    741     sp<ABuffer> accessUnit = new ABuffer(offset);
    742     memcpy(accessUnit->data(), mBuffer->data(), offset);
    743 
    744     memmove(mBuffer->data(), mBuffer->data() + offset,
    745             mBuffer->size() - offset);
    746     mBuffer->setRange(0, mBuffer->size() - offset);
    747 
    748     accessUnit->meta()->setInt64("timeUs", timeUs);
    749     accessUnit->meta()->setInt32("isSync", 1);
    750 
    751     return accessUnit;
    752 }
    753 
    754 int64_t ElementaryStreamQueue::fetchTimestamp(size_t size) {
    755     int64_t timeUs = -1;
    756     bool first = true;
    757 
    758     while (size > 0) {
    759         if (mRangeInfos.empty()) {
    760             return timeUs;
    761         }
    762 
    763         RangeInfo *info = &*mRangeInfos.begin();
    764 
    765         if (first) {
    766             timeUs = info->mTimestampUs;
    767             first = false;
    768         }
    769 
    770         if (info->mLength > size) {
    771             info->mLength -= size;
    772             size = 0;
    773         } else {
    774             size -= info->mLength;
    775 
    776             mRangeInfos.erase(mRangeInfos.begin());
    777             info = NULL;
    778         }
    779 
    780     }
    781 
    782     if (timeUs == 0ll) {
    783         ALOGV("Returning 0 timestamp");
    784     }
    785 
    786     return timeUs;
    787 }
    788 
    789 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitH264() {
    790     const uint8_t *data = mBuffer->data();
    791 
    792     size_t size = mBuffer->size();
    793     Vector<NALPosition> nals;
    794 
    795     size_t totalSize = 0;
    796     size_t seiCount = 0;
    797 
    798     status_t err;
    799     const uint8_t *nalStart;
    800     size_t nalSize;
    801     bool foundSlice = false;
    802     bool foundIDR = false;
    803     while ((err = getNextNALUnit(&data, &size, &nalStart, &nalSize)) == OK) {
    804         if (nalSize == 0) continue;
    805 
    806         unsigned nalType = nalStart[0] & 0x1f;
    807         bool flush = false;
    808 
    809         if (nalType == 1 || nalType == 5) {
    810             if (nalType == 5) {
    811                 foundIDR = true;
    812             }
    813             if (foundSlice) {
    814                 ABitReader br(nalStart + 1, nalSize);
    815                 unsigned first_mb_in_slice = parseUE(&br);
    816 
    817                 if (first_mb_in_slice == 0) {
    818                     // This slice starts a new frame.
    819 
    820                     flush = true;
    821                 }
    822             }
    823 
    824             foundSlice = true;
    825         } else if ((nalType == 9 || nalType == 7) && foundSlice) {
    826             // Access unit delimiter and SPS will be associated with the
    827             // next frame.
    828 
    829             flush = true;
    830         } else if (nalType == 6 && nalSize > 0) {
    831             // found non-zero sized SEI
    832             ++seiCount;
    833         }
    834 
    835         if (flush) {
    836             // The access unit will contain all nal units up to, but excluding
    837             // the current one, separated by 0x00 0x00 0x00 0x01 startcodes.
    838 
    839             size_t auSize = 4 * nals.size() + totalSize;
    840             sp<ABuffer> accessUnit = new ABuffer(auSize);
    841             sp<ABuffer> sei;
    842 
    843             if (seiCount > 0) {
    844                 sei = new ABuffer(seiCount * sizeof(NALPosition));
    845                 accessUnit->meta()->setBuffer("sei", sei);
    846             }
    847 
    848 #if !LOG_NDEBUG
    849             AString out;
    850 #endif
    851 
    852             size_t dstOffset = 0;
    853             size_t seiIndex = 0;
    854             for (size_t i = 0; i < nals.size(); ++i) {
    855                 const NALPosition &pos = nals.itemAt(i);
    856 
    857                 unsigned nalType = mBuffer->data()[pos.nalOffset] & 0x1f;
    858 
    859                 if (nalType == 6 && pos.nalSize > 0) {
    860                     if (seiIndex >= sei->size() / sizeof(NALPosition)) {
    861                         ALOGE("Wrong seiIndex");
    862                         return NULL;
    863                     }
    864                     NALPosition &seiPos = ((NALPosition *)sei->data())[seiIndex++];
    865                     seiPos.nalOffset = dstOffset + 4;
    866                     seiPos.nalSize = pos.nalSize;
    867                 }
    868 
    869 #if !LOG_NDEBUG
    870                 char tmp[128];
    871                 sprintf(tmp, "0x%02x", nalType);
    872                 if (i > 0) {
    873                     out.append(", ");
    874                 }
    875                 out.append(tmp);
    876 #endif
    877 
    878                 memcpy(accessUnit->data() + dstOffset, "\x00\x00\x00\x01", 4);
    879 
    880                 memcpy(accessUnit->data() + dstOffset + 4,
    881                        mBuffer->data() + pos.nalOffset,
    882                        pos.nalSize);
    883 
    884                 dstOffset += pos.nalSize + 4;
    885             }
    886 
    887 #if !LOG_NDEBUG
    888             ALOGV("accessUnit contains nal types %s", out.c_str());
    889 #endif
    890 
    891             const NALPosition &pos = nals.itemAt(nals.size() - 1);
    892             size_t nextScan = pos.nalOffset + pos.nalSize;
    893 
    894             memmove(mBuffer->data(),
    895                     mBuffer->data() + nextScan,
    896                     mBuffer->size() - nextScan);
    897 
    898             mBuffer->setRange(0, mBuffer->size() - nextScan);
    899 
    900             int64_t timeUs = fetchTimestamp(nextScan);
    901             if (timeUs < 0ll) {
    902                 ALOGE("Negative timeUs");
    903                 return NULL;
    904             }
    905 
    906             accessUnit->meta()->setInt64("timeUs", timeUs);
    907             if (foundIDR) {
    908                 accessUnit->meta()->setInt32("isSync", 1);
    909             }
    910 
    911             if (mFormat == NULL) {
    912                 mFormat = MakeAVCCodecSpecificData(accessUnit);
    913             }
    914 
    915             return accessUnit;
    916         }
    917 
    918         NALPosition pos;
    919         pos.nalOffset = nalStart - mBuffer->data();
    920         pos.nalSize = nalSize;
    921 
    922         nals.push(pos);
    923 
    924         totalSize += nalSize;
    925     }
    926     if (err != (status_t)-EAGAIN) {
    927         ALOGE("Unexpeted err");
    928         return NULL;
    929     }
    930 
    931     return NULL;
    932 }
    933 
    934 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitMPEGAudio() {
    935     const uint8_t *data = mBuffer->data();
    936     size_t size = mBuffer->size();
    937 
    938     if (size < 4) {
    939         return NULL;
    940     }
    941 
    942     uint32_t header = U32_AT(data);
    943 
    944     size_t frameSize;
    945     int samplingRate, numChannels, bitrate, numSamples;
    946     if (!GetMPEGAudioFrameSize(
    947                 header, &frameSize, &samplingRate, &numChannels,
    948                 &bitrate, &numSamples)) {
    949         ALOGE("Failed to get audio frame size");
    950         return NULL;
    951     }
    952 
    953     if (size < frameSize) {
    954         return NULL;
    955     }
    956 
    957     unsigned layer = 4 - ((header >> 17) & 3);
    958 
    959     sp<ABuffer> accessUnit = new ABuffer(frameSize);
    960     memcpy(accessUnit->data(), data, frameSize);
    961 
    962     memmove(mBuffer->data(),
    963             mBuffer->data() + frameSize,
    964             mBuffer->size() - frameSize);
    965 
    966     mBuffer->setRange(0, mBuffer->size() - frameSize);
    967 
    968     int64_t timeUs = fetchTimestamp(frameSize);
    969     if (timeUs < 0ll) {
    970         ALOGE("Negative timeUs");
    971         return NULL;
    972     }
    973 
    974     accessUnit->meta()->setInt64("timeUs", timeUs);
    975     accessUnit->meta()->setInt32("isSync", 1);
    976 
    977     if (mFormat == NULL) {
    978         mFormat = new MetaData;
    979 
    980         switch (layer) {
    981             case 1:
    982                 mFormat->setCString(
    983                         kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_I);
    984                 break;
    985             case 2:
    986                 mFormat->setCString(
    987                         kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II);
    988                 break;
    989             case 3:
    990                 mFormat->setCString(
    991                         kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG);
    992                 break;
    993             default:
    994                 return NULL;
    995         }
    996 
    997         mFormat->setInt32(kKeySampleRate, samplingRate);
    998         mFormat->setInt32(kKeyChannelCount, numChannels);
    999     }
   1000 
   1001     return accessUnit;
   1002 }
   1003 
   1004 static void EncodeSize14(uint8_t **_ptr, size_t size) {
   1005     if (size > 0x3fff) {
   1006         ALOGE("Wrong size");
   1007         return;
   1008     }
   1009 
   1010     uint8_t *ptr = *_ptr;
   1011 
   1012     *ptr++ = 0x80 | (size >> 7);
   1013     *ptr++ = size & 0x7f;
   1014 
   1015     *_ptr = ptr;
   1016 }
   1017 
   1018 static sp<ABuffer> MakeMPEGVideoESDS(const sp<ABuffer> &csd) {
   1019     sp<ABuffer> esds = new ABuffer(csd->size() + 25);
   1020 
   1021     uint8_t *ptr = esds->data();
   1022     *ptr++ = 0x03;
   1023     EncodeSize14(&ptr, 22 + csd->size());
   1024 
   1025     *ptr++ = 0x00;  // ES_ID
   1026     *ptr++ = 0x00;
   1027 
   1028     *ptr++ = 0x00;  // streamDependenceFlag, URL_Flag, OCRstreamFlag
   1029 
   1030     *ptr++ = 0x04;
   1031     EncodeSize14(&ptr, 16 + csd->size());
   1032 
   1033     *ptr++ = 0x40;  // Audio ISO/IEC 14496-3
   1034 
   1035     for (size_t i = 0; i < 12; ++i) {
   1036         *ptr++ = 0x00;
   1037     }
   1038 
   1039     *ptr++ = 0x05;
   1040     EncodeSize14(&ptr, csd->size());
   1041 
   1042     memcpy(ptr, csd->data(), csd->size());
   1043 
   1044     return esds;
   1045 }
   1046 
   1047 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitMPEGVideo() {
   1048     const uint8_t *data = mBuffer->data();
   1049     size_t size = mBuffer->size();
   1050 
   1051     Vector<size_t> userDataPositions;
   1052 
   1053     bool sawPictureStart = false;
   1054     int pprevStartCode = -1;
   1055     int prevStartCode = -1;
   1056     int currentStartCode = -1;
   1057     bool gopFound = false;
   1058     bool isClosedGop = false;
   1059     bool brokenLink = false;
   1060 
   1061     size_t offset = 0;
   1062     while (offset + 3 < size) {
   1063         if (memcmp(&data[offset], "\x00\x00\x01", 3)) {
   1064             ++offset;
   1065             continue;
   1066         }
   1067 
   1068         pprevStartCode = prevStartCode;
   1069         prevStartCode = currentStartCode;
   1070         currentStartCode = data[offset + 3];
   1071 
   1072         if (currentStartCode == 0xb3 && mFormat == NULL) {
   1073             memmove(mBuffer->data(), mBuffer->data() + offset, size - offset);
   1074             size -= offset;
   1075             (void)fetchTimestamp(offset);
   1076             offset = 0;
   1077             mBuffer->setRange(0, size);
   1078         }
   1079 
   1080         if ((prevStartCode == 0xb3 && currentStartCode != 0xb5)
   1081                 || (pprevStartCode == 0xb3 && prevStartCode == 0xb5)) {
   1082             // seqHeader without/with extension
   1083 
   1084             if (mFormat == NULL) {
   1085                 if (size < 7u) {
   1086                     ALOGE("Size too small");
   1087                     return NULL;
   1088                 }
   1089 
   1090                 unsigned width =
   1091                     (data[4] << 4) | data[5] >> 4;
   1092 
   1093                 unsigned height =
   1094                     ((data[5] & 0x0f) << 8) | data[6];
   1095 
   1096                 mFormat = new MetaData;
   1097                 mFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG2);
   1098                 mFormat->setInt32(kKeyWidth, width);
   1099                 mFormat->setInt32(kKeyHeight, height);
   1100 
   1101                 ALOGI("found MPEG2 video codec config (%d x %d)", width, height);
   1102 
   1103                 sp<ABuffer> csd = new ABuffer(offset);
   1104                 memcpy(csd->data(), data, offset);
   1105 
   1106                 memmove(mBuffer->data(),
   1107                         mBuffer->data() + offset,
   1108                         mBuffer->size() - offset);
   1109 
   1110                 mBuffer->setRange(0, mBuffer->size() - offset);
   1111                 size -= offset;
   1112                 (void)fetchTimestamp(offset);
   1113                 offset = 0;
   1114 
   1115                 // hexdump(csd->data(), csd->size());
   1116 
   1117                 sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
   1118                 mFormat->setData(
   1119                         kKeyESDS, kTypeESDS, esds->data(), esds->size());
   1120 
   1121                 return NULL;
   1122             }
   1123         }
   1124 
   1125         if (mFormat != NULL && currentStartCode == 0xb8) {
   1126             // GOP layer
   1127             if (offset + 7 >= size) {
   1128                 ALOGE("Size too small");
   1129                 return NULL;
   1130             }
   1131             gopFound = true;
   1132             isClosedGop = (data[offset + 7] & 0x40) != 0;
   1133             brokenLink = (data[offset + 7] & 0x20) != 0;
   1134         }
   1135 
   1136         if (mFormat != NULL && currentStartCode == 0xb2) {
   1137             userDataPositions.add(offset);
   1138         }
   1139 
   1140         if (mFormat != NULL && currentStartCode == 0x00) {
   1141             // Picture start
   1142 
   1143             if (!sawPictureStart) {
   1144                 sawPictureStart = true;
   1145             } else {
   1146                 sp<ABuffer> accessUnit = new ABuffer(offset);
   1147                 memcpy(accessUnit->data(), data, offset);
   1148 
   1149                 memmove(mBuffer->data(),
   1150                         mBuffer->data() + offset,
   1151                         mBuffer->size() - offset);
   1152 
   1153                 mBuffer->setRange(0, mBuffer->size() - offset);
   1154 
   1155                 int64_t timeUs = fetchTimestamp(offset);
   1156                 if (timeUs < 0ll) {
   1157                     ALOGE("Negative timeUs");
   1158                     return NULL;
   1159                 }
   1160 
   1161                 offset = 0;
   1162 
   1163                 accessUnit->meta()->setInt64("timeUs", timeUs);
   1164                 if (gopFound && (!brokenLink || isClosedGop)) {
   1165                     accessUnit->meta()->setInt32("isSync", 1);
   1166                 }
   1167 
   1168                 ALOGV("returning MPEG video access unit at time %" PRId64 " us",
   1169                       timeUs);
   1170 
   1171                 // hexdump(accessUnit->data(), accessUnit->size());
   1172 
   1173                 if (userDataPositions.size() > 0) {
   1174                     sp<ABuffer> mpegUserData =
   1175                         new ABuffer(userDataPositions.size() * sizeof(size_t));
   1176                     if (mpegUserData != NULL && mpegUserData->data() != NULL) {
   1177                         for (size_t i = 0; i < userDataPositions.size(); ++i) {
   1178                             memcpy(
   1179                                     mpegUserData->data() + i * sizeof(size_t),
   1180                                     &userDataPositions[i], sizeof(size_t));
   1181                         }
   1182                         accessUnit->meta()->setBuffer("mpegUserData", mpegUserData);
   1183                     }
   1184                 }
   1185 
   1186                 return accessUnit;
   1187             }
   1188         }
   1189 
   1190         ++offset;
   1191     }
   1192 
   1193     return NULL;
   1194 }
   1195 
   1196 static ssize_t getNextChunkSize(
   1197         const uint8_t *data, size_t size) {
   1198     static const char kStartCode[] = "\x00\x00\x01";
   1199 
   1200     if (size < 3) {
   1201         return -EAGAIN;
   1202     }
   1203 
   1204     if (memcmp(kStartCode, data, 3)) {
   1205         return -EAGAIN;
   1206     }
   1207 
   1208     size_t offset = 3;
   1209     while (offset + 2 < size) {
   1210         if (!memcmp(&data[offset], kStartCode, 3)) {
   1211             return offset;
   1212         }
   1213 
   1214         ++offset;
   1215     }
   1216 
   1217     return -EAGAIN;
   1218 }
   1219 
   1220 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitMPEG4Video() {
   1221     uint8_t *data = mBuffer->data();
   1222     size_t size = mBuffer->size();
   1223 
   1224     enum {
   1225         SKIP_TO_VISUAL_OBJECT_SEQ_START,
   1226         EXPECT_VISUAL_OBJECT_START,
   1227         EXPECT_VO_START,
   1228         EXPECT_VOL_START,
   1229         WAIT_FOR_VOP_START,
   1230         SKIP_TO_VOP_START,
   1231 
   1232     } state;
   1233 
   1234     if (mFormat == NULL) {
   1235         state = SKIP_TO_VISUAL_OBJECT_SEQ_START;
   1236     } else {
   1237         state = SKIP_TO_VOP_START;
   1238     }
   1239 
   1240     int32_t width = -1, height = -1;
   1241 
   1242     size_t offset = 0;
   1243     ssize_t chunkSize;
   1244     while ((chunkSize = getNextChunkSize(
   1245                     &data[offset], size - offset)) > 0) {
   1246         bool discard = false;
   1247 
   1248         unsigned chunkType = data[offset + 3];
   1249 
   1250         switch (state) {
   1251             case SKIP_TO_VISUAL_OBJECT_SEQ_START:
   1252             {
   1253                 if (chunkType == 0xb0) {
   1254                     // Discard anything before this marker.
   1255 
   1256                     state = EXPECT_VISUAL_OBJECT_START;
   1257                 } else {
   1258                     discard = true;
   1259                 }
   1260                 break;
   1261             }
   1262 
   1263             case EXPECT_VISUAL_OBJECT_START:
   1264             {
   1265                 if (chunkType != 0xb5) {
   1266                     ALOGE("Unexpected chunkType");
   1267                     return NULL;
   1268                 }
   1269                 state = EXPECT_VO_START;
   1270                 break;
   1271             }
   1272 
   1273             case EXPECT_VO_START:
   1274             {
   1275                 if (chunkType > 0x1f) {
   1276                     ALOGE("Unexpected chunkType");
   1277                     return NULL;
   1278                 }
   1279                 state = EXPECT_VOL_START;
   1280                 break;
   1281             }
   1282 
   1283             case EXPECT_VOL_START:
   1284             {
   1285                 if ((chunkType & 0xf0) != 0x20) {
   1286                     ALOGE("Wrong chunkType");
   1287                     return NULL;
   1288                 }
   1289 
   1290                 if (!ExtractDimensionsFromVOLHeader(
   1291                             &data[offset], chunkSize,
   1292                             &width, &height)) {
   1293                     ALOGE("Failed to get dimension");
   1294                     return NULL;
   1295                 }
   1296 
   1297                 state = WAIT_FOR_VOP_START;
   1298                 break;
   1299             }
   1300 
   1301             case WAIT_FOR_VOP_START:
   1302             {
   1303                 if (chunkType == 0xb3 || chunkType == 0xb6) {
   1304                     // group of VOP or VOP start.
   1305 
   1306                     mFormat = new MetaData;
   1307                     mFormat->setCString(
   1308                             kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4);
   1309 
   1310                     mFormat->setInt32(kKeyWidth, width);
   1311                     mFormat->setInt32(kKeyHeight, height);
   1312 
   1313                     ALOGI("found MPEG4 video codec config (%d x %d)",
   1314                          width, height);
   1315 
   1316                     sp<ABuffer> csd = new ABuffer(offset);
   1317                     memcpy(csd->data(), data, offset);
   1318 
   1319                     // hexdump(csd->data(), csd->size());
   1320 
   1321                     sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
   1322                     mFormat->setData(
   1323                             kKeyESDS, kTypeESDS,
   1324                             esds->data(), esds->size());
   1325 
   1326                     discard = true;
   1327                     state = SKIP_TO_VOP_START;
   1328                 }
   1329 
   1330                 break;
   1331             }
   1332 
   1333             case SKIP_TO_VOP_START:
   1334             {
   1335                 if (chunkType == 0xb6) {
   1336                     int vopCodingType = (data[offset + 4] & 0xc0) >> 6;
   1337 
   1338                     offset += chunkSize;
   1339 
   1340                     sp<ABuffer> accessUnit = new ABuffer(offset);
   1341                     memcpy(accessUnit->data(), data, offset);
   1342 
   1343                     memmove(data, &data[offset], size - offset);
   1344                     size -= offset;
   1345                     mBuffer->setRange(0, size);
   1346 
   1347                     int64_t timeUs = fetchTimestamp(offset);
   1348                     if (timeUs < 0ll) {
   1349                         ALOGE("Negative timeus");
   1350                         return NULL;
   1351                     }
   1352 
   1353                     offset = 0;
   1354 
   1355                     accessUnit->meta()->setInt64("timeUs", timeUs);
   1356                     if (vopCodingType == 0) {  // intra-coded VOP
   1357                         accessUnit->meta()->setInt32("isSync", 1);
   1358                     }
   1359 
   1360                     ALOGV("returning MPEG4 video access unit at time %" PRId64 " us",
   1361                          timeUs);
   1362 
   1363                     // hexdump(accessUnit->data(), accessUnit->size());
   1364 
   1365                     return accessUnit;
   1366                 } else if (chunkType != 0xb3) {
   1367                     offset += chunkSize;
   1368                     discard = true;
   1369                 }
   1370 
   1371                 break;
   1372             }
   1373 
   1374             default:
   1375                 ALOGE("Unknown state: %d", state);
   1376                 return NULL;
   1377         }
   1378 
   1379         if (discard) {
   1380             (void)fetchTimestamp(offset);
   1381             memmove(data, &data[offset], size - offset);
   1382             size -= offset;
   1383             offset = 0;
   1384             mBuffer->setRange(0, size);
   1385         } else {
   1386             offset += chunkSize;
   1387         }
   1388     }
   1389 
   1390     return NULL;
   1391 }
   1392 
   1393 void ElementaryStreamQueue::signalEOS() {
   1394     if (!mEOSReached) {
   1395         if (mMode == MPEG_VIDEO) {
   1396             const char *theEnd = "\x00\x00\x01\x00";
   1397             appendData(theEnd, 4, 0);
   1398         }
   1399         mEOSReached = true;
   1400     } else {
   1401         ALOGW("EOS already signaled");
   1402     }
   1403 }
   1404 
   1405 sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitMetadata() {
   1406     size_t size = mBuffer->size();
   1407     if (!size) {
   1408         return NULL;
   1409     }
   1410 
   1411     sp<ABuffer> accessUnit = new ABuffer(size);
   1412     int64_t timeUs = fetchTimestamp(size);
   1413     accessUnit->meta()->setInt64("timeUs", timeUs);
   1414 
   1415     memcpy(accessUnit->data(), mBuffer->data(), size);
   1416     mBuffer->setRange(0, 0);
   1417 
   1418     if (mFormat == NULL) {
   1419         mFormat = new MetaData;
   1420         mFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_DATA_TIMED_ID3);
   1421     }
   1422 
   1423     return accessUnit;
   1424 }
   1425 
   1426 }  // namespace android
   1427