Merge "Convert a number of assertions into runtime errors (OggExtractor)" into kraken
This commit is contained in:
committed by
Android (Google) Code Review
commit
a08d85237a
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user