WGraphicBufferSource.cpp revision c80d8810bffeb28f1dcf6e92bd81fc549df13348
1f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa/* 2f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * Copyright 2016, The Android Open Source Project 3f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * 4f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * Licensed under the Apache License, Version 2.0 (the "License"); 5f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * you may not use this file except in compliance with the License. 6f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * You may obtain a copy of the License at 7f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * 8f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * http://www.apache.org/licenses/LICENSE-2.0 9f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * 10f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * Unless required by applicable law or agreed to in writing, software 11f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * distributed under the License is distributed on an "AS IS" BASIS, 12f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * See the License for the specific language governing permissions and 14f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * limitations under the License. 15f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa */ 16f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 17d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih//#define LOG_NDEBUG 0 18d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih#define LOG_TAG "TWGraphicBufferSource" 190d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa 20255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/1.0/WGraphicBufferSource.h> 21255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/1.0/WOmxNode.h> 22255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/1.0/Conversion.h> 23255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/OMXUtils.h> 24d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih#include <android/hardware/media/omx/1.0/IOmxBufferSource.h> 25d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih#include <android/hardware/media/omx/1.0/IOmxNode.h> 26255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/openmax/OMX_Component.h> 27255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/openmax/OMX_IndexExt.h> 28517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 29517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace android { 30517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace hardware { 31517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace media { 32517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace omx { 33517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace V1_0 { 34517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace implementation { 35517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 36d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shihstatic const OMX_U32 kPortIndexInput = 0; 37d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 38d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shihstruct TWGraphicBufferSource::TWOmxNodeWrapper : public IOmxNodeWrapper { 39d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih sp<IOmxNode> mOmxNode; 40d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 41d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih TWOmxNodeWrapper(const sp<IOmxNode> &omxNode): mOmxNode(omxNode) { 42d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih } 43d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 44d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih virtual status_t emptyBuffer( 45d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih int32_t bufferId, uint32_t flags, 46d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih const sp<GraphicBuffer> &buffer, 47d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih int64_t timestamp, int fenceFd) override { 48d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih CodecBuffer tBuffer; 49694ebf6734cc7af6b8cf9c032fa3e5a00a54dc84Robert Shih native_handle_t* fenceNh = native_handle_create_from_fd(fenceFd); 50694ebf6734cc7af6b8cf9c032fa3e5a00a54dc84Robert Shih status_t err = toStatusT(mOmxNode->emptyBuffer( 51d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih bufferId, 52d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih *wrapAs(&tBuffer, buffer), 53d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih flags, 54d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih toRawTicks(timestamp), 55694ebf6734cc7af6b8cf9c032fa3e5a00a54dc84Robert Shih fenceNh)); 56694ebf6734cc7af6b8cf9c032fa3e5a00a54dc84Robert Shih native_handle_close(fenceNh); 57694ebf6734cc7af6b8cf9c032fa3e5a00a54dc84Robert Shih native_handle_delete(fenceNh); 58694ebf6734cc7af6b8cf9c032fa3e5a00a54dc84Robert Shih return err; 59d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih } 60d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 61d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih virtual void dispatchDataSpaceChanged( 62d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih int32_t dataSpace, int32_t aspects, int32_t pixelFormat) override { 63d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih Message tMsg; 64d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih tMsg.type = Message::Type::EVENT; 65d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih tMsg.fence = native_handle_create(0, 0); 66d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih tMsg.data.eventData.event = uint32_t(OMX_EventDataSpaceChanged); 67d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih tMsg.data.eventData.data1 = dataSpace; 68d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih tMsg.data.eventData.data2 = aspects; 69d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih tMsg.data.eventData.data3 = pixelFormat; 70c80d8810bffeb28f1dcf6e92bd81fc549df13348Pawin Vongmasa if (!mOmxNode->dispatchMessage(tMsg).isOk()) { 71c80d8810bffeb28f1dcf6e92bd81fc549df13348Pawin Vongmasa ALOGE("TWOmxNodeWrapper failed to dispatch message " 72c80d8810bffeb28f1dcf6e92bd81fc549df13348Pawin Vongmasa "OMX_EventDataSpaceChanged: " 73c80d8810bffeb28f1dcf6e92bd81fc549df13348Pawin Vongmasa "dataSpace = %ld, aspects = %ld, pixelFormat = %ld", 74c80d8810bffeb28f1dcf6e92bd81fc549df13348Pawin Vongmasa static_cast<long>(dataSpace), 75c80d8810bffeb28f1dcf6e92bd81fc549df13348Pawin Vongmasa static_cast<long>(aspects), 76c80d8810bffeb28f1dcf6e92bd81fc549df13348Pawin Vongmasa static_cast<long>(pixelFormat)); 77c80d8810bffeb28f1dcf6e92bd81fc549df13348Pawin Vongmasa } 78d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih } 79d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih}; 80d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 81d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shihstruct TWGraphicBufferSource::TWOmxBufferSource : public IOmxBufferSource { 82d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih sp<GraphicBufferSource> mSource; 83d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 84d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih TWOmxBufferSource(const sp<GraphicBufferSource> &source): mSource(source) { 85d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih } 86d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 87d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih Return<void> onOmxExecuting() override { 88d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih mSource->onOmxExecuting(); 89d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return Void(); 90d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih } 91d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 92d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih Return<void> onOmxIdle() override { 93d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih mSource->onOmxIdle(); 94d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return Void(); 95d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih } 96d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 97d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih Return<void> onOmxLoaded() override { 98d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih mSource->onOmxLoaded(); 99d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return Void(); 100d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih } 101d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 102d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih Return<void> onInputBufferAdded(uint32_t bufferId) override { 103d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih mSource->onInputBufferAdded(static_cast<int32_t>(bufferId)); 104d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return Void(); 105d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih } 106d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 107d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih Return<void> onInputBufferEmptied( 108d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih uint32_t bufferId, hidl_handle const& tFence) override { 109d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih mSource->onInputBufferEmptied( 110d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih static_cast<int32_t>(bufferId), 111d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih native_handle_read_fd(tFence)); 112d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return Void(); 113d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih } 114d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih}; 115517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 116517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// TWGraphicBufferSource 117517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaTWGraphicBufferSource::TWGraphicBufferSource( 118d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih sp<GraphicBufferSource> const& base) : 119d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih mBase(base), 120d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih mOmxBufferSource(new TWOmxBufferSource(base)) { 121517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 122517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 123d095e65c8c125c555046c60539a0f7abf0ccf271Robert ShihReturn<Status> TWGraphicBufferSource::configure( 124517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa const sp<IOmxNode>& omxNode, Dataspace dataspace) { 125d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih if (omxNode == NULL) { 126d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return toStatus(BAD_VALUE); 127d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih } 128d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 129d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih // Do setInputSurface() first, the node will try to enable metadata 130d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih // mode on input, and does necessary error checking. If this fails, 131d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih // we can't use this input surface on the node. 132d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih Return<Status> err(omxNode->setInputSurface(mOmxBufferSource)); 133d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih status_t fnStatus = toStatusT(err); 134d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih if (fnStatus != NO_ERROR) { 135d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih ALOGE("Unable to set input surface: %d", fnStatus); 136d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return err; 137d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih } 138d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 139d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih // use consumer usage bits queried from encoder, but always add 140d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih // HW_VIDEO_ENCODER for backward compatibility. 141d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih uint32_t consumerUsage; 142d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih void *_params = &consumerUsage; 143d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih uint8_t *params = static_cast<uint8_t*>(_params); 144d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih fnStatus = UNKNOWN_ERROR; 145d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih IOmxNode::getParameter_cb _hidl_cb( 146d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih [&fnStatus, ¶ms](Status status, hidl_vec<uint8_t> const& outParams) { 147d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih fnStatus = toStatusT(status); 148d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih std::copy( 149d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih outParams.data(), 150d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih outParams.data() + outParams.size(), 151d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih params); 152d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih }); 153c80d8810bffeb28f1dcf6e92bd81fc549df13348Pawin Vongmasa auto transStatus = omxNode->getParameter( 154d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih static_cast<uint32_t>(OMX_IndexParamConsumerUsageBits), 155d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih inHidlBytes(&consumerUsage, sizeof(consumerUsage)), 156d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih _hidl_cb); 157c80d8810bffeb28f1dcf6e92bd81fc549df13348Pawin Vongmasa if (!transStatus.isOk()) { 158c80d8810bffeb28f1dcf6e92bd81fc549df13348Pawin Vongmasa return toStatus(FAILED_TRANSACTION); 159c80d8810bffeb28f1dcf6e92bd81fc549df13348Pawin Vongmasa } 160d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih if (fnStatus != OK) { 161d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih consumerUsage = 0; 162d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih } 163d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 164d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih OMX_PARAM_PORTDEFINITIONTYPE def; 165d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih InitOMXParams(&def); 166d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih def.nPortIndex = kPortIndexInput; 167d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 168d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih _params = &def; 169d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih params = static_cast<uint8_t*>(_params); 170c80d8810bffeb28f1dcf6e92bd81fc549df13348Pawin Vongmasa transStatus = omxNode->getParameter( 171d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih static_cast<uint32_t>(OMX_IndexParamPortDefinition), 172d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih inHidlBytes(&def, sizeof(def)), 173d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih _hidl_cb); 174c80d8810bffeb28f1dcf6e92bd81fc549df13348Pawin Vongmasa if (!transStatus.isOk()) { 175c80d8810bffeb28f1dcf6e92bd81fc549df13348Pawin Vongmasa return toStatus(FAILED_TRANSACTION); 176c80d8810bffeb28f1dcf6e92bd81fc549df13348Pawin Vongmasa } 177d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih if (fnStatus != NO_ERROR) { 178d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih ALOGE("Failed to get port definition: %d", fnStatus); 179d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return toStatus(fnStatus); 180d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih } 181d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 182d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 183d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return toStatus(mBase->configure( 184d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih new TWOmxNodeWrapper(omxNode), 185d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih toRawDataspace(dataspace), 186d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih def.nBufferCountActual, 187d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih def.format.video.nFrameWidth, 188d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih def.format.video.nFrameHeight, 189d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih consumerUsage)); 190d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih} 191d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih 192d095e65c8c125c555046c60539a0f7abf0ccf271Robert ShihReturn<Status> TWGraphicBufferSource::setSuspend( 193764d945bfdb9dec60f2b482fbf6c5e83824ed950Hangyu Kuang bool suspend, int64_t timeUs) { 194d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return toStatus(mBase->setSuspend(suspend, timeUs)); 195517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 196517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 197d095e65c8c125c555046c60539a0f7abf0ccf271Robert ShihReturn<Status> TWGraphicBufferSource::setRepeatPreviousFrameDelayUs( 198517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa int64_t repeatAfterUs) { 199d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return toStatus(mBase->setRepeatPreviousFrameDelayUs(repeatAfterUs)); 200517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 201517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 202d095e65c8c125c555046c60539a0f7abf0ccf271Robert ShihReturn<Status> TWGraphicBufferSource::setMaxFps(float maxFps) { 203d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return toStatus(mBase->setMaxFps(maxFps)); 204517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 205517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 206d095e65c8c125c555046c60539a0f7abf0ccf271Robert ShihReturn<Status> TWGraphicBufferSource::setTimeLapseConfig( 20722dc508717c7767927064ec7c152def99e54adcbPawin Vongmasa double fps, double captureFps) { 20822dc508717c7767927064ec7c152def99e54adcbPawin Vongmasa return toStatus(mBase->setTimeLapseConfig(fps, captureFps)); 209517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 210517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 211d095e65c8c125c555046c60539a0f7abf0ccf271Robert ShihReturn<Status> TWGraphicBufferSource::setStartTimeUs(int64_t startTimeUs) { 212d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return toStatus(mBase->setStartTimeUs(startTimeUs)); 213517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 214517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 215d095e65c8c125c555046c60539a0f7abf0ccf271Robert ShihReturn<Status> TWGraphicBufferSource::setStopTimeUs(int64_t stopTimeUs) { 216d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return toStatus(mBase->setStopTimeUs(stopTimeUs)); 217764d945bfdb9dec60f2b482fbf6c5e83824ed950Hangyu Kuang} 218764d945bfdb9dec60f2b482fbf6c5e83824ed950Hangyu Kuang 21924059088a46160f731903cc66404184a531d0478Pawin VongmasaReturn<void> TWGraphicBufferSource::getStopTimeOffsetUs( 22024059088a46160f731903cc66404184a531d0478Pawin Vongmasa getStopTimeOffsetUs_cb _hidl_cb) { 221f72cefddf378909f360998852e41f49042711299Hangyu Kuang status_t status; 222f72cefddf378909f360998852e41f49042711299Hangyu Kuang int64_t stopTimeOffsetUs; 223f72cefddf378909f360998852e41f49042711299Hangyu Kuang status = mBase->getStopTimeOffsetUs(&stopTimeOffsetUs); 224f72cefddf378909f360998852e41f49042711299Hangyu Kuang _hidl_cb(toStatus(status), stopTimeOffsetUs); 22524059088a46160f731903cc66404184a531d0478Pawin Vongmasa return Void(); 22624059088a46160f731903cc66404184a531d0478Pawin Vongmasa} 22724059088a46160f731903cc66404184a531d0478Pawin Vongmasa 228d095e65c8c125c555046c60539a0f7abf0ccf271Robert ShihReturn<Status> TWGraphicBufferSource::setColorAspects( 229517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa const ColorAspects& aspects) { 230d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return toStatus(mBase->setColorAspects(toCompactColorAspects(aspects))); 231517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 232517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 233d095e65c8c125c555046c60539a0f7abf0ccf271Robert ShihReturn<Status> TWGraphicBufferSource::setTimeOffsetUs(int64_t timeOffsetUs) { 234d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return toStatus(mBase->setTimeOffsetUs(timeOffsetUs)); 235517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 236517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 237d095e65c8c125c555046c60539a0f7abf0ccf271Robert ShihReturn<Status> TWGraphicBufferSource::signalEndOfInputStream() { 238d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih return toStatus(mBase->signalEndOfInputStream()); 239517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 240517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 241517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} // namespace implementation 242517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} // namespace V1_0 243517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} // namespace omx 244517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} // namespace media 245517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} // namespace hardware 246517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} // namespace android 247