Remove RefBase from plugin-side DataSource
Extractor plugins now use DataSourceBase, which is not refcounted.
Framework-side DataSource derives from DataSourceBase and RefBase.
Also remove MediaExtractor::release, because it is not needed
anymore due to the way the extractor/track/datasource lifecycle
is managed now.
Also add source and target pid to CallbackDataSource name, to
make the extractor dumpsys more useful.
Bug: 67908556
Test: build, boot, CTS, skia test app for heif
Change-Id: I6b9cbe903f76b0cf27ba87f4a456f424803efd08
diff --git a/include/media/DataSourceBase.h b/include/media/DataSourceBase.h
new file mode 120000
index 0000000..54c8047
--- /dev/null
+++ b/include/media/DataSourceBase.h
@@ -0,0 +1 @@
+../../media/libmediaextractor/include/media/DataSourceBase.h
\ No newline at end of file
diff --git a/media/extractors/aac/AACExtractor.cpp b/media/extractors/aac/AACExtractor.cpp
index 6f28374..1614ca4 100644
--- a/media/extractors/aac/AACExtractor.cpp
+++ b/media/extractors/aac/AACExtractor.cpp
@@ -19,7 +19,7 @@
#include <utils/Log.h>
#include "AACExtractor.h"
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/MediaSourceBase.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/AMessage.h>
@@ -35,7 +35,7 @@
class AACSource : public MediaSourceBase {
public:
- AACSource(const sp<DataSource> &source,
+ AACSource(DataSourceBase *source,
const sp<MetaData> &meta,
const Vector<uint64_t> &offset_vector,
int64_t frame_duration_us);
@@ -53,7 +53,7 @@
private:
static const size_t kMaxFrameSize;
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
sp<MetaData> mMeta;
off64_t mOffset;
@@ -91,7 +91,7 @@
// The returned value is the AAC frame size with the ADTS header length (regardless of
// the presence of the CRC).
// If headerSize is non-NULL, it will be used to return the size of the header of this ADTS frame.
-static size_t getAdtsFrameLength(const sp<DataSource> &source, off64_t offset, size_t* headerSize) {
+static size_t getAdtsFrameLength(DataSourceBase *source, off64_t offset, size_t* headerSize) {
const size_t kAdtsHeaderLengthNoCrc = 7;
const size_t kAdtsHeaderLengthWithCrc = 9;
@@ -132,7 +132,7 @@
}
AACExtractor::AACExtractor(
- const sp<DataSource> &source, const sp<AMessage> &_meta)
+ DataSourceBase *source, const sp<AMessage> &_meta)
: mDataSource(source),
mInitCheck(NO_INIT),
mFrameDurationUs(0) {
@@ -229,7 +229,7 @@
const size_t AACSource::kMaxFrameSize = 8192;
AACSource::AACSource(
- const sp<DataSource> &source, const sp<MetaData> &meta,
+ DataSourceBase *source, const sp<MetaData> &meta,
const Vector<uint64_t> &offset_vector,
int64_t frame_duration_us)
: mDataSource(source),
@@ -332,13 +332,13 @@
////////////////////////////////////////////////////////////////////////////////
static MediaExtractor* CreateExtractor(
- const sp<DataSource> &source,
+ DataSourceBase *source,
const sp<AMessage>& meta) {
return new AACExtractor(source, meta);
}
static MediaExtractor::CreatorFunc Sniff(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *meta) {
off64_t pos = 0;
diff --git a/media/extractors/aac/AACExtractor.h b/media/extractors/aac/AACExtractor.h
index 33fbba7..e99699c 100644
--- a/media/extractors/aac/AACExtractor.h
+++ b/media/extractors/aac/AACExtractor.h
@@ -29,7 +29,7 @@
class AACExtractor : public MediaExtractor {
public:
- AACExtractor(const sp<DataSource> &source, const sp<AMessage> &meta);
+ AACExtractor(DataSourceBase *source, const sp<AMessage> &meta);
virtual size_t countTracks();
virtual MediaSourceBase *getTrack(size_t index);
@@ -42,7 +42,7 @@
virtual ~AACExtractor();
private:
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
sp<MetaData> mMeta;
status_t mInitCheck;
@@ -54,7 +54,7 @@
};
bool SniffAAC(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *);
} // namespace android
diff --git a/media/extractors/amr/AMRExtractor.cpp b/media/extractors/amr/AMRExtractor.cpp
index 10be50c..547e3f5 100644
--- a/media/extractors/amr/AMRExtractor.cpp
+++ b/media/extractors/amr/AMRExtractor.cpp
@@ -20,7 +20,7 @@
#include "AMRExtractor.h"
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/MediaSourceBase.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/MediaBufferGroup.h>
@@ -33,7 +33,7 @@
class AMRSource : public MediaSourceBase {
public:
- AMRSource(const sp<DataSource> &source,
+ AMRSource(DataSourceBase *source,
const sp<MetaData> &meta,
bool isWide,
const off64_t *offset_table,
@@ -51,7 +51,7 @@
virtual ~AMRSource();
private:
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
sp<MetaData> mMeta;
bool mIsWide;
@@ -97,7 +97,7 @@
return frameSize;
}
-static status_t getFrameSizeByOffset(const sp<DataSource> &source,
+static status_t getFrameSizeByOffset(DataSourceBase *source,
off64_t offset, bool isWide, size_t *frameSize) {
uint8_t header;
ssize_t count = source->readAt(offset, &header, 1);
@@ -116,7 +116,7 @@
return OK;
}
-AMRExtractor::AMRExtractor(const sp<DataSource> &source)
+AMRExtractor::AMRExtractor(DataSourceBase *source)
: mDataSource(source),
mInitCheck(NO_INIT),
mOffsetTableLength(0) {
@@ -206,7 +206,7 @@
////////////////////////////////////////////////////////////////////////////////
AMRSource::AMRSource(
- const sp<DataSource> &source, const sp<MetaData> &meta,
+ DataSourceBase *source, const sp<MetaData> &meta,
bool isWide, const off64_t *offset_table, size_t offset_table_length)
: mDataSource(source),
mMeta(meta),
@@ -339,7 +339,7 @@
////////////////////////////////////////////////////////////////////////////////
bool SniffAMR(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *) {
char header[9];
@@ -372,13 +372,13 @@
1,
"AMR Extractor",
[](
- const sp<DataSource> &source,
+ DataSourceBase *source,
String8 *mimeType,
float *confidence,
sp<AMessage> *meta __unused) -> MediaExtractor::CreatorFunc {
if (SniffAMR(source, mimeType, confidence, meta)) {
return [](
- const sp<DataSource> &source,
+ DataSourceBase *source,
const sp<AMessage>& meta __unused) -> MediaExtractor* {
return new AMRExtractor(source);};
}
diff --git a/media/extractors/amr/AMRExtractor.h b/media/extractors/amr/AMRExtractor.h
index 56883e3..d6d49f2 100644
--- a/media/extractors/amr/AMRExtractor.h
+++ b/media/extractors/amr/AMRExtractor.h
@@ -29,7 +29,7 @@
class AMRExtractor : public MediaExtractor {
public:
- explicit AMRExtractor(const sp<DataSource> &source);
+ explicit AMRExtractor(DataSourceBase *source);
virtual size_t countTracks();
virtual MediaSourceBase *getTrack(size_t index);
@@ -42,7 +42,7 @@
virtual ~AMRExtractor();
private:
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
sp<MetaData> mMeta;
status_t mInitCheck;
bool mIsWide;
@@ -55,7 +55,7 @@
};
bool SniffAMR(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *);
} // namespace android
diff --git a/media/extractors/flac/FLACExtractor.cpp b/media/extractors/flac/FLACExtractor.cpp
index ba28e86..8dbb5a1 100644
--- a/media/extractors/flac/FLACExtractor.cpp
+++ b/media/extractors/flac/FLACExtractor.cpp
@@ -22,7 +22,7 @@
// libFLAC parser
#include "FLAC/stream_decoder.h"
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/MediaSourceBase.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
@@ -165,7 +165,7 @@
public:
FLACSource(
- const sp<DataSource> &dataSource,
+ DataSourceBase *dataSource,
const sp<MetaData> &trackMetadata);
virtual status_t start(MetaData *params);
@@ -179,7 +179,7 @@
virtual ~FLACSource();
private:
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
sp<MetaData> mTrackMetadata;
sp<FLACParser> mParser;
bool mInitCheck;
@@ -203,7 +203,7 @@
};
explicit FLACParser(
- const sp<DataSource> &dataSource,
+ DataSourceBase *dataSource,
// If metadata pointers aren't provided, we don't fill them
const sp<MetaData> &fileMetadata = 0,
const sp<MetaData> &trackMetadata = 0);
@@ -243,7 +243,7 @@
virtual ~FLACParser();
private:
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
sp<MetaData> mFileMetadata;
sp<MetaData> mTrackMetadata;
bool mInitCheck;
@@ -612,7 +612,7 @@
// FLACParser
FLACParser::FLACParser(
- const sp<DataSource> &dataSource,
+ DataSourceBase *dataSource,
const sp<MetaData> &fileMetadata,
const sp<MetaData> &trackMetadata)
: mDataSource(dataSource),
@@ -833,7 +833,7 @@
// FLACsource
FLACSource::FLACSource(
- const sp<DataSource> &dataSource,
+ DataSourceBase *dataSource,
const sp<MetaData> &trackMetadata)
: mDataSource(dataSource),
mTrackMetadata(trackMetadata),
@@ -918,7 +918,7 @@
// FLACExtractor
FLACExtractor::FLACExtractor(
- const sp<DataSource> &dataSource)
+ DataSourceBase *dataSource)
: mDataSource(dataSource),
mInitCheck(false)
{
@@ -969,7 +969,7 @@
// Sniffer
bool SniffFLAC(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *)
{
// first 4 is the signature word
@@ -1000,13 +1000,13 @@
1,
"FLAC Extractor",
[](
- const sp<DataSource> &source,
+ DataSourceBase *source,
String8 *mimeType,
float *confidence,
sp<AMessage> *meta __unused) -> MediaExtractor::CreatorFunc {
if (SniffFLAC(source, mimeType, confidence, meta)) {
return [](
- const sp<DataSource> &source,
+ DataSourceBase *source,
const sp<AMessage>& meta __unused) -> MediaExtractor* {
return new FLACExtractor(source);};
}
diff --git a/media/extractors/flac/FLACExtractor.h b/media/extractors/flac/FLACExtractor.h
index 2e7ee3b..ef07212 100644
--- a/media/extractors/flac/FLACExtractor.h
+++ b/media/extractors/flac/FLACExtractor.h
@@ -17,7 +17,7 @@
#ifndef FLAC_EXTRACTOR_H_
#define FLAC_EXTRACTOR_H_
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/MediaExtractor.h>
#include <utils/String8.h>
@@ -28,8 +28,7 @@
class FLACExtractor : public MediaExtractor {
public:
- // Extractor assumes ownership of source
- explicit FLACExtractor(const sp<DataSource> &source);
+ explicit FLACExtractor(DataSourceBase *source);
virtual size_t countTracks();
virtual MediaSourceBase *getTrack(size_t index);
@@ -42,7 +41,7 @@
virtual ~FLACExtractor();
private:
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
sp<FLACParser> mParser;
status_t mInitCheck;
sp<MetaData> mFileMetadata;
@@ -57,7 +56,7 @@
};
-bool SniffFLAC(const sp<DataSource> &source, String8 *mimeType,
+bool SniffFLAC(DataSourceBase *source, String8 *mimeType,
float *confidence, sp<AMessage> *);
} // namespace android
diff --git a/media/extractors/midi/MidiExtractor.cpp b/media/extractors/midi/MidiExtractor.cpp
index 18b1d23..711c6a5 100644
--- a/media/extractors/midi/MidiExtractor.cpp
+++ b/media/extractors/midi/MidiExtractor.cpp
@@ -141,7 +141,7 @@
// MidiEngine
-MidiEngine::MidiEngine(const sp<DataSource> &dataSource,
+MidiEngine::MidiEngine(DataSourceBase *dataSource,
const sp<MetaData> &fileMetadata,
const sp<MetaData> &trackMetadata) :
mGroup(NULL),
@@ -261,7 +261,7 @@
// MidiExtractor
MidiExtractor::MidiExtractor(
- const sp<DataSource> &dataSource)
+ DataSourceBase *dataSource)
: mDataSource(dataSource),
mInitCheck(false)
{
@@ -308,7 +308,7 @@
// Sniffer
bool SniffMidi(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *)
{
sp<MidiEngine> p = new MidiEngine(source, NULL, NULL);
@@ -333,13 +333,13 @@
1,
"MIDI Extractor",
[](
- const sp<DataSource> &source,
+ DataSourceBase *source,
String8 *mimeType,
float *confidence,
sp<AMessage> *meta __unused) -> MediaExtractor::CreatorFunc {
if (SniffMidi(source, mimeType, confidence, meta)) {
return [](
- const sp<DataSource> &source,
+ DataSourceBase *source,
const sp<AMessage>& meta __unused) -> MediaExtractor* {
return new MidiExtractor(source);};
}
diff --git a/media/extractors/midi/MidiExtractor.h b/media/extractors/midi/MidiExtractor.h
index 87e4654..91efd06 100644
--- a/media/extractors/midi/MidiExtractor.h
+++ b/media/extractors/midi/MidiExtractor.h
@@ -17,7 +17,7 @@
#ifndef MIDI_EXTRACTOR_H_
#define MIDI_EXTRACTOR_H_
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/MediaExtractor.h>
#include <media/stagefright/MediaBuffer.h>
#include <media/stagefright/MediaBufferGroup.h>
@@ -29,7 +29,7 @@
class MidiEngine : public RefBase {
public:
- MidiEngine(const sp<DataSource> &dataSource,
+ MidiEngine(DataSourceBase *dataSource,
const sp<MetaData> &fileMetadata,
const sp<MetaData> &trackMetadata);
~MidiEngine();
@@ -52,8 +52,7 @@
class MidiExtractor : public MediaExtractor {
public:
- // Extractor assumes ownership of source
- explicit MidiExtractor(const sp<DataSource> &source);
+ explicit MidiExtractor(DataSourceBase *source);
virtual size_t countTracks();
virtual MediaSourceBase *getTrack(size_t index);
@@ -66,7 +65,7 @@
virtual ~MidiExtractor();
private:
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
status_t mInitCheck;
sp<MetaData> mFileMetadata;
@@ -88,7 +87,7 @@
};
-bool SniffMidi(const sp<DataSource> &source, String8 *mimeType,
+bool SniffMidi(DataSourceBase *source, String8 *mimeType,
float *confidence, sp<AMessage> *);
} // namespace android
diff --git a/media/extractors/mkv/MatroskaExtractor.cpp b/media/extractors/mkv/MatroskaExtractor.cpp
index 6df0012..f61f7c7 100644
--- a/media/extractors/mkv/MatroskaExtractor.cpp
+++ b/media/extractors/mkv/MatroskaExtractor.cpp
@@ -21,7 +21,7 @@
#include "FLACDecoder.h"
#include "MatroskaExtractor.h"
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/MediaSourceBase.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AUtils.h>
@@ -40,8 +40,8 @@
namespace android {
-struct DataSourceReader : public mkvparser::IMkvReader {
- explicit DataSourceReader(const sp<DataSource> &source)
+struct DataSourceBaseReader : public mkvparser::IMkvReader {
+ explicit DataSourceBaseReader(DataSourceBase *source)
: mSource(source) {
}
@@ -83,10 +83,10 @@
}
private:
- sp<DataSource> mSource;
+ DataSourceBase *mSource;
- DataSourceReader(const DataSourceReader &);
- DataSourceReader &operator=(const DataSourceReader &);
+ DataSourceBaseReader(const DataSourceBaseReader &);
+ DataSourceBaseReader &operator=(const DataSourceBaseReader &);
};
////////////////////////////////////////////////////////////////////////////////
@@ -852,9 +852,9 @@
////////////////////////////////////////////////////////////////////////////////
-MatroskaExtractor::MatroskaExtractor(const sp<DataSource> &source)
+MatroskaExtractor::MatroskaExtractor(DataSourceBase *source)
: mDataSource(source),
- mReader(new DataSourceReader(mDataSource)),
+ mReader(new DataSourceBaseReader(mDataSource)),
mSegment(NULL),
mExtractedThumbnails(false),
mIsWebm(false),
@@ -862,8 +862,8 @@
off64_t size;
mIsLiveStreaming =
(mDataSource->flags()
- & (DataSource::kWantsPrefetching
- | DataSource::kIsCachingDataSource))
+ & (DataSourceBase::kWantsPrefetching
+ | DataSourceBase::kIsCachingDataSource))
&& mDataSource->getSize(&size) != OK;
mkvparser::EBMLHeader ebmlHeader;
@@ -1548,9 +1548,9 @@
}
bool SniffMatroska(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *) {
- DataSourceReader reader(source);
+ DataSourceBaseReader reader(source);
mkvparser::EBMLHeader ebmlHeader;
long long pos;
if (ebmlHeader.Parse(&reader, pos) < 0) {
@@ -1574,13 +1574,13 @@
1,
"Matroska Extractor",
[](
- const sp<DataSource> &source,
+ DataSourceBase *source,
String8 *mimeType,
float *confidence,
sp<AMessage> *meta __unused) -> MediaExtractor::CreatorFunc {
if (SniffMatroska(source, mimeType, confidence, meta)) {
return [](
- const sp<DataSource> &source,
+ DataSourceBase *source,
const sp<AMessage>& meta __unused) -> MediaExtractor* {
return new MatroskaExtractor(source);};
}
diff --git a/media/extractors/mkv/MatroskaExtractor.h b/media/extractors/mkv/MatroskaExtractor.h
index 54419bf..095452b 100644
--- a/media/extractors/mkv/MatroskaExtractor.h
+++ b/media/extractors/mkv/MatroskaExtractor.h
@@ -30,11 +30,11 @@
class String8;
class MetaData;
-struct DataSourceReader;
+struct DataSourceBaseReader;
struct MatroskaSource;
struct MatroskaExtractor : public MediaExtractor {
- explicit MatroskaExtractor(const sp<DataSource> &source);
+ explicit MatroskaExtractor(DataSourceBase *source);
virtual size_t countTracks();
@@ -76,8 +76,8 @@
Mutex mLock;
Vector<TrackInfo> mTracks;
- sp<DataSource> mDataSource;
- DataSourceReader *mReader;
+ DataSourceBase *mDataSource;
+ DataSourceBaseReader *mReader;
mkvparser::Segment *mSegment;
bool mExtractedThumbnails;
bool mIsLiveStreaming;
@@ -96,7 +96,7 @@
};
bool SniffMatroska(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *);
} // namespace android
diff --git a/media/extractors/mp3/MP3Extractor.cpp b/media/extractors/mp3/MP3Extractor.cpp
index 7e27fd8..25d4deb 100644
--- a/media/extractors/mp3/MP3Extractor.cpp
+++ b/media/extractors/mp3/MP3Extractor.cpp
@@ -24,7 +24,7 @@
#include "VBRISeeker.h"
#include "XINGSeeker.h"
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/MediaSourceBase.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
@@ -46,7 +46,7 @@
static const uint32_t kMask = 0xfffe0c00;
static bool Resync(
- const sp<DataSource> &source, uint32_t match_header,
+ DataSourceBase *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 +212,7 @@
class MP3Source : public MediaSourceBase {
public:
MP3Source(
- const sp<MetaData> &meta, const sp<DataSource> &source,
+ const sp<MetaData> &meta, DataSourceBase *source,
off64_t first_frame_pos, uint32_t fixed_header,
const sp<MP3Seeker> &seeker);
@@ -230,7 +230,7 @@
private:
static const size_t kMaxFrameSize;
sp<MetaData> mMeta;
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
off64_t mFirstFramePos;
uint32_t mFixedHeader;
off64_t mCurrentPos;
@@ -247,7 +247,7 @@
};
MP3Extractor::MP3Extractor(
- const sp<DataSource> &source, const sp<AMessage> &meta)
+ DataSourceBase *source, const sp<AMessage> &meta)
: mInitCheck(NO_INIT),
mDataSource(source),
mFirstFramePos(-1),
@@ -436,7 +436,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(
- const sp<MetaData> &meta, const sp<DataSource> &source,
+ const sp<MetaData> &meta, DataSourceBase *source,
off64_t first_frame_pos, uint32_t fixed_header,
const sp<MP3Seeker> &seeker)
: mMeta(meta),
@@ -667,13 +667,13 @@
}
static MediaExtractor* CreateExtractor(
- const sp<DataSource> &source,
+ DataSourceBase *source,
const sp<AMessage>& meta) {
return new MP3Extractor(source, meta);
}
static MediaExtractor::CreatorFunc Sniff(
- const sp<DataSource> &source, String8 *mimeType,
+ DataSourceBase *source, String8 *mimeType,
float *confidence, sp<AMessage> *meta) {
off64_t pos = 0;
off64_t post_id3_pos;
diff --git a/media/extractors/mp3/MP3Extractor.h b/media/extractors/mp3/MP3Extractor.h
index 3b3387d..6257112 100644
--- a/media/extractors/mp3/MP3Extractor.h
+++ b/media/extractors/mp3/MP3Extractor.h
@@ -24,14 +24,13 @@
namespace android {
struct AMessage;
-class DataSource;
+class DataSourceBase;
struct MP3Seeker;
class String8;
class MP3Extractor : public MediaExtractor {
public:
- // Extractor assumes ownership of "source".
- MP3Extractor(const sp<DataSource> &source, const sp<AMessage> &meta);
+ MP3Extractor(DataSourceBase *source, const sp<AMessage> &meta);
virtual size_t countTracks();
virtual MediaSourceBase *getTrack(size_t index);
@@ -43,7 +42,7 @@
private:
status_t mInitCheck;
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
off64_t mFirstFramePos;
sp<MetaData> mMeta;
uint32_t mFixedHeader;
@@ -54,7 +53,7 @@
};
bool SniffMP3(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *meta);
} // namespace android
diff --git a/media/extractors/mp3/VBRISeeker.cpp b/media/extractors/mp3/VBRISeeker.cpp
index e7db6fd..51c5d1f 100644
--- a/media/extractors/mp3/VBRISeeker.cpp
+++ b/media/extractors/mp3/VBRISeeker.cpp
@@ -27,7 +27,7 @@
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ByteUtils.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
namespace android {
@@ -37,7 +37,7 @@
// static
sp<VBRISeeker> VBRISeeker::CreateFromSource(
- const sp<DataSource> &source, off64_t post_id3_pos) {
+ DataSourceBase *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 87258b0..e46af36 100644
--- a/media/extractors/mp3/VBRISeeker.h
+++ b/media/extractors/mp3/VBRISeeker.h
@@ -24,11 +24,11 @@
namespace android {
-class DataSource;
+class DataSourceBase;
struct VBRISeeker : public MP3Seeker {
static sp<VBRISeeker> CreateFromSource(
- const sp<DataSource> &source, off64_t post_id3_pos);
+ DataSourceBase *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 fa59701..adfa8d2 100644
--- a/media/extractors/mp3/XINGSeeker.cpp
+++ b/media/extractors/mp3/XINGSeeker.cpp
@@ -21,7 +21,7 @@
#include <media/stagefright/foundation/avc_utils.h>
#include <media/stagefright/foundation/ByteUtils.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
namespace android {
@@ -77,7 +77,7 @@
// static
sp<XINGSeeker> XINGSeeker::CreateFromSource(
- const sp<DataSource> &source, off64_t first_frame_pos) {
+ DataSourceBase *source, off64_t first_frame_pos) {
sp<XINGSeeker> seeker = new XINGSeeker;
seeker->mFirstFramePos = first_frame_pos;
diff --git a/media/extractors/mp3/XINGSeeker.h b/media/extractors/mp3/XINGSeeker.h
index 37077c4..db847bc 100644
--- a/media/extractors/mp3/XINGSeeker.h
+++ b/media/extractors/mp3/XINGSeeker.h
@@ -22,11 +22,11 @@
namespace android {
-class DataSource;
+class DataSourceBase;
struct XINGSeeker : public MP3Seeker {
static sp<XINGSeeker> CreateFromSource(
- const sp<DataSource> &source, off64_t first_frame_pos);
+ DataSourceBase *source, off64_t first_frame_pos);
virtual bool getDuration(int64_t *durationUs);
virtual bool getOffsetForTime(int64_t *timeUs, off64_t *pos);
diff --git a/media/extractors/mp4/ItemTable.cpp b/media/extractors/mp4/ItemTable.cpp
index 85c66b2..cef5f4a 100644
--- a/media/extractors/mp4/ItemTable.cpp
+++ b/media/extractors/mp4/ItemTable.cpp
@@ -18,7 +18,7 @@
#define LOG_TAG "ItemTable"
#include <ItemTable.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/stagefright/MetaData.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/foundation/ABuffer.h>
@@ -87,7 +87,7 @@
struct Box {
protected:
- Box(const sp<DataSource> source, uint32_t type) :
+ Box(DataSourceBase *source, uint32_t type) :
mDataSource(source), mType(type) {}
virtual ~Box() {}
@@ -99,14 +99,14 @@
inline uint32_t type() const { return mType; }
- inline sp<DataSource> source() const { return mDataSource; }
+ inline DataSourceBase *source() const { return mDataSource; }
status_t parseChunk(off64_t *offset);
status_t parseChunks(off64_t offset, size_t size);
private:
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
uint32_t mType;
};
@@ -181,7 +181,7 @@
struct FullBox : public Box {
protected:
- FullBox(const sp<DataSource> source, uint32_t type) :
+ FullBox(DataSourceBase *source, uint32_t type) :
Box(source, type), mVersion(0), mFlags(0) {}
inline uint8_t version() const { return mVersion; }
@@ -216,7 +216,7 @@
//
struct PitmBox : public FullBox {
- PitmBox(const sp<DataSource> source) :
+ PitmBox(DataSourceBase *source) :
FullBox(source, FOURCC('p', 'i', 't', 'm')) {}
status_t parse(off64_t offset, size_t size, uint32_t *primaryItemId);
@@ -296,7 +296,7 @@
};
struct IlocBox : public FullBox {
- IlocBox(const sp<DataSource> source, KeyedVector<uint32_t, ItemLoc> *itemLocs) :
+ IlocBox(DataSourceBase *source, KeyedVector<uint32_t, ItemLoc> *itemLocs) :
FullBox(source, FOURCC('i', 'l', 'o', 'c')),
mItemLocs(itemLocs), mHasConstructMethod1(false) {}
@@ -466,7 +466,7 @@
//
struct ItemReference : public Box, public RefBase {
- ItemReference(const sp<DataSource> source, uint32_t type, uint32_t itemIdSize) :
+ ItemReference(DataSourceBase *source, uint32_t type, uint32_t itemIdSize) :
Box(source, type), mItemId(0), mRefIdSize(itemIdSize) {}
status_t parse(off64_t offset, size_t size);
@@ -575,7 +575,7 @@
}
struct IrefBox : public FullBox {
- IrefBox(const sp<DataSource> source, Vector<sp<ItemReference> > *itemRefs) :
+ IrefBox(DataSourceBase *source, Vector<sp<ItemReference> > *itemRefs) :
FullBox(source, FOURCC('i', 'r', 'e', 'f')), mRefIdSize(0), mItemRefs(itemRefs) {}
status_t parse(off64_t offset, size_t size);
@@ -637,7 +637,7 @@
};
struct IspeBox : public FullBox, public ItemProperty {
- IspeBox(const sp<DataSource> source) :
+ IspeBox(DataSourceBase *source) :
FullBox(source, FOURCC('i', 's', 'p', 'e')), mWidth(0), mHeight(0) {}
status_t parse(off64_t offset, size_t size) override;
@@ -673,7 +673,7 @@
}
struct HvccBox : public Box, public ItemProperty {
- HvccBox(const sp<DataSource> source) :
+ HvccBox(DataSourceBase *source) :
Box(source, FOURCC('h', 'v', 'c', 'C')) {}
status_t parse(off64_t offset, size_t size) override;
@@ -706,7 +706,7 @@
}
struct IrotBox : public Box, public ItemProperty {
- IrotBox(const sp<DataSource> source) :
+ IrotBox(DataSourceBase *source) :
Box(source, FOURCC('i', 'r', 'o', 't')), mAngle(0) {}
status_t parse(off64_t offset, size_t size) override;
@@ -735,7 +735,7 @@
}
struct ColrBox : public Box, public ItemProperty {
- ColrBox(const sp<DataSource> source) :
+ ColrBox(DataSourceBase *source) :
Box(source, FOURCC('c', 'o', 'l', 'r')) {}
status_t parse(off64_t offset, size_t size) override;
@@ -783,7 +783,7 @@
}
struct IpmaBox : public FullBox {
- IpmaBox(const sp<DataSource> source, Vector<AssociationEntry> *associations) :
+ IpmaBox(DataSourceBase *source, Vector<AssociationEntry> *associations) :
FullBox(source, FOURCC('i', 'p', 'm', 'a')), mAssociations(associations) {}
status_t parse(off64_t offset, size_t size);
@@ -857,7 +857,7 @@
}
struct IpcoBox : public Box {
- IpcoBox(const sp<DataSource> source, Vector<sp<ItemProperty> > *properties) :
+ IpcoBox(DataSourceBase *source, Vector<sp<ItemProperty> > *properties) :
Box(source, FOURCC('i', 'p', 'c', 'o')), mItemProperties(properties) {}
status_t parse(off64_t offset, size_t size);
@@ -914,7 +914,7 @@
}
struct IprpBox : public Box {
- IprpBox(const sp<DataSource> source,
+ IprpBox(DataSourceBase *source,
Vector<sp<ItemProperty> > *properties,
Vector<AssociationEntry> *associations) :
Box(source, FOURCC('i', 'p', 'r', 'p')),
@@ -971,7 +971,7 @@
};
struct InfeBox : public FullBox {
- InfeBox(const sp<DataSource> source) :
+ InfeBox(DataSourceBase *source) :
FullBox(source, FOURCC('i', 'n', 'f', 'e')) {}
status_t parse(off64_t offset, size_t size, ItemInfo *itemInfo);
@@ -1075,7 +1075,7 @@
}
struct IinfBox : public FullBox {
- IinfBox(const sp<DataSource> source, Vector<ItemInfo> *itemInfos) :
+ IinfBox(DataSourceBase *source, Vector<ItemInfo> *itemInfos) :
FullBox(source, FOURCC('i', 'i', 'n', 'f')),
mItemInfos(itemInfos), mHasGrids(false) {}
@@ -1144,7 +1144,7 @@
//////////////////////////////////////////////////////////////////
-ItemTable::ItemTable(const sp<DataSource> &source)
+ItemTable::ItemTable(DataSourceBase *source)
: mDataSource(source),
mPrimaryItemId(0),
mIdatOffset(0),
diff --git a/media/extractors/mp4/ItemTable.h b/media/extractors/mp4/ItemTable.h
index 3d2e2ae..f4a69cc 100644
--- a/media/extractors/mp4/ItemTable.h
+++ b/media/extractors/mp4/ItemTable.h
@@ -25,7 +25,7 @@
namespace android {
-class DataSource;
+class DataSourceBase;
class MetaData;
namespace heif {
@@ -44,7 +44,7 @@
class ItemTable : public RefBase {
public:
- explicit ItemTable(const sp<DataSource> &source);
+ explicit ItemTable(DataSourceBase *source);
status_t parse(uint32_t type, off64_t offset, size_t size);
@@ -60,7 +60,7 @@
~ItemTable();
private:
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
KeyedVector<uint32_t, ItemLoc> mItemLocs;
Vector<ItemInfo> mItemInfos;
diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp
index 9f21db6..30dda13 100644
--- a/media/extractors/mp4/MPEG4Extractor.cpp
+++ b/media/extractors/mp4/MPEG4Extractor.cpp
@@ -69,7 +69,7 @@
public:
// Caller retains ownership of both "dataSource" and "sampleTable".
MPEG4Source(const sp<MetaData> &format,
- const sp<DataSource> &dataSource,
+ DataSourceBase *dataSource,
int32_t timeScale,
const sp<SampleTable> &sampleTable,
Vector<SidxEntry> &sidx,
@@ -93,7 +93,7 @@
Mutex mLock;
sp<MetaData> mFormat;
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
int32_t mTimescale;
sp<SampleTable> mSampleTable;
uint32_t mCurrentSampleIndex;
@@ -186,47 +186,51 @@
// all remaining requests to the wrapped datasource.
// This is used to cache the full sampletable metadata for a single track,
// possibly wrapping multiple times to cover all tracks, i.e.
-// Each MPEG4DataSource caches the sampletable metadata for a single track.
+// Each CachedRangedDataSource caches the sampletable metadata for a single track.
-struct MPEG4DataSource : public DataSource {
- explicit MPEG4DataSource(const sp<DataSource> &source);
+struct CachedRangedDataSource : public DataSourceBase {
+ explicit CachedRangedDataSource(DataSourceBase *source);
+ virtual ~CachedRangedDataSource();
virtual status_t initCheck() const;
virtual ssize_t readAt(off64_t offset, void *data, size_t size);
virtual status_t getSize(off64_t *size);
virtual uint32_t flags();
- status_t setCachedRange(off64_t offset, size_t size);
+ status_t setCachedRange(off64_t offset, size_t size, bool assumeSourceOwnershipOnSuccess);
-protected:
- virtual ~MPEG4DataSource();
private:
Mutex mLock;
- sp<DataSource> mSource;
+ DataSourceBase *mSource;
+ bool mOwnsDataSource;
off64_t mCachedOffset;
size_t mCachedSize;
uint8_t *mCache;
void clearCache();
- MPEG4DataSource(const MPEG4DataSource &);
- MPEG4DataSource &operator=(const MPEG4DataSource &);
+ CachedRangedDataSource(const CachedRangedDataSource &);
+ CachedRangedDataSource &operator=(const CachedRangedDataSource &);
};
-MPEG4DataSource::MPEG4DataSource(const sp<DataSource> &source)
+CachedRangedDataSource::CachedRangedDataSource(DataSourceBase *source)
: mSource(source),
+ mOwnsDataSource(false),
mCachedOffset(0),
mCachedSize(0),
mCache(NULL) {
}
-MPEG4DataSource::~MPEG4DataSource() {
+CachedRangedDataSource::~CachedRangedDataSource() {
clearCache();
+ if (mOwnsDataSource) {
+ delete (CachedRangedDataSource*)mSource;
+ }
}
-void MPEG4DataSource::clearCache() {
+void CachedRangedDataSource::clearCache() {
if (mCache) {
free(mCache);
mCache = NULL;
@@ -236,11 +240,11 @@
mCachedSize = 0;
}
-status_t MPEG4DataSource::initCheck() const {
+status_t CachedRangedDataSource::initCheck() const {
return mSource->initCheck();
}
-ssize_t MPEG4DataSource::readAt(off64_t offset, void *data, size_t size) {
+ssize_t CachedRangedDataSource::readAt(off64_t offset, void *data, size_t size) {
Mutex::Autolock autoLock(mLock);
if (isInRange(mCachedOffset, mCachedSize, offset, size)) {
@@ -251,15 +255,17 @@
return mSource->readAt(offset, data, size);
}
-status_t MPEG4DataSource::getSize(off64_t *size) {
+status_t CachedRangedDataSource::getSize(off64_t *size) {
return mSource->getSize(size);
}
-uint32_t MPEG4DataSource::flags() {
+uint32_t CachedRangedDataSource::flags() {
return mSource->flags();
}
-status_t MPEG4DataSource::setCachedRange(off64_t offset, size_t size) {
+status_t CachedRangedDataSource::setCachedRange(off64_t offset,
+ size_t size,
+ bool assumeSourceOwnershipOnSuccess) {
Mutex::Autolock autoLock(mLock);
clearCache();
@@ -280,7 +286,7 @@
return ERROR_IO;
}
-
+ mOwnsDataSource = assumeSourceOwnershipOnSuccess;
return OK;
}
@@ -334,11 +340,12 @@
return false;
}
-MPEG4Extractor::MPEG4Extractor(const sp<DataSource> &source, const char *mime)
+MPEG4Extractor::MPEG4Extractor(DataSourceBase *source, const char *mime)
: mMoofOffset(0),
mMoofFound(false),
mMdatFound(false),
mDataSource(source),
+ mCachedSource(NULL),
mInitCheck(NO_INIT),
mHeaderTimescale(0),
mIsQT(false),
@@ -354,10 +361,6 @@
}
MPEG4Extractor::~MPEG4Extractor() {
- release();
-}
-
-void MPEG4Extractor::release() {
Track *track = mFirstTrack;
while (track) {
Track *next = track->next;
@@ -381,10 +384,7 @@
}
mPssh.clear();
- if (mDataSource != NULL) {
- mDataSource->close();
- mDataSource.clear();
- }
+ delete mCachedSource;
}
uint32_t MPEG4Extractor::flags() const {
@@ -692,14 +692,14 @@
// Reads an encoded integer 7 bits at a time until it encounters the high bit clear.
static int32_t readSize(off64_t offset,
- const sp<DataSource> &DataSource, uint8_t *numOfBytes) {
+ DataSourceBase *DataSourceBase, uint8_t *numOfBytes) {
uint32_t size = 0;
uint8_t data;
bool moreData = true;
*numOfBytes = 0;
while (moreData) {
- if (DataSource->readAt(offset, &data, 1) < 1) {
+ if (DataSourceBase->readAt(offset, &data, 1) < 1) {
return -1;
}
offset ++;
@@ -1045,13 +1045,17 @@
ALOGV("sampleTable chunk is %" PRIu64 " bytes long.", chunk_size);
if (mDataSource->flags()
- & (DataSource::kWantsPrefetching
- | DataSource::kIsCachingDataSource)) {
- sp<MPEG4DataSource> cachedSource =
- new MPEG4DataSource(mDataSource);
+ & (DataSourceBase::kWantsPrefetching
+ | DataSourceBase::kIsCachingDataSource)) {
+ CachedRangedDataSource *cachedSource =
+ new CachedRangedDataSource(mDataSource);
- if (cachedSource->setCachedRange(*offset, chunk_size) == OK) {
- mDataSource = cachedSource;
+ if (cachedSource->setCachedRange(
+ *offset, chunk_size,
+ mCachedSource != NULL /* assume ownership on success */) == OK) {
+ mDataSource = mCachedSource = cachedSource;
+ } else {
+ delete cachedSource;
}
}
@@ -3890,7 +3894,7 @@
MPEG4Source::MPEG4Source(
const sp<MetaData> &format,
- const sp<DataSource> &dataSource,
+ DataSourceBase *dataSource,
int32_t timeScale,
const sp<SampleTable> &sampleTable,
Vector<SidxEntry> &sidx,
@@ -5379,7 +5383,7 @@
}
static bool LegacySniffMPEG4(
- const sp<DataSource> &source, String8 *mimeType, float *confidence) {
+ DataSourceBase *source, String8 *mimeType, float *confidence) {
uint8_t header[8];
ssize_t n = source->readAt(4, header, sizeof(header));
@@ -5446,7 +5450,7 @@
// (end of the 'moov' atom) and report it to the caller as part of
// the metadata.
static bool BetterSniffMPEG4(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *meta) {
// We scan up to 128 bytes to identify this file as an MP4.
static const off64_t kMaxScanOffset = 128ll;
@@ -5563,13 +5567,13 @@
}
static MediaExtractor* CreateExtractor(
- const sp<DataSource> &source,
+ DataSourceBase *source,
const sp<AMessage>& meta __unused) {
return new MPEG4Extractor(source);
}
static MediaExtractor::CreatorFunc Sniff(
- const sp<DataSource> &source,
+ DataSourceBase *source,
String8 *mimeType,
float *confidence,
sp<AMessage> *meta) {
diff --git a/media/extractors/mp4/MPEG4Extractor.h b/media/extractors/mp4/MPEG4Extractor.h
index e947b87..644c430 100644
--- a/media/extractors/mp4/MPEG4Extractor.h
+++ b/media/extractors/mp4/MPEG4Extractor.h
@@ -20,7 +20,7 @@
#include <arpa/inet.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/MediaExtractor.h>
#include <media/stagefright/foundation/AString.h>
#include <utils/List.h>
@@ -29,7 +29,8 @@
namespace android {
struct AMessage;
-class DataSource;
+class DataSourceBase;
+struct CachedRangedDataSource;
class SampleTable;
class String8;
namespace heif {
@@ -52,8 +53,7 @@
class MPEG4Extractor : public MediaExtractor {
public:
- // Extractor assumes ownership of "source".
- explicit MPEG4Extractor(const sp<DataSource> &source, const char *mime = NULL);
+ explicit MPEG4Extractor(DataSourceBase *source, const char *mime = NULL);
virtual size_t countTracks();
virtual MediaSourceBase *getTrack(size_t index);
@@ -62,7 +62,6 @@
virtual sp<MetaData> getMetaData();
virtual uint32_t flags() const;
virtual const char * name() { return "MPEG4Extractor"; }
- virtual void release();
// for DRM
virtual char* getDrmTrackInfo(size_t trackID, int *len);
@@ -98,7 +97,8 @@
Vector<Trex> mTrex;
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
+ CachedRangedDataSource *mCachedSource;
status_t mInitCheck;
uint32_t mHeaderTimescale;
bool mIsQT;
@@ -160,7 +160,7 @@
};
bool SniffMPEG4(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *);
} // namespace android
diff --git a/media/extractors/mp4/SampleIterator.cpp b/media/extractors/mp4/SampleIterator.cpp
index c194397..93ee7c6 100644
--- a/media/extractors/mp4/SampleIterator.cpp
+++ b/media/extractors/mp4/SampleIterator.cpp
@@ -22,7 +22,7 @@
#include <arpa/inet.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ByteUtils.h>
diff --git a/media/extractors/mp4/SampleTable.cpp b/media/extractors/mp4/SampleTable.cpp
index 378d63a..81c353e 100644
--- a/media/extractors/mp4/SampleTable.cpp
+++ b/media/extractors/mp4/SampleTable.cpp
@@ -25,7 +25,7 @@
#include <arpa/inet.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ByteUtils.h>
@@ -114,7 +114,7 @@
////////////////////////////////////////////////////////////////////////////////
-SampleTable::SampleTable(const sp<DataSource> &source)
+SampleTable::SampleTable(DataSourceBase *source)
: mDataSource(source),
mChunkOffsetOffset(-1),
mChunkOffsetType(0),
diff --git a/media/extractors/mp4/SampleTable.h b/media/extractors/mp4/SampleTable.h
index 466e26b..e4e974b 100644
--- a/media/extractors/mp4/SampleTable.h
+++ b/media/extractors/mp4/SampleTable.h
@@ -27,12 +27,12 @@
namespace android {
-class DataSource;
+class DataSourceBase;
struct SampleIterator;
class SampleTable : public RefBase {
public:
- explicit SampleTable(const sp<DataSource> &source);
+ explicit SampleTable(DataSourceBase *source);
bool isValid() const;
@@ -99,7 +99,7 @@
// Limit the total size of all internal tables to 200MiB.
static const size_t kMaxTotalSize = 200 * (1 << 20);
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
Mutex mLock;
off64_t mChunkOffsetOffset;
diff --git a/media/extractors/mpeg2/ExtractorBundle.cpp b/media/extractors/mpeg2/ExtractorBundle.cpp
index d5682e9..443d685 100644
--- a/media/extractors/mpeg2/ExtractorBundle.cpp
+++ b/media/extractors/mpeg2/ExtractorBundle.cpp
@@ -34,18 +34,18 @@
1,
"MPEG2-PS/TS Extractor",
[](
- const sp<DataSource> &source,
+ DataSourceBase *source,
String8 *mimeType,
float *confidence,
sp<AMessage> *meta __unused) -> MediaExtractor::CreatorFunc {
if (SniffMPEG2TS(source, mimeType, confidence, meta)) {
return [](
- const sp<DataSource> &source,
+ DataSourceBase *source,
const sp<AMessage>& meta __unused) -> MediaExtractor* {
return new MPEG2TSExtractor(source);};
} else if (SniffMPEG2PS(source, mimeType, confidence, meta)) {
return [](
- const sp<DataSource> &source,
+ DataSourceBase *source,
const sp<AMessage>& meta __unused) -> MediaExtractor* {
return new MPEG2PSExtractor(source);};
}
diff --git a/media/extractors/mpeg2/MPEG2PSExtractor.cpp b/media/extractors/mpeg2/MPEG2PSExtractor.cpp
index 0978387..697e44f 100644
--- a/media/extractors/mpeg2/MPEG2PSExtractor.cpp
+++ b/media/extractors/mpeg2/MPEG2PSExtractor.cpp
@@ -23,7 +23,7 @@
#include "mpeg2ts/AnotherPacketSource.h"
#include "mpeg2ts/ESQueue.h"
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/MediaSourceBase.h>
#include <media/stagefright/foundation/ABitReader.h>
#include <media/stagefright/foundation/ABuffer.h>
@@ -94,7 +94,7 @@
////////////////////////////////////////////////////////////////////////////////
-MPEG2PSExtractor::MPEG2PSExtractor(const sp<DataSource> &source)
+MPEG2PSExtractor::MPEG2PSExtractor(DataSourceBase *source)
: mDataSource(source),
mOffset(0),
mFinalResult(OK),
@@ -751,7 +751,7 @@
////////////////////////////////////////////////////////////////////////////////
bool SniffMPEG2PS(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *) {
uint8_t header[5];
if (source->readAt(0, header, sizeof(header)) < (ssize_t)sizeof(header)) {
diff --git a/media/extractors/mpeg2/MPEG2PSExtractor.h b/media/extractors/mpeg2/MPEG2PSExtractor.h
index f8a97ef..adf719a 100644
--- a/media/extractors/mpeg2/MPEG2PSExtractor.h
+++ b/media/extractors/mpeg2/MPEG2PSExtractor.h
@@ -31,7 +31,7 @@
class String8;
struct MPEG2PSExtractor : public MediaExtractor {
- explicit MPEG2PSExtractor(const sp<DataSource> &source);
+ explicit MPEG2PSExtractor(DataSourceBase *source);
virtual size_t countTracks();
virtual MediaSourceBase *getTrack(size_t index);
@@ -50,7 +50,7 @@
struct WrappedTrack;
mutable Mutex mLock;
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
off64_t mOffset;
status_t mFinalResult;
@@ -72,7 +72,7 @@
};
bool SniffMPEG2PS(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *);
} // namespace android
diff --git a/media/extractors/mpeg2/MPEG2TSExtractor.cpp b/media/extractors/mpeg2/MPEG2TSExtractor.cpp
index b24e8db..6d0b1cc 100644
--- a/media/extractors/mpeg2/MPEG2TSExtractor.cpp
+++ b/media/extractors/mpeg2/MPEG2TSExtractor.cpp
@@ -22,7 +22,7 @@
#include "MPEG2TSExtractor.h"
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/IStreamSource.h>
#include <media/MediaSourceBase.h>
#include <media/stagefright/foundation/ABuffer.h>
@@ -121,7 +121,7 @@
////////////////////////////////////////////////////////////////////////////////
-MPEG2TSExtractor::MPEG2TSExtractor(const sp<DataSource> &source)
+MPEG2TSExtractor::MPEG2TSExtractor(DataSourceBase *source)
: mDataSource(source),
mParser(new ATSParser),
mLastSyncEvent(0),
@@ -367,7 +367,7 @@
}
status_t MPEG2TSExtractor::estimateDurationsFromTimesUsAtEnd() {
- if (!(mDataSource->flags() & DataSource::kIsLocalFileSource)) {
+ if (!(mDataSource->flags() & DataSourceBase::kIsLocalFileSource)) {
return ERROR_UNSUPPORTED;
}
@@ -646,7 +646,7 @@
////////////////////////////////////////////////////////////////////////////////
bool SniffMPEG2TS(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *) {
for (int i = 0; i < 5; ++i) {
char header;
diff --git a/media/extractors/mpeg2/MPEG2TSExtractor.h b/media/extractors/mpeg2/MPEG2TSExtractor.h
index 362f016..57cb675 100644
--- a/media/extractors/mpeg2/MPEG2TSExtractor.h
+++ b/media/extractors/mpeg2/MPEG2TSExtractor.h
@@ -32,12 +32,12 @@
struct AMessage;
struct AnotherPacketSource;
struct ATSParser;
-class DataSource;
+class DataSourceBase;
struct MPEG2TSSource;
class String8;
struct MPEG2TSExtractor : public MediaExtractor {
- explicit MPEG2TSExtractor(const sp<DataSource> &source);
+ explicit MPEG2TSExtractor(DataSourceBase *source);
virtual size_t countTracks();
virtual MediaSourceBase *getTrack(size_t index);
@@ -55,7 +55,7 @@
mutable Mutex mLock;
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
sp<ATSParser> mParser;
@@ -79,9 +79,9 @@
// Try to feed more data from source to parser.
// |isInit| means this function is called inside init(). This is a signal to
// save SyncEvent so that init() can add SyncPoint after it updates |mSourceImpls|.
- // This function returns OK if expected amount of data is fed from DataSource to
+ // This function returns OK if expected amount of data is fed from DataSourceBase to
// parser and is successfully parsed. Otherwise, various error codes could be
- // returned, e.g., ERROR_END_OF_STREAM, or no data availalbe from DataSource, or
+ // returned, e.g., ERROR_END_OF_STREAM, or no data availalbe from DataSourceBase, or
// the data has syntax error during parsing, etc.
status_t feedMore(bool isInit = false);
status_t seek(int64_t seekTimeUs,
@@ -100,7 +100,7 @@
};
bool SniffMPEG2TS(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *);
} // namespace android
diff --git a/media/extractors/ogg/OggExtractor.cpp b/media/extractors/ogg/OggExtractor.cpp
index f62ec47..1d04bed 100644
--- a/media/extractors/ogg/OggExtractor.cpp
+++ b/media/extractors/ogg/OggExtractor.cpp
@@ -21,7 +21,7 @@
#include "OggExtractor.h"
#include <cutils/properties.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/MediaSourceBase.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
@@ -69,7 +69,7 @@
struct MyOggExtractor {
MyOggExtractor(
- const sp<DataSource> &source,
+ DataSourceBase *source,
const char *mimeType,
size_t numHeaders,
int64_t seekPreRollUs);
@@ -105,7 +105,7 @@
int64_t mTimeUs;
};
- sp<DataSource> mSource;
+ DataSourceBase *mSource;
off64_t mOffset;
Page mCurrentPage;
uint64_t mCurGranulePosition;
@@ -164,7 +164,7 @@
};
struct MyVorbisExtractor : public MyOggExtractor {
- explicit MyVorbisExtractor(const sp<DataSource> &source)
+ explicit MyVorbisExtractor(DataSourceBase *source)
: MyOggExtractor(source,
MEDIA_MIMETYPE_AUDIO_VORBIS,
/* numHeaders */ 3,
@@ -192,7 +192,7 @@
static const int32_t kOpusSampleRate = 48000;
static const int64_t kOpusSeekPreRollUs = 80000; // 80 ms
- explicit MyOpusExtractor(const sp<DataSource> &source)
+ explicit MyOpusExtractor(DataSourceBase *source)
: MyOggExtractor(source, MEDIA_MIMETYPE_AUDIO_OPUS, /*numHeaders*/ 2, kOpusSeekPreRollUs),
mChannelCount(0),
mCodecDelay(0),
@@ -294,7 +294,7 @@
////////////////////////////////////////////////////////////////////////////////
MyOggExtractor::MyOggExtractor(
- const sp<DataSource> &source,
+ DataSourceBase *source,
const char *mimeType,
size_t numHeaders,
int64_t seekPreRollUs)
@@ -852,7 +852,7 @@
off64_t size;
uint64_t lastGranulePosition;
- if (!(mSource->flags() & DataSource::kIsCachingDataSource)
+ if (!(mSource->flags() & DataSourceBase::kIsCachingDataSource)
&& mSource->getSize(&size) == OK
&& findPrevGranulePosition(size, &lastGranulePosition) == OK) {
// Let's assume it's cheap to seek to the end.
@@ -1315,7 +1315,7 @@
////////////////////////////////////////////////////////////////////////////////
-OggExtractor::OggExtractor(const sp<DataSource> &source)
+OggExtractor::OggExtractor(DataSourceBase *source)
: mDataSource(source),
mInitCheck(NO_INIT),
mImpl(NULL) {
@@ -1370,13 +1370,13 @@
}
static MediaExtractor* CreateExtractor(
- const sp<DataSource> &source,
+ DataSourceBase *source,
const sp<AMessage>& meta __unused) {
return new OggExtractor(source);
}
static MediaExtractor::CreatorFunc Sniff(
- const sp<DataSource> &source,
+ DataSourceBase *source,
String8 *mimeType,
float *confidence,
sp<AMessage> *) {
diff --git a/media/extractors/ogg/OggExtractor.h b/media/extractors/ogg/OggExtractor.h
index 126428c..c9c37eb 100644
--- a/media/extractors/ogg/OggExtractor.h
+++ b/media/extractors/ogg/OggExtractor.h
@@ -24,14 +24,14 @@
namespace android {
struct AMessage;
-class DataSource;
+class DataSourceBase;
class String8;
struct MyOggExtractor;
struct OggSource;
struct OggExtractor : public MediaExtractor {
- explicit OggExtractor(const sp<DataSource> &source);
+ explicit OggExtractor(DataSourceBase *source);
virtual size_t countTracks();
virtual MediaSourceBase *getTrack(size_t index);
@@ -46,7 +46,7 @@
private:
friend struct OggSource;
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
status_t mInitCheck;
MyOggExtractor *mImpl;
@@ -56,7 +56,7 @@
};
bool SniffOgg(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *);
} // namespace android
diff --git a/media/extractors/wav/WAVExtractor.cpp b/media/extractors/wav/WAVExtractor.cpp
index cf22c66..105a37f 100644
--- a/media/extractors/wav/WAVExtractor.cpp
+++ b/media/extractors/wav/WAVExtractor.cpp
@@ -21,7 +21,7 @@
#include "WAVExtractor.h"
#include <audio_utils/primitives.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/MediaSourceBase.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/MediaBufferGroup.h>
@@ -57,7 +57,7 @@
struct WAVSource : public MediaSourceBase {
WAVSource(
- const sp<DataSource> &dataSource,
+ DataSourceBase *dataSource,
const sp<MetaData> &meta,
uint16_t waveFormat,
int32_t bitsPerSample,
@@ -78,7 +78,7 @@
private:
static const size_t kMaxFrameSize;
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
sp<MetaData> mMeta;
uint16_t mWaveFormat;
int32_t mSampleRate;
@@ -94,7 +94,7 @@
WAVSource &operator=(const WAVSource &);
};
-WAVExtractor::WAVExtractor(const sp<DataSource> &source)
+WAVExtractor::WAVExtractor(DataSourceBase *source)
: mDataSource(source),
mValidFormat(false),
mChannelMask(CHANNEL_MASK_USE_CHANNEL_ORDER) {
@@ -348,7 +348,7 @@
const size_t WAVSource::kMaxFrameSize = 32768;
WAVSource::WAVSource(
- const sp<DataSource> &dataSource,
+ DataSourceBase *dataSource,
const sp<MetaData> &meta,
uint16_t waveFormat,
int32_t bitsPerSample,
@@ -545,13 +545,13 @@
////////////////////////////////////////////////////////////////////////////////
static MediaExtractor* CreateExtractor(
- const sp<DataSource> &source,
+ DataSourceBase *source,
const sp<AMessage>& meta __unused) {
return new WAVExtractor(source);
}
static MediaExtractor::CreatorFunc Sniff(
- const sp<DataSource> &source,
+ DataSourceBase *source,
String8 *mimeType,
float *confidence,
sp<AMessage> *) {
diff --git a/media/extractors/wav/WAVExtractor.h b/media/extractors/wav/WAVExtractor.h
index 47c3c40..67661ed 100644
--- a/media/extractors/wav/WAVExtractor.h
+++ b/media/extractors/wav/WAVExtractor.h
@@ -24,13 +24,12 @@
namespace android {
struct AMessage;
-class DataSource;
+class DataSourceBase;
class String8;
class WAVExtractor : public MediaExtractor {
public:
- // Extractor assumes ownership of "source".
- explicit WAVExtractor(const sp<DataSource> &source);
+ explicit WAVExtractor(DataSourceBase *source);
virtual size_t countTracks();
virtual MediaSourceBase *getTrack(size_t index);
@@ -42,7 +41,7 @@
virtual ~WAVExtractor();
private:
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
status_t mInitCheck;
bool mValidFormat;
uint16_t mWaveFormat;
diff --git a/media/libmedia/IMediaExtractor.cpp b/media/libmedia/IMediaExtractor.cpp
index a8a7b82..51ccb5a 100644
--- a/media/libmedia/IMediaExtractor.cpp
+++ b/media/libmedia/IMediaExtractor.cpp
@@ -39,8 +39,7 @@
SETMEDIACAS,
SETUID,
NAME,
- GETMETRICS,
- RELEASE,
+ GETMETRICS
};
class BpMediaExtractor : public BpInterface<IMediaExtractor> {
@@ -140,13 +139,6 @@
ALOGV("name NOT IMPLEMENTED");
return NULL;
}
-
- virtual void release() {
- ALOGV("release");
- Parcel data, reply;
- data.writeInterfaceToken(BpMediaExtractor::getInterfaceDescriptor());
- remote()->transact(RELEASE, data, &reply);
- }
};
IMPLEMENT_META_INTERFACE(MediaExtractor, "android.media.IMediaExtractor");
@@ -224,12 +216,6 @@
reply->writeInt32(setMediaCas(casToken));
return OK;
}
- case RELEASE: {
- ALOGV("release");
- CHECK_INTERFACE(IMediaExtractor, data, reply);
- release();
- return OK;
- }
default:
return BBinder::onTransact(code, data, reply, flags);
}
diff --git a/media/libmedia/MidiIoWrapper.cpp b/media/libmedia/MidiIoWrapper.cpp
index 4e5d67f..0896e75 100644
--- a/media/libmedia/MidiIoWrapper.cpp
+++ b/media/libmedia/MidiIoWrapper.cpp
@@ -47,7 +47,7 @@
mLength = size;
}
-MidiIoWrapper::MidiIoWrapper(const sp<DataSource> &source) {
+MidiIoWrapper::MidiIoWrapper(DataSourceBase *source) {
ALOGV("MidiIoWrapper(DataSource)");
mFd = -1;
mDataSource = source;
diff --git a/media/libmedia/include/media/IMediaExtractor.h b/media/libmedia/include/media/IMediaExtractor.h
index 44f8c1d..9899429 100644
--- a/media/libmedia/include/media/IMediaExtractor.h
+++ b/media/libmedia/include/media/IMediaExtractor.h
@@ -68,8 +68,6 @@
virtual void setUID(uid_t uid) = 0;
virtual const char * name() = 0;
-
- virtual void release() = 0;
};
diff --git a/media/libmedia/include/media/MidiIoWrapper.h b/media/libmedia/include/media/MidiIoWrapper.h
index 2754b2c..a27b410 100644
--- a/media/libmedia/include/media/MidiIoWrapper.h
+++ b/media/libmedia/include/media/MidiIoWrapper.h
@@ -19,7 +19,7 @@
#include <libsonivox/eas_types.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
namespace android {
@@ -27,7 +27,7 @@
public:
MidiIoWrapper(const char *path);
MidiIoWrapper(int fd, off64_t offset, int64_t size);
- MidiIoWrapper(const sp<DataSource> &source);
+ MidiIoWrapper(DataSourceBase *source);
~MidiIoWrapper();
@@ -40,7 +40,7 @@
int mFd;
off64_t mBase;
int64_t mLength;
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
EAS_FILE mEasFile;
};
diff --git a/media/libmediaextractor/Android.bp b/media/libmediaextractor/Android.bp
index 4071fba..8f4ba70 100644
--- a/media/libmediaextractor/Android.bp
+++ b/media/libmediaextractor/Android.bp
@@ -23,7 +23,7 @@
],
srcs: [
- "DataSource.cpp",
+ "DataSourceBase.cpp",
"MediaBuffer.cpp",
"MediaBufferGroup.cpp",
"MediaSourceBase.cpp",
diff --git a/media/libmediaextractor/DataSource.cpp b/media/libmediaextractor/DataSourceBase.cpp
similarity index 77%
rename from media/libmediaextractor/DataSource.cpp
rename to media/libmediaextractor/DataSourceBase.cpp
index 72959c6..d3af4eb 100644
--- a/media/libmediaextractor/DataSource.cpp
+++ b/media/libmediaextractor/DataSourceBase.cpp
@@ -14,16 +14,16 @@
* limitations under the License.
*/
//#define LOG_NDEBUG 0
-#define LOG_TAG "DataSource"
+#define LOG_TAG "DataSourceBase"
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/stagefright/foundation/ByteUtils.h>
#include <media/stagefright/MediaErrors.h>
#include <utils/String8.h>
namespace android {
-bool DataSource::getUInt16(off64_t offset, uint16_t *x) {
+bool DataSourceBase::getUInt16(off64_t offset, uint16_t *x) {
*x = 0;
uint8_t byte[2];
@@ -36,7 +36,7 @@
return true;
}
-bool DataSource::getUInt24(off64_t offset, uint32_t *x) {
+bool DataSourceBase::getUInt24(off64_t offset, uint32_t *x) {
*x = 0;
uint8_t byte[3];
@@ -49,7 +49,7 @@
return true;
}
-bool DataSource::getUInt32(off64_t offset, uint32_t *x) {
+bool DataSourceBase::getUInt32(off64_t offset, uint32_t *x) {
*x = 0;
uint32_t tmp;
@@ -62,7 +62,7 @@
return true;
}
-bool DataSource::getUInt64(off64_t offset, uint64_t *x) {
+bool DataSourceBase::getUInt64(off64_t offset, uint64_t *x) {
*x = 0;
uint64_t tmp;
@@ -75,7 +75,7 @@
return true;
}
-bool DataSource::getUInt16Var(off64_t offset, uint16_t *x, size_t size) {
+bool DataSourceBase::getUInt16Var(off64_t offset, uint16_t *x, size_t size) {
if (size == 2) {
return getUInt16(offset, x);
}
@@ -89,7 +89,7 @@
return false;
}
-bool DataSource::getUInt32Var(off64_t offset, uint32_t *x, size_t size) {
+bool DataSourceBase::getUInt32Var(off64_t offset, uint32_t *x, size_t size) {
if (size == 4) {
return getUInt32(offset, x);
}
@@ -103,7 +103,7 @@
return false;
}
-bool DataSource::getUInt64Var(off64_t offset, uint64_t *x, size_t size) {
+bool DataSourceBase::getUInt64Var(off64_t offset, uint64_t *x, size_t size) {
if (size == 8) {
return getUInt64(offset, x);
}
@@ -117,13 +117,13 @@
return false;
}
-status_t DataSource::getSize(off64_t *size) {
+status_t DataSourceBase::getSize(off64_t *size) {
*size = 0;
return ERROR_UNSUPPORTED;
}
-String8 DataSource::getMIMEType() const {
+String8 DataSourceBase::getMIMEType() const {
return String8("application/octet-stream");
}
diff --git a/media/libmediaextractor/include/media/DataSource.h b/media/libmediaextractor/include/media/DataSource.h
index 9f00e0a..a066183 100644
--- a/media/libmediaextractor/include/media/DataSource.h
+++ b/media/libmediaextractor/include/media/DataSource.h
@@ -20,75 +20,21 @@
#include <sys/types.h>
#include <media/stagefright/MediaErrors.h>
+#include <media/DataSourceBase.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
#include <utils/threads.h>
#include <drm/DrmManagerClient.h>
+
namespace android {
class String8;
-class DataSource : public RefBase {
+class DataSource : public DataSourceBase, public virtual RefBase {
public:
- enum Flags {
- kWantsPrefetching = 1,
- kStreamedFromLocalHost = 2,
- kIsCachingDataSource = 4,
- kIsHTTPBasedSource = 8,
- kIsLocalFileSource = 16,
- };
-
DataSource() {}
- virtual status_t initCheck() const = 0;
-
- // Returns the number of bytes read, or -1 on failure. It's not an error if
- // this returns zero; it just means the given offset is equal to, or
- // beyond, the end of the source.
- virtual ssize_t readAt(off64_t offset, void *data, size_t size) = 0;
-
- // Convenience methods:
- bool getUInt16(off64_t offset, uint16_t *x);
- bool getUInt24(off64_t offset, uint32_t *x); // 3 byte int, returned as a 32-bit int
- bool getUInt32(off64_t offset, uint32_t *x);
- bool getUInt64(off64_t offset, uint64_t *x);
-
- // read either int<N> or int<2N> into a uint<2N>_t, size is the int size in bytes.
- bool getUInt16Var(off64_t offset, uint16_t *x, size_t size);
- bool getUInt32Var(off64_t offset, uint32_t *x, size_t size);
- bool getUInt64Var(off64_t offset, uint64_t *x, size_t size);
-
- // May return ERROR_UNSUPPORTED.
- virtual status_t getSize(off64_t *size);
-
- virtual uint32_t flags() {
- return 0;
- }
-
- virtual String8 toString() {
- return String8("<unspecified>");
- }
-
- virtual status_t reconnectAtOffset(off64_t /*offset*/) {
- return ERROR_UNSUPPORTED;
- }
-
- ////////////////////////////////////////////////////////////////////////////
-
- // for DRM
- virtual sp<DecryptHandle> DrmInitialization(const char * /*mime*/ = NULL) {
- return NULL;
- }
-
- virtual String8 getUri() {
- return String8();
- }
-
- virtual String8 getMIMEType() const;
-
- virtual void close() {};
-
protected:
virtual ~DataSource() {}
diff --git a/media/libmediaextractor/include/media/DataSourceBase.h b/media/libmediaextractor/include/media/DataSourceBase.h
new file mode 100644
index 0000000..f964137
--- /dev/null
+++ b/media/libmediaextractor/include/media/DataSourceBase.h
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef DATA_SOURCE_BASE_H_
+
+#define DATA_SOURCE_BASE_H_
+
+#include <sys/types.h>
+#include <media/stagefright/MediaErrors.h>
+#include <utils/Errors.h>
+#include <utils/threads.h>
+#include <drm/DrmManagerClient.h>
+
+namespace android {
+
+class String8;
+
+class DataSourceBase {
+public:
+ enum Flags {
+ kWantsPrefetching = 1,
+ kStreamedFromLocalHost = 2,
+ kIsCachingDataSource = 4,
+ kIsHTTPBasedSource = 8,
+ kIsLocalFileSource = 16,
+ };
+
+ DataSourceBase() {}
+
+ virtual status_t initCheck() const = 0;
+
+ // Returns the number of bytes read, or -1 on failure. It's not an error if
+ // this returns zero; it just means the given offset is equal to, or
+ // beyond, the end of the source.
+ virtual ssize_t readAt(off64_t offset, void *data, size_t size) = 0;
+
+ // Convenience methods:
+ bool getUInt16(off64_t offset, uint16_t *x);
+ bool getUInt24(off64_t offset, uint32_t *x); // 3 byte int, returned as a 32-bit int
+ bool getUInt32(off64_t offset, uint32_t *x);
+ bool getUInt64(off64_t offset, uint64_t *x);
+
+ // read either int<N> or int<2N> into a uint<2N>_t, size is the int size in bytes.
+ bool getUInt16Var(off64_t offset, uint16_t *x, size_t size);
+ bool getUInt32Var(off64_t offset, uint32_t *x, size_t size);
+ bool getUInt64Var(off64_t offset, uint64_t *x, size_t size);
+
+ // Reads in "count" entries of type T into vector *x.
+ // Returns true if "count" entries can be read.
+ // If fewer than "count" entries can be read, return false. In this case,
+ // the output vector *x will still have those entries that were read. Call
+ // x->size() to obtain the number of entries read.
+ // The optional parameter chunkSize specifies how many entries should be
+ // read from the data source at one time into a temporary buffer. Increasing
+ // chunkSize can improve the performance at the cost of extra memory usage.
+ // The default value for chunkSize is set to read at least 4k bytes at a
+ // time, depending on sizeof(T).
+ template <typename T>
+ bool getVector(off64_t offset, Vector<T>* x, size_t count,
+ size_t chunkSize = (4095 / sizeof(T)) + 1);
+
+ // May return ERROR_UNSUPPORTED.
+ virtual status_t getSize(off64_t *size);
+
+ virtual uint32_t flags() {
+ return 0;
+ }
+
+ virtual String8 toString() {
+ return String8("<unspecified>");
+ }
+
+ virtual status_t reconnectAtOffset(off64_t /*offset*/) {
+ return ERROR_UNSUPPORTED;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+
+ // for DRM
+ virtual sp<DecryptHandle> DrmInitialization(const char * /*mime*/ = NULL) {
+ return NULL;
+ }
+
+ virtual String8 getUri() {
+ return String8();
+ }
+
+ virtual String8 getMIMEType() const;
+
+ virtual void close() {};
+
+protected:
+ virtual ~DataSourceBase() {}
+
+private:
+ DataSourceBase(const DataSourceBase &);
+ DataSourceBase &operator=(const DataSourceBase &);
+};
+
+template <typename T>
+bool DataSourceBase::getVector(off64_t offset, Vector<T>* x, size_t count,
+ size_t chunkSize)
+{
+ x->clear();
+ if (chunkSize == 0) {
+ return false;
+ }
+ if (count == 0) {
+ return true;
+ }
+
+ T tmp[chunkSize];
+ ssize_t numBytesRead;
+ size_t numBytesPerChunk = chunkSize * sizeof(T);
+ size_t i;
+
+ for (i = 0; i + chunkSize < count; i += chunkSize) {
+ // This loops is executed when more than chunkSize records need to be
+ // read.
+ numBytesRead = this->readAt(offset, (void*)&tmp, numBytesPerChunk);
+ if (numBytesRead == -1) { // If readAt() returns -1, there is an error.
+ return false;
+ }
+ if (static_cast<size_t>(numBytesRead) < numBytesPerChunk) {
+ // This case is triggered when the stream ends before the whole
+ // chunk is read.
+ x->appendArray(tmp, (size_t)numBytesRead / sizeof(T));
+ return false;
+ }
+ x->appendArray(tmp, chunkSize);
+ offset += numBytesPerChunk;
+ }
+
+ // There are (count - i) more records to read.
+ // Right now, (count - i) <= chunkSize.
+ // We do the same thing as above, but with chunkSize replaced by count - i.
+ numBytesRead = this->readAt(offset, (void*)&tmp, (count - i) * sizeof(T));
+ if (numBytesRead == -1) {
+ return false;
+ }
+ x->appendArray(tmp, (size_t)numBytesRead / sizeof(T));
+ return x->size() == count;
+}
+
+} // namespace android
+
+#endif // DATA_SOURCE_BASE_H_
diff --git a/media/libmediaextractor/include/media/MediaExtractor.h b/media/libmediaextractor/include/media/MediaExtractor.h
index 27581f3..60495ec 100644
--- a/media/libmediaextractor/include/media/MediaExtractor.h
+++ b/media/libmediaextractor/include/media/MediaExtractor.h
@@ -27,7 +27,7 @@
namespace android {
-class DataSource;
+class DataSourceBase;
class MetaData;
class String8;
struct AMessage;
@@ -87,15 +87,14 @@
virtual const char * name() { return "<unspecified>"; }
- virtual void release() {}
typedef MediaExtractor* (*CreatorFunc)(
- const sp<DataSource> &source, const sp<AMessage> &meta);
+ DataSourceBase *source, const sp<AMessage> &meta);
// The sniffer can optionally fill in "meta" with an AMessage containing
// a dictionary of values that helps the corresponding extractor initialize
// its state without duplicating effort already exerted by the sniffer.
typedef CreatorFunc (*SnifferFunc)(
- const sp<DataSource> &source, String8 *mimeType,
+ DataSourceBase *source, String8 *mimeType,
float *confidence, sp<AMessage> *meta);
typedef struct {
diff --git a/media/libstagefright/CallbackDataSource.cpp b/media/libstagefright/CallbackDataSource.cpp
index f479644..71b737b 100644
--- a/media/libstagefright/CallbackDataSource.cpp
+++ b/media/libstagefright/CallbackDataSource.cpp
@@ -21,6 +21,7 @@
#include "include/CallbackDataSource.h"
#include <binder/IMemory.h>
+#include <binder/IPCThreadState.h>
#include <media/IDataSource.h>
#include <media/stagefright/foundation/ADebug.h>
@@ -34,7 +35,10 @@
mIsClosed(false) {
// Set up the buffer to read into.
mMemory = mIDataSource->getIMemory();
- mName = String8::format("CallbackDataSource(%s)", mIDataSource->toString().string());
+ mName = String8::format("CallbackDataSource(%d->%d, %s)",
+ getpid(),
+ IPCThreadState::self()->getCallingPid(),
+ mIDataSource->toString().string());
}
diff --git a/media/libstagefright/InterfaceUtils.cpp b/media/libstagefright/InterfaceUtils.cpp
index 284e63b..70fbbd7 100644
--- a/media/libstagefright/InterfaceUtils.cpp
+++ b/media/libstagefright/InterfaceUtils.cpp
@@ -38,11 +38,13 @@
}
sp<IMediaExtractor> CreateIMediaExtractorFromMediaExtractor(
- MediaExtractor *extractor, const sp<RefBase> &plugin) {
+ MediaExtractor *extractor,
+ const sp<DataSource> &source,
+ const sp<RefBase> &plugin) {
if (extractor == nullptr) {
return nullptr;
}
- return RemoteMediaExtractor::wrap(extractor, plugin);
+ return RemoteMediaExtractor::wrap(extractor, source, plugin);
}
sp<MediaSource> CreateMediaSourceFromIMediaSource(const sp<IMediaSource> &source) {
diff --git a/media/libstagefright/MediaExtractorFactory.cpp b/media/libstagefright/MediaExtractorFactory.cpp
index e79696c..bb72167 100644
--- a/media/libstagefright/MediaExtractorFactory.cpp
+++ b/media/libstagefright/MediaExtractorFactory.cpp
@@ -118,7 +118,7 @@
String8 tmp;
float confidence;
sp<ExtractorPlugin> plugin;
- creator = sniff(source, &tmp, &confidence, &meta, plugin);
+ creator = sniff(source.get(), &tmp, &confidence, &meta, plugin);
if (!creator) {
ALOGV("FAILED to autodetect media content.");
return NULL;
@@ -128,8 +128,8 @@
ALOGV("Autodetected media content as '%s' with confidence %.2f",
mime, confidence);
- MediaExtractor *ret = creator(source, meta);
- return CreateIMediaExtractorFromMediaExtractor(ret, plugin);
+ MediaExtractor *ret = creator(source.get(), meta);
+ return CreateIMediaExtractorFromMediaExtractor(ret, source, plugin);
}
//static
@@ -165,7 +165,7 @@
// static
MediaExtractor::CreatorFunc MediaExtractorFactory::sniff(
- const sp<DataSource> &source, String8 *mimeType, float *confidence, sp<AMessage> *meta,
+ DataSourceBase *source, String8 *mimeType, float *confidence, sp<AMessage> *meta,
sp<ExtractorPlugin> &plugin) {
*mimeType = "";
*confidence = 0.0f;
diff --git a/media/libstagefright/RemoteMediaExtractor.cpp b/media/libstagefright/RemoteMediaExtractor.cpp
index 3ebee51..601c9fa 100644
--- a/media/libstagefright/RemoteMediaExtractor.cpp
+++ b/media/libstagefright/RemoteMediaExtractor.cpp
@@ -37,9 +37,12 @@
static const char *kExtractorFormat = "android.media.mediaextractor.fmt";
RemoteMediaExtractor::RemoteMediaExtractor(
- MediaExtractor *extractor, const sp<RefBase> &plugin)
+ MediaExtractor *extractor,
+ const sp<DataSource> &source,
+ const sp<RefBase> &plugin)
:mExtractor(extractor),
- mExtractorPlugin(plugin) {
+ mSource(source),
+ mExtractorPlugin(plugin) {
mAnalyticsItem = nullptr;
if (MEDIA_LOG) {
@@ -67,6 +70,8 @@
RemoteMediaExtractor::~RemoteMediaExtractor() {
delete mExtractor;
+ mSource->close();
+ mSource.clear();
mExtractorPlugin = nullptr;
// log the current record, provided it has some information worth recording
if (MEDIA_LOG) {
@@ -129,19 +134,17 @@
return mExtractor->name();
}
-void RemoteMediaExtractor::release() {
- return mExtractor->release();
-}
-
////////////////////////////////////////////////////////////////////////////////
// static
sp<IMediaExtractor> RemoteMediaExtractor::wrap(
- MediaExtractor *extractor, const sp<RefBase> &plugin) {
+ MediaExtractor *extractor,
+ const sp<DataSource> &source,
+ const sp<RefBase> &plugin) {
if (extractor == nullptr) {
return nullptr;
}
- return new RemoteMediaExtractor(extractor, plugin);
+ return new RemoteMediaExtractor(extractor, source, plugin);
}
} // namespace android
diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp
index e2db0f5..179e0e6 100644
--- a/media/libstagefright/StagefrightMetadataRetriever.cpp
+++ b/media/libstagefright/StagefrightMetadataRetriever.cpp
@@ -47,12 +47,6 @@
StagefrightMetadataRetriever::~StagefrightMetadataRetriever() {
ALOGV("~StagefrightMetadataRetriever()");
clearMetadata();
- // Explicitly release extractor before continuing with the destructor,
- // some extractors might need to callback to close off the DataSource
- // and we need to make sure it's still there.
- if (mExtractor != NULL) {
- mExtractor->release();
- }
if (mSource != NULL) {
mSource->close();
}
diff --git a/media/libstagefright/id3/ID3.cpp b/media/libstagefright/id3/ID3.cpp
index 61403be..f4bba59 100644
--- a/media/libstagefright/id3/ID3.cpp
+++ b/media/libstagefright/id3/ID3.cpp
@@ -30,7 +30,7 @@
static const size_t kMaxMetadataSize = 3 * 1024 * 1024;
-struct MemorySource : public DataSource {
+struct MemorySource : public DataSourceBase {
MemorySource(const uint8_t *data, size_t size)
: mData(data),
mSize(size) {
@@ -56,7 +56,7 @@
DISALLOW_EVIL_CONSTRUCTORS(MemorySource);
};
-ID3::ID3(const sp<DataSource> &source, bool ignoreV1, off64_t offset)
+ID3::ID3(DataSourceBase *source, bool ignoreV1, off64_t offset)
: mIsValid(false),
mData(NULL),
mSize(0),
@@ -77,7 +77,7 @@
mFirstFrameOffset(0),
mVersion(ID3_UNKNOWN),
mRawSize(0) {
- sp<MemorySource> source = new (std::nothrow) MemorySource(data, size);
+ MemorySource *source = new (std::nothrow) MemorySource(data, size);
if (source == NULL)
return;
@@ -87,6 +87,7 @@
if (!mIsValid && !ignoreV1) {
mIsValid = parseV1(source);
}
+ delete source;
}
ID3::~ID3() {
@@ -118,7 +119,7 @@
return true;
}
-bool ID3::parseV2(const sp<DataSource> &source, off64_t offset) {
+bool ID3::parseV2(DataSourceBase *source, off64_t offset) {
struct id3_header {
char id[3];
uint8_t version_major;
@@ -960,7 +961,7 @@
return NULL;
}
-bool ID3::parseV1(const sp<DataSource> &source) {
+bool ID3::parseV1(DataSourceBase *source) {
const size_t V1_TAG_SIZE = 128;
off64_t size;
diff --git a/media/libstagefright/id3/testid3.cpp b/media/libstagefright/id3/testid3.cpp
index 442a3ff..86e6adf 100644
--- a/media/libstagefright/id3/testid3.cpp
+++ b/media/libstagefright/id3/testid3.cpp
@@ -72,7 +72,7 @@
sp<FileSource> file = new FileSource(path);
CHECK_EQ(file->initCheck(), (status_t)OK);
- ID3 tag(file);
+ ID3 tag(file.get());
if (!tag.isValid()) {
printf("FAIL %s\n", path);
} else {
diff --git a/media/libstagefright/include/ID3.h b/media/libstagefright/include/ID3.h
index 11682f8..7c2391e 100644
--- a/media/libstagefright/include/ID3.h
+++ b/media/libstagefright/include/ID3.h
@@ -22,7 +22,7 @@
namespace android {
-class DataSource;
+class DataSourceBase;
class String8;
struct ID3 {
@@ -35,7 +35,7 @@
ID3_V2_4,
};
- explicit ID3(const sp<DataSource> &source, bool ignoreV1 = false, off64_t offset = 0);
+ explicit ID3(DataSourceBase *source, bool ignoreV1 = false, off64_t offset = 0);
ID3(const uint8_t *data, size_t size, bool ignoreV1 = false);
~ID3();
@@ -85,8 +85,8 @@
// only valid for IDV2+
size_t mRawSize;
- bool parseV1(const sp<DataSource> &source);
- bool parseV2(const sp<DataSource> &source, off64_t offset);
+ bool parseV1(DataSourceBase *source);
+ bool parseV2(DataSourceBase *source, off64_t offset);
void removeUnsynchronization();
bool removeUnsynchronizationV2_4(bool iTunesHack);
diff --git a/media/libstagefright/include/media/stagefright/InterfaceUtils.h b/media/libstagefright/include/media/stagefright/InterfaceUtils.h
index ceeaf31..568c735 100644
--- a/media/libstagefright/include/media/stagefright/InterfaceUtils.h
+++ b/media/libstagefright/include/media/stagefright/InterfaceUtils.h
@@ -41,7 +41,9 @@
// Creates an IMediaExtractor wrapper to the given MediaExtractor.
sp<IMediaExtractor> CreateIMediaExtractorFromMediaExtractor(
- MediaExtractor *extractor, const sp<RefBase> &plugin);
+ MediaExtractor *extractor,
+ const sp<DataSource> &source,
+ const sp<RefBase> &plugin);
// Creates a MediaSource which wraps the given IMediaSource object.
sp<MediaSource> CreateMediaSourceFromIMediaSource(const sp<IMediaSource> &source);
diff --git a/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h b/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h
index 4610359..4d2f4f0 100644
--- a/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h
+++ b/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h
@@ -56,7 +56,7 @@
static void RegisterExtractor(
const sp<ExtractorPlugin> &plugin, List<sp<ExtractorPlugin>> &pluginList);
- static MediaExtractor::CreatorFunc sniff(const sp<DataSource> &source,
+ static MediaExtractor::CreatorFunc sniff(DataSourceBase *source,
String8 *mimeType, float *confidence, sp<AMessage> *meta,
sp<ExtractorPlugin> &plugin);
diff --git a/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h b/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h
index 78f3a84..22a8210 100644
--- a/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h
+++ b/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h
@@ -28,7 +28,10 @@
// IMediaExtractor wrapper to the MediaExtractor.
class RemoteMediaExtractor : public BnMediaExtractor {
public:
- static sp<IMediaExtractor> wrap(MediaExtractor *extractor, const sp<RefBase> &plugin);
+ static sp<IMediaExtractor> wrap(
+ MediaExtractor *extractor,
+ const sp<DataSource> &source,
+ const sp<RefBase> &plugin);
virtual ~RemoteMediaExtractor();
virtual size_t countTracks();
@@ -41,15 +44,18 @@
virtual void setUID(uid_t uid);
virtual status_t setMediaCas(const HInterfaceToken &casToken);
virtual const char * name();
- virtual void release();
private:
MediaExtractor *mExtractor;
+ sp<DataSource> mSource;
sp<RefBase> mExtractorPlugin;
MediaAnalyticsItem *mAnalyticsItem;
- explicit RemoteMediaExtractor(MediaExtractor *extractor, const sp<RefBase> &plugin);
+ explicit RemoteMediaExtractor(
+ MediaExtractor *extractor,
+ const sp<DataSource> &source,
+ const sp<RefBase> &plugin);
DISALLOW_EVIL_CONSTRUCTORS(RemoteMediaExtractor);
};