C-ify DataSource
Add a C API for DataSource/Base, and a helper so extractors
can continue using a C++ API.
Bug: 111407253
Test: build, boot, play some files
Change-Id: I1c8b2990e17d18eee53c9abf7ebef2ced0e8b7fd
diff --git a/include/media/MediaExtractorPluginApi.h b/include/media/MediaExtractorPluginApi.h
index 30c2b05..930b6e2 100644
--- a/include/media/MediaExtractorPluginApi.h
+++ b/include/media/MediaExtractorPluginApi.h
@@ -23,10 +23,17 @@
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 @@
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 @@
// 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 {
diff --git a/include/media/MediaExtractorPluginHelper.h b/include/media/MediaExtractorPluginHelper.h
index 465f76a..c817b30 100644
--- a/include/media/MediaExtractorPluginHelper.h
+++ b/include/media/MediaExtractorPluginHelper.h
@@ -18,6 +18,7 @@
#define MEDIA_EXTRACTOR_PLUGIN_HELPER_H_
+#include <arpa/inet.h>
#include <stdio.h>
#include <vector>
@@ -117,6 +118,136 @@
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