diff options
author | Lajos Molnar <lajos@google.com> | 2015-06-04 10:29:19 -0700 |
---|---|---|
committer | Lajos Molnar <lajos@google.com> | 2015-06-09 08:09:08 -0700 |
commit | 90fcf68fd29f3cb695bd53a830ad984cb7d430c0 (patch) | |
tree | ea257431333e4252dcc7882246029d362899b3f0 /media/libstagefright/omx | |
parent | 9b132a7bdde8388f124e4db5ff54a88a93f8cdb6 (diff) | |
download | frameworks_av-90fcf68fd29f3cb695bd53a830ad984cb7d430c0.zip frameworks_av-90fcf68fd29f3cb695bd53a830ad984cb7d430c0.tar.gz frameworks_av-90fcf68fd29f3cb695bd53a830ad984cb7d430c0.tar.bz2 |
stagefright: add support for output frame rendered callback
- Added FRAME_RENDERED event in OMX, used by tunneled video decoders
to signal rendered event timing
- Track buffers sent for rendering in ACodec and in SoftwareRenderer, and
determine when they have rendered
- Propagate render times to MediaCodec
Bug: 20503131
Change-Id: Idf0a8714d5368b237c2285dd39fa82db847c232f
Diffstat (limited to 'media/libstagefright/omx')
-rw-r--r-- | media/libstagefright/omx/OMX.cpp | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp index e94adbd..cb7ab5e 100644 --- a/media/libstagefright/omx/OMX.cpp +++ b/media/libstagefright/omx/OMX.cpp @@ -34,6 +34,7 @@ #include <OMX_AsString.h> #include <OMX_Component.h> +#include <OMX_VideoExt.h> namespace android { @@ -455,12 +456,35 @@ OMX_ERRORTYPE OMX::OnEvent( OMX_IN OMX_EVENTTYPE eEvent, OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, - OMX_IN OMX_PTR /* pEventData */) { + OMX_IN OMX_PTR pEventData) { ALOGV("OnEvent(%d, %" PRIu32", %" PRIu32 ")", eEvent, nData1, nData2); // Forward to OMXNodeInstance. findInstance(node)->onEvent(eEvent, nData1, nData2); + sp<OMX::CallbackDispatcher> dispatcher = findDispatcher(node); + + // output rendered events are not processed as regular events until they hit the observer + if (eEvent == OMX_EventOutputRendered) { + if (pEventData == NULL) { + return OMX_ErrorBadParameter; + } + + // process data from array + OMX_VIDEO_RENDEREVENTTYPE *renderData = (OMX_VIDEO_RENDEREVENTTYPE *)pEventData; + for (size_t i = 0; i < nData1; ++i) { + omx_message msg; + msg.type = omx_message::FRAME_RENDERED; + msg.node = node; + msg.fenceFd = -1; + msg.u.render_data.timestamp = renderData[i].nMediaTimeUs; + msg.u.render_data.nanoTime = renderData[i].nSystemTimeNs; + + dispatcher->post(msg, false /* realTime */); + } + return OMX_ErrorNone; + } + omx_message msg; msg.type = omx_message::EVENT; msg.node = node; @@ -469,7 +493,7 @@ OMX_ERRORTYPE OMX::OnEvent( msg.u.event_data.data1 = nData1; msg.u.event_data.data2 = nData2; - findDispatcher(node)->post(msg); + dispatcher->post(msg, true /* realTime */); return OMX_ErrorNone; } |