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 "ATSParser"
     19 #include <utils/Log.h>
     20 
     21 #include "ATSParser.h"
     22 
     23 #include "AnotherPacketSource.h"
     24 #include "ESQueue.h"
     25 #include "include/avc_utils.h"
     26 
     27 #include <media/stagefright/foundation/ABitReader.h>
     28 #include <media/stagefright/foundation/ABuffer.h>
     29 #include <media/stagefright/foundation/ADebug.h>
     30 #include <media/stagefright/foundation/AMessage.h>
     31 #include <media/stagefright/foundation/hexdump.h>
     32 #include <media/stagefright/MediaDefs.h>
     33 #include <media/stagefright/MediaErrors.h>
     34 #include <media/stagefright/MetaData.h>
     35 #include <media/stagefright/Utils.h>
     36 #include <media/IStreamSource.h>
     37 #include <utils/KeyedVector.h>
     38 
     39 #include <inttypes.h>
     40 
     41 namespace android {
     42 
     43 // I want the expression "y" evaluated even if verbose logging is off.
     44 #define MY_LOGV(x, y) \
     45     do { unsigned tmp = y; ALOGV(x, tmp); } while (0)
     46 
     47 static const size_t kTSPacketSize = 188;
     48 
     49 struct ATSParser::Program : public RefBase {
     50     Program(ATSParser *parser, unsigned programNumber, unsigned programMapPID);
     51 
     52     bool parsePSISection(
     53             unsigned pid, ABitReader *br, status_t *err);
     54 
     55     bool parsePID(
     56             unsigned pid, unsigned continuity_counter,
     57             unsigned payload_unit_start_indicator,
     58             ABitReader *br, status_t *err);
     59 
     60     void signalDiscontinuity(
     61             DiscontinuityType type, const sp<AMessage> &extra);
     62 
     63     void signalEOS(status_t finalResult);
     64 
     65     sp<MediaSource> getSource(SourceType type);
     66 
     67     int64_t convertPTSToTimestamp(uint64_t PTS);
     68 
     69     bool PTSTimeDeltaEstablished() const {
     70         return mFirstPTSValid;
     71     }
     72 
     73     unsigned number() const { return mProgramNumber; }
     74 
     75     void updateProgramMapPID(unsigned programMapPID) {
     76         mProgramMapPID = programMapPID;
     77     }
     78 
     79     unsigned programMapPID() const {
     80         return mProgramMapPID;
     81     }
     82 
     83     uint32_t parserFlags() const {
     84         return mParser->mFlags;
     85     }
     86 
     87 private:
     88     ATSParser *mParser;
     89     unsigned mProgramNumber;
     90     unsigned mProgramMapPID;
     91     KeyedVector<unsigned, sp<Stream> > mStreams;
     92     bool mFirstPTSValid;
     93     uint64_t mFirstPTS;
     94 
     95     status_t parseProgramMap(ABitReader *br);
     96 
     97     DISALLOW_EVIL_CONSTRUCTORS(Program);
     98 };
     99 
    100 struct ATSParser::Stream : public RefBase {
    101     Stream(Program *program,
    102            unsigned elementaryPID,
    103            unsigned streamType,
    104            unsigned PCR_PID);
    105 
    106     unsigned type() const { return mStreamType; }
    107     unsigned pid() const { return mElementaryPID; }
    108     void setPID(unsigned pid) { mElementaryPID = pid; }
    109 
    110     status_t parse(
    111             unsigned continuity_counter,
    112             unsigned payload_unit_start_indicator,
    113             ABitReader *br);
    114 
    115     void signalDiscontinuity(
    116             DiscontinuityType type, const sp<AMessage> &extra);
    117 
    118     void signalEOS(status_t finalResult);
    119 
    120     sp<MediaSource> getSource(SourceType type);
    121 
    122 protected:
    123     virtual ~Stream();
    124 
    125 private:
    126     Program *mProgram;
    127     unsigned mElementaryPID;
    128     unsigned mStreamType;
    129     unsigned mPCR_PID;
    130     int32_t mExpectedContinuityCounter;
    131 
    132     sp<ABuffer> mBuffer;
    133     sp<AnotherPacketSource> mSource;
    134     bool mPayloadStarted;
    135 
    136     uint64_t mPrevPTS;
    137 
    138     ElementaryStreamQueue *mQueue;
    139 
    140     status_t flush();
    141     status_t parsePES(ABitReader *br);
    142 
    143     void onPayloadData(
    144             unsigned PTS_DTS_flags, uint64_t PTS, uint64_t DTS,
    145             const uint8_t *data, size_t size);
    146 
    147     void extractAACFrames(const sp<ABuffer> &buffer);
    148 
    149     bool isAudio() const;
    150     bool isVideo() const;
    151 
    152     DISALLOW_EVIL_CONSTRUCTORS(Stream);
    153 };
    154 
    155 struct ATSParser::PSISection : public RefBase {
    156     PSISection();
    157 
    158     status_t append(const void *data, size_t size);
    159     void clear();
    160 
    161     bool isComplete() const;
    162     bool isEmpty() const;
    163 
    164     const uint8_t *data() const;
    165     size_t size() const;
    166 
    167 protected:
    168     virtual ~PSISection();
    169 
    170 private:
    171     sp<ABuffer> mBuffer;
    172 
    173     DISALLOW_EVIL_CONSTRUCTORS(PSISection);
    174 };
    175 
    176 ////////////////////////////////////////////////////////////////////////////////
    177 
    178 ATSParser::Program::Program(
    179         ATSParser *parser, unsigned programNumber, unsigned programMapPID)
    180     : mParser(parser),
    181       mProgramNumber(programNumber),
    182       mProgramMapPID(programMapPID),
    183       mFirstPTSValid(false),
    184       mFirstPTS(0) {
    185     ALOGV("new program number %u", programNumber);
    186 }
    187 
    188 bool ATSParser::Program::parsePSISection(
    189         unsigned pid, ABitReader *br, status_t *err) {
    190     *err = OK;
    191 
    192     if (pid != mProgramMapPID) {
    193         return false;
    194     }
    195 
    196     *err = parseProgramMap(br);
    197 
    198     return true;
    199 }
    200 
    201 bool ATSParser::Program::parsePID(
    202         unsigned pid, unsigned continuity_counter,
    203         unsigned payload_unit_start_indicator,
    204         ABitReader *br, status_t *err) {
    205     *err = OK;
    206 
    207     ssize_t index = mStreams.indexOfKey(pid);
    208     if (index < 0) {
    209         return false;
    210     }
    211 
    212     *err = mStreams.editValueAt(index)->parse(
    213             continuity_counter, payload_unit_start_indicator, br);
    214 
    215     return true;
    216 }
    217 
    218 void ATSParser::Program::signalDiscontinuity(
    219         DiscontinuityType type, const sp<AMessage> &extra) {
    220     int64_t mediaTimeUs;
    221     if ((type & DISCONTINUITY_TIME)
    222             && extra != NULL
    223             && extra->findInt64(
    224                 IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) {
    225         mFirstPTSValid = false;
    226     }
    227 
    228     for (size_t i = 0; i < mStreams.size(); ++i) {
    229         mStreams.editValueAt(i)->signalDiscontinuity(type, extra);
    230     }
    231 }
    232 
    233 void ATSParser::Program::signalEOS(status_t finalResult) {
    234     for (size_t i = 0; i < mStreams.size(); ++i) {
    235         mStreams.editValueAt(i)->signalEOS(finalResult);
    236     }
    237 }
    238 
    239 struct StreamInfo {
    240     unsigned mType;
    241     unsigned mPID;
    242 };
    243 
    244 status_t ATSParser::Program::parseProgramMap(ABitReader *br) {
    245     unsigned table_id = br->getBits(8);
    246     ALOGV("  table_id = %u", table_id);
    247     CHECK_EQ(table_id, 0x02u);
    248 
    249     unsigned section_syntax_indicator = br->getBits(1);
    250     ALOGV("  section_syntax_indicator = %u", section_syntax_indicator);
    251     CHECK_EQ(section_syntax_indicator, 1u);
    252 
    253     CHECK_EQ(br->getBits(1), 0u);
    254     MY_LOGV("  reserved = %u", br->getBits(2));
    255 
    256     unsigned section_length = br->getBits(12);
    257     ALOGV("  section_length = %u", section_length);
    258     CHECK_EQ(section_length & 0xc00, 0u);
    259     CHECK_LE(section_length, 1021u);
    260 
    261     MY_LOGV("  program_number = %u", br->getBits(16));
    262     MY_LOGV("  reserved = %u", br->getBits(2));
    263     MY_LOGV("  version_number = %u", br->getBits(5));
    264     MY_LOGV("  current_next_indicator = %u", br->getBits(1));
    265     MY_LOGV("  section_number = %u", br->getBits(8));
    266     MY_LOGV("  last_section_number = %u", br->getBits(8));
    267     MY_LOGV("  reserved = %u", br->getBits(3));
    268 
    269     unsigned PCR_PID = br->getBits(13);
    270     ALOGV("  PCR_PID = 0x%04x", PCR_PID);
    271 
    272     MY_LOGV("  reserved = %u", br->getBits(4));
    273 
    274     unsigned program_info_length = br->getBits(12);
    275     ALOGV("  program_info_length = %u", program_info_length);
    276     CHECK_EQ(program_info_length & 0xc00, 0u);
    277 
    278     br->skipBits(program_info_length * 8);  // skip descriptors
    279 
    280     Vector<StreamInfo> infos;
    281 
    282     // infoBytesRemaining is the number of bytes that make up the
    283     // variable length section of ES_infos. It does not include the
    284     // final CRC.
    285     size_t infoBytesRemaining = section_length - 9 - program_info_length - 4;
    286 
    287     while (infoBytesRemaining > 0) {
    288         CHECK_GE(infoBytesRemaining, 5u);
    289 
    290         unsigned streamType = br->getBits(8);
    291         ALOGV("    stream_type = 0x%02x", streamType);
    292 
    293         MY_LOGV("    reserved = %u", br->getBits(3));
    294 
    295         unsigned elementaryPID = br->getBits(13);
    296         ALOGV("    elementary_PID = 0x%04x", elementaryPID);
    297 
    298         MY_LOGV("    reserved = %u", br->getBits(4));
    299 
    300         unsigned ES_info_length = br->getBits(12);
    301         ALOGV("    ES_info_length = %u", ES_info_length);
    302         CHECK_EQ(ES_info_length & 0xc00, 0u);
    303 
    304         CHECK_GE(infoBytesRemaining - 5, ES_info_length);
    305 
    306 #if 0
    307         br->skipBits(ES_info_length * 8);  // skip descriptors
    308 #else
    309         unsigned info_bytes_remaining = ES_info_length;
    310         while (info_bytes_remaining >= 2) {
    311             MY_LOGV("      tag = 0x%02x", br->getBits(8));
    312 
    313             unsigned descLength = br->getBits(8);
    314             ALOGV("      len = %u", descLength);
    315 
    316             CHECK_GE(info_bytes_remaining, 2 + descLength);
    317 
    318             br->skipBits(descLength * 8);
    319 
    320             info_bytes_remaining -= descLength + 2;
    321         }
    322         CHECK_EQ(info_bytes_remaining, 0u);
    323 #endif
    324 
    325         StreamInfo info;
    326         info.mType = streamType;
    327         info.mPID = elementaryPID;
    328         infos.push(info);
    329 
    330         infoBytesRemaining -= 5 + ES_info_length;
    331     }
    332 
    333     CHECK_EQ(infoBytesRemaining, 0u);
    334     MY_LOGV("  CRC = 0x%08x", br->getBits(32));
    335 
    336     bool PIDsChanged = false;
    337     for (size_t i = 0; i < infos.size(); ++i) {
    338         StreamInfo &info = infos.editItemAt(i);
    339 
    340         ssize_t index = mStreams.indexOfKey(info.mPID);
    341 
    342         if (index >= 0 && mStreams.editValueAt(index)->type() != info.mType) {
    343             ALOGI("uh oh. stream PIDs have changed.");
    344             PIDsChanged = true;
    345             break;
    346         }
    347     }
    348 
    349     if (PIDsChanged) {
    350 #if 0
    351         ALOGI("before:");
    352         for (size_t i = 0; i < mStreams.size(); ++i) {
    353             sp<Stream> stream = mStreams.editValueAt(i);
    354 
    355             ALOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type());
    356         }
    357 
    358         ALOGI("after:");
    359         for (size_t i = 0; i < infos.size(); ++i) {
    360             StreamInfo &info = infos.editItemAt(i);
    361 
    362             ALOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType);
    363         }
    364 #endif
    365 
    366         // The only case we can recover from is if we have two streams
    367         // and they switched PIDs.
    368 
    369         bool success = false;
    370 
    371         if (mStreams.size() == 2 && infos.size() == 2) {
    372             const StreamInfo &info1 = infos.itemAt(0);
    373             const StreamInfo &info2 = infos.itemAt(1);
    374 
    375             sp<Stream> s1 = mStreams.editValueAt(0);
    376             sp<Stream> s2 = mStreams.editValueAt(1);
    377 
    378             bool caseA =
    379                 info1.mPID == s1->pid() && info1.mType == s2->type()
    380                     && info2.mPID == s2->pid() && info2.mType == s1->type();
    381 
    382             bool caseB =
    383                 info1.mPID == s2->pid() && info1.mType == s1->type()
    384                     && info2.mPID == s1->pid() && info2.mType == s2->type();
    385 
    386             if (caseA || caseB) {
    387                 unsigned pid1 = s1->pid();
    388                 unsigned pid2 = s2->pid();
    389                 s1->setPID(pid2);
    390                 s2->setPID(pid1);
    391 
    392                 mStreams.clear();
    393                 mStreams.add(s1->pid(), s1);
    394                 mStreams.add(s2->pid(), s2);
    395 
    396                 success = true;
    397             }
    398         }
    399 
    400         if (!success) {
    401             ALOGI("Stream PIDs changed and we cannot recover.");
    402             return ERROR_MALFORMED;
    403         }
    404     }
    405 
    406     for (size_t i = 0; i < infos.size(); ++i) {
    407         StreamInfo &info = infos.editItemAt(i);
    408 
    409         ssize_t index = mStreams.indexOfKey(info.mPID);
    410 
    411         if (index < 0) {
    412             sp<Stream> stream = new Stream(
    413                     this, info.mPID, info.mType, PCR_PID);
    414 
    415             mStreams.add(info.mPID, stream);
    416         }
    417     }
    418 
    419     return OK;
    420 }
    421 
    422 sp<MediaSource> ATSParser::Program::getSource(SourceType type) {
    423     size_t index = (type == AUDIO) ? 0 : 0;
    424 
    425     for (size_t i = 0; i < mStreams.size(); ++i) {
    426         sp<MediaSource> source = mStreams.editValueAt(i)->getSource(type);
    427         if (source != NULL) {
    428             if (index == 0) {
    429                 return source;
    430             }
    431             --index;
    432         }
    433     }
    434 
    435     return NULL;
    436 }
    437 
    438 int64_t ATSParser::Program::convertPTSToTimestamp(uint64_t PTS) {
    439     if (!(mParser->mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)) {
    440         if (!mFirstPTSValid) {
    441             mFirstPTSValid = true;
    442             mFirstPTS = PTS;
    443             PTS = 0;
    444         } else if (PTS < mFirstPTS) {
    445             PTS = 0;
    446         } else {
    447             PTS -= mFirstPTS;
    448         }
    449     }
    450 
    451     int64_t timeUs = (PTS * 100) / 9;
    452 
    453     if (mParser->mAbsoluteTimeAnchorUs >= 0ll) {
    454         timeUs += mParser->mAbsoluteTimeAnchorUs;
    455     }
    456 
    457     if (mParser->mTimeOffsetValid) {
    458         timeUs += mParser->mTimeOffsetUs;
    459     }
    460 
    461     return timeUs;
    462 }
    463 
    464 ////////////////////////////////////////////////////////////////////////////////
    465 
    466 ATSParser::Stream::Stream(
    467         Program *program,
    468         unsigned elementaryPID,
    469         unsigned streamType,
    470         unsigned PCR_PID)
    471     : mProgram(program),
    472       mElementaryPID(elementaryPID),
    473       mStreamType(streamType),
    474       mPCR_PID(PCR_PID),
    475       mExpectedContinuityCounter(-1),
    476       mPayloadStarted(false),
    477       mPrevPTS(0),
    478       mQueue(NULL) {
    479     switch (mStreamType) {
    480         case STREAMTYPE_H264:
    481             mQueue = new ElementaryStreamQueue(
    482                     ElementaryStreamQueue::H264,
    483                     (mProgram->parserFlags() & ALIGNED_VIDEO_DATA)
    484                         ? ElementaryStreamQueue::kFlag_AlignedData : 0);
    485             break;
    486         case STREAMTYPE_MPEG2_AUDIO_ADTS:
    487             mQueue = new ElementaryStreamQueue(ElementaryStreamQueue::AAC);
    488             break;
    489         case STREAMTYPE_MPEG1_AUDIO:
    490         case STREAMTYPE_MPEG2_AUDIO:
    491             mQueue = new ElementaryStreamQueue(
    492                     ElementaryStreamQueue::MPEG_AUDIO);
    493             break;
    494 
    495         case STREAMTYPE_MPEG1_VIDEO:
    496         case STREAMTYPE_MPEG2_VIDEO:
    497             mQueue = new ElementaryStreamQueue(
    498                     ElementaryStreamQueue::MPEG_VIDEO);
    499             break;
    500 
    501         case STREAMTYPE_MPEG4_VIDEO:
    502             mQueue = new ElementaryStreamQueue(
    503                     ElementaryStreamQueue::MPEG4_VIDEO);
    504             break;
    505 
    506         case STREAMTYPE_LPCM_AC3:
    507         case STREAMTYPE_AC3:
    508             mQueue = new ElementaryStreamQueue(
    509                     ElementaryStreamQueue::AC3);
    510             break;
    511 
    512         default:
    513             break;
    514     }
    515 
    516     ALOGV("new stream PID 0x%02x, type 0x%02x", elementaryPID, streamType);
    517 
    518     if (mQueue != NULL) {
    519         mBuffer = new ABuffer(192 * 1024);
    520         mBuffer->setRange(0, 0);
    521     }
    522 }
    523 
    524 ATSParser::Stream::~Stream() {
    525     delete mQueue;
    526     mQueue = NULL;
    527 }
    528 
    529 status_t ATSParser::Stream::parse(
    530         unsigned continuity_counter,
    531         unsigned payload_unit_start_indicator, ABitReader *br) {
    532     if (mQueue == NULL) {
    533         return OK;
    534     }
    535 
    536     if (mExpectedContinuityCounter >= 0
    537             && (unsigned)mExpectedContinuityCounter != continuity_counter) {
    538         ALOGI("discontinuity on stream pid 0x%04x", mElementaryPID);
    539 
    540         mPayloadStarted = false;
    541         mBuffer->setRange(0, 0);
    542         mExpectedContinuityCounter = -1;
    543 
    544 #if 0
    545         // Uncomment this if you'd rather see no corruption whatsoever on
    546         // screen and suspend updates until we come across another IDR frame.
    547 
    548         if (mStreamType == STREAMTYPE_H264) {
    549             ALOGI("clearing video queue");
    550             mQueue->clear(true /* clearFormat */);
    551         }
    552 #endif
    553 
    554         if (!payload_unit_start_indicator) {
    555             return OK;
    556         }
    557     }
    558 
    559     mExpectedContinuityCounter = (continuity_counter + 1) & 0x0f;
    560 
    561     if (payload_unit_start_indicator) {
    562         if (mPayloadStarted) {
    563             // Otherwise we run the danger of receiving the trailing bytes
    564             // of a PES packet that we never saw the start of and assuming
    565             // we have a a complete PES packet.
    566 
    567             status_t err = flush();
    568 
    569             if (err != OK) {
    570                 return err;
    571             }
    572         }
    573 
    574         mPayloadStarted = true;
    575     }
    576 
    577     if (!mPayloadStarted) {
    578         return OK;
    579     }
    580 
    581     size_t payloadSizeBits = br->numBitsLeft();
    582     CHECK_EQ(payloadSizeBits % 8, 0u);
    583 
    584     size_t neededSize = mBuffer->size() + payloadSizeBits / 8;
    585     if (mBuffer->capacity() < neededSize) {
    586         // Increment in multiples of 64K.
    587         neededSize = (neededSize + 65535) & ~65535;
    588 
    589         ALOGI("resizing buffer to %zu bytes", neededSize);
    590 
    591         sp<ABuffer> newBuffer = new ABuffer(neededSize);
    592         memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
    593         newBuffer->setRange(0, mBuffer->size());
    594         mBuffer = newBuffer;
    595     }
    596 
    597     memcpy(mBuffer->data() + mBuffer->size(), br->data(), payloadSizeBits / 8);
    598     mBuffer->setRange(0, mBuffer->size() + payloadSizeBits / 8);
    599 
    600     return OK;
    601 }
    602 
    603 bool ATSParser::Stream::isVideo() const {
    604     switch (mStreamType) {
    605         case STREAMTYPE_H264:
    606         case STREAMTYPE_MPEG1_VIDEO:
    607         case STREAMTYPE_MPEG2_VIDEO:
    608         case STREAMTYPE_MPEG4_VIDEO:
    609             return true;
    610 
    611         default:
    612             return false;
    613     }
    614 }
    615 
    616 bool ATSParser::Stream::isAudio() const {
    617     switch (mStreamType) {
    618         case STREAMTYPE_MPEG1_AUDIO:
    619         case STREAMTYPE_MPEG2_AUDIO:
    620         case STREAMTYPE_MPEG2_AUDIO_ADTS:
    621         case STREAMTYPE_LPCM_AC3:
    622         case STREAMTYPE_AC3:
    623             return true;
    624 
    625         default:
    626             return false;
    627     }
    628 }
    629 
    630 void ATSParser::Stream::signalDiscontinuity(
    631         DiscontinuityType type, const sp<AMessage> &extra) {
    632     mExpectedContinuityCounter = -1;
    633 
    634     if (mQueue == NULL) {
    635         return;
    636     }
    637 
    638     mPayloadStarted = false;
    639     mBuffer->setRange(0, 0);
    640 
    641     bool clearFormat = false;
    642     if (isAudio()) {
    643         if (type & DISCONTINUITY_AUDIO_FORMAT) {
    644             clearFormat = true;
    645         }
    646     } else {
    647         if (type & DISCONTINUITY_VIDEO_FORMAT) {
    648             clearFormat = true;
    649         }
    650     }
    651 
    652     mQueue->clear(clearFormat);
    653 
    654     if (type & DISCONTINUITY_TIME) {
    655         uint64_t resumeAtPTS;
    656         if (extra != NULL
    657                 && extra->findInt64(
    658                     IStreamListener::kKeyResumeAtPTS,
    659                     (int64_t *)&resumeAtPTS)) {
    660             int64_t resumeAtMediaTimeUs =
    661                 mProgram->convertPTSToTimestamp(resumeAtPTS);
    662 
    663             extra->setInt64("resume-at-mediatimeUs", resumeAtMediaTimeUs);
    664         }
    665     }
    666 
    667     if (mSource != NULL) {
    668         mSource->queueDiscontinuity(type, extra, true);
    669     }
    670 }
    671 
    672 void ATSParser::Stream::signalEOS(status_t finalResult) {
    673     if (mSource != NULL) {
    674         mSource->signalEOS(finalResult);
    675     }
    676 }
    677 
    678 status_t ATSParser::Stream::parsePES(ABitReader *br) {
    679     unsigned packet_startcode_prefix = br->getBits(24);
    680 
    681     ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix);
    682 
    683     if (packet_startcode_prefix != 1) {
    684         ALOGV("Supposedly payload_unit_start=1 unit does not start "
    685              "with startcode.");
    686 
    687         return ERROR_MALFORMED;
    688     }
    689 
    690     CHECK_EQ(packet_startcode_prefix, 0x000001u);
    691 
    692     unsigned stream_id = br->getBits(8);
    693     ALOGV("stream_id = 0x%02x", stream_id);
    694 
    695     unsigned PES_packet_length = br->getBits(16);
    696     ALOGV("PES_packet_length = %u", PES_packet_length);
    697 
    698     if (stream_id != 0xbc  // program_stream_map
    699             && stream_id != 0xbe  // padding_stream
    700             && stream_id != 0xbf  // private_stream_2
    701             && stream_id != 0xf0  // ECM
    702             && stream_id != 0xf1  // EMM
    703             && stream_id != 0xff  // program_stream_directory
    704             && stream_id != 0xf2  // DSMCC
    705             && stream_id != 0xf8) {  // H.222.1 type E
    706         CHECK_EQ(br->getBits(2), 2u);
    707 
    708         MY_LOGV("PES_scrambling_control = %u", br->getBits(2));
    709         MY_LOGV("PES_priority = %u", br->getBits(1));
    710         MY_LOGV("data_alignment_indicator = %u", br->getBits(1));
    711         MY_LOGV("copyright = %u", br->getBits(1));
    712         MY_LOGV("original_or_copy = %u", br->getBits(1));
    713 
    714         unsigned PTS_DTS_flags = br->getBits(2);
    715         ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags);
    716 
    717         unsigned ESCR_flag = br->getBits(1);
    718         ALOGV("ESCR_flag = %u", ESCR_flag);
    719 
    720         unsigned ES_rate_flag = br->getBits(1);
    721         ALOGV("ES_rate_flag = %u", ES_rate_flag);
    722 
    723         unsigned DSM_trick_mode_flag = br->getBits(1);
    724         ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag);
    725 
    726         unsigned additional_copy_info_flag = br->getBits(1);
    727         ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag);
    728 
    729         MY_LOGV("PES_CRC_flag = %u", br->getBits(1));
    730         MY_LOGV("PES_extension_flag = %u", br->getBits(1));
    731 
    732         unsigned PES_header_data_length = br->getBits(8);
    733         ALOGV("PES_header_data_length = %u", PES_header_data_length);
    734 
    735         unsigned optional_bytes_remaining = PES_header_data_length;
    736 
    737         uint64_t PTS = 0, DTS = 0;
    738 
    739         if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
    740             CHECK_GE(optional_bytes_remaining, 5u);
    741 
    742             CHECK_EQ(br->getBits(4), PTS_DTS_flags);
    743 
    744             PTS = ((uint64_t)br->getBits(3)) << 30;
    745             CHECK_EQ(br->getBits(1), 1u);
    746             PTS |= ((uint64_t)br->getBits(15)) << 15;
    747             CHECK_EQ(br->getBits(1), 1u);
    748             PTS |= br->getBits(15);
    749             CHECK_EQ(br->getBits(1), 1u);
    750 
    751             ALOGV("PTS = 0x%016" PRIx64 " (%.2f)", PTS, PTS / 90000.0);
    752 
    753             optional_bytes_remaining -= 5;
    754 
    755             if (PTS_DTS_flags == 3) {
    756                 CHECK_GE(optional_bytes_remaining, 5u);
    757 
    758                 CHECK_EQ(br->getBits(4), 1u);
    759 
    760                 DTS = ((uint64_t)br->getBits(3)) << 30;
    761                 CHECK_EQ(br->getBits(1), 1u);
    762                 DTS |= ((uint64_t)br->getBits(15)) << 15;
    763                 CHECK_EQ(br->getBits(1), 1u);
    764                 DTS |= br->getBits(15);
    765                 CHECK_EQ(br->getBits(1), 1u);
    766 
    767                 ALOGV("DTS = %" PRIu64, DTS);
    768 
    769                 optional_bytes_remaining -= 5;
    770             }
    771         }
    772 
    773         if (ESCR_flag) {
    774             CHECK_GE(optional_bytes_remaining, 6u);
    775 
    776             br->getBits(2);
    777 
    778             uint64_t ESCR = ((uint64_t)br->getBits(3)) << 30;
    779             CHECK_EQ(br->getBits(1), 1u);
    780             ESCR |= ((uint64_t)br->getBits(15)) << 15;
    781             CHECK_EQ(br->getBits(1), 1u);
    782             ESCR |= br->getBits(15);
    783             CHECK_EQ(br->getBits(1), 1u);
    784 
    785             ALOGV("ESCR = %" PRIu64, ESCR);
    786             MY_LOGV("ESCR_extension = %u", br->getBits(9));
    787 
    788             CHECK_EQ(br->getBits(1), 1u);
    789 
    790             optional_bytes_remaining -= 6;
    791         }
    792 
    793         if (ES_rate_flag) {
    794             CHECK_GE(optional_bytes_remaining, 3u);
    795 
    796             CHECK_EQ(br->getBits(1), 1u);
    797             MY_LOGV("ES_rate = %u", br->getBits(22));
    798             CHECK_EQ(br->getBits(1), 1u);
    799 
    800             optional_bytes_remaining -= 3;
    801         }
    802 
    803         br->skipBits(optional_bytes_remaining * 8);
    804 
    805         // ES data follows.
    806 
    807         if (PES_packet_length != 0) {
    808             CHECK_GE(PES_packet_length, PES_header_data_length + 3);
    809 
    810             unsigned dataLength =
    811                 PES_packet_length - 3 - PES_header_data_length;
    812 
    813             if (br->numBitsLeft() < dataLength * 8) {
    814                 ALOGE("PES packet does not carry enough data to contain "
    815                      "payload. (numBitsLeft = %zu, required = %u)",
    816                      br->numBitsLeft(), dataLength * 8);
    817 
    818                 return ERROR_MALFORMED;
    819             }
    820 
    821             CHECK_GE(br->numBitsLeft(), dataLength * 8);
    822 
    823             onPayloadData(
    824                     PTS_DTS_flags, PTS, DTS, br->data(), dataLength);
    825 
    826             br->skipBits(dataLength * 8);
    827         } else {
    828             onPayloadData(
    829                     PTS_DTS_flags, PTS, DTS,
    830                     br->data(), br->numBitsLeft() / 8);
    831 
    832             size_t payloadSizeBits = br->numBitsLeft();
    833             CHECK_EQ(payloadSizeBits % 8, 0u);
    834 
    835             ALOGV("There's %zu bytes of payload.", payloadSizeBits / 8);
    836         }
    837     } else if (stream_id == 0xbe) {  // padding_stream
    838         CHECK_NE(PES_packet_length, 0u);
    839         br->skipBits(PES_packet_length * 8);
    840     } else {
    841         CHECK_NE(PES_packet_length, 0u);
    842         br->skipBits(PES_packet_length * 8);
    843     }
    844 
    845     return OK;
    846 }
    847 
    848 status_t ATSParser::Stream::flush() {
    849     if (mBuffer->size() == 0) {
    850         return OK;
    851     }
    852 
    853     ALOGV("flushing stream 0x%04x size = %zu", mElementaryPID, mBuffer->size());
    854 
    855     ABitReader br(mBuffer->data(), mBuffer->size());
    856 
    857     status_t err = parsePES(&br);
    858 
    859     mBuffer->setRange(0, 0);
    860 
    861     return err;
    862 }
    863 
    864 void ATSParser::Stream::onPayloadData(
    865         unsigned PTS_DTS_flags, uint64_t PTS, uint64_t /* DTS */,
    866         const uint8_t *data, size_t size) {
    867 #if 0
    868     ALOGI("payload streamType 0x%02x, PTS = 0x%016llx, dPTS = %lld",
    869           mStreamType,
    870           PTS,
    871           (int64_t)PTS - mPrevPTS);
    872     mPrevPTS = PTS;
    873 #endif
    874 
    875     ALOGV("onPayloadData mStreamType=0x%02x", mStreamType);
    876 
    877     int64_t timeUs = 0ll;  // no presentation timestamp available.
    878     if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
    879         timeUs = mProgram->convertPTSToTimestamp(PTS);
    880     }
    881 
    882     status_t err = mQueue->appendData(data, size, timeUs);
    883 
    884     if (err != OK) {
    885         return;
    886     }
    887 
    888     sp<ABuffer> accessUnit;
    889     while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) {
    890         if (mSource == NULL) {
    891             sp<MetaData> meta = mQueue->getFormat();
    892 
    893             if (meta != NULL) {
    894                 ALOGV("Stream PID 0x%08x of type 0x%02x now has data.",
    895                      mElementaryPID, mStreamType);
    896 
    897                 const char *mime;
    898                 if (meta->findCString(kKeyMIMEType, &mime)
    899                         && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)
    900                         && !IsIDR(accessUnit)) {
    901                     continue;
    902                 }
    903                 mSource = new AnotherPacketSource(meta);
    904                 mSource->queueAccessUnit(accessUnit);
    905             }
    906         } else if (mQueue->getFormat() != NULL) {
    907             // After a discontinuity we invalidate the queue's format
    908             // and won't enqueue any access units to the source until
    909             // the queue has reestablished the new format.
    910 
    911             if (mSource->getFormat() == NULL) {
    912                 mSource->setFormat(mQueue->getFormat());
    913             }
    914             mSource->queueAccessUnit(accessUnit);
    915         }
    916     }
    917 }
    918 
    919 sp<MediaSource> ATSParser::Stream::getSource(SourceType type) {
    920     switch (type) {
    921         case VIDEO:
    922         {
    923             if (isVideo()) {
    924                 return mSource;
    925             }
    926             break;
    927         }
    928 
    929         case AUDIO:
    930         {
    931             if (isAudio()) {
    932                 return mSource;
    933             }
    934             break;
    935         }
    936 
    937         default:
    938             break;
    939     }
    940 
    941     return NULL;
    942 }
    943 
    944 ////////////////////////////////////////////////////////////////////////////////
    945 
    946 ATSParser::ATSParser(uint32_t flags)
    947     : mFlags(flags),
    948       mAbsoluteTimeAnchorUs(-1ll),
    949       mTimeOffsetValid(false),
    950       mTimeOffsetUs(0ll),
    951       mNumTSPacketsParsed(0),
    952       mNumPCRs(0) {
    953     mPSISections.add(0 /* PID */, new PSISection);
    954 }
    955 
    956 ATSParser::~ATSParser() {
    957 }
    958 
    959 status_t ATSParser::feedTSPacket(const void *data, size_t size) {
    960     CHECK_EQ(size, kTSPacketSize);
    961 
    962     ABitReader br((const uint8_t *)data, kTSPacketSize);
    963     return parseTS(&br);
    964 }
    965 
    966 void ATSParser::signalDiscontinuity(
    967         DiscontinuityType type, const sp<AMessage> &extra) {
    968     int64_t mediaTimeUs;
    969     if ((type & DISCONTINUITY_TIME)
    970             && extra != NULL
    971             && extra->findInt64(
    972                 IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) {
    973         mAbsoluteTimeAnchorUs = mediaTimeUs;
    974     } else if (type == DISCONTINUITY_ABSOLUTE_TIME) {
    975         int64_t timeUs;
    976         CHECK(extra->findInt64("timeUs", &timeUs));
    977 
    978         CHECK(mPrograms.empty());
    979         mAbsoluteTimeAnchorUs = timeUs;
    980         return;
    981     } else if (type == DISCONTINUITY_TIME_OFFSET) {
    982         int64_t offset;
    983         CHECK(extra->findInt64("offset", &offset));
    984 
    985         mTimeOffsetValid = true;
    986         mTimeOffsetUs = offset;
    987         return;
    988     }
    989 
    990     for (size_t i = 0; i < mPrograms.size(); ++i) {
    991         mPrograms.editItemAt(i)->signalDiscontinuity(type, extra);
    992     }
    993 }
    994 
    995 void ATSParser::signalEOS(status_t finalResult) {
    996     CHECK_NE(finalResult, (status_t)OK);
    997 
    998     for (size_t i = 0; i < mPrograms.size(); ++i) {
    999         mPrograms.editItemAt(i)->signalEOS(finalResult);
   1000     }
   1001 }
   1002 
   1003 void ATSParser::parseProgramAssociationTable(ABitReader *br) {
   1004     unsigned table_id = br->getBits(8);
   1005     ALOGV("  table_id = %u", table_id);
   1006     CHECK_EQ(table_id, 0x00u);
   1007 
   1008     unsigned section_syntax_indictor = br->getBits(1);
   1009     ALOGV("  section_syntax_indictor = %u", section_syntax_indictor);
   1010     CHECK_EQ(section_syntax_indictor, 1u);
   1011 
   1012     CHECK_EQ(br->getBits(1), 0u);
   1013     MY_LOGV("  reserved = %u", br->getBits(2));
   1014 
   1015     unsigned section_length = br->getBits(12);
   1016     ALOGV("  section_length = %u", section_length);
   1017     CHECK_EQ(section_length & 0xc00, 0u);
   1018 
   1019     MY_LOGV("  transport_stream_id = %u", br->getBits(16));
   1020     MY_LOGV("  reserved = %u", br->getBits(2));
   1021     MY_LOGV("  version_number = %u", br->getBits(5));
   1022     MY_LOGV("  current_next_indicator = %u", br->getBits(1));
   1023     MY_LOGV("  section_number = %u", br->getBits(8));
   1024     MY_LOGV("  last_section_number = %u", br->getBits(8));
   1025 
   1026     size_t numProgramBytes = (section_length - 5 /* header */ - 4 /* crc */);
   1027     CHECK_EQ((numProgramBytes % 4), 0u);
   1028 
   1029     for (size_t i = 0; i < numProgramBytes / 4; ++i) {
   1030         unsigned program_number = br->getBits(16);
   1031         ALOGV("    program_number = %u", program_number);
   1032 
   1033         MY_LOGV("    reserved = %u", br->getBits(3));
   1034 
   1035         if (program_number == 0) {
   1036             MY_LOGV("    network_PID = 0x%04x", br->getBits(13));
   1037         } else {
   1038             unsigned programMapPID = br->getBits(13);
   1039 
   1040             ALOGV("    program_map_PID = 0x%04x", programMapPID);
   1041 
   1042             bool found = false;
   1043             for (size_t index = 0; index < mPrograms.size(); ++index) {
   1044                 const sp<Program> &program = mPrograms.itemAt(index);
   1045 
   1046                 if (program->number() == program_number) {
   1047                     program->updateProgramMapPID(programMapPID);
   1048                     found = true;
   1049                     break;
   1050                 }
   1051             }
   1052 
   1053             if (!found) {
   1054                 mPrograms.push(
   1055                         new Program(this, program_number, programMapPID));
   1056             }
   1057 
   1058             if (mPSISections.indexOfKey(programMapPID) < 0) {
   1059                 mPSISections.add(programMapPID, new PSISection);
   1060             }
   1061         }
   1062     }
   1063 
   1064     MY_LOGV("  CRC = 0x%08x", br->getBits(32));
   1065 }
   1066 
   1067 status_t ATSParser::parsePID(
   1068         ABitReader *br, unsigned PID,
   1069         unsigned continuity_counter,
   1070         unsigned payload_unit_start_indicator) {
   1071     ssize_t sectionIndex = mPSISections.indexOfKey(PID);
   1072 
   1073     if (sectionIndex >= 0) {
   1074         sp<PSISection> section = mPSISections.valueAt(sectionIndex);
   1075 
   1076         if (payload_unit_start_indicator) {
   1077             CHECK(section->isEmpty());
   1078 
   1079             unsigned skip = br->getBits(8);
   1080             br->skipBits(skip * 8);
   1081         }
   1082 
   1083         CHECK((br->numBitsLeft() % 8) == 0);
   1084         status_t err = section->append(br->data(), br->numBitsLeft() / 8);
   1085 
   1086         if (err != OK) {
   1087             return err;
   1088         }
   1089 
   1090         if (!section->isComplete()) {
   1091             return OK;
   1092         }
   1093 
   1094         ABitReader sectionBits(section->data(), section->size());
   1095 
   1096         if (PID == 0) {
   1097             parseProgramAssociationTable(&sectionBits);
   1098         } else {
   1099             bool handled = false;
   1100             for (size_t i = 0; i < mPrograms.size(); ++i) {
   1101                 status_t err;
   1102                 if (!mPrograms.editItemAt(i)->parsePSISection(
   1103                             PID, &sectionBits, &err)) {
   1104                     continue;
   1105                 }
   1106 
   1107                 if (err != OK) {
   1108                     return err;
   1109                 }
   1110 
   1111                 handled = true;
   1112                 break;
   1113             }
   1114 
   1115             if (!handled) {
   1116                 mPSISections.removeItem(PID);
   1117                 section.clear();
   1118             }
   1119         }
   1120 
   1121         if (section != NULL) {
   1122             section->clear();
   1123         }
   1124 
   1125         return OK;
   1126     }
   1127 
   1128     bool handled = false;
   1129     for (size_t i = 0; i < mPrograms.size(); ++i) {
   1130         status_t err;
   1131         if (mPrograms.editItemAt(i)->parsePID(
   1132                     PID, continuity_counter, payload_unit_start_indicator,
   1133                     br, &err)) {
   1134             if (err != OK) {
   1135                 return err;
   1136             }
   1137 
   1138             handled = true;
   1139             break;
   1140         }
   1141     }
   1142 
   1143     if (!handled) {
   1144         ALOGV("PID 0x%04x not handled.", PID);
   1145     }
   1146 
   1147     return OK;
   1148 }
   1149 
   1150 void ATSParser::parseAdaptationField(ABitReader *br, unsigned PID) {
   1151     unsigned adaptation_field_length = br->getBits(8);
   1152 
   1153     if (adaptation_field_length > 0) {
   1154         unsigned discontinuity_indicator = br->getBits(1);
   1155 
   1156         if (discontinuity_indicator) {
   1157             ALOGV("PID 0x%04x: discontinuity_indicator = 1 (!!!)", PID);
   1158         }
   1159 
   1160         br->skipBits(2);
   1161         unsigned PCR_flag = br->getBits(1);
   1162 
   1163         size_t numBitsRead = 4;
   1164 
   1165         if (PCR_flag) {
   1166             br->skipBits(4);
   1167             uint64_t PCR_base = br->getBits(32);
   1168             PCR_base = (PCR_base << 1) | br->getBits(1);
   1169 
   1170             br->skipBits(6);
   1171             unsigned PCR_ext = br->getBits(9);
   1172 
   1173             // The number of bytes from the start of the current
   1174             // MPEG2 transport stream packet up and including
   1175             // the final byte of this PCR_ext field.
   1176             size_t byteOffsetFromStartOfTSPacket =
   1177                 (188 - br->numBitsLeft() / 8);
   1178 
   1179             uint64_t PCR = PCR_base * 300 + PCR_ext;
   1180 
   1181             ALOGV("PID 0x%04x: PCR = 0x%016" PRIx64 " (%.2f)",
   1182                   PID, PCR, PCR / 27E6);
   1183 
   1184             // The number of bytes received by this parser up to and
   1185             // including the final byte of this PCR_ext field.
   1186             size_t byteOffsetFromStart =
   1187                 mNumTSPacketsParsed * 188 + byteOffsetFromStartOfTSPacket;
   1188 
   1189             for (size_t i = 0; i < mPrograms.size(); ++i) {
   1190                 updatePCR(PID, PCR, byteOffsetFromStart);
   1191             }
   1192 
   1193             numBitsRead += 52;
   1194         }
   1195 
   1196         CHECK_GE(adaptation_field_length * 8, numBitsRead);
   1197 
   1198         br->skipBits(adaptation_field_length * 8 - numBitsRead);
   1199     }
   1200 }
   1201 
   1202 status_t ATSParser::parseTS(ABitReader *br) {
   1203     ALOGV("---");
   1204 
   1205     unsigned sync_byte = br->getBits(8);
   1206     CHECK_EQ(sync_byte, 0x47u);
   1207 
   1208     if (br->getBits(1)) {  // transport_error_indicator
   1209         // silently ignore.
   1210         return OK;
   1211     }
   1212 
   1213     unsigned payload_unit_start_indicator = br->getBits(1);
   1214     ALOGV("payload_unit_start_indicator = %u", payload_unit_start_indicator);
   1215 
   1216     MY_LOGV("transport_priority = %u", br->getBits(1));
   1217 
   1218     unsigned PID = br->getBits(13);
   1219     ALOGV("PID = 0x%04x", PID);
   1220 
   1221     MY_LOGV("transport_scrambling_control = %u", br->getBits(2));
   1222 
   1223     unsigned adaptation_field_control = br->getBits(2);
   1224     ALOGV("adaptation_field_control = %u", adaptation_field_control);
   1225 
   1226     unsigned continuity_counter = br->getBits(4);
   1227     ALOGV("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
   1228 
   1229     // ALOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
   1230 
   1231     if (adaptation_field_control == 2 || adaptation_field_control == 3) {
   1232         parseAdaptationField(br, PID);
   1233     }
   1234 
   1235     status_t err = OK;
   1236 
   1237     if (adaptation_field_control == 1 || adaptation_field_control == 3) {
   1238         err = parsePID(
   1239                 br, PID, continuity_counter, payload_unit_start_indicator);
   1240     }
   1241 
   1242     ++mNumTSPacketsParsed;
   1243 
   1244     return err;
   1245 }
   1246 
   1247 sp<MediaSource> ATSParser::getSource(SourceType type) {
   1248     int which = -1;  // any
   1249 
   1250     for (size_t i = 0; i < mPrograms.size(); ++i) {
   1251         const sp<Program> &program = mPrograms.editItemAt(i);
   1252 
   1253         if (which >= 0 && (int)program->number() != which) {
   1254             continue;
   1255         }
   1256 
   1257         sp<MediaSource> source = program->getSource(type);
   1258 
   1259         if (source != NULL) {
   1260             return source;
   1261         }
   1262     }
   1263 
   1264     return NULL;
   1265 }
   1266 
   1267 bool ATSParser::PTSTimeDeltaEstablished() {
   1268     if (mPrograms.isEmpty()) {
   1269         return false;
   1270     }
   1271 
   1272     return mPrograms.editItemAt(0)->PTSTimeDeltaEstablished();
   1273 }
   1274 
   1275 void ATSParser::updatePCR(
   1276         unsigned /* PID */, uint64_t PCR, size_t byteOffsetFromStart) {
   1277     ALOGV("PCR 0x%016" PRIx64 " @ %zu", PCR, byteOffsetFromStart);
   1278 
   1279     if (mNumPCRs == 2) {
   1280         mPCR[0] = mPCR[1];
   1281         mPCRBytes[0] = mPCRBytes[1];
   1282         mSystemTimeUs[0] = mSystemTimeUs[1];
   1283         mNumPCRs = 1;
   1284     }
   1285 
   1286     mPCR[mNumPCRs] = PCR;
   1287     mPCRBytes[mNumPCRs] = byteOffsetFromStart;
   1288     mSystemTimeUs[mNumPCRs] = ALooper::GetNowUs();
   1289 
   1290     ++mNumPCRs;
   1291 
   1292     if (mNumPCRs == 2) {
   1293         double transportRate =
   1294             (mPCRBytes[1] - mPCRBytes[0]) * 27E6 / (mPCR[1] - mPCR[0]);
   1295 
   1296         ALOGV("transportRate = %.2f bytes/sec", transportRate);
   1297     }
   1298 }
   1299 
   1300 ////////////////////////////////////////////////////////////////////////////////
   1301 
   1302 ATSParser::PSISection::PSISection() {
   1303 }
   1304 
   1305 ATSParser::PSISection::~PSISection() {
   1306 }
   1307 
   1308 status_t ATSParser::PSISection::append(const void *data, size_t size) {
   1309     if (mBuffer == NULL || mBuffer->size() + size > mBuffer->capacity()) {
   1310         size_t newCapacity =
   1311             (mBuffer == NULL) ? size : mBuffer->capacity() + size;
   1312 
   1313         newCapacity = (newCapacity + 1023) & ~1023;
   1314 
   1315         sp<ABuffer> newBuffer = new ABuffer(newCapacity);
   1316 
   1317         if (mBuffer != NULL) {
   1318             memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
   1319             newBuffer->setRange(0, mBuffer->size());
   1320         } else {
   1321             newBuffer->setRange(0, 0);
   1322         }
   1323 
   1324         mBuffer = newBuffer;
   1325     }
   1326 
   1327     memcpy(mBuffer->data() + mBuffer->size(), data, size);
   1328     mBuffer->setRange(0, mBuffer->size() + size);
   1329 
   1330     return OK;
   1331 }
   1332 
   1333 void ATSParser::PSISection::clear() {
   1334     if (mBuffer != NULL) {
   1335         mBuffer->setRange(0, 0);
   1336     }
   1337 }
   1338 
   1339 bool ATSParser::PSISection::isComplete() const {
   1340     if (mBuffer == NULL || mBuffer->size() < 3) {
   1341         return false;
   1342     }
   1343 
   1344     unsigned sectionLength = U16_AT(mBuffer->data() + 1) & 0xfff;
   1345     return mBuffer->size() >= sectionLength + 3;
   1346 }
   1347 
   1348 bool ATSParser::PSISection::isEmpty() const {
   1349     return mBuffer == NULL || mBuffer->size() == 0;
   1350 }
   1351 
   1352 const uint8_t *ATSParser::PSISection::data() const {
   1353     return mBuffer == NULL ? NULL : mBuffer->data();
   1354 }
   1355 
   1356 size_t ATSParser::PSISection::size() const {
   1357     return mBuffer == NULL ? 0 : mBuffer->size();
   1358 }
   1359 
   1360 }  // namespace android
   1361