Loading media/extractors/fuzzers/ExtractorFuzzerBase.cpp +83 −12 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ bool ExtractorFuzzerBase::setDataSource(const uint8_t* data, size_t size) { return true; } bool ExtractorFuzzerBase::getExtractorDef() { void ExtractorFuzzerBase::getExtractorDef() { float confidence; void* meta = nullptr; FreeMetaFunc freeMeta = nullptr; Loading @@ -49,16 +49,15 @@ bool ExtractorFuzzerBase::getExtractorDef() { if (meta != nullptr && freeMeta != nullptr) { freeMeta(meta); } return true; } bool ExtractorFuzzerBase::extractTracks() { void ExtractorFuzzerBase::extractTracks() { MediaBufferGroup* bufferGroup = new MediaBufferGroup(); if (!bufferGroup) { return false; return; } for (size_t trackIndex = 0; trackIndex < mExtractor->countTracks(); ++trackIndex) { size_t trackCount = mExtractor->countTracks(); for (size_t trackIndex = 0; trackIndex < trackCount; ++trackIndex) { MediaTrackHelper* track = mExtractor->getTrack(trackIndex); if (!track) { continue; Loading @@ -67,7 +66,6 @@ bool ExtractorFuzzerBase::extractTracks() { delete track; } delete bufferGroup; return true; } void ExtractorFuzzerBase::extractTrack(MediaTrackHelper* track, MediaBufferGroup* bufferGroup) { Loading @@ -94,25 +92,98 @@ void ExtractorFuzzerBase::extractTrack(MediaTrackHelper* track, MediaBufferGroup free(cTrack); } bool ExtractorFuzzerBase::getTracksMetadata() { void ExtractorFuzzerBase::getTracksMetadata() { AMediaFormat* format = AMediaFormat_new(); uint32_t flags = MediaExtractorPluginHelper::kIncludeExtensiveMetaData; for (size_t trackIndex = 0; trackIndex < mExtractor->countTracks(); ++trackIndex) { size_t trackCount = mExtractor->countTracks(); for (size_t trackIndex = 0; trackIndex < trackCount; ++trackIndex) { mExtractor->getTrackMetaData(format, trackIndex, flags); } AMediaFormat_delete(format); return true; } bool ExtractorFuzzerBase::getMetadata() { void ExtractorFuzzerBase::getMetadata() { AMediaFormat* format = AMediaFormat_new(); mExtractor->getMetaData(format); AMediaFormat_delete(format); return true; } void ExtractorFuzzerBase::setDataSourceFlags(uint32_t flags) { mBufferSource->setFlags(flags); } void ExtractorFuzzerBase::seekAndExtractTracks() { MediaBufferGroup* bufferGroup = new MediaBufferGroup(); if (!bufferGroup) { return; } size_t trackCount = mExtractor->countTracks(); for (size_t trackIndex = 0; trackIndex < trackCount; ++trackIndex) { MediaTrackHelper* track = mExtractor->getTrack(trackIndex); if (!track) { continue; } AMediaFormat* trackMetaData = AMediaFormat_new(); int64_t trackDuration = 0; uint32_t flags = MediaExtractorPluginHelper::kIncludeExtensiveMetaData; mExtractor->getTrackMetaData(trackMetaData, trackIndex, flags); AMediaFormat_getInt64(trackMetaData, AMEDIAFORMAT_KEY_DURATION, &trackDuration); seekAndExtractTrack(track, bufferGroup, trackDuration); AMediaFormat_delete(trackMetaData); delete track; } delete bufferGroup; } void ExtractorFuzzerBase::seekAndExtractTrack(MediaTrackHelper* track, MediaBufferGroup* bufferGroup, int64_t trackDuration) { CMediaTrack* cTrack = wrap(track); if (!cTrack) { return; } media_status_t status = cTrack->start(track, bufferGroup->wrap()); if (status != AMEDIA_OK) { free(cTrack); return; } int32_t seekCount = 0; std::vector<int64_t> seekToTimeStamp; while (seekCount <= kFuzzerMaxSeekPointsCount) { /* This ensures kFuzzerMaxSeekPointsCount seek points are within the clipDuration and 1 seek * point is outside of the clipDuration. */ int64_t timeStamp = (seekCount * trackDuration) / (kFuzzerMaxSeekPointsCount - 1); seekToTimeStamp.push_back(timeStamp); seekCount++; } std::vector<uint32_t> seekOptions; seekOptions.push_back(CMediaTrackReadOptions::SEEK | CMediaTrackReadOptions::SEEK_CLOSEST); seekOptions.push_back(CMediaTrackReadOptions::SEEK | CMediaTrackReadOptions::SEEK_CLOSEST_SYNC); seekOptions.push_back(CMediaTrackReadOptions::SEEK | CMediaTrackReadOptions::SEEK_PREVIOUS_SYNC); seekOptions.push_back(CMediaTrackReadOptions::SEEK | CMediaTrackReadOptions::SEEK_NEXT_SYNC); seekOptions.push_back(CMediaTrackReadOptions::SEEK | CMediaTrackReadOptions::SEEK_FRAME_INDEX); for (uint32_t seekOption : seekOptions) { for (int64_t seekPts : seekToTimeStamp) { MediaTrackHelper::ReadOptions* options = new MediaTrackHelper::ReadOptions(seekOption, seekPts); MediaBufferHelper* buffer = nullptr; track->read(&buffer, options); if (buffer) { buffer->release(); } delete options; } } cTrack->stop(track); free(cTrack); } media/extractors/fuzzers/include/ExtractorFuzzerBase.h +11 −4 Original line number Diff line number Diff line Loading @@ -24,11 +24,14 @@ #include <media/DataSource.h> #include <media/MediaExtractorPluginHelper.h> #include <media/stagefright/MediaBufferGroup.h> #include <vector> extern "C" { android::ExtractorDef GETEXTRACTORDEF(); } constexpr int32_t kFuzzerMaxSeekPointsCount = 5; namespace android { class ExtractorFuzzerBase { Loading @@ -55,16 +58,18 @@ class ExtractorFuzzerBase { */ bool setDataSource(const uint8_t* data, size_t size); bool getExtractorDef(); void getExtractorDef(); bool extractTracks(); void extractTracks(); bool getMetadata(); void getMetadata(); bool getTracksMetadata(); void getTracksMetadata(); void setDataSourceFlags(uint32_t flags); void seekAndExtractTracks(); protected: class BufferSource : public DataSource { public: Loading Loading @@ -123,6 +128,8 @@ class ExtractorFuzzerBase { MediaExtractorPluginHelper* mExtractor = nullptr; virtual void extractTrack(MediaTrackHelper* track, MediaBufferGroup* bufferGroup); virtual void seekAndExtractTrack(MediaTrackHelper* track, MediaBufferGroup* bufferGroup, int64_t trackDuration); }; } // namespace android Loading Loading
media/extractors/fuzzers/ExtractorFuzzerBase.cpp +83 −12 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ bool ExtractorFuzzerBase::setDataSource(const uint8_t* data, size_t size) { return true; } bool ExtractorFuzzerBase::getExtractorDef() { void ExtractorFuzzerBase::getExtractorDef() { float confidence; void* meta = nullptr; FreeMetaFunc freeMeta = nullptr; Loading @@ -49,16 +49,15 @@ bool ExtractorFuzzerBase::getExtractorDef() { if (meta != nullptr && freeMeta != nullptr) { freeMeta(meta); } return true; } bool ExtractorFuzzerBase::extractTracks() { void ExtractorFuzzerBase::extractTracks() { MediaBufferGroup* bufferGroup = new MediaBufferGroup(); if (!bufferGroup) { return false; return; } for (size_t trackIndex = 0; trackIndex < mExtractor->countTracks(); ++trackIndex) { size_t trackCount = mExtractor->countTracks(); for (size_t trackIndex = 0; trackIndex < trackCount; ++trackIndex) { MediaTrackHelper* track = mExtractor->getTrack(trackIndex); if (!track) { continue; Loading @@ -67,7 +66,6 @@ bool ExtractorFuzzerBase::extractTracks() { delete track; } delete bufferGroup; return true; } void ExtractorFuzzerBase::extractTrack(MediaTrackHelper* track, MediaBufferGroup* bufferGroup) { Loading @@ -94,25 +92,98 @@ void ExtractorFuzzerBase::extractTrack(MediaTrackHelper* track, MediaBufferGroup free(cTrack); } bool ExtractorFuzzerBase::getTracksMetadata() { void ExtractorFuzzerBase::getTracksMetadata() { AMediaFormat* format = AMediaFormat_new(); uint32_t flags = MediaExtractorPluginHelper::kIncludeExtensiveMetaData; for (size_t trackIndex = 0; trackIndex < mExtractor->countTracks(); ++trackIndex) { size_t trackCount = mExtractor->countTracks(); for (size_t trackIndex = 0; trackIndex < trackCount; ++trackIndex) { mExtractor->getTrackMetaData(format, trackIndex, flags); } AMediaFormat_delete(format); return true; } bool ExtractorFuzzerBase::getMetadata() { void ExtractorFuzzerBase::getMetadata() { AMediaFormat* format = AMediaFormat_new(); mExtractor->getMetaData(format); AMediaFormat_delete(format); return true; } void ExtractorFuzzerBase::setDataSourceFlags(uint32_t flags) { mBufferSource->setFlags(flags); } void ExtractorFuzzerBase::seekAndExtractTracks() { MediaBufferGroup* bufferGroup = new MediaBufferGroup(); if (!bufferGroup) { return; } size_t trackCount = mExtractor->countTracks(); for (size_t trackIndex = 0; trackIndex < trackCount; ++trackIndex) { MediaTrackHelper* track = mExtractor->getTrack(trackIndex); if (!track) { continue; } AMediaFormat* trackMetaData = AMediaFormat_new(); int64_t trackDuration = 0; uint32_t flags = MediaExtractorPluginHelper::kIncludeExtensiveMetaData; mExtractor->getTrackMetaData(trackMetaData, trackIndex, flags); AMediaFormat_getInt64(trackMetaData, AMEDIAFORMAT_KEY_DURATION, &trackDuration); seekAndExtractTrack(track, bufferGroup, trackDuration); AMediaFormat_delete(trackMetaData); delete track; } delete bufferGroup; } void ExtractorFuzzerBase::seekAndExtractTrack(MediaTrackHelper* track, MediaBufferGroup* bufferGroup, int64_t trackDuration) { CMediaTrack* cTrack = wrap(track); if (!cTrack) { return; } media_status_t status = cTrack->start(track, bufferGroup->wrap()); if (status != AMEDIA_OK) { free(cTrack); return; } int32_t seekCount = 0; std::vector<int64_t> seekToTimeStamp; while (seekCount <= kFuzzerMaxSeekPointsCount) { /* This ensures kFuzzerMaxSeekPointsCount seek points are within the clipDuration and 1 seek * point is outside of the clipDuration. */ int64_t timeStamp = (seekCount * trackDuration) / (kFuzzerMaxSeekPointsCount - 1); seekToTimeStamp.push_back(timeStamp); seekCount++; } std::vector<uint32_t> seekOptions; seekOptions.push_back(CMediaTrackReadOptions::SEEK | CMediaTrackReadOptions::SEEK_CLOSEST); seekOptions.push_back(CMediaTrackReadOptions::SEEK | CMediaTrackReadOptions::SEEK_CLOSEST_SYNC); seekOptions.push_back(CMediaTrackReadOptions::SEEK | CMediaTrackReadOptions::SEEK_PREVIOUS_SYNC); seekOptions.push_back(CMediaTrackReadOptions::SEEK | CMediaTrackReadOptions::SEEK_NEXT_SYNC); seekOptions.push_back(CMediaTrackReadOptions::SEEK | CMediaTrackReadOptions::SEEK_FRAME_INDEX); for (uint32_t seekOption : seekOptions) { for (int64_t seekPts : seekToTimeStamp) { MediaTrackHelper::ReadOptions* options = new MediaTrackHelper::ReadOptions(seekOption, seekPts); MediaBufferHelper* buffer = nullptr; track->read(&buffer, options); if (buffer) { buffer->release(); } delete options; } } cTrack->stop(track); free(cTrack); }
media/extractors/fuzzers/include/ExtractorFuzzerBase.h +11 −4 Original line number Diff line number Diff line Loading @@ -24,11 +24,14 @@ #include <media/DataSource.h> #include <media/MediaExtractorPluginHelper.h> #include <media/stagefright/MediaBufferGroup.h> #include <vector> extern "C" { android::ExtractorDef GETEXTRACTORDEF(); } constexpr int32_t kFuzzerMaxSeekPointsCount = 5; namespace android { class ExtractorFuzzerBase { Loading @@ -55,16 +58,18 @@ class ExtractorFuzzerBase { */ bool setDataSource(const uint8_t* data, size_t size); bool getExtractorDef(); void getExtractorDef(); bool extractTracks(); void extractTracks(); bool getMetadata(); void getMetadata(); bool getTracksMetadata(); void getTracksMetadata(); void setDataSourceFlags(uint32_t flags); void seekAndExtractTracks(); protected: class BufferSource : public DataSource { public: Loading Loading @@ -123,6 +128,8 @@ class ExtractorFuzzerBase { MediaExtractorPluginHelper* mExtractor = nullptr; virtual void extractTrack(MediaTrackHelper* track, MediaBufferGroup* bufferGroup); virtual void seekAndExtractTrack(MediaTrackHelper* track, MediaBufferGroup* bufferGroup, int64_t trackDuration); }; } // namespace android Loading