Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f22cedb authored by Kris Alder's avatar Kris Alder Committed by Automerger Merge Worker
Browse files

Merge "libextractorfuzzerbase: Support to seek and extract tracks added" am: a66b1630

Change-Id: Ia2425940f78dc2a48eb2cb0450ceff7f7dd090fb
parents e7e3a931 a66b1630
Loading
Loading
Loading
Loading
+83 −12
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -67,7 +66,6 @@ bool ExtractorFuzzerBase::extractTracks() {
    delete track;
  }
  delete bufferGroup;
  return true;
}

void ExtractorFuzzerBase::extractTrack(MediaTrackHelper* track, MediaBufferGroup* bufferGroup) {
@@ -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);
}
+11 −4
Original line number Diff line number Diff line
@@ -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 {
@@ -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:
@@ -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