diff options
-rw-r--r-- | include/ndk/NdkMediaFormat.h | 6 | ||||
-rw-r--r-- | media/ndk/NdkMediaFormat.cpp | 17 | ||||
-rw-r--r-- | services/camera/libcameraservice/device3/Camera3Stream.cpp | 2 |
3 files changed, 20 insertions, 5 deletions
diff --git a/include/ndk/NdkMediaFormat.h b/include/ndk/NdkMediaFormat.h index 16f4348..4489b78 100644 --- a/include/ndk/NdkMediaFormat.h +++ b/include/ndk/NdkMediaFormat.h @@ -40,7 +40,8 @@ AMediaFormat *AMediaFormat_new(); int AMediaFormat_delete(AMediaFormat*); /** - * Debug string. Caller must free. + * Human readable representation of the format. The returned string is owned by the format, + * and remains valid until the next call to toString, or until the format is deleted. */ const char* AMediaFormat_toString(AMediaFormat*); @@ -50,7 +51,8 @@ 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); /** - * Caller must free the returned string + * 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); diff --git a/media/ndk/NdkMediaFormat.cpp b/media/ndk/NdkMediaFormat.cpp index 359f37e..6f69f8d 100644 --- a/media/ndk/NdkMediaFormat.cpp +++ b/media/ndk/NdkMediaFormat.cpp @@ -34,6 +34,8 @@ using namespace android; struct AMediaFormat { sp<AMessage> mFormat; + String8 mDebug; + KeyedVector<String8, String8> mStringCache; }; extern "C" { @@ -135,7 +137,8 @@ const char* AMediaFormat_toString(AMediaFormat *mData) { } } ret.append("}"); - return strdup(ret.string()); + mData->mDebug = ret; + return mData->mDebug.string(); } bool AMediaFormat_getInt32(AMediaFormat* mData, const char *name, int32_t *out) { @@ -159,9 +162,19 @@ bool AMediaFormat_getSize(AMediaFormat* mData, const char *name, size_t *out) { } bool AMediaFormat_getString(AMediaFormat* mData, const char *name, const char **out) { + + for (size_t i = 0; i < mData->mStringCache.size(); i++) { + if (strcmp(mData->mStringCache.keyAt(i).string(), name) == 0) { + mData->mStringCache.removeItemsAt(i, 1); + break; + } + } + AString tmp; if (mData->mFormat->findString(name, &tmp)) { - *out = strdup(tmp.c_str()); + String8 ret(tmp.c_str()); + mData->mStringCache.add(String8(name), ret); + *out = ret.string(); return true; } return false; diff --git a/services/camera/libcameraservice/device3/Camera3Stream.cpp b/services/camera/libcameraservice/device3/Camera3Stream.cpp index abfb602..7645a2a 100644 --- a/services/camera/libcameraservice/device3/Camera3Stream.cpp +++ b/services/camera/libcameraservice/device3/Camera3Stream.cpp @@ -397,7 +397,7 @@ status_t Camera3Stream::registerBuffersLocked(camera3_device *hal3Device) { "must be set to NULL in camera3_device::ops", __FUNCTION__); return INVALID_OPERATION; } else { - ALOGD("%s: Skipping NULL check for deprecated register_stream_buffers"); + ALOGD("%s: Skipping NULL check for deprecated register_stream_buffers", __FUNCTION__); } return OK; |