OMXNodeInstance.cpp revision 6d332d2cdf6e62c2c20ebff220868fe9e3ed7f44
1318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber/*
2318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * Copyright (C) 2009 The Android Open Source Project
3318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *
4318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * you may not use this file except in compliance with the License.
6318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * You may obtain a copy of the License at
7318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *
8318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *
10318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * Unless required by applicable law or agreed to in writing, software
11318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * See the License for the specific language governing permissions and
14318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * limitations under the License.
15318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber */
16318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
170c03d5c7c2fa4d17f7f5159e3fddd2adf6bfc923Andreas Huber//#define LOG_NDEBUG 0
18318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#define LOG_TAG "OMXNodeInstance"
19318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <utils/Log.h>
20318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
21f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <inttypes.h>
22f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
23318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include "../include/OMXNodeInstance.h"
24f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber#include "OMXMaster.h"
2573dd808754c641fe798273d356ee38368715fa7bLajos Molnar#include "OMXUtils.h"
26f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden#include "GraphicBufferSource.h"
276d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang#include <android/IGraphicBufferSource.h>
286d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang#include <android/IOMXBufferSource.h>
29318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
30e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber#include <OMX_Component.h>
31f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <OMX_IndexExt.h>
32f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <OMX_AsString.h>
33318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
34318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <binder/IMemory.h>
35aef47bf801dcbcb88cec8426c03237c6313da1c2Lajos Molnar#include <cutils/properties.h>
36f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden#include <gui/BufferQueue.h>
376c6b4d0d2b98a7ceee8b697daaf611f8df3254fbJames Dong#include <HardwareAPI.h>
38f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h>
39054219874873b41f1c815552987c10465c34ba2bLajos Molnar#include <media/stagefright/foundation/ABuffer.h>
406cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang#include <media/stagefright/foundation/ColorUtils.h>
412a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber#include <media/stagefright/MediaErrors.h>
42f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <utils/misc.h>
437e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar#include <utils/NativeHandle.h>
44f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
45f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenstatic const OMX_U32 kPortIndexInput = 0;
46f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarstatic const OMX_U32 kPortIndexOutput = 1;
47f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
48f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOGW(fmt, ...) ALOGW("[%x:%s] " fmt, mNodeID, mName, ##__VA_ARGS__)
49f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
50f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_ERROR_IF(cond, fn, err, fmt, ...) \
51f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    ALOGE_IF(cond, #fn "(%x:%s, " fmt ") ERROR: %s(%#x)", \
52f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    mNodeID, mName, ##__VA_ARGS__, asString(err), err)
53f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_ERROR(fn, err, fmt, ...) CLOG_ERROR_IF(true, fn, err, fmt, ##__VA_ARGS__)
54f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_IF_ERROR(fn, err, fmt, ...) \
55f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_ERROR_IF((err) != OMX_ErrorNone, fn, err, fmt, ##__VA_ARGS__)
56f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
57f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOGI_(level, fn, fmt, ...) \
58f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    ALOGI_IF(DEBUG >= (level), #fn "(%x:%s, " fmt ")", mNodeID, mName, ##__VA_ARGS__)
59f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOGD_(level, fn, fmt, ...) \
60f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    ALOGD_IF(DEBUG >= (level), #fn "(%x:%s, " fmt ")", mNodeID, mName, ##__VA_ARGS__)
61f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
62f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_LIFE(fn, fmt, ...)     CLOGI_(ADebug::kDebugLifeCycle,     fn, fmt, ##__VA_ARGS__)
63f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_STATE(fn, fmt, ...)    CLOGI_(ADebug::kDebugState,         fn, fmt, ##__VA_ARGS__)
64f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_CONFIG(fn, fmt, ...)   CLOGI_(ADebug::kDebugConfig,        fn, fmt, ##__VA_ARGS__)
65f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_INTERNAL(fn, fmt, ...) CLOGD_(ADebug::kDebugInternalState, fn, fmt, ##__VA_ARGS__)
66f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
67f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_DEBUG_IF(cond, fn, fmt, ...) \
68f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    ALOGD_IF(cond, #fn "(%x, " fmt ")", mNodeID, ##__VA_ARGS__)
69f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
70f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_BUFFER(fn, fmt, ...) \
71f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_DEBUG_IF(DEBUG >= ADebug::kDebugAll, fn, fmt, ##__VA_ARGS__)
72f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_BUMPED_BUFFER(fn, fmt, ...) \
73f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_DEBUG_IF(DEBUG_BUMP >= ADebug::kDebugAll, fn, fmt, ##__VA_ARGS__)
74f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
75f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar/* buffer formatting */
76f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define BUFFER_FMT(port, fmt, ...) "%s:%u " fmt, portString(port), (port), ##__VA_ARGS__
77f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define NEW_BUFFER_FMT(buffer_id, port, fmt, ...) \
78f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    BUFFER_FMT(port, fmt ") (#%zu => %#x", ##__VA_ARGS__, mActiveBuffers.size(), (buffer_id))
79f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
80f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define SIMPLE_BUFFER(port, size, data) BUFFER_FMT(port, "%zu@%p", (size), (data))
81f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define SIMPLE_NEW_BUFFER(buffer_id, port, size, data) \
82f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    NEW_BUFFER_FMT(buffer_id, port, "%zu@%p", (size), (data))
83f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
8415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar#define EMPTY_BUFFER(addr, header, fenceFd) "%#x [%u@%p fc=%d]", \
8515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    (addr), (header)->nAllocLen, (header)->pBuffer, (fenceFd)
8615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar#define FULL_BUFFER(addr, header, fenceFd) "%#" PRIxPTR " [%u@%p (%u..+%u) f=%x ts=%lld fc=%d]", \
87f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    (intptr_t)(addr), (header)->nAllocLen, (header)->pBuffer, \
8815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    (header)->nOffset, (header)->nFilledLen, (header)->nFlags, (header)->nTimeStamp, (fenceFd)
89f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
90f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define WITH_STATS_WRAPPER(fmt, ...) fmt " { IN=%zu/%zu OUT=%zu/%zu }", ##__VA_ARGS__, \
91f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    mInputBuffersWithCodec.size(), mNumPortBuffers[kPortIndexInput], \
92f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    mOutputBuffersWithCodec.size(), mNumPortBuffers[kPortIndexOutput]
93f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar// TRICKY: this is needed so formatting macros expand before substitution
94f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define WITH_STATS(fmt, ...) WITH_STATS_WRAPPER(fmt, ##__VA_ARGS__)
95f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
96318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubernamespace android {
97318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
98318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstruct BufferMeta {
9971aba39b8767de04e35b3366a6413928f50582f0Lajos Molnar    explicit BufferMeta(
100d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            const sp<IMemory> &mem, OMX_U32 portIndex, bool copyToOmx,
101d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            bool copyFromOmx, OMX_U8 *backup)
102318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        : mMem(mem),
103d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar          mCopyFromOmx(copyFromOmx),
104d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar          mCopyToOmx(copyToOmx),
105d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar          mPortIndex(portIndex),
106d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar          mBackup(backup) {
107318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
108318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
109bff5b5a8bb44754e0b51631527de1c49ab7e5a43Wonsik Kim    explicit BufferMeta(size_t size, OMX_U32 portIndex)
110318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        : mSize(size),
111d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar          mCopyFromOmx(false),
112d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar          mCopyToOmx(false),
113d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar          mPortIndex(portIndex),
114d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar          mBackup(NULL) {
115318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
116318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
117bff5b5a8bb44754e0b51631527de1c49ab7e5a43Wonsik Kim    explicit BufferMeta(const sp<GraphicBuffer> &graphicBuffer, OMX_U32 portIndex)
11883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        : mGraphicBuffer(graphicBuffer),
119d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar          mCopyFromOmx(false),
120d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar          mCopyToOmx(false),
121d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar          mPortIndex(portIndex),
122d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar          mBackup(NULL) {
12383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
12483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
125318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    void CopyFromOMX(const OMX_BUFFERHEADERTYPE *header) {
126d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        if (!mCopyFromOmx) {
127318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            return;
128318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        }
129318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
130ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar        // check component returns proper range
131ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar        sp<ABuffer> codec = getBuffer(header, false /* backup */, true /* limit */);
132ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar
133ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar        memcpy((OMX_U8 *)mMem->pointer() + header->nOffset, codec->data(), codec->size());
134318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
135318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
136318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    void CopyToOMX(const OMX_BUFFERHEADERTYPE *header) {
137d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        if (!mCopyToOmx) {
138318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            return;
139318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        }
140318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
141318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        memcpy(header->pBuffer + header->nOffset,
142f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                (const OMX_U8 *)mMem->pointer() + header->nOffset,
143f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                header->nFilledLen);
144318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
145318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
146054219874873b41f1c815552987c10465c34ba2bLajos Molnar    // return either the codec or the backup buffer
147ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar    sp<ABuffer> getBuffer(const OMX_BUFFERHEADERTYPE *header, bool backup, bool limit) {
148054219874873b41f1c815552987c10465c34ba2bLajos Molnar        sp<ABuffer> buf;
149054219874873b41f1c815552987c10465c34ba2bLajos Molnar        if (backup && mMem != NULL) {
150054219874873b41f1c815552987c10465c34ba2bLajos Molnar            buf = new ABuffer(mMem->pointer(), mMem->size());
151054219874873b41f1c815552987c10465c34ba2bLajos Molnar        } else {
152054219874873b41f1c815552987c10465c34ba2bLajos Molnar            buf = new ABuffer(header->pBuffer, header->nAllocLen);
153054219874873b41f1c815552987c10465c34ba2bLajos Molnar        }
154ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar        if (limit) {
155ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar            if (header->nOffset + header->nFilledLen > header->nOffset
156ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar                    && header->nOffset + header->nFilledLen <= header->nAllocLen) {
157ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar                buf->setRange(header->nOffset, header->nFilledLen);
158ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar            } else {
159ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar                buf->setRange(0, 0);
160ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar            }
161ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar        }
162054219874873b41f1c815552987c10465c34ba2bLajos Molnar        return buf;
163054219874873b41f1c815552987c10465c34ba2bLajos Molnar    }
164054219874873b41f1c815552987c10465c34ba2bLajos Molnar
165d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    void setGraphicBuffer(const sp<GraphicBuffer> &graphicBuffer) {
166d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        mGraphicBuffer = graphicBuffer;
167d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    }
168d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
1697e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    void setNativeHandle(const sp<NativeHandle> &nativeHandle) {
1707e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar        mNativeHandle = nativeHandle;
1717e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    }
1727e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar
17341eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim    OMX_U32 getPortIndex() {
17441eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim        return mPortIndex;
17541eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim    }
17641eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim
177d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    ~BufferMeta() {
178d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        delete[] mBackup;
179d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    }
180d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar
181318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberprivate:
18283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    sp<GraphicBuffer> mGraphicBuffer;
1837e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    sp<NativeHandle> mNativeHandle;
184318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    sp<IMemory> mMem;
185318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    size_t mSize;
186d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    bool mCopyFromOmx;
187d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    bool mCopyToOmx;
18841eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim    OMX_U32 mPortIndex;
189d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    OMX_U8 *mBackup;
190318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
191318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta(const BufferMeta &);
192318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta &operator=(const BufferMeta &);
193318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber};
194318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
195318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
196318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = {
197318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone
198318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber};
199318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
200f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarstatic inline const char *portString(OMX_U32 portIndex) {
201f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    switch (portIndex) {
202f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        case kPortIndexInput:  return "Input";
203f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        case kPortIndexOutput: return "Output";
204011734f0ce7e8b2e3066f90ef51c323ee7d4dea2Bill Yi        case ~0U:              return "All";
205f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        default:               return "port";
206f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    }
207f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar}
208f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
209318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::OMXNodeInstance(
210f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        OMX *owner, const sp<IOMXObserver> &observer, const char *name)
211318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    : mOwner(owner),
212609b815a3131d22da38b2f452faa9f89daad4039Andy Hung      mNodeID(0),
213318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber      mHandle(NULL),
214134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber      mObserver(observer),
2159113c1e619fd78fe53b548180fdc02300d33303dAndy Hung      mDying(false),
216d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar      mSailed(false),
217d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar      mQueriedProhibitedExtensions(false),
2186d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang      mBufferIDCount(0),
2196d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang      mShouldRestorePts(false),
2206d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang      mRestorePtsFailed(false)
221609b815a3131d22da38b2f452faa9f89daad4039Andy Hung{
222f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    mName = ADebug::GetDebugName(name);
223f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    DEBUG = ADebug::GetDebugLevelFromProperty(name, "debug.stagefright.omx-debug");
224f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    ALOGV("debug level for %s is %d", name, DEBUG);
225f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    DEBUG_BUMP = DEBUG;
226f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    mNumPortBuffers[0] = 0;
227f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    mNumPortBuffers[1] = 0;
228f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    mDebugLevelBumpPendingBuffers[0] = 0;
229f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    mDebugLevelBumpPendingBuffers[1] = 0;
230054219874873b41f1c815552987c10465c34ba2bLajos Molnar    mMetadataType[0] = kMetadataBufferTypeInvalid;
231054219874873b41f1c815552987c10465c34ba2bLajos Molnar    mMetadataType[1] = kMetadataBufferTypeInvalid;
232a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    mSecureBufferType[0] = kSecureBufferTypeUnknown;
233a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    mSecureBufferType[1] = kSecureBufferTypeUnknown;
2348dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia    mIsSecure = AString(name).endsWith(".secure");
235318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
236318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
237318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::~OMXNodeInstance() {
238f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    free(mName);
239f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong    CHECK(mHandle == NULL);
240318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
241318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
242318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle) {
243318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mNodeID = node_id;
244f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_LIFE(allocateNode, "handle=%p", handle);
245f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CHECK(mHandle == NULL);
246318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mHandle = handle;
247318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
248318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
2496d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhangsp<IOMXBufferSource> OMXNodeInstance::getBufferSource() {
2506d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    Mutex::Autolock autoLock(mOMXBufferSourceLock);
2516d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    return mOMXBufferSource;
252f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
253f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
2546d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhangvoid OMXNodeInstance::setBufferSource(const sp<IOMXBufferSource>& bufferSource) {
2556d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    Mutex::Autolock autoLock(mOMXBufferSourceLock);
2566d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    CLOG_INTERNAL(setBufferSource, "%p", bufferSource.get());
2576d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    mOMXBufferSource = bufferSource;
258f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
259f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
260318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX *OMXNodeInstance::owner() {
261318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mOwner;
262318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
263318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
264318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubersp<IOMXObserver> OMXNodeInstance::observer() {
265318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mObserver;
266318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
267318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
268318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX::node_id OMXNodeInstance::nodeID() {
269318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mNodeID;
270318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
271318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
272f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huberstatus_t OMXNodeInstance::freeNode(OMXMaster *master) {
273f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_LIFE(freeNode, "handle=%p", mHandle);
27443e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber    static int32_t kMaxNumIterations = 10;
27543e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber
27630358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar    // exit if we have already freed the node
27730358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar    if (mHandle == NULL) {
27830358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar        return OK;
27930358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar    }
28030358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar
281d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // Transition the node from its current state all the way down
282d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // to "Loaded".
283d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // This ensures that all active buffers are properly freed even
284d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // for components that don't do this themselves on a call to
285d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // "FreeHandle".
286d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
287134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    // The code below may trigger some more events to be dispatched
288134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    // by the OMX component - we want to ignore them as our client
289134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    // does not expect them.
290134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    mDying = true;
291134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
292d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    OMX_STATETYPE state;
293d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    CHECK_EQ(OMX_GetState(mHandle, &state), OMX_ErrorNone);
294d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    switch (state) {
295d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        case OMX_StateExecuting:
296d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        {
2973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("forcing Executing->Idle");
298d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateIdle);
299d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            OMX_ERRORTYPE err;
30043e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber            int32_t iteration = 0;
301d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
302f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                    && state != OMX_StateIdle
303f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                    && state != OMX_StateInvalid) {
30443e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                if (++iteration > kMaxNumIterations) {
305f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                    CLOGW("failed to enter Idle state (now %s(%d), aborting.",
306f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                            asString(state), state);
30743e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                    state = OMX_StateInvalid;
30843e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                    break;
30943e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                }
31043e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber
311d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber                usleep(100000);
312d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            }
313d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            CHECK_EQ(err, OMX_ErrorNone);
314d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
3150d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber            if (state == OMX_StateInvalid) {
3160d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                break;
3170d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber            }
3180d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber
319d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            // fall through
320d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        }
321d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
322d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        case OMX_StateIdle:
323d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        {
3243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("forcing Idle->Loaded");
325d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateLoaded);
326d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
327d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            freeActiveBuffers();
328d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
329d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            OMX_ERRORTYPE err;
33043e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber            int32_t iteration = 0;
331d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
332f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                    && state != OMX_StateLoaded
333f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                    && state != OMX_StateInvalid) {
33443e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                if (++iteration > kMaxNumIterations) {
335f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                    CLOGW("failed to enter Loaded state (now %s(%d), aborting.",
336f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                            asString(state), state);
33743e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                    state = OMX_StateInvalid;
33843e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                    break;
33943e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                }
34043e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber
3413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("waiting for Loaded state...");
342d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber                usleep(100000);
343d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            }
344d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            CHECK_EQ(err, OMX_ErrorNone);
345d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
346d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            // fall through
347d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        }
348d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
349d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        case OMX_StateLoaded:
350fa70cad40b01627ac1c22e04cdd548ece9c2654fAndreas Huber        case OMX_StateInvalid:
351d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            break;
352d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
353d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        default:
354f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            LOG_ALWAYS_FATAL("unknown state %s(%#x).", asString(state), state);
355d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            break;
356d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
357d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
358f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    ALOGV("[%x:%s] calling destroyComponentInstance", mNodeID, mName);
359f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber    OMX_ERRORTYPE err = master->destroyComponentInstance(
360f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber            static_cast<OMX_COMPONENTTYPE *>(mHandle));
361f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber
362318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mHandle = NULL;
363f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_IF_ERROR(freeNode, err, "");
364f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    free(mName);
365f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    mName = NULL;
366318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
367318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mOwner->invalidateNodeID(mNodeID);
368609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    mNodeID = 0;
369318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
3703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("OMXNodeInstance going away.");
37147bed1a7755ed58fa5d4c0d35b20468deb83bd60Andreas Huber    delete this;
372318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
373318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
374318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
375318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
376318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::sendCommand(
377318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_COMMANDTYPE cmd, OMX_S32 param) {
3786d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    const sp<IOMXBufferSource> bufferSource(getBufferSource());
379ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber    if (bufferSource != NULL && cmd == OMX_CommandStateSet) {
380ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber        if (param == OMX_StateIdle) {
381ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber            // Initiating transition from Executing -> Idle
382ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber            // ACodec is waiting for all buffers to be returned, do NOT
383ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber            // submit any more buffers to the codec.
3846d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            bufferSource->onOmxIdle();
385ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber        } else if (param == OMX_StateLoaded) {
386ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber            // Initiating transition from Idle/Executing -> Loaded
387ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber            // Buffers are about to be freed.
3886d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            bufferSource->onOmxLoaded();
3896d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            setBufferSource(NULL);
390ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber        }
391e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
392e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        // fall through
393e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    }
394e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
395318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
396318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
3976d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    if (cmd == OMX_CommandStateSet) {
3986d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        // There are no configurations past first StateSet command.
3996d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        mSailed = true;
4006d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    }
4016d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang
402f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    // bump internal-state debug level for 2 input and output frames past a command
403f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    {
404f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        Mutex::Autolock _l(mDebugLock);
405f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        bumpDebugLevel_l(2 /* numInputBuffers */, 2 /* numOutputBuffers */);
406f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    }
407f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
408f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    const char *paramString =
409f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        cmd == OMX_CommandStateSet ? asString((OMX_STATETYPE)param) : portString(param);
410f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_STATE(sendCommand, "%s(%d), %s(%d)", asString(cmd), cmd, paramString, param);
411318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL);
412f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_IF_ERROR(sendCommand, err, "%s(%d), %s(%d)", asString(cmd), cmd, paramString, param);
413318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
414318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
415318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
416d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnarbool OMXNodeInstance::isProhibitedIndex_l(OMX_INDEXTYPE index) {
417d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    // these extensions can only be used from OMXNodeInstance, not by clients directly.
418d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    static const char *restricted_extensions[] = {
419d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        "OMX.google.android.index.storeMetaDataInBuffers",
420d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        "OMX.google.android.index.storeANWBufferInMetadata",
421d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        "OMX.google.android.index.prepareForAdaptivePlayback",
422d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        "OMX.google.android.index.configureVideoTunnelMode",
423d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        "OMX.google.android.index.useAndroidNativeBuffer2",
424d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        "OMX.google.android.index.useAndroidNativeBuffer",
425d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        "OMX.google.android.index.enableAndroidNativeBuffers",
426d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        "OMX.google.android.index.allocateNativeHandle",
427d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        "OMX.google.android.index.getAndroidNativeBufferUsage",
428d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    };
429d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar
430d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    if ((index > OMX_IndexComponentStartUnused && index <= OMX_IndexParamStandardComponentRole)
431d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            || (index > OMX_IndexPortStartUnused && index <= OMX_IndexParamCompBufferSupplier)
432d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            || (index > OMX_IndexAudioStartUnused && index <= OMX_IndexConfigAudioChannelVolume)
433d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            || (index > OMX_IndexVideoStartUnused && index <= OMX_IndexConfigVideoNalSize)
434d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            || (index > OMX_IndexCommonStartUnused
435d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar                    && index <= OMX_IndexConfigCommonTransitionEffect)
436d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            || (index > (OMX_INDEXTYPE)OMX_IndexExtAudioStartUnused
437d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar                    && index <= (OMX_INDEXTYPE)OMX_IndexParamAudioProfileQuerySupported)
438d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            || (index > (OMX_INDEXTYPE)OMX_IndexExtVideoStartUnused
439d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar                    && index <= (OMX_INDEXTYPE)OMX_IndexConfigAndroidVideoTemporalLayering)
440d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            || (index > (OMX_INDEXTYPE)OMX_IndexExtOtherStartUnused
441d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar                    && index <= (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits)) {
442d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        return false;
443d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    }
444d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar
445d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    if (!mQueriedProhibitedExtensions) {
446d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        for (size_t i = 0; i < NELEM(restricted_extensions); ++i) {
447d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            OMX_INDEXTYPE ext;
448d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            if (OMX_GetExtensionIndex(mHandle, (OMX_STRING)restricted_extensions[i], &ext) == OMX_ErrorNone) {
449d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar                mProhibitedExtensions.add(ext);
450d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            }
451d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        }
452d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        mQueriedProhibitedExtensions = true;
453d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    }
454d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar
455d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    return mProhibitedExtensions.indexOf(index) >= 0;
456d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar}
457d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar
458318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getParameter(
45984333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        OMX_INDEXTYPE index, void *params, size_t /* size */) {
460318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
461318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
462d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    if (isProhibitedIndex_l(index)) {
463d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        android_errorWriteLog(0x534e4554, "29422020");
464d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        return BAD_INDEX;
465d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    }
466d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar
467318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params);
468f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    OMX_INDEXEXTTYPE extIndex = (OMX_INDEXEXTTYPE)index;
469f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    // some errors are expected for getParameter
470f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    if (err != OMX_ErrorNoMore) {
471f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOG_IF_ERROR(getParameter, err, "%s(%#x)", asString(extIndex), index);
472f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    }
473318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
474318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
475318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
476318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setParameter(
477f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        OMX_INDEXTYPE index, const void *params, size_t size) {
478318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
479f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    OMX_INDEXEXTTYPE extIndex = (OMX_INDEXEXTTYPE)index;
480f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_CONFIG(setParameter, "%s(%#x), %zu@%p)", asString(extIndex), index, size, params);
481318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
482d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    if (isProhibitedIndex_l(index)) {
483d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        android_errorWriteLog(0x534e4554, "29422020");
484d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        return BAD_INDEX;
485d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    }
486d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar
487318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SetParameter(
488318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, index, const_cast<void *>(params));
489f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_IF_ERROR(setParameter, err, "%s(%#x)", asString(extIndex), index);
490318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
491318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
492318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
493318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getConfig(
49484333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        OMX_INDEXTYPE index, void *params, size_t /* size */) {
495318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
496318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
497d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    if (isProhibitedIndex_l(index)) {
498d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        android_errorWriteLog(0x534e4554, "29422020");
499d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        return BAD_INDEX;
500d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    }
501d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar
502318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params);
503f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    OMX_INDEXEXTTYPE extIndex = (OMX_INDEXEXTTYPE)index;
504f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    // some errors are expected for getConfig
505f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    if (err != OMX_ErrorNoMore) {
506f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOG_IF_ERROR(getConfig, err, "%s(%#x)", asString(extIndex), index);
507f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    }
508318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
509318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
510318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
511318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setConfig(
512f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        OMX_INDEXTYPE index, const void *params, size_t size) {
513318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
514f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    OMX_INDEXEXTTYPE extIndex = (OMX_INDEXEXTTYPE)index;
515f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_CONFIG(setConfig, "%s(%#x), %zu@%p)", asString(extIndex), index, size, params);
516318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
517d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    if (isProhibitedIndex_l(index)) {
518d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        android_errorWriteLog(0x534e4554, "29422020");
519d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        return BAD_INDEX;
520d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    }
521d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar
522318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SetConfig(
523318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, index, const_cast<void *>(params));
524f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_IF_ERROR(setConfig, err, "%s(%#x)", asString(extIndex), index);
525318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
526b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis}
527b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
528b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennisstatus_t OMXNodeInstance::getState(OMX_STATETYPE* state) {
529b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    Mutex::Autolock autoLock(mLock);
530b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
531b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    OMX_ERRORTYPE err = OMX_GetState(mHandle, state);
532f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_IF_ERROR(getState, err, "");
533b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    return StatusFromOMXError(err);
534318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
535318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
536a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnarstatus_t OMXNodeInstance::enableNativeBuffers(
537a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar        OMX_U32 portIndex, OMX_BOOL graphic, OMX_BOOL enable) {
538f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia    if (portIndex >= NELEM(mSecureBufferType)) {
539f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia        ALOGE("b/31385713, portIndex(%u)", portIndex);
540f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia        android_errorWriteLog(0x534e4554, "31385713");
541f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia        return BAD_VALUE;
542f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia    }
543f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia
54483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    Mutex::Autolock autoLock(mLock);
545a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    CLOG_CONFIG(enableNativeBuffers, "%s:%u%s, %d", portString(portIndex), portIndex,
546a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar                graphic ? ", graphic" : "", enable);
547ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis    OMX_STRING name = const_cast<OMX_STRING>(
548a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar            graphic ? "OMX.google.android.index.enableAndroidNativeBuffers"
549a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar                    : "OMX.google.android.index.allocateNativeHandle");
55083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
55183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_INDEXTYPE index;
552ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis    OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index);
55383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
554a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker    if (err == OMX_ErrorNone) {
555a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker        EnableAndroidNativeBuffersParams params;
556a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker        InitOMXParams(&params);
557a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker        params.nPortIndex = portIndex;
558a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker        params.enable = enable;
559a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker
560a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker        err = OMX_SetParameter(mHandle, index, &params);
561a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker        CLOG_IF_ERROR(setParameter, err, "%s(%#x): %s:%u en=%d", name, index,
562a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker                      portString(portIndex), portIndex, enable);
563a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker        if (!graphic) {
564a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker            if (err == OMX_ErrorNone) {
565a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker                mSecureBufferType[portIndex] =
566a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker                    enable ? kSecureBufferTypeNativeHandle : kSecureBufferTypeOpaque;
567a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker            } else if (mSecureBufferType[portIndex] == kSecureBufferTypeUnknown) {
568a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker                mSecureBufferType[portIndex] = kSecureBufferTypeOpaque;
569a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker            }
570a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker        }
571a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker    } else {
572f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOG_ERROR_IF(enable, getExtensionIndex, err, "%s", name);
573a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker        if (!graphic) {
574a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker            // Extension not supported, check for manual override with system property
575a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker            // This is a temporary workaround until partners support the OMX extension
576aef47bf801dcbcb88cec8426c03237c6313da1c2Lajos Molnar            char value[PROPERTY_VALUE_MAX];
577aef47bf801dcbcb88cec8426c03237c6313da1c2Lajos Molnar            if (property_get("media.mediadrmservice.enable", value, NULL)
578a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker                && (!strcmp("1", value) || !strcasecmp("true", value))) {
579aef47bf801dcbcb88cec8426c03237c6313da1c2Lajos Molnar                CLOG_CONFIG(enableNativeBuffers, "system property override: using native-handles");
580aef47bf801dcbcb88cec8426c03237c6313da1c2Lajos Molnar                mSecureBufferType[portIndex] = kSecureBufferTypeNativeHandle;
581a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker            } else if (mSecureBufferType[portIndex] == kSecureBufferTypeUnknown) {
582a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker                mSecureBufferType[portIndex] = kSecureBufferTypeOpaque;
583aef47bf801dcbcb88cec8426c03237c6313da1c2Lajos Molnar            }
584a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker            err = OMX_ErrorNone;
585a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar        }
586a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    }
587a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker
588f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    return StatusFromOMXError(err);
58983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis}
59083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
591e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennisstatus_t OMXNodeInstance::getGraphicBufferUsage(
592e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        OMX_U32 portIndex, OMX_U32* usage) {
593e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    Mutex::Autolock autoLock(mLock);
594e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
595e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    OMX_INDEXTYPE index;
596ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis    OMX_STRING name = const_cast<OMX_STRING>(
597ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis            "OMX.google.android.index.getAndroidNativeBufferUsage");
598ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis    OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index);
599e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
600e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    if (err != OMX_ErrorNone) {
601f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOG_ERROR(getExtensionIndex, err, "%s", name);
602e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        return StatusFromOMXError(err);
603e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    }
604e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
605f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    GetAndroidNativeBufferUsageParams params;
606f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    InitOMXParams(&params);
607f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    params.nPortIndex = portIndex;
608e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
609e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    err = OMX_GetParameter(mHandle, index, &params);
610e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    if (err != OMX_ErrorNone) {
611f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOG_ERROR(getParameter, err, "%s(%#x): %s:%u", name, index,
612f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                portString(portIndex), portIndex);
613f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        return StatusFromOMXError(err);
614e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    }
615e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
616e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    *usage = params.nUsage;
617e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
618e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    return OK;
619e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis}
620e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
621e870772a78ffe08b1c14a791e368f1499f1be0f3James Dongstatus_t OMXNodeInstance::storeMetaDataInBuffers(
622054219874873b41f1c815552987c10465c34ba2bLajos Molnar        OMX_U32 portIndex, OMX_BOOL enable, MetadataBufferType *type) {
623e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    Mutex::Autolock autolock(mLock);
624f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_CONFIG(storeMetaDataInBuffers, "%s:%u en:%d", portString(portIndex), portIndex, enable);
625054219874873b41f1c815552987c10465c34ba2bLajos Molnar    return storeMetaDataInBuffers_l(portIndex, enable, type);
626f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
627e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
628f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenstatus_t OMXNodeInstance::storeMetaDataInBuffers_l(
629054219874873b41f1c815552987c10465c34ba2bLajos Molnar        OMX_U32 portIndex, OMX_BOOL enable, MetadataBufferType *type) {
630d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    if (mSailed) {
631d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        android_errorWriteLog(0x534e4554, "29422020");
632d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        return INVALID_OPERATION;
633d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    }
634054219874873b41f1c815552987c10465c34ba2bLajos Molnar    if (portIndex != kPortIndexInput && portIndex != kPortIndexOutput) {
6351a19076c36cbe76a537b5742e96747135b4f0d46mspector@google.com        android_errorWriteLog(0x534e4554, "26324358");
6363e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar        if (type != NULL) {
6373e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar            *type = kMetadataBufferTypeInvalid;
6383e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar        }
639054219874873b41f1c815552987c10465c34ba2bLajos Molnar        return BAD_VALUE;
640054219874873b41f1c815552987c10465c34ba2bLajos Molnar    }
641054219874873b41f1c815552987c10465c34ba2bLajos Molnar
642e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    OMX_INDEXTYPE index;
643e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    OMX_STRING name = const_cast<OMX_STRING>(
644e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            "OMX.google.android.index.storeMetaDataInBuffers");
645e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
646054219874873b41f1c815552987c10465c34ba2bLajos Molnar    OMX_STRING nativeBufferName = const_cast<OMX_STRING>(
647054219874873b41f1c815552987c10465c34ba2bLajos Molnar            "OMX.google.android.index.storeANWBufferInMetadata");
648054219874873b41f1c815552987c10465c34ba2bLajos Molnar    MetadataBufferType negotiatedType;
6493e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar    MetadataBufferType requestedType = type != NULL ? *type : kMetadataBufferTypeANWBuffer;
650512e979284de984427e5b2f73b9054ae1b5e2b0aLajos Molnar
651054219874873b41f1c815552987c10465c34ba2bLajos Molnar    StoreMetaDataInBuffersParams params;
652054219874873b41f1c815552987c10465c34ba2bLajos Molnar    InitOMXParams(&params);
653054219874873b41f1c815552987c10465c34ba2bLajos Molnar    params.nPortIndex = portIndex;
654054219874873b41f1c815552987c10465c34ba2bLajos Molnar    params.bStoreMetaData = enable;
655512e979284de984427e5b2f73b9054ae1b5e2b0aLajos Molnar
6563e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar    OMX_ERRORTYPE err =
6573e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar        requestedType == kMetadataBufferTypeANWBuffer
6583e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar                ? OMX_GetExtensionIndex(mHandle, nativeBufferName, &index)
6593e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar                : OMX_ErrorUnsupportedIndex;
660f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    OMX_ERRORTYPE xerr = err;
661f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    if (err == OMX_ErrorNone) {
662f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        err = OMX_SetParameter(mHandle, index, &params);
663054219874873b41f1c815552987c10465c34ba2bLajos Molnar        if (err == OMX_ErrorNone) {
664054219874873b41f1c815552987c10465c34ba2bLajos Molnar            name = nativeBufferName; // set name for debugging
6653e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar            negotiatedType = requestedType;
666054219874873b41f1c815552987c10465c34ba2bLajos Molnar        }
667054219874873b41f1c815552987c10465c34ba2bLajos Molnar    }
668054219874873b41f1c815552987c10465c34ba2bLajos Molnar    if (err != OMX_ErrorNone) {
669054219874873b41f1c815552987c10465c34ba2bLajos Molnar        err = OMX_GetExtensionIndex(mHandle, name, &index);
670054219874873b41f1c815552987c10465c34ba2bLajos Molnar        xerr = err;
671054219874873b41f1c815552987c10465c34ba2bLajos Molnar        if (err == OMX_ErrorNone) {
6723e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar            negotiatedType =
6733e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar                requestedType == kMetadataBufferTypeANWBuffer
6743e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar                        ? kMetadataBufferTypeGrallocSource : requestedType;
675054219874873b41f1c815552987c10465c34ba2bLajos Molnar            err = OMX_SetParameter(mHandle, index, &params);
676054219874873b41f1c815552987c10465c34ba2bLajos Molnar        }
677f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    }
678e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
679f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    // don't log loud error if component does not support metadata mode on the output
680f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    if (err != OMX_ErrorNone) {
681f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        if (err == OMX_ErrorUnsupportedIndex && portIndex == kPortIndexOutput) {
682f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            CLOGW("component does not support metadata mode; using fallback");
683f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        } else if (xerr != OMX_ErrorNone) {
684f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            CLOG_ERROR(getExtensionIndex, xerr, "%s", name);
685f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        } else {
686054219874873b41f1c815552987c10465c34ba2bLajos Molnar            CLOG_ERROR(setParameter, err, "%s(%#x): %s:%u en=%d type=%d", name, index,
687054219874873b41f1c815552987c10465c34ba2bLajos Molnar                    portString(portIndex), portIndex, enable, negotiatedType);
688f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        }
689054219874873b41f1c815552987c10465c34ba2bLajos Molnar        negotiatedType = mMetadataType[portIndex];
690054219874873b41f1c815552987c10465c34ba2bLajos Molnar    } else {
691054219874873b41f1c815552987c10465c34ba2bLajos Molnar        if (!enable) {
692054219874873b41f1c815552987c10465c34ba2bLajos Molnar            negotiatedType = kMetadataBufferTypeInvalid;
693054219874873b41f1c815552987c10465c34ba2bLajos Molnar        }
694054219874873b41f1c815552987c10465c34ba2bLajos Molnar        mMetadataType[portIndex] = negotiatedType;
695054219874873b41f1c815552987c10465c34ba2bLajos Molnar    }
6963e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar    CLOG_CONFIG(storeMetaDataInBuffers, "%s:%u %srequested %s:%d negotiated %s:%d",
6973e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar            portString(portIndex), portIndex, enable ? "" : "UN",
6983e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar            asString(requestedType), requestedType, asString(negotiatedType), negotiatedType);
699054219874873b41f1c815552987c10465c34ba2bLajos Molnar
700054219874873b41f1c815552987c10465c34ba2bLajos Molnar    if (type != NULL) {
701054219874873b41f1c815552987c10465c34ba2bLajos Molnar        *type = negotiatedType;
702e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    }
703054219874873b41f1c815552987c10465c34ba2bLajos Molnar
704f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    return StatusFromOMXError(err);
705e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong}
706e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
70756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnarstatus_t OMXNodeInstance::prepareForAdaptivePlayback(
70856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        OMX_U32 portIndex, OMX_BOOL enable, OMX_U32 maxFrameWidth,
70956ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        OMX_U32 maxFrameHeight) {
71056ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    Mutex::Autolock autolock(mLock);
711d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    if (mSailed) {
712d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        android_errorWriteLog(0x534e4554, "29422020");
713d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        return INVALID_OPERATION;
714d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    }
715f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_CONFIG(prepareForAdaptivePlayback, "%s:%u en=%d max=%ux%u",
716f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            portString(portIndex), portIndex, enable, maxFrameWidth, maxFrameHeight);
71756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
71856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    OMX_INDEXTYPE index;
71956ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    OMX_STRING name = const_cast<OMX_STRING>(
72056ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            "OMX.google.android.index.prepareForAdaptivePlayback");
72156ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
72256ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index);
72356ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    if (err != OMX_ErrorNone) {
724f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOG_ERROR_IF(enable, getExtensionIndex, err, "%s", name);
72556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        return StatusFromOMXError(err);
72656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    }
72756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
72856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    PrepareForAdaptivePlaybackParams params;
729f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    InitOMXParams(&params);
73056ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    params.nPortIndex = portIndex;
73156ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    params.bEnable = enable;
73256ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    params.nMaxFrameWidth = maxFrameWidth;
73356ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    params.nMaxFrameHeight = maxFrameHeight;
734f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
735f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    err = OMX_SetParameter(mHandle, index, &params);
736f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_IF_ERROR(setParameter, err, "%s(%#x): %s:%u en=%d max=%ux%u", name, index,
737f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            portString(portIndex), portIndex, enable, maxFrameWidth, maxFrameHeight);
738f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    return StatusFromOMXError(err);
73956ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar}
74056ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
7415a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachadstatus_t OMXNodeInstance::configureVideoTunnelMode(
7425a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        OMX_U32 portIndex, OMX_BOOL tunneled, OMX_U32 audioHwSync,
7435a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        native_handle_t **sidebandHandle) {
7445a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    Mutex::Autolock autolock(mLock);
745d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    if (mSailed) {
746d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        android_errorWriteLog(0x534e4554, "29422020");
747d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        return INVALID_OPERATION;
748d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    }
749f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_CONFIG(configureVideoTunnelMode, "%s:%u tun=%d sync=%u",
750f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            portString(portIndex), portIndex, tunneled, audioHwSync);
7515a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
7525a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    OMX_INDEXTYPE index;
7535a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    OMX_STRING name = const_cast<OMX_STRING>(
7545a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            "OMX.google.android.index.configureVideoTunnelMode");
7555a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
7565a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index);
7575a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    if (err != OMX_ErrorNone) {
758f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOG_ERROR_IF(tunneled, getExtensionIndex, err, "%s", name);
7595a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        return StatusFromOMXError(err);
7605a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    }
7615a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
7625a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    ConfigureVideoTunnelModeParams tunnelParams;
763f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    InitOMXParams(&tunnelParams);
7645a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    tunnelParams.nPortIndex = portIndex;
7655a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    tunnelParams.bTunneled = tunneled;
7665a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    tunnelParams.nAudioHwSync = audioHwSync;
7675a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    err = OMX_SetParameter(mHandle, index, &tunnelParams);
7685a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    if (err != OMX_ErrorNone) {
769f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOG_ERROR(setParameter, err, "%s(%#x): %s:%u tun=%d sync=%u", name, index,
770f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                portString(portIndex), portIndex, tunneled, audioHwSync);
771f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        return StatusFromOMXError(err);
7725a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    }
7735a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
7745a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    err = OMX_GetParameter(mHandle, index, &tunnelParams);
7755a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    if (err != OMX_ErrorNone) {
776f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOG_ERROR(getParameter, err, "%s(%#x): %s:%u tun=%d sync=%u", name, index,
777f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                portString(portIndex), portIndex, tunneled, audioHwSync);
778f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        return StatusFromOMXError(err);
7795a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    }
7805a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    if (sidebandHandle) {
7815a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        *sidebandHandle = (native_handle_t*)tunnelParams.pSidebandWindow;
7825a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    }
7835a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
784f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    return OK;
7855a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad}
7865a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
787318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::useBuffer(
788318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
789cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar        OMX::buffer_id *buffer, OMX_U32 allottedSize) {
790298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    if (params == NULL || buffer == NULL) {
791298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        ALOGE("b/25884056");
792298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        return BAD_VALUE;
793298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    }
794298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia
795318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
796d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    if (allottedSize > params->size() || portIndex >= NELEM(mNumPortBuffers)) {
797cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar        return BAD_VALUE;
798cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar    }
799318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
800d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    // metadata buffers are not connected cross process
801d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    // use a backup buffer instead of the actual buffer
802d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    BufferMeta *buffer_meta;
803d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    bool useBackup = mMetadataType[portIndex] != kMetadataBufferTypeInvalid;
804d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    OMX_U8 *data = static_cast<OMX_U8 *>(params->pointer());
805d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    // allocate backup buffer
806d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    if (useBackup) {
807d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        data = new (std::nothrow) OMX_U8[allottedSize];
808d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        if (data == NULL) {
809d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            return NO_MEMORY;
810d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        }
811d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        memset(data, 0, allottedSize);
812d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar
813d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        // if we are not connecting the buffers, the sizes must match
814d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        if (allottedSize != params->size()) {
815d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            CLOG_ERROR(useBuffer, BAD_VALUE, SIMPLE_BUFFER(portIndex, (size_t)allottedSize, data));
816d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            delete[] data;
817d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            return BAD_VALUE;
818d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        }
819d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar
820d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        buffer_meta = new BufferMeta(
821d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar                params, portIndex, false /* copyToOmx */, false /* copyFromOmx */, data);
822d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    } else {
823d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        buffer_meta = new BufferMeta(
824534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar                params, portIndex, false /* copyToOmx */, false /* copyFromOmx */, NULL);
825d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    }
826318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
827318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
828318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
829318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_UseBuffer(
830318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta,
831d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            allottedSize, data);
832318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
833318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
834cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar        CLOG_ERROR(useBuffer, err, SIMPLE_BUFFER(
835d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar                portIndex, (size_t)allottedSize, data));
836318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
837318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
838318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
839318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
840318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
841318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
842f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        return StatusFromOMXError(err);
843318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
844318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
84503b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    CHECK_EQ(header->pAppPrivate, buffer_meta);
84603b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber
847609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    *buffer = makeBufferID(header);
848318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
849d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    addActiveBuffer(portIndex, *buffer);
850d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
8516d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    sp<IOMXBufferSource> bufferSource(getBufferSource());
852f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (bufferSource != NULL && portIndex == kPortIndexInput) {
8536d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        bufferSource->onInputBufferAdded(*buffer);
854f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
855f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
856f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_BUFFER(useBuffer, NEW_BUFFER_FMT(
8575fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar            *buffer, portIndex, "%u(%zu)@%p", allottedSize, params->size(), params->pointer()));
858318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
859318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
860318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
861c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajanstatus_t OMXNodeInstance::useGraphicBuffer2_l(
862c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer,
863c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        OMX::buffer_id *buffer) {
864298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    if (graphicBuffer == NULL || buffer == NULL) {
865298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        ALOGE("b/25884056");
866298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        return BAD_VALUE;
867298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    }
868c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
869c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    // port definition
870c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    OMX_PARAM_PORTDEFINITIONTYPE def;
871f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    InitOMXParams(&def);
872c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nPortIndex = portIndex;
873c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    OMX_ERRORTYPE err = OMX_GetParameter(mHandle, OMX_IndexParamPortDefinition, &def);
874f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    if (err != OMX_ErrorNone) {
875f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        OMX_INDEXTYPE index = OMX_IndexParamPortDefinition;
876f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOG_ERROR(getParameter, err, "%s(%#x): %s:%u",
877f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                asString(index), index, portString(portIndex), portIndex);
878f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        return UNKNOWN_ERROR;
879c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    }
880c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
88141eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim    BufferMeta *bufferMeta = new BufferMeta(graphicBuffer, portIndex);
882c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
883c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    OMX_BUFFERHEADERTYPE *header = NULL;
884c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    OMX_U8* bufferHandle = const_cast<OMX_U8*>(
885c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            reinterpret_cast<const OMX_U8*>(graphicBuffer->handle));
886c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
887c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    err = OMX_UseBuffer(
888c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            mHandle,
889c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            &header,
890c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            portIndex,
891c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            bufferMeta,
892c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            def.nBufferSize,
893c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            bufferHandle);
894c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
895c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    if (err != OMX_ErrorNone) {
896f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOG_ERROR(useBuffer, err, BUFFER_FMT(portIndex, "%u@%p", def.nBufferSize, bufferHandle));
897c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        delete bufferMeta;
898c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        bufferMeta = NULL;
899c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        *buffer = 0;
900f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        return StatusFromOMXError(err);
901c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    }
902c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
903c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    CHECK_EQ(header->pBuffer, bufferHandle);
904c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    CHECK_EQ(header->pAppPrivate, bufferMeta);
905c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
906609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    *buffer = makeBufferID(header);
907c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
908c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    addActiveBuffer(portIndex, *buffer);
909f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_BUFFER(useGraphicBuffer2, NEW_BUFFER_FMT(
910f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            *buffer, portIndex, "%u@%p", def.nBufferSize, bufferHandle));
911c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    return OK;
912c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan}
913c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
914c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// XXX: This function is here for backwards compatibility.  Once the OMX
915c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// implementations have been updated this can be removed and useGraphicBuffer2
916c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// can be renamed to useGraphicBuffer.
91783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennisstatus_t OMXNodeInstance::useGraphicBuffer(
91883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer,
91983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        OMX::buffer_id *buffer) {
920298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    if (graphicBuffer == NULL || buffer == NULL) {
921298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        ALOGE("b/25884056");
922298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        return BAD_VALUE;
923298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    }
92483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    Mutex::Autolock autoLock(mLock);
92583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
926c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    // See if the newer version of the extension is present.
92783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_INDEXTYPE index;
928c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    if (OMX_GetExtensionIndex(
929c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            mHandle,
930c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            const_cast<OMX_STRING>("OMX.google.android.index.useAndroidNativeBuffer2"),
931c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            &index) == OMX_ErrorNone) {
932c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        return useGraphicBuffer2_l(portIndex, graphicBuffer, buffer);
933c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    }
934c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
935ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis    OMX_STRING name = const_cast<OMX_STRING>(
936ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis        "OMX.google.android.index.useAndroidNativeBuffer");
937ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis    OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index);
93883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    if (err != OMX_ErrorNone) {
939f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOG_ERROR(getExtensionIndex, err, "%s", name);
94083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return StatusFromOMXError(err);
94183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
94283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
94341eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim    BufferMeta *bufferMeta = new BufferMeta(graphicBuffer, portIndex);
94483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
94583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_BUFFERHEADERTYPE *header;
94683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
94783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_VERSIONTYPE ver;
94883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nVersionMajor = 1;
94983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nVersionMinor = 0;
95083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nRevision = 0;
95183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nStep = 0;
95283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    UseAndroidNativeBufferParams params = {
95383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        sizeof(UseAndroidNativeBufferParams), ver, portIndex, bufferMeta,
95483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        &header, graphicBuffer,
95583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    };
95683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
95783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    err = OMX_SetParameter(mHandle, index, &params);
95883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
95983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    if (err != OMX_ErrorNone) {
960f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOG_ERROR(setParameter, err, "%s(%#x): %s:%u meta=%p GB=%p", name, index,
961f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                portString(portIndex), portIndex, bufferMeta, graphicBuffer->handle);
96283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
96383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        delete bufferMeta;
96483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        bufferMeta = NULL;
96583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
96683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        *buffer = 0;
96783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
968f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        return StatusFromOMXError(err);
96983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
97083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
97183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    CHECK_EQ(header->pAppPrivate, bufferMeta);
97283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
973609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    *buffer = makeBufferID(header);
97483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
97583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    addActiveBuffer(portIndex, *buffer);
976f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_BUFFER(useGraphicBuffer, NEW_BUFFER_FMT(
977f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            *buffer, portIndex, "GB=%p", graphicBuffer->handle));
97883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    return OK;
97983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis}
98083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
981054219874873b41f1c815552987c10465c34ba2bLajos Molnarstatus_t OMXNodeInstance::updateGraphicBufferInMeta_l(
982f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer,
983e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar        OMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header, bool updateCodecBuffer) {
984298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    // No need to check |graphicBuffer| since NULL is valid for it as below.
985298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    if (header == NULL) {
986298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        ALOGE("b/25884056");
987298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        return BAD_VALUE;
988298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    }
989298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia
990054219874873b41f1c815552987c10465c34ba2bLajos Molnar    if (portIndex != kPortIndexInput && portIndex != kPortIndexOutput) {
991054219874873b41f1c815552987c10465c34ba2bLajos Molnar        return BAD_VALUE;
992054219874873b41f1c815552987c10465c34ba2bLajos Molnar    }
993d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
994d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    BufferMeta *bufferMeta = (BufferMeta *)(header->pAppPrivate);
995e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    sp<ABuffer> data = bufferMeta->getBuffer(
996e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar            header, !updateCodecBuffer /* backup */, false /* limit */);
997d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    bufferMeta->setGraphicBuffer(graphicBuffer);
998e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    MetadataBufferType metaType = mMetadataType[portIndex];
999e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    // we use gralloc source only in the codec buffers
1000e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    if (metaType == kMetadataBufferTypeGrallocSource && !updateCodecBuffer) {
1001e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar        metaType = kMetadataBufferTypeANWBuffer;
1002e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    }
1003e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    if (metaType == kMetadataBufferTypeGrallocSource
1004e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar            && data->capacity() >= sizeof(VideoGrallocMetadata)) {
1005e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar        VideoGrallocMetadata &metadata = *(VideoGrallocMetadata *)(data->data());
1006054219874873b41f1c815552987c10465c34ba2bLajos Molnar        metadata.eType = kMetadataBufferTypeGrallocSource;
10079847fcefb183e1cb09eb48e17a09577392b0e8f4Lajos Molnar        metadata.pHandle = graphicBuffer == NULL ? NULL : graphicBuffer->handle;
1008e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    } else if (metaType == kMetadataBufferTypeANWBuffer
1009e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar            && data->capacity() >= sizeof(VideoNativeMetadata)) {
1010e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar        VideoNativeMetadata &metadata = *(VideoNativeMetadata *)(data->data());
1011054219874873b41f1c815552987c10465c34ba2bLajos Molnar        metadata.eType = kMetadataBufferTypeANWBuffer;
1012054219874873b41f1c815552987c10465c34ba2bLajos Molnar        metadata.pBuffer = graphicBuffer == NULL ? NULL : graphicBuffer->getNativeBuffer();
1013054219874873b41f1c815552987c10465c34ba2bLajos Molnar        metadata.nFenceFd = -1;
1014054219874873b41f1c815552987c10465c34ba2bLajos Molnar    } else {
1015e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar        CLOG_ERROR(updateGraphicBufferInMeta, BAD_VALUE, "%s:%u, %#x bad type (%d) or size (%u)",
1016054219874873b41f1c815552987c10465c34ba2bLajos Molnar            portString(portIndex), portIndex, buffer, mMetadataType[portIndex], header->nAllocLen);
1017054219874873b41f1c815552987c10465c34ba2bLajos Molnar        return BAD_VALUE;
1018054219874873b41f1c815552987c10465c34ba2bLajos Molnar    }
1019054219874873b41f1c815552987c10465c34ba2bLajos Molnar
1020f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_BUFFER(updateGraphicBufferInMeta, "%s:%u, %#x := %p",
102149605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar            portString(portIndex), portIndex, buffer,
102249605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar            graphicBuffer == NULL ? NULL : graphicBuffer->handle);
1023d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    return OK;
1024d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar}
1025d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
1026054219874873b41f1c815552987c10465c34ba2bLajos Molnarstatus_t OMXNodeInstance::updateGraphicBufferInMeta(
1027054219874873b41f1c815552987c10465c34ba2bLajos Molnar        OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer,
1028054219874873b41f1c815552987c10465c34ba2bLajos Molnar        OMX::buffer_id buffer) {
1029054219874873b41f1c815552987c10465c34ba2bLajos Molnar    Mutex::Autolock autoLock(mLock);
103041eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim    OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, portIndex);
1031e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    // update backup buffer for input, codec buffer for output
1032e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    return updateGraphicBufferInMeta_l(
1033e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar            portIndex, graphicBuffer, buffer, header,
1034d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            true /* updateCodecBuffer */);
1035054219874873b41f1c815552987c10465c34ba2bLajos Molnar}
1036054219874873b41f1c815552987c10465c34ba2bLajos Molnar
10377e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnarstatus_t OMXNodeInstance::updateNativeHandleInMeta(
10387e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar        OMX_U32 portIndex, const sp<NativeHandle>& nativeHandle, OMX::buffer_id buffer) {
10397e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    Mutex::Autolock autoLock(mLock);
104041eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim    OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, portIndex);
10417e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    // No need to check |nativeHandle| since NULL is valid for it as below.
10427e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    if (header == NULL) {
10437e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar        ALOGE("b/25884056");
10447e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar        return BAD_VALUE;
10457e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    }
10467e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar
10477e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    if (portIndex != kPortIndexInput && portIndex != kPortIndexOutput) {
10487e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar        return BAD_VALUE;
10497e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    }
10507e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar
10517e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    BufferMeta *bufferMeta = (BufferMeta *)(header->pAppPrivate);
1052534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar    // update backup buffer
10537e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    sp<ABuffer> data = bufferMeta->getBuffer(
1054d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            header, false /* backup */, false /* limit */);
10557e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    bufferMeta->setNativeHandle(nativeHandle);
10567e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    if (mMetadataType[portIndex] == kMetadataBufferTypeNativeHandleSource
10577e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar            && data->capacity() >= sizeof(VideoNativeHandleMetadata)) {
10587e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar        VideoNativeHandleMetadata &metadata = *(VideoNativeHandleMetadata *)(data->data());
10597e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar        metadata.eType = mMetadataType[portIndex];
10607e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar        metadata.pHandle =
10617e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar            nativeHandle == NULL ? NULL : const_cast<native_handle*>(nativeHandle->handle());
10627e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    } else {
10637e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar        CLOG_ERROR(updateNativeHandleInMeta, BAD_VALUE, "%s:%u, %#x bad type (%d) or size (%zu)",
10647e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar            portString(portIndex), portIndex, buffer, mMetadataType[portIndex], data->capacity());
10657e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar        return BAD_VALUE;
10667e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    }
10677e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar
10687e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    CLOG_BUFFER(updateNativeHandleInMeta, "%s:%u, %#x := %p",
10697e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar            portString(portIndex), portIndex, buffer,
10707e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar            nativeHandle == NULL ? NULL : nativeHandle->handle());
10717e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    return OK;
10727e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar}
10737e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar
1074d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstatus_t OMXNodeInstance::createGraphicBufferSource(
10756d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        OMX_U32 portIndex, android_dataspace dataSpace,
10766d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        const sp<IGraphicBufferConsumer> &bufferConsumer,
10776d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        sp<IGraphicBufferProducer> *bufferProducer,
10786d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        sp<IGraphicBufferSource> *bufferSource,
10796d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        MetadataBufferType *type) {
1080f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    status_t err;
1081f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
1082d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    // only allow graphic source on input port, when there are no allocated buffers yet
1083d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    if (portIndex != kPortIndexInput) {
1084d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        android_errorWriteLog(0x534e4554, "29422020");
1085d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        return BAD_VALUE;
1086d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    } else if (mNumPortBuffers[portIndex] > 0) {
1087d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        android_errorWriteLog(0x534e4554, "29422020");
1088d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        return INVALID_OPERATION;
1089d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    }
1090d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar
10916d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    if (getBufferSource() != NULL) {
1092054219874873b41f1c815552987c10465c34ba2bLajos Molnar        if (portIndex < NELEM(mMetadataType) && type != NULL) {
1093054219874873b41f1c815552987c10465c34ba2bLajos Molnar            *type = mMetadataType[portIndex];
1094054219874873b41f1c815552987c10465c34ba2bLajos Molnar        }
1095f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        return ALREADY_EXISTS;
1096f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
1097f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
1098054219874873b41f1c815552987c10465c34ba2bLajos Molnar    // Input buffers will hold meta-data (ANativeWindowBuffer references).
10993e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar    if (type != NULL) {
11003e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar        *type = kMetadataBufferTypeANWBuffer;
11013e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar    }
1102054219874873b41f1c815552987c10465c34ba2bLajos Molnar    err = storeMetaDataInBuffers_l(portIndex, OMX_TRUE, type);
1103f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (err != OK) {
1104f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        return err;
1105f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
1106f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
1107f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    // Retrieve the width and height of the graphic buffer, set when the
1108f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    // codec was configured.
1109f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    OMX_PARAM_PORTDEFINITIONTYPE def;
1110f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    InitOMXParams(&def);
1111f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    def.nPortIndex = portIndex;
1112f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    OMX_ERRORTYPE oerr = OMX_GetParameter(
1113f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden            mHandle, OMX_IndexParamPortDefinition, &def);
1114f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    if (oerr != OMX_ErrorNone) {
1115f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        OMX_INDEXTYPE index = OMX_IndexParamPortDefinition;
1116f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOG_ERROR(getParameter, oerr, "%s(%#x): %s:%u",
1117f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                asString(index), index, portString(portIndex), portIndex);
1118f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        return UNKNOWN_ERROR;
1119f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    }
1120f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
1121ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden    if (def.format.video.eColorFormat != OMX_COLOR_FormatAndroidOpaque) {
1122f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOGW("createInputSurface requires COLOR_FormatSurface "
1123f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                "(AndroidOpaque) color format instead of %s(%#x)",
1124f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                asString(def.format.video.eColorFormat), def.format.video.eColorFormat);
1125ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden        return INVALID_OPERATION;
1126ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden    }
1127ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden
112849605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar    uint32_t usageBits;
112949605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar    oerr = OMX_GetParameter(
113049605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar            mHandle, (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits, &usageBits);
113149605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar    if (oerr != OMX_ErrorNone) {
113249605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar        usageBits = 0;
113349605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar    }
113449605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar
11356d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    sp<GraphicBufferSource> graphicBufferSource = new GraphicBufferSource(
11366cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            mOwner,
11376cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            mNodeID,
1138d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            def.format.video.nFrameWidth,
1139d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            def.format.video.nFrameHeight,
1140d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            def.nBufferCountActual,
114149605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar            usageBits,
1142d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            bufferConsumer);
1143d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
11446d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    if ((err = graphicBufferSource->initCheck()) != OK) {
1145f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        return err;
1146f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
11476d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    setBufferSource(graphicBufferSource);
11486d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang
11496d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    if (bufferConsumer == NULL) {
11506d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        graphicBufferSource->setDefaultDataSpace(dataSpace);
11516d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    }
11526d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang
11536d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    if (bufferProducer != NULL) {
11546d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        *bufferProducer = graphicBufferSource->getIGraphicBufferProducer();
11556d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    }
11566d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang
11576d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    *bufferSource = graphicBufferSource;
1158f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
1159f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    return OK;
1160f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
1161f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
1162d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstatus_t OMXNodeInstance::createInputSurface(
116357fad3c31f46ec98d15bc253c16f9d269aeb8ea7Lajos Molnar        OMX_U32 portIndex, android_dataspace dataSpace,
11646d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        sp<IGraphicBufferProducer> *bufferProducer,
11656d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        sp<IGraphicBufferSource> *bufferSource,
11666d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        MetadataBufferType *type) {
1167298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    if (bufferProducer == NULL) {
1168298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        ALOGE("b/25884056");
1169298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        return BAD_VALUE;
1170298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    }
1171298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia
1172d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    Mutex::Autolock autolock(mLock);
11736d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    return createGraphicBufferSource(
11746d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            portIndex, dataSpace, NULL /* bufferConsumer */,
11756d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            bufferProducer, bufferSource, type);
1176d291c222357303b9611cab89d0c3b047584ef377Chong Zhang}
1177d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
1178d291c222357303b9611cab89d0c3b047584ef377Chong Zhang//static
1179d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstatus_t OMXNodeInstance::createPersistentInputSurface(
1180d291c222357303b9611cab89d0c3b047584ef377Chong Zhang        sp<IGraphicBufferProducer> *bufferProducer,
1181d291c222357303b9611cab89d0c3b047584ef377Chong Zhang        sp<IGraphicBufferConsumer> *bufferConsumer) {
1182298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    if (bufferProducer == NULL || bufferConsumer == NULL) {
1183298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        ALOGE("b/25884056");
1184298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        return BAD_VALUE;
1185298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    }
1186d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    String8 name("GraphicBufferSource");
1187d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
1188d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    sp<IGraphicBufferProducer> producer;
1189d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    sp<IGraphicBufferConsumer> consumer;
1190d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    BufferQueue::createBufferQueue(&producer, &consumer);
1191d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    consumer->setConsumerName(name);
1192d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    consumer->setConsumerUsageBits(GRALLOC_USAGE_HW_VIDEO_ENCODER);
1193d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
1194d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    sp<BufferQueue::ProxyConsumerListener> proxy =
1195d291c222357303b9611cab89d0c3b047584ef377Chong Zhang        new BufferQueue::ProxyConsumerListener(NULL);
119679608158c2254fe1357959157f2d0c1560a8a6c6Chong Zhang    status_t err = consumer->consumerConnect(proxy, false);
1197d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    if (err != NO_ERROR) {
1198d291c222357303b9611cab89d0c3b047584ef377Chong Zhang        ALOGE("Error connecting to BufferQueue: %s (%d)",
1199d291c222357303b9611cab89d0c3b047584ef377Chong Zhang                strerror(-err), err);
1200d291c222357303b9611cab89d0c3b047584ef377Chong Zhang        return err;
1201d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    }
1202d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
1203d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    *bufferProducer = producer;
1204d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    *bufferConsumer = consumer;
1205d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
1206d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    return OK;
1207d291c222357303b9611cab89d0c3b047584ef377Chong Zhang}
1208d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
12098f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhangstatus_t OMXNodeInstance::setInputSurface(
12106d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        OMX_U32 portIndex,
12116d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        const sp<IGraphicBufferConsumer> &bufferConsumer,
12126d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        sp<IGraphicBufferSource> *bufferSource,
1213054219874873b41f1c815552987c10465c34ba2bLajos Molnar        MetadataBufferType *type) {
1214d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    Mutex::Autolock autolock(mLock);
12156d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    return createGraphicBufferSource(
12166d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            portIndex, android_dataspace::HAL_DATASPACE_UNKNOWN,
12176d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            bufferConsumer, NULL, bufferSource, type);
1218f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
1219f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
1220a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnarstatus_t OMXNodeInstance::allocateSecureBuffer(
1221570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber        OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer,
12221b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar        void **buffer_data, sp<NativeHandle> *native_handle) {
1223a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    if (buffer == NULL || buffer_data == NULL || native_handle == NULL) {
1224298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        ALOGE("b/25884056");
1225298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        return BAD_VALUE;
1226298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    }
1227298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia
1228f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia    if (portIndex >= NELEM(mSecureBufferType)) {
1229f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia        ALOGE("b/31385713, portIndex(%u)", portIndex);
1230f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia        android_errorWriteLog(0x534e4554, "31385713");
1231f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia        return BAD_VALUE;
1232f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia    }
1233f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia
1234318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
1235318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
123641eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim    BufferMeta *buffer_meta = new BufferMeta(size, portIndex);
1237318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1238318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
1239318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1240318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
1241318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta, size);
1242318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1243318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
1244f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOG_ERROR(allocateBuffer, err, BUFFER_FMT(portIndex, "%zu@", size));
1245318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
1246318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
1247318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1248318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
1249318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1250f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        return StatusFromOMXError(err);
1251318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
1252318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
125303b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    CHECK_EQ(header->pAppPrivate, buffer_meta);
125403b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber
1255609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    *buffer = makeBufferID(header);
1256a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    if (mSecureBufferType[portIndex] == kSecureBufferTypeNativeHandle) {
1257a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar        *buffer_data = NULL;
12581b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar        *native_handle = NativeHandle::create(
12591b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar                (native_handle_t *)header->pBuffer, false /* ownsHandle */);
1260a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    } else {
1261a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar        *buffer_data = header->pBuffer;
1262a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar        *native_handle = NULL;
1263a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    }
1264318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1265d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    addActiveBuffer(portIndex, *buffer);
1266d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
12676d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    sp<IOMXBufferSource> bufferSource(getBufferSource());
1268f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (bufferSource != NULL && portIndex == kPortIndexInput) {
12696d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        bufferSource->onInputBufferAdded(*buffer);
1270f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
1271a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    CLOG_BUFFER(allocateSecureBuffer, NEW_BUFFER_FMT(
12721b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar            *buffer, portIndex, "%zu@%p:%p", size, *buffer_data,
12731b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar            *native_handle == NULL ? NULL : (*native_handle)->handle()));
1274f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
1275318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
1276318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
1277318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1278318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup(
1279318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
1280cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar        OMX::buffer_id *buffer, OMX_U32 allottedSize) {
1281298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    if (params == NULL || buffer == NULL) {
1282298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        ALOGE("b/25884056");
1283298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        return BAD_VALUE;
1284298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    }
1285298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia
1286318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
1287d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    if (allottedSize > params->size() || portIndex >= NELEM(mNumPortBuffers)) {
1288cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar        return BAD_VALUE;
1289cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar    }
1290318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1291d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    // metadata buffers are not connected cross process; only copy if not meta
1292d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    bool copy = mMetadataType[portIndex] == kMetadataBufferTypeInvalid;
1293d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar
1294d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    BufferMeta *buffer_meta = new BufferMeta(
1295d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            params, portIndex,
1296d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            (portIndex == kPortIndexInput) && copy /* copyToOmx */,
1297d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            (portIndex == kPortIndexOutput) && copy /* copyFromOmx */,
1298d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar            NULL /* data */);
1299318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1300318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
1301318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1302318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
1303cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar            mHandle, &header, portIndex, buffer_meta, allottedSize);
1304318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
1305f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        CLOG_ERROR(allocateBufferWithBackup, err,
1306cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar                SIMPLE_BUFFER(portIndex, (size_t)allottedSize, params->pointer()));
1307318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
1308318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
1309318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1310318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
1311318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1312f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        return StatusFromOMXError(err);
1313318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
1314318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
131503b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    CHECK_EQ(header->pAppPrivate, buffer_meta);
131603b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber
1317609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    *buffer = makeBufferID(header);
1318318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1319d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    addActiveBuffer(portIndex, *buffer);
1320d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
13216d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    sp<IOMXBufferSource> bufferSource(getBufferSource());
1322f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (bufferSource != NULL && portIndex == kPortIndexInput) {
13236d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        bufferSource->onInputBufferAdded(*buffer);
1324f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
1325f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
13265fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar    CLOG_BUFFER(allocateBufferWithBackup, NEW_BUFFER_FMT(*buffer, portIndex, "%zu@%p :> %u@%p",
13275fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar            params->size(), params->pointer(), allottedSize, header->pBuffer));
1328f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
1329318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
1330318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
1331318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1332318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::freeBuffer(
1333318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, OMX::buffer_id buffer) {
1334318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
1335f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_BUFFER(freeBuffer, "%s:%u %#x", portString(portIndex), portIndex, buffer);
1336318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1337d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    removeActiveBuffer(portIndex, buffer);
1338d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
133941eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim    OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, portIndex);
1340298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    if (header == NULL) {
1341298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        ALOGE("b/25884056");
1342298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        return BAD_VALUE;
1343298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    }
1344318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate);
1345318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1346318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header);
1347f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOG_IF_ERROR(freeBuffer, err, "%s:%u %#x", portString(portIndex), portIndex, buffer);
1348318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1349318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    delete buffer_meta;
1350318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    buffer_meta = NULL;
1351609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    invalidateBufferID(buffer);
1352318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1353318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
1354318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
1355318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
135615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnarstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer, int fenceFd) {
1357318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
1358318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
135941eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim    OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, kPortIndexOutput);
1360298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    if (header == NULL) {
1361298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        ALOGE("b/25884056");
1362298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        return BAD_VALUE;
1363298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    }
1364318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFilledLen = 0;
1365318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nOffset = 0;
1366318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFlags = 0;
1367318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
136815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // meta now owns fenceFd
136915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    status_t res = storeFenceInMeta_l(header, fenceFd, kPortIndexOutput);
137015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    if (res != OK) {
137115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        CLOG_ERROR(fillBuffer::storeFenceInMeta, res, EMPTY_BUFFER(buffer, header, fenceFd));
137215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        return res;
137315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    }
137415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar
1375f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    {
1376f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        Mutex::Autolock _l(mDebugLock);
1377f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        mOutputBuffersWithCodec.add(header);
137815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        CLOG_BUMPED_BUFFER(fillBuffer, WITH_STATS(EMPTY_BUFFER(buffer, header, fenceFd)));
1379f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    }
1380318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1381f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header);
1382f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    if (err != OMX_ErrorNone) {
138315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        CLOG_ERROR(fillBuffer, err, EMPTY_BUFFER(buffer, header, fenceFd));
1384f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        Mutex::Autolock _l(mDebugLock);
1385f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        mOutputBuffersWithCodec.remove(header);
1386f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    }
1387318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
1388318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
1389318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1390318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::emptyBuffer(
1391318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX::buffer_id buffer,
1392318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 rangeOffset, OMX_U32 rangeLength,
139315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) {
1394318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
1395318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1396d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    // no emptybuffer if using input surface
13976d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    if (getBufferSource() != NULL) {
1398d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        android_errorWriteLog(0x534e4554, "29422020");
1399d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar        return INVALID_OPERATION;
1400d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    }
1401d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar
140241eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim    OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, kPortIndexInput);
1403298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    if (header == NULL) {
1404298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        ALOGE("b/25884056");
1405298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        return BAD_VALUE;
1406298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    }
1407318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta =
1408318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        static_cast<BufferMeta *>(header->pAppPrivate);
1409534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar
1410534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar    // set up proper filled length if component is configured for gralloc metadata mode
1411534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar    // ignore rangeOffset in this case (as client may be assuming ANW meta buffers).
1412534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar    if (mMetadataType[kPortIndexInput] == kMetadataBufferTypeGrallocSource) {
1413534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar        header->nFilledLen = rangeLength ? sizeof(VideoGrallocMetadata) : 0;
14145fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar        header->nOffset = 0;
1415054219874873b41f1c815552987c10465c34ba2bLajos Molnar    } else {
14165fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar        // rangeLength and rangeOffset must be a subset of the allocated data in the buffer.
14175fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar        // corner case: we permit rangeOffset == end-of-buffer with rangeLength == 0.
14185fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar        if (rangeOffset > header->nAllocLen
14195fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar                || rangeLength > header->nAllocLen - rangeOffset) {
1420ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar            CLOG_ERROR(emptyBuffer, OMX_ErrorBadParameter, FULL_BUFFER(NULL, header, fenceFd));
14215fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar            if (fenceFd >= 0) {
14225fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar                ::close(fenceFd);
14235fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar            }
14245fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar            return BAD_VALUE;
14255fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar        }
14265fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar        header->nFilledLen = rangeLength;
14275fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar        header->nOffset = rangeOffset;
14285fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar
1429054219874873b41f1c815552987c10465c34ba2bLajos Molnar        buffer_meta->CopyToOMX(header);
1430054219874873b41f1c815552987c10465c34ba2bLajos Molnar    }
1431318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
143215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    return emptyBuffer_l(header, flags, timestamp, (intptr_t)buffer, fenceFd);
1433f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar}
1434f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
1435f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar// log queued buffer activity for the next few input and/or output frames
1436f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar// if logging at internal state level
1437f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarvoid OMXNodeInstance::bumpDebugLevel_l(size_t numInputBuffers, size_t numOutputBuffers) {
1438f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    if (DEBUG == ADebug::kDebugInternalState) {
1439f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        DEBUG_BUMP = ADebug::kDebugAll;
1440f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        if (numInputBuffers > 0) {
1441f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            mDebugLevelBumpPendingBuffers[kPortIndexInput] = numInputBuffers;
1442f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        }
1443f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        if (numOutputBuffers > 0) {
1444f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            mDebugLevelBumpPendingBuffers[kPortIndexOutput] = numOutputBuffers;
1445f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        }
1446f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    }
1447f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar}
1448f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
1449f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarvoid OMXNodeInstance::unbumpDebugLevel_l(size_t portIndex) {
1450f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    if (mDebugLevelBumpPendingBuffers[portIndex]) {
1451f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        --mDebugLevelBumpPendingBuffers[portIndex];
1452f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    }
1453f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    if (!mDebugLevelBumpPendingBuffers[0]
1454f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            && !mDebugLevelBumpPendingBuffers[1]) {
1455f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        DEBUG_BUMP = DEBUG;
1456f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    }
1457f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar}
1458f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
145915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnarstatus_t OMXNodeInstance::storeFenceInMeta_l(
146015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        OMX_BUFFERHEADERTYPE *header, int fenceFd, OMX_U32 portIndex) {
146115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // propagate fence if component supports it; wait for it otherwise
146215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    OMX_U32 metaSize = portIndex == kPortIndexInput ? header->nFilledLen : header->nAllocLen;
146315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    if (mMetadataType[portIndex] == kMetadataBufferTypeANWBuffer
146415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            && metaSize >= sizeof(VideoNativeMetadata)) {
146515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        VideoNativeMetadata &nativeMeta = *(VideoNativeMetadata *)(header->pBuffer);
146615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        if (nativeMeta.nFenceFd >= 0) {
146715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            ALOGE("fence (%d) already exists in meta", nativeMeta.nFenceFd);
146815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            if (fenceFd >= 0) {
146915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar                ::close(fenceFd);
147015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            }
147115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            return ALREADY_EXISTS;
147215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        }
147315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        nativeMeta.nFenceFd = fenceFd;
147415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    } else if (fenceFd >= 0) {
147515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        CLOG_BUFFER(storeFenceInMeta, "waiting for fence %d", fenceFd);
147615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        sp<Fence> fence = new Fence(fenceFd);
147715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        return fence->wait(IOMX::kFenceTimeoutMs);
147815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    }
147915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    return OK;
148015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar}
148115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar
148215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnarint OMXNodeInstance::retrieveFenceFromMeta_l(
148315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        OMX_BUFFERHEADERTYPE *header, OMX_U32 portIndex) {
148415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    OMX_U32 metaSize = portIndex == kPortIndexInput ? header->nAllocLen : header->nFilledLen;
148515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    int fenceFd = -1;
148615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    if (mMetadataType[portIndex] == kMetadataBufferTypeANWBuffer
148715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            && header->nAllocLen >= sizeof(VideoNativeMetadata)) {
148815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        VideoNativeMetadata &nativeMeta = *(VideoNativeMetadata *)(header->pBuffer);
148915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        if (nativeMeta.eType == kMetadataBufferTypeANWBuffer) {
149015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            fenceFd = nativeMeta.nFenceFd;
149115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            nativeMeta.nFenceFd = -1;
149215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        }
149315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        if (metaSize < sizeof(nativeMeta) && fenceFd >= 0) {
149415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            CLOG_ERROR(foundFenceInEmptyMeta, BAD_VALUE, FULL_BUFFER(
149515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar                    NULL, header, nativeMeta.nFenceFd));
149615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            fenceFd = -1;
149715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        }
149815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    }
149915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    return fenceFd;
150015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar}
150115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar
1502f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarstatus_t OMXNodeInstance::emptyBuffer_l(
150315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        OMX_BUFFERHEADERTYPE *header, OMX_U32 flags, OMX_TICKS timestamp,
150415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        intptr_t debugAddr, int fenceFd) {
1505f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    header->nFlags = flags;
1506f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    header->nTimeStamp = timestamp;
1507f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
150815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    status_t res = storeFenceInMeta_l(header, fenceFd, kPortIndexInput);
150915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    if (res != OK) {
151015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        CLOG_ERROR(emptyBuffer::storeFenceInMeta, res, WITH_STATS(
151115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar                FULL_BUFFER(debugAddr, header, fenceFd)));
151215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        return res;
151315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    }
151415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar
1515f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    {
1516f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        Mutex::Autolock _l(mDebugLock);
1517f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        mInputBuffersWithCodec.add(header);
1518f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
1519f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        // bump internal-state debug level for 2 input frames past a buffer with CSD
1520f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        if ((flags & OMX_BUFFERFLAG_CODECCONFIG) != 0) {
1521f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            bumpDebugLevel_l(2 /* numInputBuffers */, 0 /* numOutputBuffers */);
1522f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        }
1523f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
152415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        CLOG_BUMPED_BUFFER(emptyBuffer, WITH_STATS(FULL_BUFFER(debugAddr, header, fenceFd)));
1525f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    }
1526f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
1527318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header);
152815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    CLOG_IF_ERROR(emptyBuffer, err, FULL_BUFFER(debugAddr, header, fenceFd));
1529f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
1530f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    {
1531f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        Mutex::Autolock _l(mDebugLock);
1532f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        if (err != OMX_ErrorNone) {
1533f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            mInputBuffersWithCodec.remove(header);
1534f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        } else if (!(flags & OMX_BUFFERFLAG_CODECCONFIG)) {
1535f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            unbumpDebugLevel_l(kPortIndexInput);
1536f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        }
1537f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    }
1538318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1539318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
1540318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
1541318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1542f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// like emptyBuffer, but the data is already in header->pBuffer
1543054219874873b41f1c815552987c10465c34ba2bLajos Molnarstatus_t OMXNodeInstance::emptyGraphicBuffer(
15446cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        OMX::buffer_id buffer, const sp<GraphicBuffer> &graphicBuffer,
15456d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        OMX_U32 flags, OMX_TICKS timestamp, OMX_TICKS origTimestamp, int fenceFd) {
15466cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    Mutex::Autolock autoLock(mLock);
15476cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang
15486cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, kPortIndexInput);
1549298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    if (header == NULL) {
1550298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        ALOGE("b/25884056");
1551298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        return BAD_VALUE;
1552298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    }
1553298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia
1554e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    status_t err = updateGraphicBufferInMeta_l(
1555e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar            kPortIndexInput, graphicBuffer, buffer, header,
1556e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar            true /* updateCodecBuffer */);
1557054219874873b41f1c815552987c10465c34ba2bLajos Molnar    if (err != OK) {
155815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        CLOG_ERROR(emptyGraphicBuffer, err, FULL_BUFFER(
155915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar                (intptr_t)header->pBuffer, header, fenceFd));
1560054219874873b41f1c815552987c10465c34ba2bLajos Molnar        return err;
1561054219874873b41f1c815552987c10465c34ba2bLajos Molnar    }
1562f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
15636d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    // If we're required to restore original timestamp, origTimestamp will
15646d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    // be set to non-negative number for all frames. If it's not required
15656d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    // client will set it to -1ll for all frames.
15666d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    if (origTimestamp >= 0ll && !mRestorePtsFailed) {
15676d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        mShouldRestorePts = true;
15686d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        mOriginalTimeUs.add(timestamp, origTimestamp);
15696d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    }
15706d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang
1571054219874873b41f1c815552987c10465c34ba2bLajos Molnar    header->nOffset = 0;
1572e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    if (graphicBuffer == NULL) {
1573e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar        header->nFilledLen = 0;
1574e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    } else if (mMetadataType[kPortIndexInput] == kMetadataBufferTypeGrallocSource) {
1575e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar        header->nFilledLen = sizeof(VideoGrallocMetadata);
1576e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    } else {
1577e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar        header->nFilledLen = sizeof(VideoNativeMetadata);
1578e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    }
157915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    return emptyBuffer_l(header, flags, timestamp, (intptr_t)header->pBuffer, fenceFd);
1580f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
1581f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
15826d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhangvoid OMXNodeInstance::codecBufferFilled(omx_message &msg) {
15836d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    Mutex::Autolock autoLock(mBufferIDLock);
1584318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
15856d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    if (!mShouldRestorePts || mRestorePtsFailed) {
15866d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        return;
1587f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    }
1588f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
15896d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    OMX_U32 &flags = msg.u.extended_buffer_data.flags;
15906d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    OMX_TICKS &timestamp = msg.u.extended_buffer_data.timestamp;
15916d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang
15926d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    if (!(flags & OMX_BUFFERFLAG_CODECCONFIG)) {
15936d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        ssize_t index = mOriginalTimeUs.indexOfKey(timestamp);
15946d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        if (index >= 0) {
15956d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            ALOGV("OUT timestamp: %lld -> %lld",
15966d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang                    static_cast<long long>(timestamp),
15976d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang                    static_cast<long long>(mOriginalTimeUs[index]));
15986d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            timestamp = mOriginalTimeUs[index];
15996d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            mOriginalTimeUs.removeItemsAt(index);
16006d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        } else {
16016d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            // giving up the effort as encoder doesn't appear to preserve pts
16026d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            ALOGW("giving up limiting timestamp gap (pts = %lld)", timestamp);
16036d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            mRestorePtsFailed = true;
16046d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        }
16056d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        if (mOriginalTimeUs.size() > BufferQueue::NUM_BUFFER_SLOTS) {
16066d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            // something terribly wrong must have happened, giving up...
16076d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            ALOGE("mOriginalTimeUs has too many entries (%zu)",
16086d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang                    mOriginalTimeUs.size());
16096d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            mRestorePtsFailed = true;
16106d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        }
1611dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar    }
1612dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar}
1613dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar
16146d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhangstatus_t OMXNodeInstance::getExtensionIndex(
16156d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        const char *parameterName, OMX_INDEXTYPE *index) {
16166d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    Mutex::Autolock autoLock(mLock);
1617e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
16186d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    OMX_ERRORTYPE err = OMX_GetExtensionIndex(
16196d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            mHandle, const_cast<char *>(parameterName), index);
1620e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
16216d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    return StatusFromOMXError(err);
1622e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber}
1623e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
162426a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnarbool OMXNodeInstance::handleMessage(omx_message &msg) {
1625318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (msg.type == omx_message::FILL_BUFFER_DONE) {
1626318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_BUFFERHEADERTYPE *buffer =
162741eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim            findBufferHeader(msg.u.extended_buffer_data.buffer, kPortIndexOutput);
1628298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        if (buffer == NULL) {
1629298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia            ALOGE("b/25884056");
163041eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim            return false;
1631298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        }
1632318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1633f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        {
1634f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            Mutex::Autolock _l(mDebugLock);
1635f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            mOutputBuffersWithCodec.remove(buffer);
1636f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
1637f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            CLOG_BUMPED_BUFFER(
163815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar                    FBD, WITH_STATS(FULL_BUFFER(
163915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar                            msg.u.extended_buffer_data.buffer, buffer, msg.fenceFd)));
1640f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
1641f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            unbumpDebugLevel_l(kPortIndexOutput);
1642f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        }
1643f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
1644318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        BufferMeta *buffer_meta =
1645318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            static_cast<BufferMeta *>(buffer->pAppPrivate);
1646318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1647ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar        if (buffer->nOffset + buffer->nFilledLen < buffer->nOffset
1648ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar                || buffer->nOffset + buffer->nFilledLen > buffer->nAllocLen) {
1649ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar            CLOG_ERROR(onFillBufferDone, OMX_ErrorBadParameter,
1650ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar                    FULL_BUFFER(NULL, buffer, msg.fenceFd));
1651ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar        }
1652318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta->CopyFromOMX(buffer);
16531b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber
16546d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        // fix up the buffer info (especially timestamp) if needed
16556d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        codecBufferFilled(msg);
165694ee4b708acfa941581160b267afb79192b1d816Chong Zhang    } else if (msg.type == omx_message::EMPTY_BUFFER_DONE) {
1657f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        OMX_BUFFERHEADERTYPE *buffer =
165841eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim            findBufferHeader(msg.u.buffer_data.buffer, kPortIndexInput);
165941eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim        if (buffer == NULL) {
166041eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim            return false;
166141eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim        }
1662f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
1663f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        {
1664f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            Mutex::Autolock _l(mDebugLock);
1665f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            mInputBuffersWithCodec.remove(buffer);
1666f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
1667f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            CLOG_BUMPED_BUFFER(
166815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar                    EBD, WITH_STATS(EMPTY_BUFFER(msg.u.buffer_data.buffer, buffer, msg.fenceFd)));
1669f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        }
1670f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
16716d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        const sp<IOMXBufferSource> bufferSource(getBufferSource());
16726d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang
167394ee4b708acfa941581160b267afb79192b1d816Chong Zhang        if (bufferSource != NULL) {
16746d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            // This is one of the buffers used exclusively by IOMXBufferSource.
16751b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber            // Don't dispatch a message back to ACodec, since it doesn't
16761b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber            // know that anyone asked to have the buffer emptied and will
16771b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber            // be very confused.
16786d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang            bufferSource->onInputBufferEmptied(
16796d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang                    msg.u.buffer_data.buffer, OMXFenceParcelable(msg.fenceFd));
168026a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar            return true;
168126a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar        }
16826cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    } else if (msg.type == omx_message::EVENT &&
16836cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            msg.u.event_data.event == OMX_EventDataSpaceChanged) {
16846cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        handleDataSpaceChanged(msg);
168526a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    }
168626a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar
168726a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    return false;
168826a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar}
168926a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar
16906cf9a1238986880536de705255f7c2c91c1ba719Chong Zhangbool OMXNodeInstance::handleDataSpaceChanged(omx_message &msg) {
16916cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    android_dataspace dataSpace = (android_dataspace) msg.u.event_data.data1;
16926cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    android_dataspace origDataSpace = dataSpace;
16936cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang
16946cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    if (!ColorUtils::convertDataSpaceToV0(dataSpace)) {
16956cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        // Do not process the data space change, don't notify client either
16966cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        return true;
16976cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    }
16986cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang
16996cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    android_pixel_format pixelFormat = (android_pixel_format)msg.u.event_data.data3;
17006cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang
17016cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    ColorAspects requestedAspects = ColorUtils::unpackToColorAspects(msg.u.event_data.data2);
17026cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    ColorAspects aspects = requestedAspects; // initially requested aspects
17036cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang
17046cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    // request color aspects to encode
17056cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    OMX_INDEXTYPE index;
17066cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    status_t err = getExtensionIndex(
17076cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            "OMX.google.android.index.describeColorAspects", &index);
17086cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    if (err == OK) {
17096cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        // V0 dataspace
17106cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        DescribeColorAspectsParams params;
17116cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        InitOMXParams(&params);
17126cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        params.nPortIndex = kPortIndexInput;
17136cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        params.nDataSpace = origDataSpace;
17146cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        params.nPixelFormat = pixelFormat;
17156cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        params.bDataSpaceChanged = OMX_TRUE;
17166cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        params.sAspects = requestedAspects;
17176cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang
17186cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        err = getConfig(index, &params, sizeof(params));
17196cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        if (err == OK) {
17206cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            aspects = params.sAspects;
17216cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            ALOGD("Codec resolved it to (R:%d(%s), P:%d(%s), M:%d(%s), T:%d(%s)) err=%d(%s)",
17226cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang                    params.sAspects.mRange, asString(params.sAspects.mRange),
17236cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang                    params.sAspects.mPrimaries, asString(params.sAspects.mPrimaries),
17246cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang                    params.sAspects.mMatrixCoeffs, asString(params.sAspects.mMatrixCoeffs),
17256cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang                    params.sAspects.mTransfer, asString(params.sAspects.mTransfer),
17266cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang                    err, asString(err));
17276cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        } else {
17286cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            params.sAspects = aspects;
17296cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            err = OK;
17306cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        }
17316cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        params.bDataSpaceChanged = OMX_FALSE;
17326cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        for (int triesLeft = 2; --triesLeft >= 0; ) {
17336cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            status_t err = setConfig(index, &params, sizeof(params));
17346cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            if (err == OK) {
17356cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang                err = getConfig(index, &params, sizeof(params));
17366cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            }
17376cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            if (err != OK || !ColorUtils::checkIfAspectsChangedAndUnspecifyThem(
17386cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang                    params.sAspects, aspects)) {
17396cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang                // if we can't set or get color aspects, still communicate dataspace to client
17406cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang                break;
17416cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            }
17426cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang
17436cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            ALOGW_IF(triesLeft == 0, "Codec repeatedly changed requested ColorAspects.");
17446cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang        }
17456cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    }
17466cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang
17476cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    ALOGV("Set color aspects to (R:%d(%s), P:%d(%s), M:%d(%s), T:%d(%s)) err=%d(%s)",
17486cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            aspects.mRange, asString(aspects.mRange),
17496cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            aspects.mPrimaries, asString(aspects.mPrimaries),
17506cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            aspects.mMatrixCoeffs, asString(aspects.mMatrixCoeffs),
17516cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            aspects.mTransfer, asString(aspects.mTransfer),
17526cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang            err, asString(err));
17536cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang
17546cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    // signal client that the dataspace has changed; this will update the output format
17556cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    // TODO: we should tie this to an output buffer somehow, and signal the change
17566cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    // just before the output buffer is returned to the client, but there are many
17576cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    // ways this could fail (e.g. flushing), and we are not yet supporting this scenario.
17586cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang
17596cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    msg.u.event_data.data1 = (OMX_U32) dataSpace;
17606cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    msg.u.event_data.data2 = (OMX_U32) ColorUtils::packToU32(aspects);
17616cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang
17626cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    return false;
17636cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang}
17646cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang
176526a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnarvoid OMXNodeInstance::onMessages(std::list<omx_message> &messages) {
176626a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    for (std::list<omx_message>::iterator it = messages.begin(); it != messages.end(); ) {
176726a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar        if (handleMessage(*it)) {
176826a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar            messages.erase(it++);
176926a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar        } else {
177026a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar            ++it;
17711b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber        }
1772318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
1773318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1774984a54322f7c70bc75e862d91bdd975814872affLajos Molnar    if (!messages.empty()) {
1775984a54322f7c70bc75e862d91bdd975814872affLajos Molnar        mObserver->onMessages(messages);
1776984a54322f7c70bc75e862d91bdd975814872affLajos Molnar    }
1777318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
1778318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1779f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Hubervoid OMXNodeInstance::onObserverDied(OMXMaster *master) {
178029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block    ALOGE("!!! Observer died. Quickly, do something, ... anything...");
1781318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1782318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    // Try to force shutdown of the node and hope for the best.
1783f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber    freeNode(master);
1784318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
1785318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1786318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onGetHandleFailed() {
1787318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    delete this;
1788318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
1789318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1790f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// OMXNodeInstance::OnEvent calls OMX::OnEvent, which then calls here.
1791f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// Don't try to acquire mLock here -- in rare circumstances this will hang.
1792f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenvoid OMXNodeInstance::onEvent(
1793f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        OMX_EVENTTYPE event, OMX_U32 arg1, OMX_U32 arg2) {
1794f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    const char *arg1String = "??";
1795f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    const char *arg2String = "??";
1796f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    ADebug::Level level = ADebug::kDebugInternalState;
1797f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
1798f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    switch (event) {
1799f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        case OMX_EventCmdComplete:
1800f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            arg1String = asString((OMX_COMMANDTYPE)arg1);
1801f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            switch (arg1) {
1802f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                case OMX_CommandStateSet:
1803f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                    arg2String = asString((OMX_STATETYPE)arg2);
1804f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                    level = ADebug::kDebugState;
1805f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                    break;
1806f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                case OMX_CommandFlush:
1807f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                case OMX_CommandPortEnable:
1808f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                {
1809f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                    // bump internal-state debug level for 2 input and output frames
1810f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                    Mutex::Autolock _l(mDebugLock);
1811f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                    bumpDebugLevel_l(2 /* numInputBuffers */, 2 /* numOutputBuffers */);
1812f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                }
1813f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                // fall through
1814f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                default:
1815f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                    arg2String = portString(arg2);
1816f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            }
1817f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            break;
1818f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        case OMX_EventError:
1819f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            arg1String = asString((OMX_ERRORTYPE)arg1);
1820f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            level = ADebug::kDebugLifeCycle;
1821f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            break;
1822f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        case OMX_EventPortSettingsChanged:
1823f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            arg2String = asString((OMX_INDEXEXTTYPE)arg2);
1824f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            // fall through
1825f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        default:
1826f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            arg1String = portString(arg1);
1827f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    }
1828f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
1829f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    CLOGI_(level, onEvent, "%s(%x), %s(%x), %s(%x)",
1830f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            asString(event), event, arg1String, arg1, arg2String, arg2);
18316d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    const sp<IOMXBufferSource> bufferSource(getBufferSource());
1832f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
1833e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    if (bufferSource != NULL
1834e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            && event == OMX_EventCmdComplete
1835e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            && arg1 == OMX_CommandStateSet
1836e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            && arg2 == OMX_StateExecuting) {
18376d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang        bufferSource->onOmxExecuting();
1838f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
18396392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar
18406392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar    // allow configuration if we return to the loaded state
18416392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar    if (event == OMX_EventCmdComplete
18426392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar            && arg1 == OMX_CommandStateSet
18436392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar            && arg2 == OMX_StateLoaded) {
18446392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar        mSailed = false;
18456392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar    }
1846f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
1847f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
1848318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
1849318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent(
185084333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        OMX_IN OMX_HANDLETYPE /* hComponent */,
1851318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
1852318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_EVENTTYPE eEvent,
1853318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_U32 nData1,
1854318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_U32 nData2,
1855318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pEventData) {
1856298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    if (pAppData == NULL) {
1857298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        ALOGE("b/25884056");
1858298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        return OMX_ErrorBadParameter;
1859298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    }
1860318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
1861134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    if (instance->mDying) {
1862134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        return OMX_ErrorNone;
1863134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    }
1864318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return instance->owner()->OnEvent(
1865318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            instance->nodeID(), eEvent, nData1, nData2, pEventData);
1866318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
1867318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1868318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
1869318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone(
187084333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        OMX_IN OMX_HANDLETYPE /* hComponent */,
1871318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
1872318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
1873298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    if (pAppData == NULL) {
1874298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        ALOGE("b/25884056");
1875298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        return OMX_ErrorBadParameter;
1876298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    }
1877318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
1878134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    if (instance->mDying) {
1879134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        return OMX_ErrorNone;
1880134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    }
188115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    int fenceFd = instance->retrieveFenceFromMeta_l(pBuffer, kPortIndexOutput);
1882609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    return instance->owner()->OnEmptyBufferDone(instance->nodeID(),
188315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            instance->findBufferID(pBuffer), pBuffer, fenceFd);
1884318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
1885318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1886318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
1887318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone(
188884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        OMX_IN OMX_HANDLETYPE /* hComponent */,
1889318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
1890318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
1891298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    if (pAppData == NULL) {
1892298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        ALOGE("b/25884056");
1893298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia        return OMX_ErrorBadParameter;
1894298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia    }
1895318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
1896134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    if (instance->mDying) {
1897134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        return OMX_ErrorNone;
1898134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    }
189915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    int fenceFd = instance->retrieveFenceFromMeta_l(pBuffer, kPortIndexOutput);
1900609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    return instance->owner()->OnFillBufferDone(instance->nodeID(),
190115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            instance->findBufferID(pBuffer), pBuffer, fenceFd);
1902318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
1903318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1904d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) {
1905d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    ActiveBuffer active;
1906d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    active.mPortIndex = portIndex;
1907d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    active.mID = id;
1908d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    mActiveBuffers.push(active);
1909f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
1910f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    if (portIndex < NELEM(mNumPortBuffers)) {
1911f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar        ++mNumPortBuffers[portIndex];
1912f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    }
1913d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber}
1914d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
1915d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::removeActiveBuffer(
1916d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        OMX_U32 portIndex, OMX::buffer_id id) {
1917d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    for (size_t i = 0; i < mActiveBuffers.size(); ++i) {
1918d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        if (mActiveBuffers[i].mPortIndex == portIndex
1919f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                && mActiveBuffers[i].mID == id) {
1920d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            mActiveBuffers.removeItemsAt(i);
1921f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
1922f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            if (portIndex < NELEM(mNumPortBuffers)) {
1923f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar                --mNumPortBuffers[portIndex];
1924f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            }
1925f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            return;
1926d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        }
1927d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
1928d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
1929f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar     CLOGW("Attempt to remove an active buffer [%#x] we know nothing about...", id);
1930d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber}
1931d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
1932d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::freeActiveBuffers() {
1933d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // Make sure to count down here, as freeBuffer will in turn remove
1934d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // the active buffer from the vector...
1935b92add32c22656dedfb82d26ccc168c43c92b8ebChad Brubaker    for (size_t i = mActiveBuffers.size(); i > 0;) {
1936b92add32c22656dedfb82d26ccc168c43c92b8ebChad Brubaker        i--;
1937d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID);
1938d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
1939d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber}
1940d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
1941609b815a3131d22da38b2f452faa9f89daad4039Andy HungOMX::buffer_id OMXNodeInstance::makeBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) {
1942609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    if (bufferHeader == NULL) {
1943609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        return 0;
1944609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    }
1945609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    Mutex::Autolock autoLock(mBufferIDLock);
1946609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    OMX::buffer_id buffer;
1947609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    do { // handle the very unlikely case of ID overflow
1948609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        if (++mBufferIDCount == 0) {
1949f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar            ++mBufferIDCount;
1950609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        }
1951609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        buffer = (OMX::buffer_id)mBufferIDCount;
1952609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    } while (mBufferIDToBufferHeader.indexOfKey(buffer) >= 0);
1953609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    mBufferIDToBufferHeader.add(buffer, bufferHeader);
1954609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    mBufferHeaderToBufferID.add(bufferHeader, buffer);
1955609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    return buffer;
1956609b815a3131d22da38b2f452faa9f89daad4039Andy Hung}
1957609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
195841eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik KimOMX_BUFFERHEADERTYPE *OMXNodeInstance::findBufferHeader(
195941eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim        OMX::buffer_id buffer, OMX_U32 portIndex) {
1960609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    if (buffer == 0) {
1961609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        return NULL;
1962609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    }
1963609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    Mutex::Autolock autoLock(mBufferIDLock);
19645419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang    ssize_t index = mBufferIDToBufferHeader.indexOfKey(buffer);
19655419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang    if (index < 0) {
19665419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang        CLOGW("findBufferHeader: buffer %u not found", buffer);
19675419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang        return NULL;
19685419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang    }
196941eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim    OMX_BUFFERHEADERTYPE *header = mBufferIDToBufferHeader.valueAt(index);
197041eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim    BufferMeta *buffer_meta =
197141eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim        static_cast<BufferMeta *>(header->pAppPrivate);
197241eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim    if (buffer_meta->getPortIndex() != portIndex) {
197341eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim        CLOGW("findBufferHeader: buffer %u found but with incorrect port index.", buffer);
197441eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim        android_errorWriteLog(0x534e4554, "28816827");
197541eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim        return NULL;
197641eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim    }
197741eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim    return header;
1978609b815a3131d22da38b2f452faa9f89daad4039Andy Hung}
1979609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
1980609b815a3131d22da38b2f452faa9f89daad4039Andy HungOMX::buffer_id OMXNodeInstance::findBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) {
1981609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    if (bufferHeader == NULL) {
1982609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        return 0;
1983609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    }
1984609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    Mutex::Autolock autoLock(mBufferIDLock);
19855419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang    ssize_t index = mBufferHeaderToBufferID.indexOfKey(bufferHeader);
19865419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang    if (index < 0) {
19875419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang        CLOGW("findBufferID: bufferHeader %p not found", bufferHeader);
19885419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang        return 0;
19895419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang    }
19905419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang    return mBufferHeaderToBufferID.valueAt(index);
1991609b815a3131d22da38b2f452faa9f89daad4039Andy Hung}
1992609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
1993609b815a3131d22da38b2f452faa9f89daad4039Andy Hungvoid OMXNodeInstance::invalidateBufferID(OMX::buffer_id buffer) {
1994609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    if (buffer == 0) {
1995609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        return;
1996609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    }
1997609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    Mutex::Autolock autoLock(mBufferIDLock);
19985419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang    ssize_t index = mBufferIDToBufferHeader.indexOfKey(buffer);
19995419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang    if (index < 0) {
20005419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang        CLOGW("invalidateBufferID: buffer %u not found", buffer);
20015419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang        return;
20025419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang    }
20035419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang    mBufferHeaderToBufferID.removeItem(mBufferIDToBufferHeader.valueAt(index));
20045419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang    mBufferIDToBufferHeader.removeItemsAt(index);
2005609b815a3131d22da38b2f452faa9f89daad4039Andy Hung}
2006609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
2007318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}  // namespace android
2008