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 {
822860573684ebaf514827cc1b5b144deb194eb8f6Wonsik Kim    sp<OmxGraphicBufferSource> mSource;
83d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih
842860573684ebaf514827cc1b5b144deb194eb8f6Wonsik Kim    TWOmxBufferSource(const sp<OmxGraphicBufferSource> &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(
1182860573684ebaf514827cc1b5b144deb194eb8f6Wonsik Kim        sp<OmxGraphicBufferSource> 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, &params](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