You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
2.8 KiB
111 lines
2.8 KiB
/*
|
|
* Copyright (c) Hisilicon Technologies Co., Ltd. 2019-2020. All rights reserved.
|
|
* Description: NxMediaMsg class
|
|
* Author: NxPlayer software group
|
|
* Create: 2019-07-15
|
|
*/
|
|
#ifndef NXMESSAGE_H
|
|
#define NXMESSAGE_H
|
|
|
|
#include <securec.h>
|
|
#include <binder/Parcel.h>
|
|
#include <utils/KeyedVector.h>
|
|
#include <utils/threads.h>
|
|
|
|
#include "NxLooper.h"
|
|
|
|
namespace android {
|
|
const int NX_MSG_EXIT = 0xFFFE;
|
|
|
|
class NxMediaPlayerManage;
|
|
const int POLL_WAKE = -1;
|
|
const int POLL_CALLBACK = -2;
|
|
|
|
struct NxMessage {
|
|
NxMessage() : mMsg(0), mPara1(0), mPara2(0), mBuffer(nullptr), mDataLen(0)
|
|
{
|
|
}
|
|
void Init(int msgid, int ext1, int ext2, const Parcel &obj)
|
|
{
|
|
mMsg = msgid;
|
|
mPara1 = ext1;
|
|
mPara2 = ext2;
|
|
if (obj.data() && obj.dataSize() > 0) {
|
|
mBuffer = new (std::nothrow) unsigned char[obj.dataSize()]; /* memory will be freed after send event */
|
|
if (mBuffer != nullptr) {
|
|
memcpy_s(mBuffer, obj.dataSize(), obj.data(), obj.dataSize());
|
|
mDataLen = obj.dataSize();
|
|
}
|
|
} else {
|
|
mBuffer = nullptr;
|
|
mDataLen = 0;
|
|
}
|
|
}
|
|
/* The message type. (interpretation is left up to the handler) */
|
|
int mMsg;
|
|
int mPara1;
|
|
int mPara2;
|
|
unsigned char *mBuffer;
|
|
int mDataLen;
|
|
};
|
|
|
|
class NxMessageHandler : public virtual RefBase {
|
|
public:
|
|
virtual void HandleMessage(NxMessage &message) = 0;
|
|
protected:
|
|
~NxMessageHandler() override;
|
|
};
|
|
|
|
struct NxMessagePackage {
|
|
NxMessagePackage(): handler(nullptr)
|
|
{
|
|
}
|
|
NxMessagePackage(const sp<NxMessageHandler> h, const NxMessage &m)
|
|
: handler(h), message(m)
|
|
{
|
|
}
|
|
sp<NxMessageHandler> handler;
|
|
NxMessage message;
|
|
};
|
|
|
|
class NxMediaMsg : public Thread {
|
|
friend class NxMediaMsgHandle;
|
|
public:
|
|
explicit NxMediaMsg(int idx);
|
|
~NxMediaMsg() override;
|
|
status_t EnableNxMediaMsg(bool enable);
|
|
status_t PostMessage(const sp<NxMessageHandler> &handler, NxMessage &msg);
|
|
|
|
private:
|
|
void MessageProcess();
|
|
bool threadLoop() override;
|
|
void Init();
|
|
int ReadMsg(int timeoutMs);
|
|
int Flush(int timeoutMs);
|
|
int ProcessMessagePackages(int result);
|
|
|
|
private:
|
|
sp<NxLooper> m_looper;
|
|
int m_isExit;
|
|
bool m_enableNxMediaMsg;
|
|
int m_instIdx; /* instance number */
|
|
Mutex m_lock;
|
|
Vector<NxMessagePackage> mMsgPackages;
|
|
};
|
|
|
|
class NxMediaMsgHandle : public NxMessageHandler {
|
|
public:
|
|
NxMediaMsgHandle(sp<NxMediaMsg> &msg, NxMediaPlayerManage *player, int idx);
|
|
~NxMediaMsgHandle() override;
|
|
void SetCbPlayer(NxMediaPlayerManage *player);
|
|
void HandleMessage(NxMessage &message) override;
|
|
private:
|
|
sp<NxMediaMsg> m_nxMsg;
|
|
NxMediaPlayerManage *m_hmplayer;
|
|
Mutex m_cbLock;
|
|
int m_instIdx; /* instance number */
|
|
};
|
|
};
|
|
|
|
#endif
|