diff options
author | Lajos Molnar <lajos@google.com> | 2014-05-07 15:31:28 -0700 |
---|---|---|
committer | Lajos Molnar <lajos@google.com> | 2014-05-08 19:32:05 -0700 |
commit | fc7fca77caa12993dd938d5ff43797d781291027 (patch) | |
tree | 14e40042e56178850395b4302291d7d84c2fe5cb /media/libstagefright/MediaCodec.cpp | |
parent | e99703920adb8037c506bfc6d0159a1b9aa8cf7c (diff) | |
download | frameworks_av-fc7fca77caa12993dd938d5ff43797d781291027.zip frameworks_av-fc7fca77caa12993dd938d5ff43797d781291027.tar.gz frameworks_av-fc7fca77caa12993dd938d5ff43797d781291027.tar.bz2 |
MediaCodec: add renderAndReleaseOutputBuffer() method with timestamp
Bug: 11784827
Change-Id: Ia1dcbd6c1d1a4380db04b750c0eb3fa0bd58d7b4
Diffstat (limited to 'media/libstagefright/MediaCodec.cpp')
-rw-r--r-- | media/libstagefright/MediaCodec.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index 601dccf..5b525f2 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -17,6 +17,7 @@ //#define LOG_NDEBUG 0 #define LOG_TAG "MediaCodec" #include <utils/Log.h> +#include <inttypes.h> #include <media/stagefright/MediaCodec.h> @@ -323,6 +324,16 @@ status_t MediaCodec::renderOutputBufferAndRelease(size_t index) { return PostAndAwaitResponse(msg, &response); } +status_t MediaCodec::renderOutputBufferAndRelease(size_t index, int64_t timestampNs) { + sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); + msg->setSize("index", index); + msg->setInt32("render", true); + msg->setInt64("timestampNs", timestampNs); + + sp<AMessage> response; + return PostAndAwaitResponse(msg, &response); +} + status_t MediaCodec::releaseOutputBuffer(size_t index) { sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); msg->setSize("index", index); @@ -1707,9 +1718,25 @@ status_t MediaCodec::onReleaseOutputBuffer(const sp<AMessage> &msg) { if (render && info->mData != NULL && info->mData->size() != 0) { info->mNotify->setInt32("render", true); + int64_t timestampNs = 0; + if (msg->findInt64("timestampNs", ×tampNs)) { + info->mNotify->setInt64("timestampNs", timestampNs); + } else { + // TODO: it seems like we should use the timestamp + // in the (media)buffer as it potentially came from + // an input surface, but we did not propagate it prior to + // API 20. Perhaps check for target SDK version. +#if 0 + if (info->mData->meta()->findInt64("timeUs", ×tampNs)) { + ALOGI("using buffer PTS of %" PRId64, timestampNs); + timestampNs *= 1000; + } +#endif + } + if (mSoftRenderer != NULL) { mSoftRenderer->render( - info->mData->data(), info->mData->size(), NULL); + info->mData->data(), info->mData->size(), timestampNs, NULL); } } |