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/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