OMXNodeInstance.cpp revision 318ad9c1d9d6515026dfc2c021359d27decaa7a1
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
17318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber//#define LOG_NDEBUG 0
18318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#define LOG_TAG "OMXNodeInstance"
19318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <utils/Log.h>
20318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
21318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include "../include/OMXNodeInstance.h"
22318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
23318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include "pv_omxcore.h"
24318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
25318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <binder/IMemory.h>
26318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <media/stagefright/MediaDebug.h>
27318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
28318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubernamespace android {
29318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
30318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstruct BufferMeta {
31318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta(const sp<IMemory> &mem, bool is_backup = false)
32318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        : mMem(mem),
33318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber          mIsBackup(is_backup) {
34318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
35318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
36318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta(size_t size)
37318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        : mSize(size),
38318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber          mIsBackup(false) {
39318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
40318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
41318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    void CopyFromOMX(const OMX_BUFFERHEADERTYPE *header) {
42318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        if (!mIsBackup) {
43318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            return;
44318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        }
45318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
46318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        memcpy((OMX_U8 *)mMem->pointer() + header->nOffset,
47318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber               header->pBuffer + header->nOffset,
48318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber               header->nFilledLen);
49318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
50318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
51318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    void CopyToOMX(const OMX_BUFFERHEADERTYPE *header) {
52318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        if (!mIsBackup) {
53318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            return;
54318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        }
55318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
56318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        memcpy(header->pBuffer + header->nOffset,
57318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber               (const OMX_U8 *)mMem->pointer() + header->nOffset,
58318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber               header->nFilledLen);
59318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
60318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
61318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberprivate:
62318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    sp<IMemory> mMem;
63318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    size_t mSize;
64318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    bool mIsBackup;
65318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
66318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta(const BufferMeta &);
67318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta &operator=(const BufferMeta &);
68318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber};
69318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
70318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
71318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = {
72318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone
73318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber};
74318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
75318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::OMXNodeInstance(
76318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX *owner, const sp<IOMXObserver> &observer)
77318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    : mOwner(owner),
78318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber      mNodeID(NULL),
79318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber      mHandle(NULL),
80318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber      mObserver(observer) {
81318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
82318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
83318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::~OMXNodeInstance() {
84318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    CHECK_EQ(mHandle, NULL);
85318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
86318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
87318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle) {
88318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    CHECK_EQ(mHandle, NULL);
89318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mNodeID = node_id;
90318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mHandle = handle;
91318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
92318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
93318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX *OMXNodeInstance::owner() {
94318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mOwner;
95318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
96318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
97318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubersp<IOMXObserver> OMXNodeInstance::observer() {
98318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mObserver;
99318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
100318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
101318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX::node_id OMXNodeInstance::nodeID() {
102318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mNodeID;
103318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
104318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
105318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatic status_t StatusFromOMXError(OMX_ERRORTYPE err) {
106318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return (err == OMX_ErrorNone) ? OK : UNKNOWN_ERROR;
107318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
108318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
109318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::freeNode() {
110318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
111318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
112318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_MasterFreeHandle(mHandle);
113318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mHandle = NULL;
114318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
115318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
116318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        LOGE("FreeHandle FAILED with error 0x%08x.", err);
117318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
118318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
119318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mOwner->invalidateNodeID(mNodeID);
120318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mNodeID = NULL;
121318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
122318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    LOGI("OMXNodeInstance going away.");
123318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    delete this;
124318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
125318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
126318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
127318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
128318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::sendCommand(
129318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_COMMANDTYPE cmd, OMX_S32 param) {
130318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
131318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
132318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL);
133318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
134318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
135318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
136318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getParameter(
137318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE index, void *params, size_t size) {
138318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
139318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
140318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params);
141318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
142318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
143318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
144318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setParameter(
145318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE index, const void *params, size_t size) {
146318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
147318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
148318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SetParameter(
149318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, index, const_cast<void *>(params));
150318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
151318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
152318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
153318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
154318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getConfig(
155318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE index, void *params, size_t size) {
156318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
157318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
158318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params);
159318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
160318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
161318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
162318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setConfig(
163318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE index, const void *params, size_t size) {
164318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
165318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
166318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SetConfig(
167318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, index, const_cast<void *>(params));
168318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
169318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
170318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
171318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
172318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::useBuffer(
173318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
174318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX::buffer_id *buffer) {
175318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
176318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
177318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = new BufferMeta(params);
178318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
179318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
180318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
181318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_UseBuffer(
182318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta,
183318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            params->size(), static_cast<OMX_U8 *>(params->pointer()));
184318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
185318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
186318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        LOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err);
187318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
188318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
189318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
190318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
191318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
192318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
193318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return UNKNOWN_ERROR;
194318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
195318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
196318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    *buffer = header;
197318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
198318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
199318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
200318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
201318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::allocateBuffer(
202318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer) {
203318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
204318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
205318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = new BufferMeta(size);
206318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
207318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
208318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
209318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
210318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta, size);
211318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
212318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
213318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
214318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
215318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
216318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
217318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
218318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
219318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
220318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return UNKNOWN_ERROR;
221318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
222318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
223318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    *buffer = header;
224318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
225318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
226318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
227318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
228318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup(
229318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
230318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX::buffer_id *buffer) {
231318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
232318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
233318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = new BufferMeta(params, true);
234318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
235318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
236318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
237318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
238318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta, params->size());
239318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
240318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
241318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
242318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
243318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
244318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
245318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
246318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
247318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
248318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return UNKNOWN_ERROR;
249318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
250318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
251318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    *buffer = header;
252318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
253318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
254318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
255318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
256318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::freeBuffer(
257318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, OMX::buffer_id buffer) {
258318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
259318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
260318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
261318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate);
262318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
263318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header);
264318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
265318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    delete buffer_meta;
266318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    buffer_meta = NULL;
267318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
268318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
269318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
270318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
271318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer) {
272318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
273318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
274318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
275318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFilledLen = 0;
276318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nOffset = 0;
277318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFlags = 0;
278318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
279318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header);
280318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
281318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
282318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
283318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
284318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::emptyBuffer(
285318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX::buffer_id buffer,
286318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 rangeOffset, OMX_U32 rangeLength,
287318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 flags, OMX_TICKS timestamp) {
288318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
289318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
290318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
291318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFilledLen = rangeLength;
292318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nOffset = rangeOffset;
293318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFlags = flags;
294318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nTimeStamp = timestamp;
295318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
296318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta =
297318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        static_cast<BufferMeta *>(header->pAppPrivate);
298318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    buffer_meta->CopyToOMX(header);
299318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
300318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header);
301318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
302318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
303318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
304318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
305318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getExtensionIndex(
306318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        const char *parameterName, OMX_INDEXTYPE *index) {
307318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
308318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
309318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetExtensionIndex(
310318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, const_cast<char *>(parameterName), index);
311318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
312318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
313318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
314318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
315318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onMessage(const omx_message &msg) {
316318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (msg.type == omx_message::FILL_BUFFER_DONE) {
317318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_BUFFERHEADERTYPE *buffer =
318318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            static_cast<OMX_BUFFERHEADERTYPE *>(
319318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber                    msg.u.extended_buffer_data.buffer);
320318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
321318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        BufferMeta *buffer_meta =
322318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            static_cast<BufferMeta *>(buffer->pAppPrivate);
323318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
324318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta->CopyFromOMX(buffer);
325318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
326318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
327318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mObserver->onMessage(msg);
328318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
329318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
330318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onObserverDied() {
331318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    LOGE("!!! Observer died. Quickly, do something, ... anything...");
332318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
333318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    // Try to force shutdown of the node and hope for the best.
334318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    freeNode();
335318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
336318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
337318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onGetHandleFailed() {
338318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    delete this;
339318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
340318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
341318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
342318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent(
343318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
344318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
345318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_EVENTTYPE eEvent,
346318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_U32 nData1,
347318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_U32 nData2,
348318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pEventData) {
349318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
350318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return instance->owner()->OnEvent(
351318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            instance->nodeID(), eEvent, nData1, nData2, pEventData);
352318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
353318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
354318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
355318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone(
356318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
357318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
358318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
359318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
360318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer);
361318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
362318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
363318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
364318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone(
365318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
366318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
367318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
368318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
369318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer);
370318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
371318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
372318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}  // namespace android
373318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
374