C-ify DataSource
Add a C API for DataSource/Base, and a helper so extractors
can continue using a C++ API.
Bug: 111407253
Test: build, boot, play some files
Change-Id: I1c8b2990e17d18eee53c9abf7ebef2ced0e8b7fd
diff --git a/media/extractors/mp3/MP3Extractor.cpp b/media/extractors/mp3/MP3Extractor.cpp
index c86212c..a1e5593 100644
--- a/media/extractors/mp3/MP3Extractor.cpp
+++ b/media/extractors/mp3/MP3Extractor.cpp
@@ -24,7 +24,6 @@
#include "VBRISeeker.h"
#include "XINGSeeker.h"
-#include <media/DataSourceBase.h>
#include <media/MediaTrack.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
@@ -46,7 +45,7 @@
static const uint32_t kMask = 0xfffe0c00;
static bool Resync(
- DataSourceBase *source, uint32_t match_header,
+ DataSourceHelper *source, uint32_t match_header,
off64_t *inout_pos, off64_t *post_id3_pos, uint32_t *out_header) {
if (post_id3_pos != NULL) {
*post_id3_pos = 0;
@@ -212,7 +211,7 @@
class MP3Source : public MediaTrack {
public:
MP3Source(
- MetaDataBase &meta, DataSourceBase *source,
+ MetaDataBase &meta, DataSourceHelper *source,
off64_t first_frame_pos, uint32_t fixed_header,
MP3Seeker *seeker);
@@ -230,7 +229,7 @@
private:
static const size_t kMaxFrameSize;
MetaDataBase &mMeta;
- DataSourceBase *mDataSource;
+ DataSourceHelper *mDataSource;
off64_t mFirstFramePos;
uint32_t mFixedHeader;
off64_t mCurrentPos;
@@ -253,7 +252,7 @@
};
MP3Extractor::MP3Extractor(
- DataSourceBase *source, Mp3Meta *meta)
+ DataSourceHelper *source, Mp3Meta *meta)
: mInitCheck(NO_INIT),
mDataSource(source),
mFirstFramePos(-1),
@@ -371,7 +370,8 @@
// Get iTunes-style gapless info if present.
// When getting the id3 tag, skip the V1 tags to prevent the source cache
// from being iterated to the end of the file.
- ID3 id3(mDataSource, true);
+ DataSourceHelper helper(mDataSource);
+ ID3 id3(&helper, true);
if (id3.isValid()) {
ID3::Iterator *com = new ID3::Iterator(id3, "COM");
if (com->done()) {
@@ -404,6 +404,7 @@
MP3Extractor::~MP3Extractor() {
delete mSeeker;
+ delete mDataSource;
}
size_t MP3Extractor::countTracks() {
@@ -440,7 +441,7 @@
// Set our max frame size to the nearest power of 2 above this size (aka, 4kB)
const size_t MP3Source::kMaxFrameSize = (1 << 12); /* 4096 bytes */
MP3Source::MP3Source(
- MetaDataBase &meta, DataSourceBase *source,
+ MetaDataBase &meta, DataSourceHelper *source,
off64_t first_frame_pos, uint32_t fixed_header,
MP3Seeker *seeker)
: mMeta(meta),
@@ -612,7 +613,8 @@
}
meta.setCString(kKeyMIMEType, "audio/mpeg");
- ID3 id3(mDataSource);
+ DataSourceHelper helper(mDataSource);
+ ID3 id3(&helper);
if (!id3.isValid()) {
return OK;
@@ -670,20 +672,21 @@
}
static CMediaExtractor* CreateExtractor(
- DataSourceBase *source,
+ CDataSource *source,
void *meta) {
Mp3Meta *metaData = static_cast<Mp3Meta *>(meta);
- return wrap(new MP3Extractor(source, metaData));
+ return wrap(new MP3Extractor(new DataSourceHelper(source), metaData));
}
static CreatorFunc Sniff(
- DataSourceBase *source, float *confidence, void **meta,
+ CDataSource *source, float *confidence, void **meta,
FreeMetaFunc *freeMeta) {
off64_t pos = 0;
off64_t post_id3_pos;
uint32_t header;
uint8_t mpeg_header[5];
- if (source->readAt(0, mpeg_header, sizeof(mpeg_header)) < (ssize_t)sizeof(mpeg_header)) {
+ DataSourceHelper helper(source);
+ if (helper.readAt(0, mpeg_header, sizeof(mpeg_header)) < (ssize_t)sizeof(mpeg_header)) {
return NULL;
}
@@ -691,7 +694,7 @@
ALOGV("MPEG1PS container is not supported!");
return NULL;
}
- if (!Resync(source, 0, &pos, &post_id3_pos, &header)) {
+ if (!Resync(&helper, 0, &pos, &post_id3_pos, &header)) {
return NULL;
}
diff --git a/media/extractors/mp3/MP3Extractor.h b/media/extractors/mp3/MP3Extractor.h
index 8957302..585d9f6 100644
--- a/media/extractors/mp3/MP3Extractor.h
+++ b/media/extractors/mp3/MP3Extractor.h
@@ -25,15 +25,16 @@
namespace android {
+class DataSourceHelper;
+
struct AMessage;
-class DataSourceBase;
struct MP3Seeker;
class String8;
struct Mp3Meta;
class MP3Extractor : public MediaExtractorPluginHelper {
public:
- MP3Extractor(DataSourceBase *source, Mp3Meta *meta);
+ MP3Extractor(DataSourceHelper *source, Mp3Meta *meta);
~MP3Extractor();
virtual size_t countTracks();
@@ -46,7 +47,7 @@
private:
status_t mInitCheck;
- DataSourceBase *mDataSource;
+ DataSourceHelper *mDataSource;
off64_t mFirstFramePos;
MetaDataBase mMeta;
uint32_t mFixedHeader;
diff --git a/media/extractors/mp3/VBRISeeker.cpp b/media/extractors/mp3/VBRISeeker.cpp
index 523f14c..9eb72a7 100644
--- a/media/extractors/mp3/VBRISeeker.cpp
+++ b/media/extractors/mp3/VBRISeeker.cpp
@@ -27,7 +27,9 @@
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ByteUtils.h>
-#include <media/DataSourceBase.h>
+
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
namespace android {
@@ -37,7 +39,7 @@
// static
VBRISeeker *VBRISeeker::CreateFromSource(
- DataSourceBase *source, off64_t post_id3_pos) {
+ DataSourceHelper *source, off64_t post_id3_pos) {
off64_t pos = post_id3_pos;
uint8_t header[4];
diff --git a/media/extractors/mp3/VBRISeeker.h b/media/extractors/mp3/VBRISeeker.h
index 9213f6e..507899c 100644
--- a/media/extractors/mp3/VBRISeeker.h
+++ b/media/extractors/mp3/VBRISeeker.h
@@ -24,11 +24,11 @@
namespace android {
-class DataSourceBase;
+class DataSourceHelper;
struct VBRISeeker : public MP3Seeker {
static VBRISeeker *CreateFromSource(
- DataSourceBase *source, off64_t post_id3_pos);
+ DataSourceHelper *source, off64_t post_id3_pos);
virtual bool getDuration(int64_t *durationUs);
virtual bool getOffsetForTime(int64_t *timeUs, off64_t *pos);
diff --git a/media/extractors/mp3/XINGSeeker.cpp b/media/extractors/mp3/XINGSeeker.cpp
index 01e06ca..9f1fd7a 100644
--- a/media/extractors/mp3/XINGSeeker.cpp
+++ b/media/extractors/mp3/XINGSeeker.cpp
@@ -21,7 +21,9 @@
#include <media/stagefright/foundation/avc_utils.h>
#include <media/stagefright/foundation/ByteUtils.h>
-#include <media/DataSourceBase.h>
+
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
namespace android {
@@ -79,7 +81,7 @@
// static
XINGSeeker *XINGSeeker::CreateFromSource(
- DataSourceBase *source, off64_t first_frame_pos) {
+ DataSourceHelper *source, off64_t first_frame_pos) {
uint8_t buffer[4];
int offset = first_frame_pos;
diff --git a/media/extractors/mp3/XINGSeeker.h b/media/extractors/mp3/XINGSeeker.h
index 5867eae..9acee38 100644
--- a/media/extractors/mp3/XINGSeeker.h
+++ b/media/extractors/mp3/XINGSeeker.h
@@ -22,11 +22,11 @@
namespace android {
-class DataSourceBase;
+class DataSourceHelper;
struct XINGSeeker : public MP3Seeker {
static XINGSeeker *CreateFromSource(
- DataSourceBase *source, off64_t first_frame_pos);
+ DataSourceHelper *source, off64_t first_frame_pos);
virtual bool getDuration(int64_t *durationUs);
virtual bool getOffsetForTime(int64_t *timeUs, off64_t *pos);