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
gugelfrei
Marco Nelissen 6 years ago
parent 0b16447f1c
commit cec44d0c8d

@ -23,10 +23,17 @@ namespace android {
struct MediaTrack;
class MetaDataBase;
class DataSourceBase;
extern "C" {
struct CDataSource {
ssize_t (*readAt)(void *handle, off64_t offset, void *data, size_t size);
status_t (*getSize)(void *handle, off64_t *size);
uint32_t (*flags)(void *handle );
bool (*getUri)(void *handle, char *uriString, size_t bufferSize);
void *handle;
};
struct CMediaExtractor {
void *data;
@ -44,7 +51,7 @@ struct CMediaExtractor {
const char * (*name)(void *data);
};
typedef CMediaExtractor* (*CreatorFunc)(DataSourceBase *source, void *meta);
typedef CMediaExtractor* (*CreatorFunc)(CDataSource *source, void *meta);
typedef void (*FreeMetaFunc)(void *meta);
// The sniffer can optionally fill in an opaque object, "meta", that helps
@ -52,7 +59,7 @@ typedef void (*FreeMetaFunc)(void *meta);
// effort already exerted by the sniffer. If "freeMeta" is given, it will be
// called against the opaque object when it is no longer used.
typedef CreatorFunc (*SnifferFunc)(
DataSourceBase *source, float *confidence,
CDataSource *source, float *confidence,
void **meta, FreeMetaFunc *freeMeta);
typedef struct {

@ -18,6 +18,7 @@
#define MEDIA_EXTRACTOR_PLUGIN_HELPER_H_
#include <arpa/inet.h>
#include <stdio.h>
#include <vector>
@ -117,6 +118,136 @@ inline CMediaExtractor *wrap(MediaExtractorPluginHelper *extractor) {
return wrapper;
}
/* adds some convience methods */
class DataSourceHelper {
public:
explicit DataSourceHelper(CDataSource *csource) {
mSource = csource;
}
explicit DataSourceHelper(DataSourceHelper *source) {
mSource = source->mSource;
}
ssize_t readAt(off64_t offset, void *data, size_t size) {
return mSource->readAt(mSource->handle, offset, data, size);
}
status_t getSize(off64_t *size) {
return mSource->getSize(mSource->handle, size);
}
bool getUri(char *uriString, size_t bufferSize) {
return mSource->getUri(mSource->handle, uriString, bufferSize);
}
uint32_t flags() {
return mSource->flags(mSource->handle);
}
// Convenience methods:
bool getUInt16(off64_t offset, uint16_t *x) {
*x = 0;
uint8_t byte[2];
if (readAt(offset, byte, 2) != 2) {
return false;
}
*x = (byte[0] << 8) | byte[1];
return true;
}
// 3 byte int, returned as a 32-bit int
bool getUInt24(off64_t offset, uint32_t *x) {
*x = 0;
uint8_t byte[3];
if (readAt(offset, byte, 3) != 3) {
return false;
}
*x = (byte[0] << 16) | (byte[1] << 8) | byte[2];
return true;
}
bool getUInt32(off64_t offset, uint32_t *x) {
*x = 0;
uint32_t tmp;
if (readAt(offset, &tmp, 4) != 4) {
return false;
}
*x = ntohl(tmp);
return true;
}
bool getUInt64(off64_t offset, uint64_t *x) {
*x = 0;
uint64_t tmp;
if (readAt(offset, &tmp, 8) != 8) {
return false;
}
*x = ((uint64_t)ntohl(tmp & 0xffffffff) << 32) | ntohl(tmp >> 32);
return true;
}
// 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) {
if (size == 2) {
return getUInt16(offset, x);
}
if (size == 1) {
uint8_t tmp;
if (readAt(offset, &tmp, 1) == 1) {
*x = tmp;
return true;
}
}
return false;
}
bool getUInt32Var(off64_t offset, uint32_t *x, size_t size) {
if (size == 4) {
return getUInt32(offset, x);
}
if (size == 2) {
uint16_t tmp;
if (getUInt16(offset, &tmp)) {
*x = tmp;
return true;
}
}
return false;
}
bool getUInt64Var(off64_t offset, uint64_t *x, size_t size) {
if (size == 8) {
return getUInt64(offset, x);
}
if (size == 4) {
uint32_t tmp;
if (getUInt32(offset, &tmp)) {
*x = tmp;
return true;
}
}
return false;
}
protected:
CDataSource *mSource;
};
// helpers to create a media_uuid_t from a string literal
// purposely not defined anywhere so that this will fail to link if

@ -19,7 +19,7 @@
#include <utils/Log.h>
#include "AACExtractor.h"
#include <media/DataSourceBase.h>
#include <media/MediaExtractorPluginApi.h>
#include <media/MediaTrack.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/AMessage.h>
@ -36,7 +36,7 @@ namespace android {
class AACSource : public MediaTrack {
public:
AACSource(
DataSourceBase *source,
DataSourceHelper *source,
MetaDataBase &meta,
const Vector<uint64_t> &offset_vector,
int64_t frame_duration_us);
@ -54,7 +54,7 @@ protected:
private:
static const size_t kMaxFrameSize;
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
MetaDataBase mMeta;
off64_t mOffset;
@ -92,7 +92,7 @@ uint32_t get_sample_rate(const uint8_t sf_index)
// 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(DataSourceBase *source, off64_t offset, size_t* headerSize) {
static size_t getAdtsFrameLength(DataSourceHelper *source, off64_t offset, size_t* headerSize) {
const size_t kAdtsHeaderLengthNoCrc = 7;
const size_t kAdtsHeaderLengthWithCrc = 9;
@ -133,7 +133,7 @@ static size_t getAdtsFrameLength(DataSourceBase *source, off64_t offset, size_t*
}
AACExtractor::AACExtractor(
DataSourceBase *source, off64_t offset)
DataSourceHelper *source, off64_t offset)
: mDataSource(source),
mInitCheck(NO_INIT),
mFrameDurationUs(0) {
@ -219,7 +219,7 @@ status_t AACExtractor::getTrackMetaData(MetaDataBase &meta, size_t index, uint32
const size_t AACSource::kMaxFrameSize = 8192;
AACSource::AACSource(
DataSourceBase *source,
DataSourceHelper *source,
MetaDataBase &meta,
const Vector<uint64_t> &offset_vector,
int64_t frame_duration_us)
@ -324,20 +324,21 @@ status_t AACSource::read(
////////////////////////////////////////////////////////////////////////////////
static CMediaExtractor* CreateExtractor(
DataSourceBase *source,
CDataSource *source,
void *meta) {
off64_t offset = *static_cast<off64_t*>(meta);
return wrap(new AACExtractor(source, offset));
return wrap(new AACExtractor(new DataSourceHelper(source), offset));
}
static CreatorFunc Sniff(
DataSourceBase *source, float *confidence, void **meta,
CDataSource *source, float *confidence, void **meta,
FreeMetaFunc *freeMeta) {
off64_t pos = 0;
DataSourceHelper helper(source);
for (;;) {
uint8_t id3header[10];
if (source->readAt(pos, id3header, sizeof(id3header))
if (helper.readAt(pos, id3header, sizeof(id3header))
< (ssize_t)sizeof(id3header)) {
return NULL;
}
@ -364,7 +365,7 @@ static CreatorFunc Sniff(
uint8_t header[2];
if (source->readAt(pos, &header, 2) != 2) {
if (helper.readAt(pos, &header, 2) != 2) {
return NULL;
}

@ -31,7 +31,7 @@ class String8;
class AACExtractor : public MediaExtractorPluginHelper {
public:
AACExtractor(DataSourceBase *source, off64_t offset);
AACExtractor(DataSourceHelper *source, off64_t offset);
virtual size_t countTracks();
virtual MediaTrack *getTrack(size_t index);
@ -44,7 +44,7 @@ protected:
virtual ~AACExtractor();
private:
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
MetaDataBase mMeta;
status_t mInitCheck;
@ -56,7 +56,7 @@ private:
};
bool SniffAAC(
DataSourceBase *source, String8 *mimeType, float *confidence, off64_t *offset);
DataSourceHelper *source, String8 *mimeType, float *confidence, off64_t *offset);
} // namespace android

@ -20,7 +20,6 @@
#include "AMRExtractor.h"
#include <media/DataSourceBase.h>
#include <media/MediaTrack.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/MediaBufferGroup.h>
@ -34,7 +33,7 @@ namespace android {
class AMRSource : public MediaTrack {
public:
AMRSource(
DataSourceBase *source,
DataSourceHelper *source,
MetaDataBase &meta,
bool isWide,
const off64_t *offset_table,
@ -52,7 +51,7 @@ protected:
virtual ~AMRSource();
private:
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
MetaDataBase mMeta;
bool mIsWide;
@ -98,7 +97,7 @@ static size_t getFrameSize(bool isWide, unsigned FT) {
return frameSize;
}
static status_t getFrameSizeByOffset(DataSourceBase *source,
static status_t getFrameSizeByOffset(DataSourceHelper *source,
off64_t offset, bool isWide, size_t *frameSize) {
uint8_t header;
ssize_t count = source->readAt(offset, &header, 1);
@ -118,7 +117,7 @@ static status_t getFrameSizeByOffset(DataSourceBase *source,
}
static bool SniffAMR(
DataSourceBase *source, bool *isWide, float *confidence) {
DataSourceHelper *source, bool *isWide, float *confidence) {
char header[9];
if (source->readAt(0, header, sizeof(header)) != sizeof(header)) {
@ -144,7 +143,7 @@ static bool SniffAMR(
return false;
}
AMRExtractor::AMRExtractor(DataSourceBase *source)
AMRExtractor::AMRExtractor(DataSourceHelper *source)
: mDataSource(source),
mInitCheck(NO_INIT),
mOffsetTableLength(0) {
@ -192,6 +191,7 @@ AMRExtractor::AMRExtractor(DataSourceBase *source)
}
AMRExtractor::~AMRExtractor() {
delete mDataSource;
}
status_t AMRExtractor::getMetaData(MetaDataBase &meta) {
@ -229,7 +229,7 @@ status_t AMRExtractor::getTrackMetaData(MetaDataBase &meta, size_t index, uint32
////////////////////////////////////////////////////////////////////////////////
AMRSource::AMRSource(
DataSourceBase *source, MetaDataBase &meta,
DataSourceHelper *source, MetaDataBase &meta,
bool isWide, const off64_t *offset_table, size_t offset_table_length)
: mDataSource(source),
mMeta(meta),
@ -372,15 +372,16 @@ ExtractorDef GETEXTRACTORDEF() {
1,
"AMR Extractor",
[](
DataSourceBase *source,
CDataSource *source,
float *confidence,
void **,
FreeMetaFunc *) -> CreatorFunc {
if (SniffAMR(source, nullptr, confidence)) {
DataSourceHelper helper(source);
if (SniffAMR(&helper, nullptr, confidence)) {
return [](
DataSourceBase *source,
CDataSource *source,
void *) -> CMediaExtractor* {
return wrap(new AMRExtractor(source));};
return wrap(new AMRExtractor(new DataSourceHelper(source)));};
}
return NULL;
}

@ -31,7 +31,7 @@ class String8;
class AMRExtractor : public MediaExtractorPluginHelper {
public:
explicit AMRExtractor(DataSourceBase *source);
explicit AMRExtractor(DataSourceHelper *source);
virtual size_t countTracks();
virtual MediaTrack *getTrack(size_t index);
@ -44,7 +44,7 @@ protected:
virtual ~AMRExtractor();
private:
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
MetaDataBase mMeta;
status_t mInitCheck;
bool mIsWide;

@ -24,7 +24,7 @@
// libFLAC parser
#include "FLAC/stream_decoder.h"
#include <media/DataSourceBase.h>
#include <media/MediaExtractorPluginApi.h>
#include <media/MediaTrack.h>
#include <media/VorbisComment.h>
#include <media/stagefright/foundation/ABuffer.h>
@ -43,7 +43,7 @@ class FLACSource : public MediaTrack {
public:
FLACSource(
DataSourceBase *dataSource,
DataSourceHelper *dataSource,
MetaDataBase &meta);
virtual status_t start(MetaDataBase *params);
@ -57,7 +57,7 @@ protected:
virtual ~FLACSource();
private:
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
MetaDataBase mTrackMetadata;
FLACParser *mParser;
bool mInitCheck;
@ -79,7 +79,7 @@ public:
};
explicit FLACParser(
DataSourceBase *dataSource,
DataSourceHelper *dataSource,
// If metadata pointers aren't provided, we don't fill them
MetaDataBase *fileMetadata = 0,
MetaDataBase *trackMetadata = 0);
@ -118,7 +118,7 @@ public:
}
private:
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
MetaDataBase *mFileMetadata;
MetaDataBase *mTrackMetadata;
bool mInitCheck;
@ -487,7 +487,7 @@ static void copyTrespass(
// FLACParser
FLACParser::FLACParser(
DataSourceBase *dataSource,
DataSourceHelper *dataSource,
MetaDataBase *fileMetadata,
MetaDataBase *trackMetadata)
: mDataSource(dataSource),
@ -708,7 +708,7 @@ MediaBufferBase *FLACParser::readBuffer(bool doSeek, FLAC__uint64 sample)
// FLACsource
FLACSource::FLACSource(
DataSourceBase *dataSource,
DataSourceHelper *dataSource,
MetaDataBase &trackMetadata)
: mDataSource(dataSource),
mTrackMetadata(trackMetadata),
@ -789,7 +789,7 @@ status_t FLACSource::read(
// FLACExtractor
FLACExtractor::FLACExtractor(
DataSourceBase *dataSource)
DataSourceHelper *dataSource)
: mDataSource(dataSource),
mParser(nullptr),
mInitCheck(false)
@ -804,6 +804,7 @@ FLACExtractor::~FLACExtractor()
{
ALOGV("~FLACExtractor::FLACExtractor");
delete mParser;
delete mDataSource;
}
size_t FLACExtractor::countTracks()
@ -837,7 +838,7 @@ status_t FLACExtractor::getMetaData(MetaDataBase &meta)
// Sniffer
bool SniffFLAC(DataSourceBase *source, float *confidence)
bool SniffFLAC(DataSourceHelper *source, float *confidence)
{
// first 4 is the signature word
// second 4 is the sizeof STREAMINFO
@ -866,15 +867,16 @@ ExtractorDef GETEXTRACTORDEF() {
1,
"FLAC Extractor",
[](
DataSourceBase *source,
CDataSource *source,
float *confidence,
void **,
FreeMetaFunc *) -> CreatorFunc {
if (SniffFLAC(source, confidence)) {
DataSourceHelper helper(source);
if (SniffFLAC(&helper, confidence)) {
return [](
DataSourceBase *source,
CDataSource *source,
void *) -> CMediaExtractor* {
return wrap(new FLACExtractor(source));};
return wrap(new FLACExtractor(new DataSourceHelper(source)));};
}
return NULL;
}

@ -30,7 +30,7 @@ class FLACParser;
class FLACExtractor : public MediaExtractorPluginHelper {
public:
explicit FLACExtractor(DataSourceBase *source);
explicit FLACExtractor(DataSourceHelper *source);
virtual size_t countTracks();
virtual MediaTrack *getTrack(size_t index);
@ -43,7 +43,7 @@ protected:
virtual ~FLACExtractor();
private:
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
FLACParser *mParser;
status_t mInitCheck;
MetaDataBase mFileMetadata;
@ -56,8 +56,6 @@ private:
};
bool SniffFLAC(DataSourceBase *source, float *confidence);
} // namespace android
#endif // FLAC_EXTRACTOR_H_

@ -142,7 +142,7 @@ status_t MidiSource::init()
// MidiEngine
MidiEngine::MidiEngine(DataSourceBase *dataSource,
MidiEngine::MidiEngine(CDataSource *dataSource,
MetaDataBase *fileMetadata,
MetaDataBase *trackMetadata) :
mGroup(NULL),
@ -263,7 +263,7 @@ MediaBufferBase* MidiEngine::readBuffer() {
// MidiExtractor
MidiExtractor::MidiExtractor(
DataSourceBase *dataSource)
CDataSource *dataSource)
: mDataSource(dataSource),
mInitCheck(false)
{
@ -310,7 +310,7 @@ status_t MidiExtractor::getMetaData(MetaDataBase &meta)
// Sniffer
bool SniffMidi(DataSourceBase *source, float *confidence)
bool SniffMidi(CDataSource *source, float *confidence)
{
MidiEngine p(source, NULL, NULL);
if (p.initCheck() == OK) {
@ -333,13 +333,13 @@ ExtractorDef GETEXTRACTORDEF() {
1,
"MIDI Extractor",
[](
DataSourceBase *source,
CDataSource *source,
float *confidence,
void **,
FreeMetaFunc *) -> CreatorFunc {
if (SniffMidi(source, confidence)) {
return [](
DataSourceBase *source,
CDataSource *source,
void *) -> CMediaExtractor* {
return wrap(new MidiExtractor(source));};
}

@ -31,7 +31,7 @@ namespace android {
class MidiEngine {
public:
explicit MidiEngine(DataSourceBase *dataSource,
explicit MidiEngine(CDataSource *dataSource,
MetaDataBase *fileMetadata,
MetaDataBase *trackMetadata);
~MidiEngine();
@ -54,7 +54,7 @@ private:
class MidiExtractor : public MediaExtractorPluginHelper {
public:
explicit MidiExtractor(DataSourceBase *source);
explicit MidiExtractor(CDataSource *source);
virtual size_t countTracks();
virtual MediaTrack *getTrack(size_t index);
@ -67,7 +67,7 @@ protected:
virtual ~MidiExtractor();
private:
DataSourceBase *mDataSource;
CDataSource *mDataSource;
status_t mInitCheck;
MetaDataBase mFileMetadata;
@ -89,7 +89,7 @@ private:
};
bool SniffMidi(DataSourceBase *source, float *confidence);
bool SniffMidi(CDataSource *source, float *confidence);
} // namespace android

@ -44,7 +44,7 @@
namespace android {
struct DataSourceBaseReader : public mkvparser::IMkvReader {
explicit DataSourceBaseReader(DataSourceBase *source)
explicit DataSourceBaseReader(DataSourceHelper *source)
: mSource(source) {
}
@ -86,7 +86,7 @@ struct DataSourceBaseReader : public mkvparser::IMkvReader {
}
private:
DataSourceBase *mSource;
DataSourceHelper *mSource;
DataSourceBaseReader(const DataSourceBaseReader &);
DataSourceBaseReader &operator=(const DataSourceBaseReader &);
@ -921,7 +921,7 @@ status_t MatroskaSource::read(
////////////////////////////////////////////////////////////////////////////////
MatroskaExtractor::MatroskaExtractor(DataSourceBase *source)
MatroskaExtractor::MatroskaExtractor(DataSourceHelper *source)
: mDataSource(source),
mReader(new DataSourceBaseReader(mDataSource)),
mSegment(NULL),
@ -994,6 +994,8 @@ MatroskaExtractor::~MatroskaExtractor() {
delete mReader;
mReader = NULL;
delete mDataSource;
}
size_t MatroskaExtractor::countTracks() {
@ -1621,7 +1623,7 @@ uint32_t MatroskaExtractor::flags() const {
}
bool SniffMatroska(
DataSourceBase *source, float *confidence) {
DataSourceHelper *source, float *confidence) {
DataSourceBaseReader reader(source);
mkvparser::EBMLHeader ebmlHeader;
long long pos;
@ -1645,15 +1647,16 @@ ExtractorDef GETEXTRACTORDEF() {
1,
"Matroska Extractor",
[](
DataSourceBase *source,
CDataSource *source,
float *confidence,
void **,
FreeMetaFunc *) -> CreatorFunc {
if (SniffMatroska(source, confidence)) {
DataSourceHelper helper(source);
if (SniffMatroska(&helper, confidence)) {
return [](
DataSourceBase *source,
CDataSource *source,
void *) -> CMediaExtractor* {
return wrap(new MatroskaExtractor(source));};
return wrap(new MatroskaExtractor(new DataSourceHelper(source)));};
}
return NULL;
}

@ -36,7 +36,7 @@ struct DataSourceBaseReader;
struct MatroskaSource;
struct MatroskaExtractor : public MediaExtractorPluginHelper {
explicit MatroskaExtractor(DataSourceBase *source);
explicit MatroskaExtractor(DataSourceHelper *source);
virtual size_t countTracks();
@ -77,7 +77,7 @@ private:
Mutex mLock;
Vector<TrackInfo> mTracks;
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
DataSourceBaseReader *mReader;
mkvparser::Segment *mSegment;
bool mExtractedThumbnails;

@ -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 @@ namespace android {
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 @@ static bool Resync(
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 @@ protected:
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 @@ struct Mp3Meta {
};
MP3Extractor::MP3Extractor(
DataSourceBase *source, Mp3Meta *meta)
DataSourceHelper *source, Mp3Meta *meta)
: mInitCheck(NO_INIT),
mDataSource(source),
mFirstFramePos(-1),
@ -371,7 +370,8 @@ MP3Extractor::MP3Extractor(
// 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(
MP3Extractor::~MP3Extractor() {
delete mSeeker;
delete mDataSource;
}
size_t MP3Extractor::countTracks() {
@ -440,7 +441,7 @@ status_t MP3Extractor::getTrackMetaData(
// 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 @@ status_t MP3Extractor::getMetaData(MetaDataBase &meta) {
}
meta.setCString(kKeyMIMEType, "audio/mpeg");
ID3 id3(mDataSource);
DataSourceHelper helper(mDataSource);
ID3 id3(&helper);
if (!id3.isValid()) {
return OK;
@ -670,20 +672,21 @@ status_t MP3Extractor::getMetaData(MetaDataBase &meta) {
}
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 @@ static CreatorFunc Sniff(
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;
}

@ -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 @@ public:
private:
status_t mInitCheck;
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
off64_t mFirstFramePos;
MetaDataBase mMeta;
uint32_t mFixedHeader;

@ -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 uint32_t U24_AT(const uint8_t *ptr) {
// 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];

@ -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);

@ -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 @@ bool XINGSeeker::getOffsetForTime(int64_t *timeUs, off64_t *pos) {
// 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;

@ -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);

@ -18,7 +18,8 @@
#define LOG_TAG "ItemTable"
#include <ItemTable.h>
#include <media/DataSourceBase.h>
#include <media/MediaExtractorPluginApi.h>
#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MetaData.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/foundation/ABuffer.h>
@ -92,7 +93,7 @@ struct ExifItem {
struct Box {
protected:
Box(DataSourceBase *source, uint32_t type) :
Box(DataSourceHelper *source, uint32_t type) :
mDataSource(source), mType(type) {}
virtual ~Box() {}
@ -104,14 +105,14 @@ protected:
inline uint32_t type() const { return mType; }
inline DataSourceBase *source() const { return mDataSource; }
inline DataSourceHelper *source() const { return mDataSource; }
status_t parseChunk(off64_t *offset);
status_t parseChunks(off64_t offset, size_t size);
private:
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
uint32_t mType;
};
@ -186,7 +187,7 @@ status_t Box::parseChunks(off64_t offset, size_t size) {
struct FullBox : public Box {
protected:
FullBox(DataSourceBase *source, uint32_t type) :
FullBox(DataSourceHelper *source, uint32_t type) :
Box(source, type), mVersion(0), mFlags(0) {}
inline uint8_t version() const { return mVersion; }
@ -221,7 +222,7 @@ status_t FullBox::parseFullBoxHeader(off64_t *offset, size_t *size) {
//
struct PitmBox : public FullBox {
PitmBox(DataSourceBase *source) :
PitmBox(DataSourceHelper *source) :
FullBox(source, FOURCC('p', 'i', 't', 'm')) {}
status_t parse(off64_t offset, size_t size, uint32_t *primaryItemId);
@ -301,7 +302,7 @@ struct ItemLoc {
};
struct IlocBox : public FullBox {
IlocBox(DataSourceBase *source, KeyedVector<uint32_t, ItemLoc> *itemLocs) :
IlocBox(DataSourceHelper *source, KeyedVector<uint32_t, ItemLoc> *itemLocs) :
FullBox(source, FOURCC('i', 'l', 'o', 'c')),
mItemLocs(itemLocs), mHasConstructMethod1(false) {}
@ -471,7 +472,7 @@ status_t IlocBox::parse(off64_t offset, size_t size) {
//
struct ItemReference : public Box, public RefBase {
ItemReference(DataSourceBase *source, uint32_t type, uint32_t itemIdSize) :
ItemReference(DataSourceHelper *source, uint32_t type, uint32_t itemIdSize) :
Box(source, type), mItemId(0), mRefIdSize(itemIdSize) {}
status_t parse(off64_t offset, size_t size);
@ -626,7 +627,7 @@ status_t ItemReference::parse(off64_t offset, size_t size) {
}
struct IrefBox : public FullBox {
IrefBox(DataSourceBase *source, Vector<sp<ItemReference> > *itemRefs) :
IrefBox(DataSourceHelper *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);
@ -688,7 +689,7 @@ private:
};
struct IspeBox : public FullBox, public ItemProperty {
IspeBox(DataSourceBase *source) :
IspeBox(DataSourceHelper *source) :
FullBox(source, FOURCC('i', 's', 'p', 'e')), mWidth(0), mHeight(0) {}
status_t parse(off64_t offset, size_t size) override;
@ -724,7 +725,7 @@ status_t IspeBox::parse(off64_t offset, size_t size) {
}
struct HvccBox : public Box, public ItemProperty {
HvccBox(DataSourceBase *source) :
HvccBox(DataSourceHelper *source) :
Box(source, FOURCC('h', 'v', 'c', 'C')) {}
status_t parse(off64_t offset, size_t size) override;
@ -757,7 +758,7 @@ status_t HvccBox::parse(off64_t offset, size_t size) {
}
struct IrotBox : public Box, public ItemProperty {
IrotBox(DataSourceBase *source) :
IrotBox(DataSourceHelper *source) :
Box(source, FOURCC('i', 'r', 'o', 't')), mAngle(0) {}
status_t parse(off64_t offset, size_t size) override;
@ -786,7 +787,7 @@ status_t IrotBox::parse(off64_t offset, size_t size) {
}
struct ColrBox : public Box, public ItemProperty {
ColrBox(DataSourceBase *source) :
ColrBox(DataSourceHelper *source) :
Box(source, FOURCC('c', 'o', 'l', 'r')) {}
status_t parse(off64_t offset, size_t size) override;
@ -834,7 +835,7 @@ status_t ColrBox::parse(off64_t offset, size_t size) {
}
struct IpmaBox : public FullBox {
IpmaBox(DataSourceBase *source, Vector<AssociationEntry> *associations) :
IpmaBox(DataSourceHelper *source, Vector<AssociationEntry> *associations) :
FullBox(source, FOURCC('i', 'p', 'm', 'a')), mAssociations(associations) {}
status_t parse(off64_t offset, size_t size);
@ -908,7 +909,7 @@ status_t IpmaBox::parse(off64_t offset, size_t size) {
}
struct IpcoBox : public Box {
IpcoBox(DataSourceBase *source, Vector<sp<ItemProperty> > *properties) :
IpcoBox(DataSourceHelper *source, Vector<sp<ItemProperty> > *properties) :
Box(source, FOURCC('i', 'p', 'c', 'o')), mItemProperties(properties) {}
status_t parse(off64_t offset, size_t size);
@ -965,7 +966,7 @@ status_t IpcoBox::onChunkData(uint32_t type, off64_t offset, size_t size) {
}
struct IprpBox : public Box {
IprpBox(DataSourceBase *source,
IprpBox(DataSourceHelper *source,
Vector<sp<ItemProperty> > *properties,
Vector<AssociationEntry> *associations) :
Box(source, FOURCC('i', 'p', 'r', 'p')),
@ -1022,7 +1023,7 @@ struct ItemInfo {
};
struct InfeBox : public FullBox {
InfeBox(DataSourceBase *source) :
InfeBox(DataSourceHelper *source) :
FullBox(source, FOURCC('i', 'n', 'f', 'e')) {}
status_t parse(off64_t offset, size_t size, ItemInfo *itemInfo);
@ -1127,7 +1128,7 @@ status_t InfeBox::parse(off64_t offset, size_t size, ItemInfo *itemInfo) {
}
struct IinfBox : public FullBox {
IinfBox(DataSourceBase *source, Vector<ItemInfo> *itemInfos) :
IinfBox(DataSourceHelper *source, Vector<ItemInfo> *itemInfos) :
FullBox(source, FOURCC('i', 'i', 'n', 'f')),
mItemInfos(itemInfos), mHasGrids(false) {}
@ -1196,7 +1197,7 @@ status_t IinfBox::onChunkData(uint32_t type, off64_t offset, size_t size) {
//////////////////////////////////////////////////////////////////
ItemTable::ItemTable(DataSourceBase *source)
ItemTable::ItemTable(DataSourceHelper *source)
: mDataSource(source),
mPrimaryItemId(0),
mIdatOffset(0),

@ -25,7 +25,7 @@
namespace android {
class DataSourceBase;
class DataSourceHelper;
class MetaData;
namespace heif {
@ -45,7 +45,7 @@ struct ItemReference;
class ItemTable : public RefBase {
public:
explicit ItemTable(DataSourceBase *source);
explicit ItemTable(DataSourceHelper *source);
status_t parse(uint32_t type, off64_t offset, size_t size);
@ -62,7 +62,7 @@ protected:
~ItemTable();
private:
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
KeyedVector<uint32_t, ItemLoc> mItemLocs;
Vector<ItemInfo> mItemInfos;

@ -32,6 +32,7 @@
#include "ItemTable.h"
#include "include/ESDS.h"
#include <media/DataSourceBase.h>
#include <media/ExtractorUtils.h>
#include <media/MediaTrack.h>
#include <media/stagefright/foundation/ABitReader.h>
@ -72,7 +73,7 @@ static const size_t kMaxPcmFrameSize = 8192;
public:
// Caller retains ownership of both "dataSource" and "sampleTable".
MPEG4Source(MetaDataBase &format,
DataSourceBase *dataSource,
DataSourceHelper *dataSource,
int32_t timeScale,
const sp<SampleTable> &sampleTable,
Vector<SidxEntry> &sidx,
@ -96,7 +97,7 @@ private:
Mutex mLock;
MetaDataBase &mFormat;
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
int32_t mTimescale;
sp<SampleTable> mSampleTable;
uint32_t mCurrentSampleIndex;
@ -197,11 +198,10 @@ private:
// possibly wrapping multiple times to cover all tracks, i.e.
// Each CachedRangedDataSource caches the sampletable metadata for a single track.
struct CachedRangedDataSource : public DataSourceBase {
explicit CachedRangedDataSource(DataSourceBase *source);
struct CachedRangedDataSource : public DataSourceHelper {
explicit CachedRangedDataSource(DataSourceHelper *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();
@ -212,7 +212,7 @@ struct CachedRangedDataSource : public DataSourceBase {
private:
Mutex mLock;
DataSourceBase *mSource;
DataSourceHelper *mSource;
bool mOwnsDataSource;
off64_t mCachedOffset;
size_t mCachedSize;
@ -224,8 +224,9 @@ private:
CachedRangedDataSource &operator=(const CachedRangedDataSource &);
};
CachedRangedDataSource::CachedRangedDataSource(DataSourceBase *source)
: mSource(source),
CachedRangedDataSource::CachedRangedDataSource(DataSourceHelper *source)
: DataSourceHelper(source),
mSource(source),
mOwnsDataSource(false),
mCachedOffset(0),
mCachedSize(0),
@ -249,10 +250,6 @@ void CachedRangedDataSource::clearCache() {
mCachedSize = 0;
}
status_t CachedRangedDataSource::initCheck() const {
return mSource->initCheck();
}
ssize_t CachedRangedDataSource::readAt(off64_t offset, void *data, size_t size) {
Mutex::Autolock autoLock(mLock);
@ -364,11 +361,11 @@ static bool AdjustChannelsAndRate(uint32_t fourcc, uint32_t *channels, uint32_t
return false;
}
MPEG4Extractor::MPEG4Extractor(DataSourceBase *source, const char *mime)
MPEG4Extractor::MPEG4Extractor(DataSourceHelper *source, const char *mime)
: mMoofOffset(0),
mMoofFound(false),
mMdatFound(false),
mDataSource(source),
mDataSource(new DataSourceHelper(source)),
mCachedSource(NULL),
mInitCheck(NO_INIT),
mHeaderTimescale(0),
@ -397,6 +394,7 @@ MPEG4Extractor::~MPEG4Extractor() {
mPssh.clear();
delete mCachedSource;
delete mDataSource;
}
uint32_t MPEG4Extractor::flags() const {
@ -4093,7 +4091,7 @@ status_t MPEG4Extractor::updateAudioTrackInfoFromESDS_MPEG4Audio(
MPEG4Source::MPEG4Source(
MetaDataBase &format,
DataSourceBase *dataSource,
DataSourceHelper *dataSource,
int32_t timeScale,
const sp<SampleTable> &sampleTable,
Vector<SidxEntry> &sidx,
@ -5772,7 +5770,7 @@ MPEG4Extractor::Track *MPEG4Extractor::findTrackByMimePrefix(
return NULL;
}
static bool LegacySniffMPEG4(DataSourceBase *source, float *confidence) {
static bool LegacySniffMPEG4(DataSourceHelper *source, float *confidence) {
uint8_t header[8];
ssize_t n = source->readAt(4, header, sizeof(header));
@ -5837,7 +5835,7 @@ static bool isCompatibleBrand(uint32_t fourcc) {
// Also try to identify where this file's metadata ends
// (end of the 'moov' atom) and report it to the caller as part of
// the metadata.
static bool BetterSniffMPEG4(DataSourceBase *source, float *confidence) {
static bool BetterSniffMPEG4(DataSourceHelper *source, float *confidence) {
// We scan up to 128 bytes to identify this file as an MP4.
static const off64_t kMaxScanOffset = 128ll;
@ -5944,18 +5942,19 @@ static bool BetterSniffMPEG4(DataSourceBase *source, float *confidence) {
return true;
}
static CMediaExtractor* CreateExtractor(DataSourceBase *source, void *) {
return wrap(new MPEG4Extractor(source));
static CMediaExtractor* CreateExtractor(CDataSource *source, void *) {
return wrap(new MPEG4Extractor(new DataSourceHelper(source)));
}
static CreatorFunc Sniff(
DataSourceBase *source, float *confidence, void **,
CDataSource *source, float *confidence, void **,
FreeMetaFunc *) {
if (BetterSniffMPEG4(source, confidence)) {
DataSourceHelper helper(source);
if (BetterSniffMPEG4(&helper, confidence)) {
return CreateExtractor;
}
if (LegacySniffMPEG4(source, confidence)) {
if (LegacySniffMPEG4(&helper, confidence)) {
ALOGW("Identified supported mpeg4 through LegacySniffMPEG4.");
return CreateExtractor;
}

@ -20,7 +20,6 @@
#include <arpa/inet.h>
#include <media/DataSourceBase.h>
#include <media/MediaExtractorPluginApi.h>
#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MetaDataBase.h>
@ -32,7 +31,8 @@
namespace android {
struct AMessage;
class DataSourceBase;
struct CDataSource;
class DataSourceHelper;
struct CachedRangedDataSource;
class SampleTable;
class String8;
@ -56,7 +56,7 @@ struct Trex {
class MPEG4Extractor : public MediaExtractorPluginHelper {
public:
explicit MPEG4Extractor(DataSourceBase *source, const char *mime = NULL);
explicit MPEG4Extractor(DataSourceHelper *source, const char *mime = NULL);
virtual size_t countTracks();
virtual MediaTrack *getTrack(size_t index);
@ -98,7 +98,7 @@ private:
Vector<Trex> mTrex;
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
CachedRangedDataSource *mCachedSource;
status_t mInitCheck;
uint32_t mHeaderTimescale;
@ -150,10 +150,6 @@ private:
MPEG4Extractor &operator=(const MPEG4Extractor &);
};
bool SniffMPEG4(
DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *);
} // namespace android
#endif // MPEG4_EXTRACTOR_H_

@ -25,7 +25,7 @@
#include <arpa/inet.h>
#include <media/DataSourceBase.h>
#include <media/MediaExtractorPluginApi.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ByteUtils.h>
@ -114,7 +114,7 @@ int32_t SampleTable::CompositionDeltaLookup::getCompositionTimeOffset(
////////////////////////////////////////////////////////////////////////////////
SampleTable::SampleTable(DataSourceBase *source)
SampleTable::SampleTable(DataSourceHelper *source)
: mDataSource(source),
mChunkOffsetOffset(-1),
mChunkOffsetType(0),

@ -21,18 +21,19 @@
#include <sys/types.h>
#include <stdint.h>
#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MediaErrors.h>
#include <utils/RefBase.h>
#include <utils/threads.h>
namespace android {
class DataSourceBase;
class DataSourceHelper;
struct SampleIterator;
class SampleTable : public RefBase {
public:
explicit SampleTable(DataSourceBase *source);
explicit SampleTable(DataSourceHelper *source);
bool isValid() const;
@ -102,7 +103,7 @@ private:
// Limit the total size of all internal tables to 200MiB.
static const size_t kMaxTotalSize = 200 * (1 << 20);
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
Mutex mLock;
off64_t mChunkOffsetOffset;

@ -19,11 +19,14 @@
#include <utils/Log.h>
#include <media/MediaExtractor.h>
#include <media/MediaExtractorPluginHelper.h>
#include "MPEG2PSExtractor.h"
#include "MPEG2TSExtractor.h"
namespace android {
struct CDataSource;
extern "C" {
// This is the only symbol that needs to be exported
__attribute__ ((visibility ("default")))
@ -34,20 +37,21 @@ ExtractorDef GETEXTRACTORDEF() {
1,
"MPEG2-PS/TS Extractor",
[](
DataSourceBase *source,
CDataSource *source,
float *confidence,
void **,
FreeMetaFunc *) -> CreatorFunc {
if (SniffMPEG2TS(source, confidence)) {
DataSourceHelper helper(source);
if (SniffMPEG2TS(&helper, confidence)) {
return [](
DataSourceBase *source,
CDataSource *source,
void *) -> CMediaExtractor* {
return wrap(new MPEG2TSExtractor(source));};
} else if (SniffMPEG2PS(source, confidence)) {
return wrap(new MPEG2TSExtractor(new DataSourceHelper(source)));};
} else if (SniffMPEG2PS(&helper, confidence)) {
return [](
DataSourceBase *source,
CDataSource *source,
void *) -> CMediaExtractor* {
return wrap(new MPEG2PSExtractor(source));};
return wrap(new MPEG2PSExtractor(new DataSourceHelper(source)));};
}
return NULL;
}

@ -94,7 +94,7 @@ private:
////////////////////////////////////////////////////////////////////////////////
MPEG2PSExtractor::MPEG2PSExtractor(DataSourceBase *source)
MPEG2PSExtractor::MPEG2PSExtractor(DataSourceHelper *source)
: mDataSource(source),
mOffset(0),
mFinalResult(OK),
@ -120,6 +120,7 @@ MPEG2PSExtractor::MPEG2PSExtractor(DataSourceBase *source)
}
MPEG2PSExtractor::~MPEG2PSExtractor() {
delete mDataSource;
}
size_t MPEG2PSExtractor::countTracks() {
@ -754,7 +755,7 @@ status_t MPEG2PSExtractor::WrappedTrack::read(
////////////////////////////////////////////////////////////////////////////////
bool SniffMPEG2PS(
DataSourceBase *source, float *confidence) {
DataSourceHelper *source, float *confidence) {
uint8_t header[5];
if (source->readAt(0, header, sizeof(header)) < (ssize_t)sizeof(header)) {
return false;

@ -33,7 +33,7 @@ struct Track;
class String8;
struct MPEG2PSExtractor : public MediaExtractorPluginHelper {
explicit MPEG2PSExtractor(DataSourceBase *source);
explicit MPEG2PSExtractor(DataSourceHelper *source);
virtual size_t countTracks();
virtual MediaTrack *getTrack(size_t index);
@ -52,7 +52,7 @@ private:
struct WrappedTrack;
mutable Mutex mLock;
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
off64_t mOffset;
status_t mFinalResult;
@ -73,7 +73,7 @@ private:
DISALLOW_EVIL_CONSTRUCTORS(MPEG2PSExtractor);
};
bool SniffMPEG2PS(DataSourceBase *source, float *confidence);
bool SniffMPEG2PS(DataSourceHelper *source, float *confidence);
} // namespace android

@ -123,7 +123,7 @@ status_t MPEG2TSSource::read(
////////////////////////////////////////////////////////////////////////////////
MPEG2TSExtractor::MPEG2TSExtractor(DataSourceBase *source)
MPEG2TSExtractor::MPEG2TSExtractor(DataSourceHelper *source)
: mDataSource(source),
mParser(new ATSParser),
mLastSyncEvent(0),
@ -131,6 +131,10 @@ MPEG2TSExtractor::MPEG2TSExtractor(DataSourceBase *source)
init();
}
MPEG2TSExtractor::~MPEG2TSExtractor() {
delete mDataSource;
}
size_t MPEG2TSExtractor::countTracks() {
return mSourceImpls.size();
}
@ -652,7 +656,7 @@ status_t MPEG2TSExtractor::feedUntilBufferAvailable(
////////////////////////////////////////////////////////////////////////////////
bool SniffMPEG2TS(DataSourceBase *source, float *confidence) {
bool SniffMPEG2TS(DataSourceHelper *source, float *confidence) {
for (int i = 0; i < 5; ++i) {
char header;
if (source->readAt(kTSPacketSize * i, &header, 1) != 1

@ -35,12 +35,12 @@ namespace android {
struct AMessage;
struct AnotherPacketSource;
struct ATSParser;
class DataSourceBase;
struct CDataSource;
struct MPEG2TSSource;
class String8;
struct MPEG2TSExtractor : public MediaExtractorPluginHelper {
explicit MPEG2TSExtractor(DataSourceBase *source);
explicit MPEG2TSExtractor(DataSourceHelper *source);
virtual size_t countTracks();
virtual MediaTrack *getTrack(size_t index);
@ -53,12 +53,15 @@ struct MPEG2TSExtractor : public MediaExtractorPluginHelper {
virtual uint32_t flags() const;
virtual const char * name() { return "MPEG2TSExtractor"; }
protected:
virtual ~MPEG2TSExtractor();
private:
friend struct MPEG2TSSource;
mutable Mutex mLock;
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
sp<ATSParser> mParser;
@ -82,9 +85,9 @@ private:
// 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 DataSourceBase to
// This function returns OK if expected amount of data is fed from DataSourceHelper to
// parser and is successfully parsed. Otherwise, various error codes could be
// returned, e.g., ERROR_END_OF_STREAM, or no data availalbe from DataSourceBase, or
// returned, e.g., ERROR_END_OF_STREAM, or no data availalbe from DataSourceHelper, or
// the data has syntax error during parsing, etc.
status_t feedMore(bool isInit = false);
status_t seek(int64_t seekTimeUs,
@ -102,7 +105,7 @@ private:
DISALLOW_EVIL_CONSTRUCTORS(MPEG2TSExtractor);
};
bool SniffMPEG2TS(DataSourceBase *source, float *confidence);
bool SniffMPEG2TS(DataSourceHelper *source, float *confidence);
} // namespace android

@ -71,7 +71,7 @@ private:
struct MyOggExtractor {
MyOggExtractor(
DataSourceBase *source,
DataSourceHelper *source,
const char *mimeType,
size_t numHeaders,
int64_t seekPreRollUs);
@ -110,7 +110,7 @@ protected:
int64_t mTimeUs;
};
DataSourceBase *mSource;
DataSourceHelper *mSource;
off64_t mOffset;
Page mCurrentPage;
uint64_t mCurGranulePosition;
@ -169,7 +169,7 @@ protected:
};
struct MyVorbisExtractor : public MyOggExtractor {
explicit MyVorbisExtractor(DataSourceBase *source)
explicit MyVorbisExtractor(DataSourceHelper *source)
: MyOggExtractor(source,
MEDIA_MIMETYPE_AUDIO_VORBIS,
/* numHeaders */ 3,
@ -197,7 +197,7 @@ struct MyOpusExtractor : public MyOggExtractor {
static const int32_t kOpusSampleRate = 48000;
static const int64_t kOpusSeekPreRollUs = 80000; // 80 ms
explicit MyOpusExtractor(DataSourceBase *source)
explicit MyOpusExtractor(DataSourceHelper *source)
: MyOggExtractor(source, MEDIA_MIMETYPE_AUDIO_OPUS, /*numHeaders*/ 2, kOpusSeekPreRollUs),
mChannelCount(0),
mCodecDelay(0),
@ -296,7 +296,7 @@ status_t OggSource::read(
////////////////////////////////////////////////////////////////////////////////
MyOggExtractor::MyOggExtractor(
DataSourceBase *source,
DataSourceHelper *source,
const char *mimeType,
size_t numHeaders,
int64_t seekPreRollUs)
@ -1193,7 +1193,7 @@ void MyOggExtractor::parseFileMetaData() {
////////////////////////////////////////////////////////////////////////////////
OggExtractor::OggExtractor(DataSourceBase *source)
OggExtractor::OggExtractor(DataSourceHelper *source)
: mDataSource(source),
mInitCheck(NO_INIT),
mImpl(NULL) {
@ -1249,18 +1249,19 @@ status_t OggExtractor::getMetaData(MetaDataBase &meta) {
}
static CMediaExtractor* CreateExtractor(
DataSourceBase *source,
CDataSource *source,
void *) {
return wrap(new OggExtractor(source));
return wrap(new OggExtractor(new DataSourceHelper(source)));
}
static CreatorFunc Sniff(
DataSourceBase *source,
CDataSource *source,
float *confidence,
void **,
FreeMetaFunc *) {
DataSourceHelper helper(source);
char tmp[4];
if (source->readAt(0, tmp, 4) < 4 || memcmp(tmp, "OggS", 4)) {
if (helper.readAt(0, tmp, 4) < 4 || memcmp(tmp, "OggS", 4)) {
return NULL;
}

@ -25,14 +25,13 @@
namespace android {
struct AMessage;
class DataSourceBase;
class String8;
struct MyOggExtractor;
struct OggSource;
struct OggExtractor : public MediaExtractorPluginHelper {
explicit OggExtractor(DataSourceBase *source);
explicit OggExtractor(DataSourceHelper *source);
virtual size_t countTracks();
virtual MediaTrack *getTrack(size_t index);
@ -47,7 +46,7 @@ protected:
private:
friend struct OggSource;
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
status_t mInitCheck;
MyOggExtractor *mImpl;

@ -57,7 +57,7 @@ static uint16_t U16_LE_AT(const uint8_t *ptr) {
struct WAVSource : public MediaTrack {
WAVSource(
DataSourceBase *dataSource,
DataSourceHelper *dataSource,
MetaDataBase &meta,
uint16_t waveFormat,
int32_t bitsPerSample,
@ -78,7 +78,7 @@ protected:
private:
static const size_t kMaxFrameSize;
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
MetaDataBase &mMeta;
uint16_t mWaveFormat;
int32_t mSampleRate;
@ -94,7 +94,7 @@ private:
WAVSource &operator=(const WAVSource &);
};
WAVExtractor::WAVExtractor(DataSourceBase *source)
WAVExtractor::WAVExtractor(DataSourceHelper *source)
: mDataSource(source),
mValidFormat(false),
mChannelMask(CHANNEL_MASK_USE_CHANNEL_ORDER) {
@ -102,6 +102,7 @@ WAVExtractor::WAVExtractor(DataSourceBase *source)
}
WAVExtractor::~WAVExtractor() {
delete mDataSource;
}
status_t WAVExtractor::getMetaData(MetaDataBase &meta) {
@ -347,7 +348,7 @@ status_t WAVExtractor::init() {
const size_t WAVSource::kMaxFrameSize = 32768;
WAVSource::WAVSource(
DataSourceBase *dataSource,
DataSourceHelper *dataSource,
MetaDataBase &meta,
uint16_t waveFormat,
int32_t bitsPerSample,
@ -545,33 +546,38 @@ status_t WAVSource::read(
////////////////////////////////////////////////////////////////////////////////
static CMediaExtractor* CreateExtractor(
DataSourceBase *source,
CDataSource *source,
void *) {
return wrap(new WAVExtractor(source));
return wrap(new WAVExtractor(new DataSourceHelper(source)));
}
static CreatorFunc Sniff(
DataSourceBase *source,
CDataSource *source,
float *confidence,
void **,
FreeMetaFunc *) {
DataSourceHelper *helper = new DataSourceHelper(source);
char header[12];
if (source->readAt(0, header, sizeof(header)) < (ssize_t)sizeof(header)) {
if (helper->readAt(0, header, sizeof(header)) < (ssize_t)sizeof(header)) {
delete helper;
return NULL;
}
if (memcmp(header, "RIFF", 4) || memcmp(&header[8], "WAVE", 4)) {
delete helper;
return NULL;
}
WAVExtractor *extractor = new WAVExtractor(source);
WAVExtractor *extractor = new WAVExtractor(helper);
int numTracks = extractor->countTracks();
delete extractor;
if (numTracks == 0) {
delete helper;
return NULL;
}
*confidence = 0.3f;
delete helper;
return CreateExtractor;
}

@ -26,12 +26,12 @@
namespace android {
struct AMessage;
class DataSourceBase;
struct CDataSource;
class String8;
class WAVExtractor : public MediaExtractorPluginHelper {
public:
explicit WAVExtractor(DataSourceBase *source);
explicit WAVExtractor(DataSourceHelper *source);
virtual size_t countTracks();
virtual MediaTrack *getTrack(size_t index);
@ -43,7 +43,7 @@ public:
virtual ~WAVExtractor();
private:
DataSourceBase *mDataSource;
DataSourceHelper *mDataSource;
status_t mInitCheck;
bool mValidFormat;
uint16_t mWaveFormat;

@ -23,6 +23,7 @@
#include <fcntl.h>
#include <media/MidiIoWrapper.h>
#include <media/MediaExtractorPluginApi.h>
static int readAt(void *handle, void *buffer, int pos, int size) {
return ((android::MidiIoWrapper*)handle)->readAt(buffer, pos, size);
@ -61,6 +62,51 @@ MidiIoWrapper::MidiIoWrapper(DataSourceBase *source) {
}
}
class DataSourceUnwrapper : public DataSourceBase {
public:
explicit DataSourceUnwrapper(CDataSource *csource) {
mSource = csource;
}
virtual status_t initCheck() const { return OK; }
// 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) {
return mSource->readAt(mSource->handle, offset, data, size);
}
// May return ERROR_UNSUPPORTED.
virtual status_t getSize(off64_t *size) {
return mSource->getSize(mSource->handle, size);
}
virtual bool getUri(char * /*uriString*/, size_t /*bufferSize*/) {
return false;
}
virtual uint32_t flags() {
return 0;
}
virtual void close() {};
private:
CDataSource *mSource;
};
MidiIoWrapper::MidiIoWrapper(CDataSource *csource) {
ALOGV("MidiIoWrapper(CDataSource)");
mFd = -1;
mDataSource = new DataSourceUnwrapper(csource);
off64_t l;
if (mDataSource->getSize(&l) == OK) {
mLength = l;
} else {
mLength = 0;
}
}
MidiIoWrapper::~MidiIoWrapper() {
ALOGV("~MidiIoWrapper");
if (mFd >= 0) {

@ -23,11 +23,14 @@
namespace android {
struct CDataSource;
class MidiIoWrapper {
public:
explicit MidiIoWrapper(const char *path);
explicit MidiIoWrapper(int fd, off64_t offset, int64_t size);
explicit MidiIoWrapper(DataSourceBase *source);
explicit MidiIoWrapper(CDataSource *csource);
~MidiIoWrapper();

@ -22,6 +22,7 @@
#include <media/stagefright/MediaErrors.h>
#include <media/DataSourceBase.h>
#include <media/IDataSource.h>
#include <media/MediaExtractorPluginHelper.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
#include <utils/threads.h>
@ -34,7 +35,7 @@ class String8;
class DataSource : public DataSourceBase, public virtual RefBase {
public:
DataSource() {}
DataSource() : mWrapper(NULL) {}
// returns a pointer to IDataSource if it is wrapped.
virtual sp<IDataSource> getIDataSource() const {
@ -69,10 +70,35 @@ public:
return String8("application/octet-stream");
}
CDataSource *wrap() {
if (mWrapper) {
return mWrapper;
}
mWrapper = new CDataSource();
mWrapper->handle = this;
mWrapper->readAt = [](void *handle, off64_t offset, void *data, size_t size) -> ssize_t {
return ((DataSource*)handle)->readAt(offset, data, size);
};
mWrapper->getSize = [](void *handle, off64_t *size) -> status_t {
return ((DataSource*)handle)->getSize(size);
};
mWrapper->flags = [](void *handle) -> uint32_t {
return ((DataSource*)handle)->flags();
};
mWrapper->getUri = [](void *handle, char *uriString, size_t bufferSize) -> bool {
return ((DataSource*)handle)->getUri(uriString, bufferSize);
};
return mWrapper;
}
protected:
virtual ~DataSource() {}
virtual ~DataSource() {
delete mWrapper;
}
private:
CDataSource *mWrapper;
DataSource(const DataSource &);
DataSource &operator=(const DataSource &);
};

@ -78,13 +78,13 @@ sp<IMediaExtractor> MediaExtractorFactory::CreateFromService(
FreeMetaFunc freeMeta = nullptr;
float confidence;
sp<ExtractorPlugin> plugin;
creator = sniff(source.get(), &confidence, &meta, &freeMeta, plugin);
creator = sniff(source, &confidence, &meta, &freeMeta, plugin);
if (!creator) {
ALOGV("FAILED to autodetect media content.");
return NULL;
}
CMediaExtractor *ret = creator(source.get(), meta);
CMediaExtractor *ret = creator(source->wrap(), meta);
if (meta != nullptr && freeMeta != nullptr) {
freeMeta(meta);
}
@ -129,7 +129,7 @@ bool MediaExtractorFactory::gPluginsRegistered = false;
// static
CreatorFunc MediaExtractorFactory::sniff(
DataSourceBase *source, float *confidence, void **meta,
const sp<DataSource> &source, float *confidence, void **meta,
FreeMetaFunc *freeMeta, sp<ExtractorPlugin> &plugin) {
*confidence = 0.0f;
*meta = nullptr;
@ -150,7 +150,7 @@ CreatorFunc MediaExtractorFactory::sniff(
float newConfidence;
void *newMeta = nullptr;
FreeMetaFunc newFreeMeta = nullptr;
if ((curCreator = (*it)->def.sniff(source, &newConfidence, &newMeta, &newFreeMeta))) {
if ((curCreator = (*it)->def.sniff(source->wrap(), &newConfidence, &newMeta, &newFreeMeta))) {
if (newConfidence > *confidence) {
*confidence = newConfidence;
if (*meta != nullptr && *freeMeta != nullptr) {

@ -21,6 +21,8 @@
#include "../include/ID3.h"
#include <media/DataSource.h>
#include <media/MediaExtractorPluginApi.h>
#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ByteUtils.h>
#include <utils/String8.h>
@ -56,6 +58,55 @@ private:
DISALLOW_EVIL_CONSTRUCTORS(MemorySource);
};
class DataSourceUnwrapper : public DataSourceBase {
public:
explicit DataSourceUnwrapper(DataSourceHelper *sourcehelper) {
mSource = sourcehelper;
}
virtual status_t initCheck() const { return OK; }
// 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) {
return mSource->readAt(offset, data, size);
}
// May return ERROR_UNSUPPORTED.
virtual status_t getSize(off64_t *size) {
return mSource->getSize(size);
}
virtual bool getUri(char * /*uriString*/, size_t /*bufferSize*/) {
return false;
}
virtual uint32_t flags() {
return 0;
}
virtual void close() {};
private:
DataSourceHelper *mSource;
};
ID3::ID3(DataSourceHelper *sourcehelper, bool ignoreV1, off64_t offset)
: mIsValid(false),
mData(NULL),
mSize(0),
mFirstFrameOffset(0),
mVersion(ID3_UNKNOWN),
mRawSize(0) {
DataSourceUnwrapper source(sourcehelper);
mIsValid = parseV2(&source, offset);
if (!mIsValid && !ignoreV1) {
mIsValid = parseV1(&source);
}
}
ID3::ID3(DataSourceBase *source, bool ignoreV1, off64_t offset)
: mIsValid(false),
mData(NULL),

@ -24,6 +24,7 @@ namespace android {
class DataSourceBase;
class String8;
class DataSourceHelper;
struct ID3 {
enum Version {
@ -35,6 +36,7 @@ struct ID3 {
ID3_V2_4,
};
explicit ID3(DataSourceHelper *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();

@ -49,7 +49,7 @@ private:
static void RegisterExtractor(
const sp<ExtractorPlugin> &plugin, std::list<sp<ExtractorPlugin>> &pluginList);
static CreatorFunc sniff(DataSourceBase *source,
static CreatorFunc sniff(const sp<DataSource> &source,
float *confidence, void **meta, FreeMetaFunc *freeMeta,
sp<ExtractorPlugin> &plugin);

Loading…
Cancel
Save