mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-12-26 11:17:44 +01:00
Change-Id: Icfe26b36d066b32355bda919e605e165399c0781 Signed-off-by: Yanjun Liao <yanjun.liao@rock-chips.com>
238 lines
8 KiB
C
238 lines
8 KiB
C
/* SPDX-License-Identifier: Apache-2.0 OR MIT */
|
|
/*
|
|
* Copyright (c) 2015 Rockchip Electronics Co., Ltd.
|
|
*/
|
|
|
|
#ifndef __MPP_H__
|
|
#define __MPP_H__
|
|
|
|
#include "mpp_queue.h"
|
|
#include "mpp_task_impl.h"
|
|
|
|
#include "mpp_dec.h"
|
|
#include "mpp_enc.h"
|
|
#include "mpp_impl.h"
|
|
#include "kmpp_obj.h"
|
|
#include "kmpp.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define MPP_DBG_FUNCTION (0x00000001)
|
|
#define MPP_DBG_PACKET (0x00000002)
|
|
#define MPP_DBG_FRAME (0x00000004)
|
|
#define MPP_DBG_BUFFER (0x00000008)
|
|
|
|
/*
|
|
* mpp notify event flags
|
|
* When event happens mpp will signal deocder / encoder with different flag.
|
|
* These event will wake up the codec thread or hal thread
|
|
*/
|
|
#define MPP_INPUT_ENQUEUE (0x00000001)
|
|
#define MPP_OUTPUT_DEQUEUE (0x00000002)
|
|
#define MPP_INPUT_DEQUEUE (0x00000004)
|
|
#define MPP_OUTPUT_ENQUEUE (0x00000008)
|
|
#define MPP_RESET (0xFFFFFFFF)
|
|
|
|
/* mpp dec event flags */
|
|
#define MPP_DEC_NOTIFY_PACKET_ENQUEUE (MPP_INPUT_ENQUEUE)
|
|
#define MPP_DEC_NOTIFY_FRAME_DEQUEUE (MPP_OUTPUT_DEQUEUE)
|
|
#define MPP_DEC_NOTIFY_EXT_BUF_GRP_READY (0x00000010)
|
|
#define MPP_DEC_NOTIFY_INFO_CHG_DONE (0x00000020)
|
|
#define MPP_DEC_NOTIFY_BUFFER_VALID (0x00000040)
|
|
#define MPP_DEC_NOTIFY_TASK_ALL_DONE (0x00000080)
|
|
#define MPP_DEC_NOTIFY_TASK_HND_VALID (0x00000100)
|
|
#define MPP_DEC_NOTIFY_TASK_PREV_DONE (0x00000200)
|
|
#define MPP_DEC_NOTIFY_BUFFER_MATCH (0x00000400)
|
|
#define MPP_DEC_NOTIFY_SLOT_VALID (0x00004000)
|
|
#define MPP_DEC_CONTROL (0x00010000)
|
|
#define MPP_DEC_RESET (MPP_RESET)
|
|
|
|
/* mpp enc event flags */
|
|
#define MPP_ENC_NOTIFY_FRAME_ENQUEUE (MPP_INPUT_ENQUEUE)
|
|
#define MPP_ENC_NOTIFY_PACKET_DEQUEUE (MPP_OUTPUT_DEQUEUE)
|
|
#define MPP_ENC_NOTIFY_FRAME_DEQUEUE (MPP_INPUT_DEQUEUE)
|
|
#define MPP_ENC_NOTIFY_PACKET_ENQUEUE (MPP_OUTPUT_ENQUEUE)
|
|
#define MPP_ENC_CONTROL (0x00000010)
|
|
#define MPP_ENC_RESET (MPP_RESET)
|
|
|
|
typedef enum MppIOMode_e {
|
|
MPP_IO_MODE_DEFAULT = -1,
|
|
MPP_IO_MODE_NORMAL = 0,
|
|
MPP_IO_MODE_TASK = 1,
|
|
MPP_IO_MODE_BUTT,
|
|
} MppIoMode;
|
|
|
|
/*
|
|
* mpp hierarchy
|
|
*
|
|
* mpp layer create mpp_dec or mpp_dec instance
|
|
* mpp_dec create its parser and hal module
|
|
* mpp_enc create its control and hal module
|
|
*
|
|
* +-------+
|
|
* | |
|
|
* +-------------+ mpp +-------------+
|
|
* | | | |
|
|
* | +-------+ |
|
|
* | |
|
|
* | |
|
|
* | |
|
|
* +-----+-----+ +-----+-----+
|
|
* | | | |
|
|
* +---+ mpp_dec +--+ +--+ mpp_enc +---+
|
|
* | | | | | | | |
|
|
* | +-----------+ | | +-----------+ |
|
|
* | | | |
|
|
* | | | |
|
|
* | | | |
|
|
* +-------v------+ +-----v-----+ +-----v-----+ +------v-------+
|
|
* | | | | | | | |
|
|
* | dec_parser | | dec_hal | | enc_hal | | enc_control |
|
|
* | | | | | | | |
|
|
* +--------------+ +-----------+ +-----------+ +--------------+
|
|
*/
|
|
|
|
typedef struct Mpp {
|
|
/* Public members that were previously public in C++ class */
|
|
MppList *mPktIn;
|
|
MppList *mPktOut;
|
|
MppList *mFrmIn;
|
|
MppList *mFrmOut;
|
|
/* counters for debug */
|
|
RK_U32 mPacketPutCount;
|
|
RK_U32 mPacketGetCount;
|
|
RK_U32 mFramePutCount;
|
|
RK_U32 mFrameGetCount;
|
|
RK_U32 mTaskPutCount;
|
|
RK_U32 mTaskGetCount;
|
|
|
|
/*
|
|
* packet buffer group
|
|
* - packets in I/O, can be ion buffer or normal buffer
|
|
* frame buffer group
|
|
* - frames in I/O, normally should be a ion buffer group
|
|
*/
|
|
MppBufferGroup mPacketGroup;
|
|
MppBufferGroup mFrameGroup;
|
|
RK_U32 mExternalBufferMode;
|
|
|
|
/*
|
|
* Mpp task queue for advance task mode
|
|
*/
|
|
/*
|
|
* Task data flow:
|
|
* |
|
|
* user | mpp
|
|
* mInputTaskQueue
|
|
* mUsrInPort -> | -> mMppInPort
|
|
* | |
|
|
* | v
|
|
* | process
|
|
* | |
|
|
* | v
|
|
* mUsrOutPort <- | <- mMppOutPort
|
|
* mOutputTaskQueue
|
|
*/
|
|
MppPort mUsrInPort;
|
|
MppPort mUsrOutPort;
|
|
MppPort mMppInPort;
|
|
MppPort mMppOutPort;
|
|
MppTaskQueue mInputTaskQueue;
|
|
MppTaskQueue mOutputTaskQueue;
|
|
RK_S32 mInputTaskCount;
|
|
RK_S32 mOutputTaskCount;
|
|
|
|
MppPollType mInputTimeout;
|
|
MppPollType mOutputTimeout;
|
|
|
|
MppTask mInputTask;
|
|
MppTask mEosTask;
|
|
|
|
MppCtx mCtx;
|
|
MppDec mDec;
|
|
MppEnc mEnc;
|
|
|
|
RK_U32 mEncAyncIo;
|
|
RK_U32 mEncAyncProc;
|
|
MppIoMode mIoMode;
|
|
RK_U32 mDisableThread;
|
|
|
|
/* dump info for debug */
|
|
MppDump mDump;
|
|
|
|
/* kmpp infos */
|
|
Kmpp *mKmpp;
|
|
KmppObj mVencInitKcfg;
|
|
|
|
MppCtxType mType;
|
|
MppCodingType mCoding;
|
|
|
|
RK_U32 mInitDone;
|
|
|
|
RK_U32 mStatus;
|
|
|
|
/* decoder paramter before init */
|
|
MppDecCfg mDecCfg;
|
|
RK_U32 mParserFastMode;
|
|
RK_U32 mParserNeedSplit;
|
|
RK_U32 mParserInternalPts; /* for MPEG2/MPEG4 */
|
|
RK_U32 mImmediateOut;
|
|
/* backup extra packet for seek */
|
|
MppPacket mExtraPacket;
|
|
} Mpp;
|
|
|
|
MPP_RET mpp_ctx_create(Mpp **mpp, MppCtx ctx);
|
|
MPP_RET mpp_ctx_destroy(Mpp *mpp);
|
|
MPP_RET mpp_ctx_init(Mpp *mpp, MppCtxType type, MppCodingType coding);
|
|
void mpp_clear(Mpp *mpp);
|
|
|
|
/* Control functions */
|
|
MPP_RET mpp_start(Mpp *mpp);
|
|
MPP_RET mpp_stop(Mpp *mpp);
|
|
MPP_RET mpp_pause(Mpp *mpp);
|
|
MPP_RET mpp_resume(Mpp *mpp);
|
|
|
|
/* Data processing functions */
|
|
MPP_RET mpp_put_packet(Mpp *mpp, MppPacket packet);
|
|
MPP_RET mpp_get_frame(Mpp *mpp, MppFrame *frame);
|
|
MPP_RET mpp_get_frame_noblock(Mpp *mpp, MppFrame *frame);
|
|
|
|
MPP_RET mpp_put_frame(Mpp *mpp, MppFrame frame);
|
|
MPP_RET mpp_get_packet(Mpp *mpp, MppPacket *packet);
|
|
|
|
/* Task queue functions */
|
|
MPP_RET mpp_poll(Mpp *mpp, MppPortType type, MppPollType timeout);
|
|
MPP_RET mpp_dequeue(Mpp *mpp, MppPortType type, MppTask *task);
|
|
MPP_RET mpp_enqueue(Mpp *mpp, MppPortType type, MppTask task);
|
|
|
|
/* Decode function */
|
|
MPP_RET mpp_decode(Mpp *mpp, MppPacket packet, MppFrame *frame);
|
|
|
|
/* System functions */
|
|
MPP_RET mpp_reset(Mpp *mpp);
|
|
MPP_RET mpp_control(Mpp *mpp, MpiCmd cmd, MppParam param);
|
|
|
|
/* Notification functions */
|
|
MPP_RET mpp_notify_flag(Mpp *mpp, RK_U32 flag);
|
|
MPP_RET mpp_notify_group(Mpp *mpp, MppBufferGroup group);
|
|
|
|
MPP_RET mpp_control_mpp(Mpp *mpp, MpiCmd cmd, MppParam param);
|
|
MPP_RET mpp_control_osal(Mpp *mpp, MpiCmd cmd, MppParam param);
|
|
MPP_RET mpp_control_codec(Mpp *mpp, MpiCmd cmd, MppParam param);
|
|
MPP_RET mpp_control_dec(Mpp *mpp, MpiCmd cmd, MppParam param);
|
|
MPP_RET mpp_control_enc(Mpp *mpp, MpiCmd cmd, MppParam param);
|
|
MPP_RET mpp_control_isp(Mpp *mpp, MpiCmd cmd, MppParam param);
|
|
|
|
/* for special encoder async io mode */
|
|
MPP_RET mpp_put_frame_async(Mpp *mpp, MppFrame frame);
|
|
MPP_RET mpp_get_packet_async(Mpp *mpp, MppPacket *packet);
|
|
|
|
void mpp_set_io_mode(Mpp *mpp, MppIoMode mode);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /*__MPP_H__*/
|