[mpp_dec]: add packet slot to mpp_dec

git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@310 6e48237b-75ef-9749-8fc9-41990f28c85a
This commit is contained in:
ChenHengming
2015-09-27 19:54:47 +00:00
parent 084b4d0c7d
commit 1584b4915a
13 changed files with 74 additions and 42 deletions

View File

@@ -27,7 +27,8 @@
#define DUMMY_DEC_REF_COUNT 2
typedef struct DummyDec_t {
MppBufSlots slots;
MppBufSlots frame_slots;
MppBufSlots packet_slots;
RK_U32 task_count;
RK_U32 slots_inited;
@@ -46,7 +47,8 @@ MPP_RET dummy_dec_init(void *dec, ParserCfg *cfg)
}
p = (DummyDec *)dec;
p->slots = cfg->slots;
p->frame_slots = cfg->frame_slots;
p->packet_slots = cfg->packet_slots;
p->task_count = cfg->task_count = 2;
p->slots_inited = 0;
p->frame_count = 0;
@@ -114,7 +116,7 @@ MPP_RET dummy_dec_prepare(void *dec, MppPacket pkt, HalDecTask *task)
p = (DummyDec *)dec;
// do packet decoding here
slots = p->slots;
slots = p->frame_slots;
frame_count = p->frame_count;
// set pos to indicate that buffer is done

View File

@@ -1692,7 +1692,7 @@ MPP_RET h265d_init(void *ctx, ParserCfg *parser_cfg)
s->picture_struct = 0;
s->slots = parser_cfg->slots;
s->slots = parser_cfg->frame_slots;
if (h265dctx->extradata_size > 0 && h265dctx->extradata) {

View File

@@ -354,8 +354,8 @@ RK_S32 hevc_parser_test(ParserDemoCmdContext_t *cmd)
mpp_buffer_get(mStreamGroup, &currentstrem, 1024 * 1024);
mpp_buffer_get(mStreamGroup, &prestrem, 2 * 1024 * 1024);
parser_cfg.slots = slots;
hal_cfg.slots = slots;
parser_cfg.frame_slots = slots;
hal_cfg.frame_slots = slots;
h265d_init(mpp_codex_ctx, &parser_cfg);
hal_h265d_init(hal, &hal_cfg);
mpp_log("mallc out \n");

View File

@@ -196,6 +196,13 @@ MPP_RET mpp_buf_slot_set_buffer(MppBufSlots slots, RK_U32 index, MppBuffer b
MppBuffer mpp_buf_slot_get_buffer(MppBufSlots slots, RK_U32 index);
MPP_RET mpp_buf_slot_get_display(MppBufSlots slots, MppFrame *frame);
/*
* NOTE:
* buffer slot will be used both for frame and packet
* when buffer slot is used for packet management only inc_hw_ref and dec_hw_ref is used
*/
#ifdef __cplusplus
}
#endif

View File

@@ -31,7 +31,8 @@ struct MppDec_t {
MppHal hal;
// common resource
MppBufSlots slots;
MppBufSlots frame_slots;
MppBufSlots packet_slots;
HalTaskGroup tasks;
};

View File

@@ -31,7 +31,8 @@
typedef struct DecParserInitCfg_t {
// input
MppCodingType coding;
MppBufSlots slots;
MppBufSlots frame_slots;
MppBufSlots packet_slots;
// output
RK_U32 task_count;

View File

@@ -32,9 +32,9 @@ void *mpp_dec_parser_thread(void *data)
Mpp *mpp = (Mpp*)data;
MppThread *parser = mpp->mThreadCodec;
MppDec *dec = mpp->mDec;
MppBufSlots slots = dec->slots;
HalTaskGroup tasks = dec->tasks;
MppPacket packet = NULL;
MppBufSlots frame_slots = dec->frame_slots;
/*
* parser thread need to wait at cases below:
@@ -117,6 +117,7 @@ void *mpp_dec_parser_thread(void *data)
task_ready = task_dec->valid;
if (!task_ready)
continue;
parser_parse(dec->parser, task_dec);
/*
* 4. parse local task and slot to check whether new buffer or info change is needed.
@@ -124,7 +125,7 @@ void *mpp_dec_parser_thread(void *data)
* a. first detect info change
* b. then detect whether output index has MppBuffer
*/
wait_on_change = mpp_buf_slot_is_changed(slots);
wait_on_change = mpp_buf_slot_is_changed(frame_slots);
if (wait_on_change)
continue;
@@ -141,16 +142,16 @@ void *mpp_dec_parser_thread(void *data)
* frame to hal loop.
*/
RK_U32 output;
mpp_buf_slot_get_hw_dst(slots, &output);
if (NULL == mpp_buf_slot_get_buffer(slots, output)) {
mpp_buf_slot_get_hw_dst(frame_slots, &output);
if (NULL == mpp_buf_slot_get_buffer(frame_slots, output)) {
MppBuffer buffer = NULL;
RK_U32 size = mpp_buf_slot_get_size(slots);
RK_U32 size = mpp_buf_slot_get_size(frame_slots);
mpp_buffer_get(mpp->mFrameGroup, &buffer, size);
if (buffer)
mpp_buf_slot_set_buffer(slots, output, buffer);
mpp_buf_slot_set_buffer(frame_slots, output, buffer);
}
wait_on_buffer = (NULL == mpp_buf_slot_get_buffer(slots, output));
wait_on_buffer = (NULL == mpp_buf_slot_get_buffer(frame_slots, output));
if (wait_on_buffer)
continue;
@@ -173,9 +174,9 @@ void *mpp_dec_hal_thread(void *data)
Mpp *mpp = (Mpp*)data;
MppThread *hal = mpp->mThreadHal;
MppDec *dec = mpp->mDec;
MppBufSlots slots = dec->slots;
HalTaskGroup tasks = dec->tasks;
mpp_list *frames = mpp->mFrames;
MppBufSlots frame_slots = dec->frame_slots;
/*
* hal thread need to wait at cases below:
@@ -229,15 +230,15 @@ void *mpp_dec_hal_thread(void *data)
* 3. add frame to output list
* repeat 2 and 3 until not frame can be output
*/
mpp_buf_slot_clr_hw_dst(slots, task_dec->output);
mpp_buf_slot_clr_hw_dst(frame_slots, task_dec->output);
for (RK_U32 i = 0; i < MPP_ARRAY_ELEMS(task_dec->refer); i++) {
RK_S32 index = task_dec->refer[i];
if (index >= 0)
mpp_buf_slot_dec_hw_ref(slots, index);
mpp_buf_slot_dec_hw_ref(frame_slots, index);
}
MppFrame frame = NULL;
while (MPP_OK == mpp_buf_slot_get_display(slots, &frame)) {
while (MPP_OK == mpp_buf_slot_get_display(frame_slots, &frame)) {
frames->lock();
frames->add_at_tail(&frame, sizeof(frame));
mpp->mFramePutCount++;
@@ -252,7 +253,8 @@ void *mpp_dec_hal_thread(void *data)
MPP_RET mpp_dec_init(MppDec **dec, MppCodingType coding)
{
MPP_RET ret;
MppBufSlots slots = NULL;
MppBufSlots frame_slots = NULL;
MppBufSlots packet_slots = NULL;
Parser parser = NULL;
MppHal hal = NULL;
@@ -263,15 +265,22 @@ MPP_RET mpp_dec_init(MppDec **dec, MppCodingType coding)
}
do {
ret = mpp_buf_slot_init(&slots);
ret = mpp_buf_slot_init(&frame_slots);
if (ret) {
mpp_err_f("could not init buffer slot\n");
mpp_err_f("could not init frame buffer slot\n");
break;
}
ret = mpp_buf_slot_init(&packet_slots);
if (ret) {
mpp_err_f("could not init packet buffer slot\n");
break;
}
ParserCfg parser_cfg = {
coding,
slots,
frame_slots,
packet_slots,
2,
};
@@ -286,7 +295,8 @@ MPP_RET mpp_dec_init(MppDec **dec, MppCodingType coding)
MPP_CTX_DEC,
coding,
HAL_MODE_LIBVPU,
p->slots,
frame_slots,
packet_slots,
NULL,
parser_cfg.task_count,
};
@@ -300,8 +310,9 @@ MPP_RET mpp_dec_init(MppDec **dec, MppCodingType coding)
p->coding = coding;
p->parser = parser;
p->hal = hal;
p->slots = slots;
p->tasks = hal_cfg.tasks;
p->frame_slots = frame_slots;
p->packet_slots = packet_slots;
*dec = p;
return MPP_OK;
} while (0);
@@ -328,9 +339,14 @@ MPP_RET mpp_dec_deinit(MppDec *dec)
dec->hal = NULL;
}
if (dec->slots) {
mpp_buf_slot_deinit(dec->slots);
dec->slots = NULL;
if (dec->frame_slots) {
mpp_buf_slot_deinit(dec->frame_slots);
dec->frame_slots = NULL;
}
if (dec->packet_slots) {
mpp_buf_slot_deinit(dec->packet_slots);
dec->packet_slots = NULL;
}
mpp_free(dec);

View File

@@ -25,8 +25,6 @@
#include "mpp_packet.h"
#include "mpp_packet_impl.h"
#define MPP_TEST_FRAME_SIZE SZ_1M
void *mpp_enc_control_thread(void *data)
{
Mpp *mpp = (Mpp*)data;
@@ -100,7 +98,7 @@ void *mpp_enc_hal_thread(void *data)
// for test
MppBuffer buffer;
mpp_buffer_get(mpp->mFrameGroup, &buffer, MPP_TEST_FRAME_SIZE);
mpp_buffer_get(mpp->mFrameGroup, &buffer, SZ_1M);
MppFrame frame;
mpp_frame_init(&frame);

View File

@@ -34,7 +34,8 @@ typedef struct MppHalCfg_t {
MppCtxType type;
MppCodingType coding;
HalWorkMode mode;
MppBufSlots slots;
MppBufSlots frame_slots;
MppBufSlots packet_slots;
// output
HalTaskGroup tasks;

View File

@@ -44,7 +44,8 @@ static const MppHalApi *hw_apis[] = {
typedef struct MppHalImpl_t {
MppCtxType type;
MppCodingType coding;
MppBufSlots slots;
MppBufSlots frame_slots;
MppBufSlots packet_slots;
void *ctx;
const MppHalApi *api;
@@ -75,7 +76,8 @@ MPP_RET mpp_hal_init(MppHal *ctx, MppHalCfg *cfg)
mpp_assert(cfg->task_count > 0);
p->type = cfg->type;
p->coding = cfg->coding;
p->slots = cfg->slots;
p->frame_slots = cfg->frame_slots;
p->packet_slots = cfg->packet_slots;
p->api = hw_apis[i];
p->task_count = cfg->task_count;
p->ctx = mpp_calloc_size(void, p->api->ctx_size);

View File

@@ -255,7 +255,7 @@ MPP_RET hal_h265d_init(void *hal, MppHalCfg *cfg)
return MPP_ERR_UNKNOW;
}
reg_cxt->slots = cfg->slots;
reg_cxt->slots = cfg->frame_slots;
///<- VPUClientInit
#ifdef ANDROID

View File

@@ -30,6 +30,7 @@
#include "mpp_packet_impl.h"
#define MPP_TEST_FRAME_SIZE SZ_1M
#define MPP_TEST_PACKET_SIZE SZ_512K
RK_U32 mpp_debug = 0;
@@ -65,7 +66,10 @@ Mpp::Mpp(MppCtxType type, MppCodingType coding)
mThreadHal = new MppThread(mpp_dec_hal_thread, this);
mpp_buffer_group_normal_get(&mInternalGroup, MPP_BUFFER_TYPE_ION);
mpp_buffer_group_normal_get(&mPacketGroup, MPP_BUFFER_TYPE_NORMAL);
mpp_buffer_group_limited_get(&mPacketGroup, MPP_BUFFER_TYPE_ION);
mpp_buffer_group_limit_config(mPacketGroup, MPP_TEST_PACKET_SIZE, 4);
mpp_buffer_group_limited_get(&mFrameGroup, MPP_BUFFER_TYPE_ION);
mpp_buffer_group_limit_config(mFrameGroup, MPP_TEST_FRAME_SIZE, 4);
} break;

View File

@@ -57,9 +57,9 @@ static MPP_RET manual_set_env(void)
static MPP_RET decoder_deinit(MppDec *pApi)
{
if (pApi->slots) {
mpp_buf_slot_deinit(pApi->slots);
pApi->slots = NULL;
if (pApi->frame_slots) {
mpp_buf_slot_deinit(pApi->frame_slots);
pApi->frame_slots = NULL;
}
if (pApi->parser) {
parser_deinit(pApi->parser);
@@ -81,13 +81,13 @@ static MPP_RET decoder_init(MppDec *pApi)
MppCodingType coding = MPP_VIDEO_CodingAVC;
// malloc slot
FUN_CHECK(ret = mpp_buf_slot_init(&pApi->slots));
MEM_CHECK(ret, pApi->slots);
FUN_CHECK(ret = mpp_buf_slot_init(&pApi->frame_slots));
MEM_CHECK(ret, pApi->frame_slots);
// init parser part
memset(&parser_cfg, 0, sizeof(parser_cfg));
parser_cfg.coding = coding;
parser_cfg.slots = pApi->slots;
parser_cfg.frame_slots = pApi->frame_slots;
FUN_CHECK(ret = parser_init(&pApi->parser, &parser_cfg));
// init hal part