diff options
author | Andreas Huber <andih@google.com> | 2010-05-26 12:59:06 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-05-26 12:59:06 -0700 |
commit | 5a4001ddb2536d65d966970fc0579bf6bd11b5a0 (patch) | |
tree | 99210f9c70c3b695128950533b52d076ee35b017 /media/libstagefright/OggExtractor.cpp | |
parent | 1a9b892400dae0f63b4fd502770154a06e23b01b (diff) | |
download | frameworks_av-5a4001ddb2536d65d966970fc0579bf6bd11b5a0.zip frameworks_av-5a4001ddb2536d65d966970fc0579bf6bd11b5a0.tar.gz frameworks_av-5a4001ddb2536d65d966970fc0579bf6bd11b5a0.tar.bz2 |
Convert a number of assertions into runtime errors (OggExtractor)
Change-Id: I8fcaec927d7b72e9d61cb7283e54523711980268
Diffstat (limited to 'media/libstagefright/OggExtractor.cpp')
-rw-r--r-- | media/libstagefright/OggExtractor.cpp | 66 |
1 files changed, 46 insertions, 20 deletions
diff --git a/media/libstagefright/OggExtractor.cpp b/media/libstagefright/OggExtractor.cpp index bd16db9..6013b6f 100644 --- a/media/libstagefright/OggExtractor.cpp +++ b/media/libstagefright/OggExtractor.cpp @@ -76,7 +76,7 @@ struct MyVorbisExtractor { status_t seekToOffset(off_t offset); status_t readNextPacket(MediaBuffer **buffer); - void init(); + status_t init(); sp<MetaData> getFileMetaData() { return mFileMeta; } @@ -107,7 +107,7 @@ private: ssize_t readPage(off_t offset, Page *page); status_t findNextPage(off_t startOffset, off_t *pageOffset); - void verifyHeader( + status_t verifyHeader( MediaBuffer *buffer, uint8_t type); void parseFileMetaData(); @@ -308,6 +308,7 @@ ssize_t MyVorbisExtractor::readPage(off_t offset, Page *page) { totalSize += page->mLace[i]; } +#if 0 String8 tmp; for (size_t i = 0; i < page->mNumSegments; ++i) { char x[32]; @@ -316,7 +317,8 @@ ssize_t MyVorbisExtractor::readPage(off_t offset, Page *page) { tmp.append(x); } - // LOGV("%c %s", page->mFlags & 1 ? '+' : ' ', tmp.string()); + LOGV("%c %s", page->mFlags & 1 ? '+' : ' ', tmp.string()); +#endif return sizeof(header) + page->mNumSegments + totalSize; } @@ -432,43 +434,60 @@ status_t MyVorbisExtractor::readNextPacket(MediaBuffer **out) { } } -void MyVorbisExtractor::init() { +status_t MyVorbisExtractor::init() { mMeta = new MetaData; mMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_VORBIS); MediaBuffer *packet; - CHECK_EQ(readNextPacket(&packet), OK); + status_t err; + if ((err = readNextPacket(&packet)) != OK) { + return err; + } LOGV("read packet of size %d\n", packet->range_length()); - verifyHeader(packet, 1); + err = verifyHeader(packet, 1); packet->release(); packet = NULL; + if (err != OK) { + return err; + } - CHECK_EQ(readNextPacket(&packet), OK); + if ((err = readNextPacket(&packet)) != OK) { + return err; + } LOGV("read packet of size %d\n", packet->range_length()); - verifyHeader(packet, 3); + err = verifyHeader(packet, 3); packet->release(); packet = NULL; + if (err != OK) { + return err; + } - CHECK_EQ(readNextPacket(&packet), OK); + if ((err = readNextPacket(&packet)) != OK) { + return err; + } LOGV("read packet of size %d\n", packet->range_length()); - verifyHeader(packet, 5); + err = verifyHeader(packet, 5); packet->release(); packet = NULL; + if (err != OK) { + return err; + } mFirstDataOffset = mOffset + mCurrentPageSize; + + return OK; } -void MyVorbisExtractor::verifyHeader( +status_t MyVorbisExtractor::verifyHeader( MediaBuffer *buffer, uint8_t type) { const uint8_t *data = (const uint8_t *)buffer->data() + buffer->range_offset(); size_t size = buffer->range_length(); - CHECK(size >= 7); - - CHECK_EQ(data[0], type); - CHECK(!memcmp(&data[1], "vorbis", 6)); + if (size < 7 || data[0] != type || memcmp(&data[1], "vorbis", 6)) { + return ERROR_MALFORMED; + } ogg_buffer buf; buf.data = (uint8_t *)data; @@ -515,7 +534,9 @@ void MyVorbisExtractor::verifyHeader( case 3: { - CHECK_EQ(0, _vorbis_unpack_comment(&mVc, &bits)); + if (0 != _vorbis_unpack_comment(&mVc, &bits)) { + return ERROR_MALFORMED; + } parseFileMetaData(); break; @@ -523,12 +544,16 @@ void MyVorbisExtractor::verifyHeader( case 5: { - CHECK_EQ(0, _vorbis_unpack_books(&mVi, &bits)); + if (0 != _vorbis_unpack_books(&mVi, &bits)) { + return ERROR_MALFORMED; + } mMeta->setData(kKeyVorbisBooks, 0, data, size); break; } } + + return OK; } uint64_t MyVorbisExtractor::approxBitrate() { @@ -732,10 +757,11 @@ OggExtractor::OggExtractor(const sp<DataSource> &source) mInitCheck(NO_INIT), mImpl(NULL) { mImpl = new MyVorbisExtractor(mDataSource); - CHECK_EQ(mImpl->seekToOffset(0), OK); - mImpl->init(); + mInitCheck = mImpl->seekToOffset(0); - mInitCheck = OK; + if (mInitCheck == OK) { + mInitCheck = mImpl->init(); + } } OggExtractor::~OggExtractor() { |