190 lines
5.5 KiB
C++
190 lines
5.5 KiB
C++
/*
|
|
* Copyright 2018 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef GOLDFISH_OMX_COMPONENT_H_
|
|
|
|
#define GOLDFISH_OMX_COMPONENT_H_
|
|
|
|
#include <media/stagefright/foundation/ABase.h>
|
|
#include <media/stagefright/foundation/AString.h>
|
|
#include <utils/RefBase.h>
|
|
|
|
#include <OMX_Component.h>
|
|
|
|
namespace android {
|
|
|
|
struct GoldfishOMXComponent : public RefBase {
|
|
GoldfishOMXComponent(
|
|
const char *name,
|
|
const OMX_CALLBACKTYPE *callbacks,
|
|
OMX_PTR appData,
|
|
OMX_COMPONENTTYPE **component);
|
|
|
|
virtual OMX_ERRORTYPE initCheck();
|
|
|
|
void setLibHandle(void *libHandle);
|
|
void *libHandle() const;
|
|
|
|
virtual void prepareForDestruction();
|
|
|
|
protected:
|
|
virtual ~GoldfishOMXComponent();
|
|
|
|
const char *name() const;
|
|
|
|
void notify(
|
|
OMX_EVENTTYPE event,
|
|
OMX_U32 data1, OMX_U32 data2, OMX_PTR data);
|
|
|
|
void notifyEmptyBufferDone(OMX_BUFFERHEADERTYPE *header);
|
|
void notifyFillBufferDone(OMX_BUFFERHEADERTYPE *header);
|
|
|
|
virtual OMX_ERRORTYPE sendCommand(
|
|
OMX_COMMANDTYPE cmd, OMX_U32 param, OMX_PTR data);
|
|
|
|
virtual OMX_ERRORTYPE getParameter(
|
|
OMX_INDEXTYPE index, OMX_PTR params);
|
|
|
|
virtual OMX_ERRORTYPE setParameter(
|
|
OMX_INDEXTYPE index, const OMX_PTR params);
|
|
|
|
virtual OMX_ERRORTYPE getConfig(
|
|
OMX_INDEXTYPE index, OMX_PTR params);
|
|
|
|
virtual OMX_ERRORTYPE setConfig(
|
|
OMX_INDEXTYPE index, const OMX_PTR params);
|
|
|
|
virtual OMX_ERRORTYPE getExtensionIndex(
|
|
const char *name, OMX_INDEXTYPE *index);
|
|
|
|
virtual OMX_ERRORTYPE useBuffer(
|
|
OMX_BUFFERHEADERTYPE **buffer,
|
|
OMX_U32 portIndex,
|
|
OMX_PTR appPrivate,
|
|
OMX_U32 size,
|
|
OMX_U8 *ptr);
|
|
|
|
virtual OMX_ERRORTYPE allocateBuffer(
|
|
OMX_BUFFERHEADERTYPE **buffer,
|
|
OMX_U32 portIndex,
|
|
OMX_PTR appPrivate,
|
|
OMX_U32 size);
|
|
|
|
virtual OMX_ERRORTYPE freeBuffer(
|
|
OMX_U32 portIndex,
|
|
OMX_BUFFERHEADERTYPE *buffer);
|
|
|
|
virtual OMX_ERRORTYPE emptyThisBuffer(
|
|
OMX_BUFFERHEADERTYPE *buffer);
|
|
|
|
virtual OMX_ERRORTYPE fillThisBuffer(
|
|
OMX_BUFFERHEADERTYPE *buffer);
|
|
|
|
virtual OMX_ERRORTYPE getState(OMX_STATETYPE *state);
|
|
|
|
private:
|
|
AString mName;
|
|
const OMX_CALLBACKTYPE *mCallbacks;
|
|
OMX_COMPONENTTYPE *mComponent;
|
|
|
|
void *mLibHandle;
|
|
|
|
static OMX_ERRORTYPE SendCommandWrapper(
|
|
OMX_HANDLETYPE component,
|
|
OMX_COMMANDTYPE cmd,
|
|
OMX_U32 param,
|
|
OMX_PTR data);
|
|
|
|
static OMX_ERRORTYPE GetParameterWrapper(
|
|
OMX_HANDLETYPE component,
|
|
OMX_INDEXTYPE index,
|
|
OMX_PTR params);
|
|
|
|
static OMX_ERRORTYPE SetParameterWrapper(
|
|
OMX_HANDLETYPE component,
|
|
OMX_INDEXTYPE index,
|
|
OMX_PTR params);
|
|
|
|
static OMX_ERRORTYPE GetConfigWrapper(
|
|
OMX_HANDLETYPE component,
|
|
OMX_INDEXTYPE index,
|
|
OMX_PTR params);
|
|
|
|
static OMX_ERRORTYPE SetConfigWrapper(
|
|
OMX_HANDLETYPE component,
|
|
OMX_INDEXTYPE index,
|
|
OMX_PTR params);
|
|
|
|
static OMX_ERRORTYPE GetExtensionIndexWrapper(
|
|
OMX_HANDLETYPE component,
|
|
OMX_STRING name,
|
|
OMX_INDEXTYPE *index);
|
|
|
|
static OMX_ERRORTYPE UseBufferWrapper(
|
|
OMX_HANDLETYPE component,
|
|
OMX_BUFFERHEADERTYPE **buffer,
|
|
OMX_U32 portIndex,
|
|
OMX_PTR appPrivate,
|
|
OMX_U32 size,
|
|
OMX_U8 *ptr);
|
|
|
|
static OMX_ERRORTYPE AllocateBufferWrapper(
|
|
OMX_HANDLETYPE component,
|
|
OMX_BUFFERHEADERTYPE **buffer,
|
|
OMX_U32 portIndex,
|
|
OMX_PTR appPrivate,
|
|
OMX_U32 size);
|
|
|
|
static OMX_ERRORTYPE FreeBufferWrapper(
|
|
OMX_HANDLETYPE component,
|
|
OMX_U32 portIndex,
|
|
OMX_BUFFERHEADERTYPE *buffer);
|
|
|
|
static OMX_ERRORTYPE EmptyThisBufferWrapper(
|
|
OMX_HANDLETYPE component,
|
|
OMX_BUFFERHEADERTYPE *buffer);
|
|
|
|
static OMX_ERRORTYPE FillThisBufferWrapper(
|
|
OMX_HANDLETYPE component,
|
|
OMX_BUFFERHEADERTYPE *buffer);
|
|
|
|
static OMX_ERRORTYPE GetStateWrapper(
|
|
OMX_HANDLETYPE component,
|
|
OMX_STATETYPE *state);
|
|
|
|
DISALLOW_EVIL_CONSTRUCTORS(GoldfishOMXComponent);
|
|
};
|
|
|
|
template<typename T>
|
|
bool isValidOMXParam(T *a) {
|
|
static_assert(offsetof(typeof(*a), nSize) == 0, "nSize not at offset 0");
|
|
static_assert(std::is_same< decltype(a->nSize), OMX_U32>::value, "nSize has wrong type");
|
|
static_assert(offsetof(typeof(*a), nVersion) == 4, "nVersion not at offset 4");
|
|
static_assert(std::is_same< decltype(a->nVersion), OMX_VERSIONTYPE>::value,
|
|
"nVersion has wrong type");
|
|
|
|
if (a->nSize < sizeof(*a)) {
|
|
ALOGE("b/27207275: need %zu, got %u", sizeof(*a), a->nSize);
|
|
//android_errorWriteLog(0x534e4554, "27207275");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
} // namespace android
|
|
|
|
#endif // GOLDFISH_OMX_COMPONENT_H_
|