Merge "Convert a number of assertions into runtime errors (OggExtractor)" into kraken

This commit is contained in:
Andreas Huber
2010-05-26 13:10:47 -07:00
committed by Android (Google) Code Review

View File

@@ -76,7 +76,7 @@ struct MyVorbisExtractor {
status_t seekToOffset(off_t offset); status_t seekToOffset(off_t offset);
status_t readNextPacket(MediaBuffer **buffer); status_t readNextPacket(MediaBuffer **buffer);
void init(); status_t init();
sp<MetaData> getFileMetaData() { return mFileMeta; } sp<MetaData> getFileMetaData() { return mFileMeta; }
@@ -107,7 +107,7 @@ private:
ssize_t readPage(off_t offset, Page *page); ssize_t readPage(off_t offset, Page *page);
status_t findNextPage(off_t startOffset, off_t *pageOffset); status_t findNextPage(off_t startOffset, off_t *pageOffset);
void verifyHeader( status_t verifyHeader(
MediaBuffer *buffer, uint8_t type); MediaBuffer *buffer, uint8_t type);
void parseFileMetaData(); void parseFileMetaData();
@@ -308,6 +308,7 @@ ssize_t MyVorbisExtractor::readPage(off_t offset, Page *page) {
totalSize += page->mLace[i]; totalSize += page->mLace[i];
} }
#if 0
String8 tmp; String8 tmp;
for (size_t i = 0; i < page->mNumSegments; ++i) { for (size_t i = 0; i < page->mNumSegments; ++i) {
char x[32]; char x[32];
@@ -316,7 +317,8 @@ ssize_t MyVorbisExtractor::readPage(off_t offset, Page *page) {
tmp.append(x); 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; 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 = new MetaData;
mMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_VORBIS); mMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_VORBIS);
MediaBuffer *packet; 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()); LOGV("read packet of size %d\n", packet->range_length());
verifyHeader(packet, 1); err = verifyHeader(packet, 1);
packet->release(); packet->release();
packet = NULL; 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()); LOGV("read packet of size %d\n", packet->range_length());
verifyHeader(packet, 3); err = verifyHeader(packet, 3);
packet->release(); packet->release();
packet = NULL; 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()); LOGV("read packet of size %d\n", packet->range_length());
verifyHeader(packet, 5); err = verifyHeader(packet, 5);
packet->release(); packet->release();
packet = NULL; packet = NULL;
if (err != OK) {
return err;
}
mFirstDataOffset = mOffset + mCurrentPageSize; mFirstDataOffset = mOffset + mCurrentPageSize;
return OK;
} }
void MyVorbisExtractor::verifyHeader( status_t MyVorbisExtractor::verifyHeader(
MediaBuffer *buffer, uint8_t type) { MediaBuffer *buffer, uint8_t type) {
const uint8_t *data = const uint8_t *data =
(const uint8_t *)buffer->data() + buffer->range_offset(); (const uint8_t *)buffer->data() + buffer->range_offset();
size_t size = buffer->range_length(); size_t size = buffer->range_length();
CHECK(size >= 7); if (size < 7 || data[0] != type || memcmp(&data[1], "vorbis", 6)) {
return ERROR_MALFORMED;
CHECK_EQ(data[0], type); }
CHECK(!memcmp(&data[1], "vorbis", 6));
ogg_buffer buf; ogg_buffer buf;
buf.data = (uint8_t *)data; buf.data = (uint8_t *)data;
@@ -515,7 +534,9 @@ void MyVorbisExtractor::verifyHeader(
case 3: case 3:
{ {
CHECK_EQ(0, _vorbis_unpack_comment(&mVc, &bits)); if (0 != _vorbis_unpack_comment(&mVc, &bits)) {
return ERROR_MALFORMED;
}
parseFileMetaData(); parseFileMetaData();
break; break;
@@ -523,12 +544,16 @@ void MyVorbisExtractor::verifyHeader(
case 5: 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); mMeta->setData(kKeyVorbisBooks, 0, data, size);
break; break;
} }
} }
return OK;
} }
uint64_t MyVorbisExtractor::approxBitrate() { uint64_t MyVorbisExtractor::approxBitrate() {
@@ -732,10 +757,11 @@ OggExtractor::OggExtractor(const sp<DataSource> &source)
mInitCheck(NO_INIT), mInitCheck(NO_INIT),
mImpl(NULL) { mImpl(NULL) {
mImpl = new MyVorbisExtractor(mDataSource); mImpl = new MyVorbisExtractor(mDataSource);
CHECK_EQ(mImpl->seekToOffset(0), OK); mInitCheck = mImpl->seekToOffset(0);
mImpl->init();
mInitCheck = OK; if (mInitCheck == OK) {
mInitCheck = mImpl->init();
}
} }
OggExtractor::~OggExtractor() { OggExtractor::~OggExtractor() {