diff --git a/include/gui/Surface.h b/include/gui/Surface.h index 35ab7f618..f2cf018a9 100644 --- a/include/gui/Surface.h +++ b/include/gui/Surface.h @@ -145,6 +145,7 @@ private: int dispatchSetUsage(va_list args); int dispatchLock(va_list args); int dispatchUnlockAndPost(va_list args); + int dispatchSetSidebandStream(va_list args); protected: virtual int dequeueBuffer(ANativeWindowBuffer** buffer, int* fenceFd); diff --git a/include/media/hardware/HardwareAPI.h b/include/media/hardware/HardwareAPI.h index 88e7ad33e..90150c63b 100644 --- a/include/media/hardware/HardwareAPI.h +++ b/include/media/hardware/HardwareAPI.h @@ -214,6 +214,27 @@ struct DescribeColorFormatParams { MediaImage sMediaImage; }; +// A pointer to this struct is passed to OMX_SetParameter or OMX_GetParameter +// when the extension index for the +// 'OMX.google.android.index.configureVideoTunnelMode' extension is given. +// If the extension is supported then tunneled playback mode should be supported +// by the codec. If bTunneled is set to OMX_TRUE then the video decoder should +// operate in "tunneled" mode and output its decoded frames directly to the +// sink. In this case nAudioHwSync is the HW SYNC ID of the audio HAL Output +// stream to sync the video with. If bTunneled is set to OMX_FALSE, "tunneled" +// mode should be disabled and nAudioHwSync should be ignored. +// OMX_GetParameter is used to query tunneling configuration. bTunneled should +// return whether decoder is operating in tunneled mode, and if it is, +// pSidebandWindow should contain the codec allocated sideband window handle. +struct ConfigureVideoTunnelModeParams { + OMX_U32 nSize; // IN + OMX_VERSIONTYPE nVersion; // IN + OMX_U32 nPortIndex; // IN + OMX_BOOL bTunneled; // IN/OUT + OMX_U32 nAudioHwSync; // IN + OMX_PTR pSidebandWindow; // OUT +}; + } // namespace android extern android::OMXPluginBase *createOMXPlugin(); diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index 86451bee7..b56030e9e 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -24,6 +24,7 @@ #include #include +#include #include @@ -443,6 +444,9 @@ int Surface::perform(int operation, va_list args) case NATIVE_WINDOW_API_DISCONNECT: res = dispatchDisconnect(args); break; + case NATIVE_WINDOW_SET_SIDEBAND_STREAM: + res = dispatchSetSidebandStream(args); + break; default: res = NAME_NOT_FOUND; break; @@ -533,6 +537,12 @@ int Surface::dispatchUnlockAndPost(va_list args __attribute__((unused))) { return unlockAndPost(); } +int Surface::dispatchSetSidebandStream(va_list args) { + native_handle_t* sH = va_arg(args, native_handle_t*); + sp sidebandHandle = NativeHandle::create(sH, false); + setSidebandStream(sidebandHandle); + return OK; +} int Surface::connect(int api) { ATRACE_CALL();