OSDN Git Service

Expand AMediaFormat
authorMarco Nelissen <marcone@google.com>
Wed, 7 May 2014 19:55:18 +0000 (12:55 -0700)
committerMarco Nelissen <marcone@google.com>
Wed, 7 May 2014 19:55:18 +0000 (12:55 -0700)
Remove getDouble and getSize methods, since these are not used and/or
not present in the corresponding Java MediaFormat API.
Add setBuffer/getBuffer, needed for making formats for encoding, and
add other setters.

Change-Id: I528d51b4ed571d852b949637f7ae3a95d31da7c1

include/ndk/NdkMediaFormat.h
media/ndk/NdkMediaFormat.cpp

index 4489b78..e0caeab 100644 (file)
@@ -48,14 +48,32 @@ const char* AMediaFormat_toString(AMediaFormat*);
 bool AMediaFormat_getInt32(AMediaFormat*, const char *name, int32_t *out);
 bool AMediaFormat_getInt64(AMediaFormat*, const char *name, int64_t *out);
 bool AMediaFormat_getFloat(AMediaFormat*, const char *name, float *out);
-bool AMediaFormat_getDouble(AMediaFormat*, const char *name, double *out);
-bool AMediaFormat_getSize(AMediaFormat*, const char *name, size_t *out);
+/**
+ * The returned data is owned by the format and remains valid as long as the named entry
+ * is part of the format.
+ */
+bool AMediaFormat_getBuffer(AMediaFormat*, const char *name, void** data, size_t *size);
 /**
  * The returned string is owned by the format, and remains valid until the next call to getString,
  * or until the format is deleted.
  */
 bool AMediaFormat_getString(AMediaFormat*, const char *name, const char **out);
 
+
+void AMediaFormat_setInt32(AMediaFormat*, const char* name, int32_t value);
+void AMediaFormat_setInt64(AMediaFormat*, const char* name, int64_t value);
+void AMediaFormat_setFloat(AMediaFormat*, const char* name, float value);
+/**
+ * The provided string is copied into the format.
+ */
+void AMediaFormat_setString(AMediaFormat*, const char* name, const char* value);
+/**
+ * The provided data is copied into the format.
+ */
+void AMediaFormat_setBuffer(AMediaFormat*, const char* name, void* data, size_t size);
+
+
+
 /**
  * XXX should these be ints/enums that we look up in a table as needed?
  */
index 32acf59..c08814f 100644 (file)
@@ -141,24 +141,30 @@ const char* AMediaFormat_toString(AMediaFormat *mData) {
     return mData->mDebug.string();
 }
 
-bool AMediaFormat_getInt32(AMediaFormat* mData, const char *name, int32_t *out) {
-    return mData->mFormat->findInt32(name, out);
+bool AMediaFormat_getInt32(AMediaFormat* format, const char *name, int32_t *out) {
+    return format->mFormat->findInt32(name, out);
 }
 
-bool AMediaFormat_getInt64(AMediaFormat* mData, const char *name, int64_t *out) {
-    return mData->mFormat->findInt64(name, out);
+bool AMediaFormat_getInt64(AMediaFormat* format, const char *name, int64_t *out) {
+    return format->mFormat->findInt64(name, out);
 }
 
-bool AMediaFormat_getFloat(AMediaFormat* mData, const char *name, float *out) {
-    return mData->mFormat->findFloat(name, out);
+bool AMediaFormat_getFloat(AMediaFormat* format, const char *name, float *out) {
+    return format->mFormat->findFloat(name, out);
 }
 
-bool AMediaFormat_getDouble(AMediaFormat* mData, const char *name, double *out) {
-    return mData->mFormat->findDouble(name, out);
+bool AMediaFormat_getSize(AMediaFormat* format, const char *name, size_t *out) {
+    return format->mFormat->findSize(name, out);
 }
 
-bool AMediaFormat_getSize(AMediaFormat* mData, const char *name, size_t *out) {
-    return mData->mFormat->findSize(name, out);
+bool AMediaFormat_getBuffer(AMediaFormat* format, const char *name, void** data, size_t *outsize) {
+    sp<ABuffer> buf;
+    if (format->mFormat->findBuffer(name, &buf)) {
+        *data = buf->data() + buf->offset();
+        *outsize = buf->size();
+        return true;
+    }
+    return false;
 }
 
 bool AMediaFormat_getString(AMediaFormat* mData, const char *name, const char **out) {
@@ -180,6 +186,34 @@ bool AMediaFormat_getString(AMediaFormat* mData, const char *name, const char **
     return false;
 }
 
+void AMediaFormat_setInt32(AMediaFormat* format, const char *name, int32_t value) {
+    format->mFormat->setInt32(name, value);
+}
+
+void AMediaFormat_setInt64(AMediaFormat* format, const char *name, int64_t value) {
+    format->mFormat->setInt64(name, value);
+}
+
+void AMediaFormat_setFloat(AMediaFormat* format, const char* name, float value) {
+    format->mFormat->setFloat(name, value);
+}
+
+void AMediaFormat_setString(AMediaFormat* format, const char* name, const char* value) {
+    // AMessage::setString() makes a copy of the string
+    format->mFormat->setString(name, value, strlen(value));
+}
+
+void AMediaFormat_setBuffer(AMediaFormat* format, const char* name, void* data, size_t size) {
+    // the ABuffer(void*, size_t) constructor doesn't take ownership of the data, so create
+    // a new buffer and copy the data into it
+    sp<ABuffer> buf = new ABuffer(size);
+    memcpy(buf->data(), data, size);
+    buf->setRange(0, size);
+    // AMessage::setBuffer() increases the refcount of the buffer
+    format->mFormat->setBuffer(name, buf);
+}
+
+
 const char* AMEDIAFORMAT_KEY_AAC_PROFILE = "aac-profile";
 const char* AMEDIAFORMAT_KEY_BIT_RATE = "bitrate";
 const char* AMEDIAFORMAT_KEY_CHANNEL_COUNT = "channel-count";