1. change avs_impl CMakeLists.txt
2. add libavs.a && libavs.so, which used in avsd_api.c
3. update avsd_api.c && avsd_parse.c which interface of between libavs.a and mpp_dec 

git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@678 6e48237b-75ef-9749-8fc9-41990f28c85a
This commit is contained in:
DingWei
2016-05-03 13:32:09 +00:00
parent 506ffb1e31
commit 01b4727ba4
11 changed files with 968 additions and 172 deletions

View File

@@ -15,25 +15,14 @@ add_subdirectory(dec)
add_subdirectory(enc)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/dec/avs_impl/")
add_subdirectory(dec/avs_impl)
target_link_libraries(mpp_codec
codec_h264d
codec_vp9d
codec_h265d
codec_avsd
codec_avsd_impl
codec_dummy_enc
codec_dummy_dec
mpp)
else()
target_link_libraries(mpp_codec
codec_h264d
codec_vp9d
codec_h265d
codec_avsd
codec_dummy_enc
codec_dummy_dec
mpp)
endif()
target_link_libraries(mpp_codec
codec_h264d
codec_vp9d
codec_h265d
codec_avsd
codec_dummy_enc
codec_dummy_dec
mpp)

View File

@@ -11,12 +11,13 @@ set(AVSD_COMMON
# avs decoder header
set(AVSD_HDR
avsd_parse.h
)
# avs decoder sourse
set(AVSD_SRC
avsd_api.c
avsd_parse.c
)
add_library(codec_avsd STATIC
@@ -26,6 +27,18 @@ add_library(codec_avsd STATIC
${AVSD_SRC}
)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/avs_impl/")
add_subdirectory(avs_impl)
target_link_libraries(codec_avsd codec_avsd_impl)
else()
set(LIBAVS "${CMAKE_CURRENT_SOURCE_DIR}/libavs.a")
add_library(codec_avsd_impl STATIC IMPORTED)
set_target_properties(codec_avsd_impl PROPERTIES IMPORTED_LOCATION ${LIBAVS})
target_link_libraries(codec_avsd codec_avsd_impl)
endif()
target_link_libraries(codec_avsd mpp)
set_target_properties(codec_avsd PROPERTIES FOLDER "mpp/codec")

View File

@@ -21,17 +21,217 @@
#include <stdlib.h>
#include <string.h>
#include "mpp_packet.h"
#include "mpp_packet_impl.h"
#include "mpp_mem.h"
#include "mpp_log.h"
#include "mpp_env.h"
#include "mpp_packet.h"
#include "mpp_packet_impl.h"
#include "mpp_buffer_impl.h"
#include "avsd_api.h"
#include "avsd_parse.h"
RK_U32 avsd_parse_debug = 0;
static MPP_RET free_input_ctx(AvsdInputCtx_t *p_inp)
{
MPP_RET ret = MPP_ERR_UNKNOW;
INP_CHECK(ret, !p_inp);
AVSD_PARSE_TRACE("In.");
MPP_FCLOSE(p_inp->fp_log);
__RETURN:
AVSD_PARSE_TRACE("Out.");
return ret = MPP_OK;
}
static MPP_RET init_input_ctx(AvsdInputCtx_t *p_inp, ParserCfg *init)
{
MPP_RET ret = MPP_ERR_UNKNOW;
INP_CHECK(ret, !p_inp && !init);
AVSD_PARSE_TRACE("In.");
p_inp->init = *init;
#if defined(_WIN32)
if ((p_inp->fp_log = fopen("F:/avs_log/avs_runlog.txt", "wb")) == 0) {
mpp_log("Wanning, open file, %s(%d)", __FUNCTION__, __LINE__);
}
#endif
__RETURN:
AVSD_PARSE_TRACE("Out.");
return ret = MPP_OK;
}
static MPP_RET free_cur_ctx(AvsdCurCtx_t *p_cur)
{
MPP_RET ret = MPP_ERR_UNKNOW;
INP_CHECK(ret, !p_cur);
AVSD_PARSE_TRACE("In.");
__RETURN:
AVSD_PARSE_TRACE("Out.");
return ret = MPP_OK;
}
static MPP_RET init_cur_ctx(AvsdCurCtx_t *p_cur)
{
MPP_RET ret = MPP_ERR_UNKNOW;
AvsdCurStream_t *p_strm = NULL;
INP_CHECK(ret, !p_cur);
AVSD_PARSE_TRACE("In.");
p_strm = &p_cur->m_strm;
p_strm->prefixdata = 0xffffffff;
__RETURN:
AVSD_PARSE_TRACE("Out.");
return ret = MPP_OK;
}
static MPP_RET free_vid_ctx(AvsdVideoCtx_t *p_vid)
{
MPP_RET ret = MPP_ERR_UNKNOW;
INP_CHECK(ret, !p_vid);
AVSD_PARSE_TRACE("In.");
__RETURN:
AVSD_PARSE_TRACE("Out.");
return ret = MPP_OK;
}
static MPP_RET init_vid_ctx(AvsdVideoCtx_t *p_vid)
{
MPP_RET ret = MPP_ERR_UNKNOW;
INP_CHECK(ret, !p_vid);
AVSD_PARSE_TRACE("In.");
__RETURN:
AVSD_PARSE_TRACE("Out.");
return ret = MPP_OK;
}
static MPP_RET free_bitstream(AvsdBitstream_t *p)
{
MPP_RET ret = MPP_ERR_UNKNOW;
INP_CHECK(ret, !p);
AVSD_PARSE_TRACE("In.");
MPP_FREE(p->pbuf);
__RETURN:
AVSD_PARSE_TRACE("Out.");
return ret = MPP_OK;
}
static MPP_RET init_bitstream(AvsdBitstream_t *p)
{
MPP_RET ret = MPP_ERR_UNKNOW;
INP_CHECK(ret, !p);
AVSD_PARSE_TRACE("In.");
p->size = MAX_BITSTREAM_SIZE;
p->pbuf = mpp_malloc(RK_U8, MAX_BITSTREAM_SIZE);
MEM_CHECK(ret, p->pbuf);
__RETURN:
AVSD_PARSE_TRACE("Out.");
return ret = MPP_OK;
__FAILED:
return ret;
}
static MPP_RET free_dec_ctx(Avs_DecCtx_t *p_dec)
{
MPP_RET ret = MPP_ERR_UNKNOW;
INP_CHECK(ret, NULL == p_dec);
AVSD_PARSE_TRACE("In.");
lib_avsd_free(p_dec->libdec);
mpp_packet_deinit(&p_dec->task_pkt);
free_bitstream(p_dec->bitstream);
MPP_FREE(p_dec->mem);
__RETURN:
AVSD_PARSE_TRACE("Out.");
return ret = MPP_OK;
}
static MPP_RET init_dec_ctx(Avs_DecCtx_t *p_dec)
{
MPP_RET ret = MPP_ERR_UNKNOW;
INP_CHECK(ret, !p_dec);
AVSD_PARSE_TRACE("In.");
mpp_buf_slot_setup(p_dec->frame_slots, 4);
p_dec->mem = mpp_calloc(AvsdMemory_t, 1);
MEM_CHECK(ret, p_dec->mem);
p_dec->bitstream = &p_dec->mem->bitstream;
FUN_CHECK(ret = init_bitstream(p_dec->bitstream));
//!< malloc mpp packet
mpp_packet_init(&p_dec->task_pkt, p_dec->bitstream->pbuf, p_dec->bitstream->size);
mpp_packet_set_length(p_dec->task_pkt, 0);
MEM_CHECK(ret, p_dec->task_pkt);
//!< malloc libavsd.so
p_dec->libdec = lib_avsd_malloc(p_dec);
MEM_CHECK(ret, p_dec->libdec);
__RETURN:
AVSD_PARSE_TRACE("Out.");
return ret = MPP_OK;
__FAILED:
free_dec_ctx(p_dec);
return ret;
}
/*!
***********************************************************************
* \brief
* free all buffer
***********************************************************************
*/
MPP_RET avsd_deinit(void *decoder)
{
MPP_RET ret = MPP_ERR_UNKNOW;
Avs_DecCtx_t *p_dec = (Avs_DecCtx_t *)decoder;
INP_CHECK(ret, !decoder);
AVSD_PARSE_TRACE("In.");
avsd_flush(decoder);
free_input_ctx(p_dec->p_inp);
MPP_FREE(p_dec->p_inp);
free_cur_ctx(p_dec->p_cur);
MPP_FREE(p_dec->p_cur);
free_vid_ctx(p_dec->p_vid);
MPP_FREE(p_dec->p_vid);
free_dec_ctx(p_dec);
__RETURN:
(void)decoder;
AVSD_PARSE_TRACE("Out.");
return ret = MPP_OK;
}
/*!
***********************************************************************
* \brief
@@ -39,48 +239,64 @@ RK_U32 avsd_parse_debug = 0;
***********************************************************************
*/
MPP_RET avsd_init(void *ctx, ParserCfg *init)
MPP_RET avsd_init(void *decoder, ParserCfg *init)
{
MPP_RET ret = MPP_ERR_UNKNOW;
Avs_DecCtx_t *p_dec = (Avs_DecCtx_t *)decoder;
mpp_env_get_u32("avsd_debug", &avsd_parse_debug, 0);
AVSD_PARSE_TRACE("In.");
INP_CHECK(ret, !p_dec);
memset(p_dec, 0, sizeof(Avs_DecCtx_t));
// init logctx
mpp_env_get_u32("avsd_debug", &avsd_parse_debug, 0);
//!< get init frame_slots and packet_slots
p_dec->frame_slots = init->frame_slots;
p_dec->packet_slots = init->packet_slots;
//!< malloc decoder buffer
p_dec->p_inp = mpp_calloc(AvsdInputCtx_t, 1);
p_dec->p_cur = mpp_calloc(AvsdCurCtx_t, 1);
p_dec->p_vid = mpp_calloc(AvsdVideoCtx_t, 1);
MEM_CHECK(ret, p_dec->p_inp && p_dec->p_cur && p_dec->p_vid);
AVSD_PARSE_TRACE("In.");
p_dec->p_inp->p_dec = p_dec;
p_dec->p_inp->p_cur = p_dec->p_cur;
p_dec->p_inp->p_vid = p_dec->p_vid;
FUN_CHECK(ret = init_input_ctx(p_dec->p_inp, init));
p_dec->p_cur->p_dec = p_dec;
p_dec->p_cur->p_inp = p_dec->p_inp;
p_dec->p_cur->p_vid = p_dec->p_vid;
FUN_CHECK(ret = init_cur_ctx(p_dec->p_cur));
p_dec->p_vid->p_dec = p_dec;
p_dec->p_vid->p_inp = p_dec->p_inp;
p_dec->p_vid->p_cur = p_dec->p_cur;
FUN_CHECK(ret = init_vid_ctx(p_dec->p_vid));
FUN_CHECK(ret = init_dec_ctx(p_dec));
__RETURN:
(void)decoder;
(void)init;
AVSD_PARSE_TRACE("Out.");
return ret = MPP_OK;
__FAILED:
avsd_deinit(decoder);
(void)ctx;
(void)init;
return ret = MPP_OK;
return ret;
}
/*!
***********************************************************************
* \brief
* free all buffer
***********************************************************************
*/
MPP_RET avsd_deinit(void *ctx)
{
MPP_RET ret = MPP_ERR_UNKNOW;
AVSD_PARSE_TRACE("In.");
(void)ctx;
return ret = MPP_OK;
}
/*!
***********************************************************************
* \brief
* reset
***********************************************************************
*/
MPP_RET avsd_reset(void *ctx)
MPP_RET avsd_reset(void *decoder)
{
MPP_RET ret = MPP_ERR_UNKNOW;
Avs_DecCtx_t *p_dec = (Avs_DecCtx_t *)decoder;
AVSD_PARSE_TRACE("In.");
lib_reset(p_dec->libdec);
(void)ctx;
AVSD_PARSE_TRACE("Out.");
(void)decoder;
return ret = MPP_OK;
}
@@ -90,13 +306,16 @@ MPP_RET avsd_reset(void *ctx)
* flush
***********************************************************************
*/
MPP_RET avsd_flush(void *ctx)
MPP_RET avsd_flush(void *decoder)
{
MPP_RET ret = MPP_ERR_UNKNOW;
Avs_DecCtx_t *p_dec = (Avs_DecCtx_t *)decoder;
AVSD_PARSE_TRACE("In.");
(void)ctx;
lib_flush(p_dec->libdec);
AVSD_PARSE_TRACE("Out.");
(void)decoder;
return ret = MPP_OK;
}
@@ -106,16 +325,17 @@ MPP_RET avsd_flush(void *ctx)
* control/perform
***********************************************************************
*/
MPP_RET avsd_control(void *ctx, RK_S32 cmd_type, void *param)
MPP_RET avsd_control(void *decoder, RK_S32 cmd_type, void *param)
{
MPP_RET ret = MPP_ERR_UNKNOW;
AVSD_PARSE_TRACE("In.");
(void)ctx;
(void)decoder;
(void)cmd_type;
(void)param;
AVSD_PARSE_TRACE("Out.");
return ret = MPP_OK;
}
@@ -126,19 +346,53 @@ MPP_RET avsd_control(void *ctx, RK_S32 cmd_type, void *param)
* prepare
***********************************************************************
*/
MPP_RET avsd_prepare(void *ctx, MppPacket pkt, HalDecTask *task)
MPP_RET avsd_prepare(void *decoder, MppPacket pkt, HalDecTask *task)
{
MPP_RET ret = MPP_ERR_UNKNOW;
AvsdInputCtx_t *p_inp = NULL;
Avs_DecCtx_t *p_dec = (Avs_DecCtx_t *)decoder;
AVSD_PARSE_TRACE("In.");
AVSD_PARSE_TRACE("In.");
INP_CHECK(ret, !decoder && !pkt && !task);
p_inp = p_dec->p_inp;
if (p_inp->has_get_eos) {
mpp_packet_set_length(pkt, 0);
goto __RETURN;
}
p_inp->in_pkt = pkt;
p_inp->in_task = task;
mpp_packet_set_length(pkt, 0);
if (mpp_packet_get_eos(pkt)) {
if (mpp_packet_get_length(pkt) < 4) {
avsd_flush(decoder);
}
p_inp->has_get_eos = 1;
}
AVSD_DBG(AVSD_DBG_INPUT, "[pkt_in_timeUs] in_pts=%lld, pkt_eos=%d, len=%d, pkt_no=%d",
mpp_packet_get_pts(pkt), mpp_packet_get_eos(pkt), mpp_packet_get_length(pkt), p_inp->pkt_no++);
if (mpp_packet_get_length(pkt) > MAX_STREM_IN_SIZE) {
AVSD_DBG(AVSD_DBG_ERROR, "[pkt_in_timeUs] input error, stream too large");
mpp_packet_set_length(pkt, 0);
ret = MPP_NOK;
goto __FAILED;
}
p_inp->in_pts = mpp_packet_get_pts(pkt);
p_inp->in_dts = mpp_packet_get_dts(pkt);
(void)ctx;
(void)pkt;
(void)task;
return ret = MPP_OK;
memset(task, 0, sizeof(HalDecTask));
do {
(ret = avsd_parse_prepare(p_inp, p_dec->p_cur));
} while (mpp_packet_get_length(pkt) && !task->valid);
__RETURN:
(void)decoder;
(void)pkt;
(void)task;
AVSD_PARSE_TRACE("Out.");
return ret = MPP_OK;
__FAILED:
return ret;
}
@@ -148,14 +402,30 @@ MPP_RET avsd_prepare(void *ctx, MppPacket pkt, HalDecTask *task)
* parser
***********************************************************************
*/
MPP_RET avsd_parse(void *ctx, HalDecTask *in_task)
MPP_RET avsd_parse(void *decoder, HalDecTask *task)
{
MPP_RET ret = MPP_ERR_UNKNOW;
Avs_DecCtx_t *p_dec = (Avs_DecCtx_t *)decoder;
AVSD_PARSE_TRACE("In.");
(void)ctx;
(void)in_task;
task->valid = 0;
memset(task->refer, -1, sizeof(task->refer));
lib_parse_one_frame(p_dec->libdec, task);
if (task->flags.eos) {
avsd_flush(decoder);
goto __RETURN;
}
task->valid = 1; // register valid flag
if (task->valid) {
lib_init_one_frame(p_dec->libdec, task);
}
__RETURN:
(void)decoder;
(void)task;
AVSD_PARSE_TRACE("Out.");
return ret = MPP_OK;
}
@@ -167,14 +437,27 @@ MPP_RET avsd_parse(void *ctx, HalDecTask *in_task)
*/
MPP_RET avsd_callback(void *decoder, void *info)
{
MPP_RET ret = MPP_ERR_UNKNOW;
MPP_RET ret = MPP_ERR_UNKNOW;
HalTaskInfo *task = (HalTaskInfo *)info;
Avs_DecCtx_t *p_dec = (Avs_DecCtx_t *)decoder;
AVSD_PARSE_TRACE("In.");
AVSD_PARSE_TRACE("In.");
AVSD_PARSE_TRACE("[avsd_parse_decode] frame_dec_no=%d", p_dec->dec_no++);
lib_decode_one_frame(p_dec->libdec, &task->dec);
{
MppBuffer mbuffer = NULL;
mpp_buf_slot_get_prop(p_dec->frame_slots, task->dec.output, SLOT_BUFFER, &mbuffer);
if (mbuffer) {
RK_U8 *p = (RK_U8 *)mpp_buffer_get_ptr(mbuffer);
nv12_copy_buffer(p_dec->libdec, p);
}
}
(void)task;
(void)decoder;
(void)info;
AVSD_PARSE_TRACE("Out.");
(void)decoder;
(void)info;
return ret = MPP_OK;
return ret = MPP_OK;
}
/*!
@@ -183,11 +466,10 @@ MPP_RET avsd_callback(void *decoder, void *info)
* api struct interface
***********************************************************************
*/
const ParserApi api_avsd_parser = {
"avsd_parse",
MPP_VIDEO_CodingAVS,
200,//sizeof(AvsCodecContext),
sizeof(Avs_DecCtx_t),
0,
avsd_init,
avsd_deinit,

View File

@@ -0,0 +1,214 @@
/*
*
* Copyright 2015 Rockchip Electronics Co. LTD
*
* 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.
*/
#define MODULE_TAG "avsd_parse"
#include <string.h>
#include <stdlib.h>
#include "vpu_api.h"
#include "mpp_mem.h"
#include "mpp_log.h"
#include "mpp_packet.h"
#include "mpp_packet_impl.h"
#include "hal_task.h"
#include "avsd_api.h"
#include "avsd_parse.h"
#if 0
#define START_PREFIX_3BYTE (3)
static void reset_curstream(AvsdCurStream_t *p_strm)
{
p_strm->p_start = NULL;
p_strm->len = 0;
p_strm->got_frame_flag = 0;
p_strm->got_nalu_flag = 0;
}
static MPP_RET add_nalu_header(AvsdCurCtx_t *p_cur)
{
MPP_RET ret = MPP_ERR_UNKNOW;
RK_U32 add_size = sizeof(AvsdNalu_t);
AvsdBitstream_t *p_bitstream = p_cur->p_dec->bitstream;
if ((p_bitstream->offset + add_size) > p_bitstream->size) {
AVSD_DBG(AVSD_DBG_ERROR, "error, head_offset is larger than %d", p_bitstream->size);
goto __FAILED;
}
p_cur->cur_nalu = (AvsdNalu_t *)&p_bitstream->pbuf[p_bitstream->offset];
p_cur->cur_nalu->eof = 1;
p_cur->cur_nalu->header = 0;
p_cur->cur_nalu->pdata = NULL;
p_cur->cur_nalu->length = 0;
p_cur->cur_nalu->start_pos = 0;
p_bitstream->offset += add_size;
(void)p_cur;
return ret = MPP_OK;
__FAILED:
return ret;
}
static MPP_RET store_cur_nalu(AvsdCurCtx_t *p_cur, AvsdCurStream_t *p_strm)
{
MPP_RET ret = MPP_ERR_UNKNOW;
AvsdNalu_t *p_nalu = p_cur->cur_nalu;
AvsdBitstream_t *p_bitstream = p_cur->p_dec->bitstream;
//!< fill bitstream buffer
RK_U32 add_size = p_strm->len;
if ((p_bitstream->offset + add_size) > p_bitstream->size) {
AVSD_DBG(AVSD_DBG_ERROR, "error, head_offset is larger than %d", p_bitstream->size);
goto __FAILED;
}
p_nalu->length += p_strm->len;
p_nalu->pdata = &p_bitstream->pbuf[p_bitstream->offset];
memcpy(p_nalu->pdata, p_strm->p_start, p_strm->len);
p_bitstream->offset += add_size;
return ret = MPP_OK;
__FAILED:
return ret;
}
/*!
***********************************************************************
* \brief
* prepare function for parser
***********************************************************************
*/
MPP_RET avsd_parse_prepare(AvsdInputCtx_t *p_inp, AvsdCurCtx_t *p_cur)
{
MPP_RET ret = MPP_ERR_UNKNOW;
RK_U8 *p_curdata = NULL;
HalDecTask *in_task = p_inp->in_task;
MppPacket *in_pkt = p_inp->in_pkt;
MppPacketImpl *pkt_impl = (MppPacketImpl *)p_inp->in_pkt;
AvsdCurStream_t *p_strm = &p_cur->m_strm;
AvsdBitstream_t *p_bitstream = p_cur->p_dec->bitstream;
AVSD_PARSE_TRACE("In.");
//!< check input
if (!mpp_packet_get_length(in_pkt)) {
AVSD_DBG(AVSD_DBG_WARNNING, "input have no stream.");
goto __RETURN;
}
in_task->valid = 0;
in_task->flags.eos = 0;
//!< check eos
if (mpp_packet_get_eos(in_pkt)) {
FUN_CHECK(ret = add_nalu_header(p_cur));
in_task->valid = 1;
in_task->flags.eos = 1;
AVSD_DBG(AVSD_DBG_LOG, "end of stream.");
goto __RETURN;
}
p_strm->p_start = p_curdata = (RK_U8 *)mpp_packet_get_pos(p_inp->in_pkt);
while (pkt_impl->length > 0) {
//!< found next picture start code
if (((*p_curdata) == I_PICTURE_START_CODE)
|| ((*p_curdata) == PB_PICTURE_START_CODE)) {
if (p_strm->got_frame_flag) {
FUN_CHECK(ret = add_nalu_header(p_cur));
in_task->valid = 1;
pkt_impl->length += START_PREFIX_3BYTE;
p_bitstream->len = p_bitstream->offset;
//!< reset value
p_bitstream->offset = 0;
reset_curstream(p_strm);
break;
}
p_strm->got_frame_flag = 1;
}
//!< found next nalu start code
p_strm->prefixdata = (p_strm->prefixdata << 8) | (*p_curdata);
if ((p_strm->prefixdata & 0xFFFFFF00) == 0x00000100) {
if (p_strm->got_nalu_flag) {
p_strm->len = (RK_U32)(p_curdata - p_strm->p_start) - START_PREFIX_3BYTE;
FUN_CHECK(ret = store_cur_nalu(p_cur, p_strm));
FPRINT(p_cur->p_inp->fp_log, "g_nalu_no=%d, length=%d, header=0x%02x \n", g_nalu_no++, p_cur->cur_nalu->length, p_cur->cur_nalu->header);
}
FUN_CHECK(ret = add_nalu_header(p_cur));
p_cur->cur_nalu->header = (*p_curdata);
p_cur->cur_nalu->eof = 0;
p_cur->cur_nalu->start_pos = START_PREFIX_3BYTE;
p_strm->p_start = p_curdata - START_PREFIX_3BYTE;
p_strm->got_nalu_flag = 1;
}
p_curdata++;
pkt_impl->length--;
}
if (!pkt_impl->length) {
p_strm->len = (RK_U32)(p_curdata - p_strm->p_start) - 1;
FUN_CHECK(ret = store_cur_nalu(p_cur, p_strm));
}
__RETURN:
AVSD_PARSE_TRACE("Out.");
return ret = MPP_OK;
__FAILED:
return ret;
}
#else
MPP_RET avsd_parse_prepare(AvsdInputCtx_t *p_inp, AvsdCurCtx_t *p_cur)
{
RK_S32 ret_val = 0;
MPP_RET ret = MPP_ERR_UNKNOW;
Avs_DecCtx_t *p_dec = p_inp->p_dec;
HalDecTask *in_task = p_inp->in_task;
AvsdBitstream_t *pb = p_dec->bitstream;
AVSD_PARSE_TRACE("In.");
in_task->input_packet = p_dec->task_pkt;
ret_val = lib_prepare_one_frame(p_dec->libdec, p_inp->in_pkt, in_task);
if (ret_val < 0) {
goto __FAILED;
}
if (in_task->valid) {
mpp_packet_set_pos(in_task->input_packet, pb->pbuf);
mpp_packet_set_length(in_task->input_packet, 0);
}
AVSD_PARSE_TRACE("Out.");
(void)p_cur;
return ret = MPP_OK;
__FAILED:
mpp_packet_set_pos(p_dec->task_pkt, pb->pbuf);
mpp_packet_set_length(p_dec->task_pkt, 0);
return ret;
}
#endif

View File

@@ -0,0 +1,171 @@
/*
* Copyright 2010 Rockchip Electronics S.LSI Co. LTD
*
* 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 __AVSD_PARSE_H__
#define __AVSD_PARSE_H__
#include "rk_type.h"
#include "parser_api.h"
#include "mpp_err.h"
#include "mpp_packet.h"
#include "mpp_buf_slot.h"
#include "hal_task.h"
#define MAX_STREM_IN_SIZE (2*1024*1024)
#define MAX_BITSTREAM_SIZE (2*1024*1024)
//!< NALU type
#define SLICE_START_CODE_MIN 0x00
#define SLICE_START_CODE_MAX 0xAF
#define I_PICTURE_START_CODE 0xB3
#define PB_PICTURE_START_CODE 0xB6
#define USER_DATA_START_CODE 0xB2
#define SEQUENCE_HEADER_CODE 0xB0
#define EXTENSION_START_CODE 0xB5
#define SEQUENCE_END_CODE 0xB1 //!< no in ffmpeg
#define VIDEO_EDIT_CODE 0xB7 //!< no in ffmpeg
#define FPRINT(fp, ...) do{ if (fp) { fprintf(fp, ## __VA_ARGS__); fflush(fp);} }while(0)
//!< input parameter
typedef struct avsd_input_ctx_t {
FILE *fp_log;
ParserCfg init;
MppPacket in_pkt;
HalDecTask *in_task;
RK_S64 in_pts;
RK_S64 in_dts;
RK_U8 has_get_eos;
RK_U64 pkt_no;
struct avsd_cur_ctx_t *p_cur;
struct avsd_video_ctx_t *p_vid;
struct avs_dec_ctx_t *p_dec;
} AvsdInputCtx_t;
//!< current stream
typedef struct avsd_cur_strm_t {
RK_U8 *p_start; //!< store read nalu data
RK_U32 len;
RK_U32 prefixdata;
RK_U8 got_frame_flag;
RK_U8 got_nalu_flag;
} AvsdCurStream_t;
typedef struct avsd_nalu_t
{
RK_U8 header;
RK_U8 *pdata;
RK_U32 size;
RK_U32 length;
RK_U8 start_pos;
RK_U8 eof; //!< end of frame stream
}AvsdNalu_t;
//!< current parameters
typedef struct avsd_cur_ctx_t {
struct avsd_cur_strm_t m_strm;
struct avsd_nalu_t *cur_nalu; //!< current nalu
struct avsd_input_ctx_t *p_inp;
struct avsd_video_ctx_t *p_vid;
struct avs_dec_ctx_t *p_dec;
} AvsdCurCtx_t;
//!< decoder parameters
typedef struct avsd_video_ctx_t {
struct img_par *img;
struct avsd_input_ctx_t *p_inp;
struct avsd_cur_ctx_t *p_cur;
struct avs_dec_ctx_t *p_dec;
}AvsdVideoCtx_t;
typedef struct avsd_bitstream_t {
RK_U8 *pbuf;
RK_U32 size;
RK_U32 len;
RK_U32 offset; //!< start from the offset byte
}AvsdBitstream_t;
typedef struct avsd_memory_t {
struct avsd_bitstream_t bitstream;
} AvsdMemory_t;
//!< decoder parameters
typedef struct avs_dec_ctx_t {
MppBufSlots frame_slots;
MppBufSlots packet_slots;
MppPacket task_pkt;
struct avsd_memory_t *mem; //!< resotre slice data to decoder
struct avsd_bitstream_t *bitstream;
struct avsd_input_ctx_t *p_inp;
struct avsd_cur_ctx_t *p_cur;
struct avsd_video_ctx_t *p_vid;
//!< use in libavs.so
void *libdec;
RK_U32 dec_no;
//mpp_list
} Avs_DecCtx_t;
#ifdef __cplusplus
extern "C" {
#endif
MPP_RET avsd_parse_prepare(AvsdInputCtx_t *p_inp, AvsdCurCtx_t *p_cur);
//!< used in libavs.so
MPP_RET lib_avsd_free(void *decoder);
void *lib_avsd_malloc(void *decoder);
RK_S32 lib_prepare_one_frame(void *decoder, MppPacket pkt, HalDecTask *task);
RK_S32 lib_parse_one_frame(void *decoder, HalDecTask *task);
RK_S32 lib_init_one_frame(void *decoder, HalDecTask *task);
RK_S32 lib_decode_one_frame(void *decoder, HalDecTask *task);
RK_S32 lib_flush(void *decoder);
RK_S32 lib_reset(void *decoder);
RK_S32 nv12_copy_buffer(void *p_dec, RK_U8 *des);
#ifdef __cplusplus
}
#endif
#endif /*__AVSD_PARSE_H__*/

BIN
mpp/codec/dec/avs/libavs.a Normal file

Binary file not shown.

BIN
mpp/codec/dec/avs/libavs.so Normal file

Binary file not shown.

View File

@@ -20,7 +20,17 @@
#include "parser_api.h"
#define AVSD_DBG_TRACE (0x00000001)
#define AVSD_DBG_ERROR (0x00000001)
#define AVSD_DBG_ASSERT (0x00000002)
#define AVSD_DBG_WARNNING (0x00000004)
#define AVSD_DBG_TRACE (0x00000008)
#define AVSD_DBG_INPUT (0x00000010) //!< input packet
#define AVSD_DBG_CALLBACK (0x00008000)
extern RK_U32 avsd_parse_debug;
@@ -32,6 +42,46 @@ do {\
} while (0)
#define AVSD_DBG(level, fmt, ...)\
do {\
if (level & avsd_parse_debug)\
{ mpp_log(fmt, ## __VA_ARGS__); }\
} while (0)
#ifdef INP_CHECK
#undef INP_CHECK
#endif
//!< input check
#define INP_CHECK(ret, val, ...)\
do{\
if ((val)) {\
ret = MPP_ERR_INIT; \
AVSD_DBG(AVSD_DBG_WARNNING, "input empty(%d).\n", __LINE__); \
goto __RETURN; \
}} while (0)
#ifdef MEM_CHECK
#undef MEM_CHECK
#endif
//!< memory malloc check
#define MEM_CHECK(ret, val, ...)\
do{\
if(!(val)) {\
ret = MPP_ERR_MALLOC;\
AVSD_DBG(AVSD_DBG_ERROR, "malloc buffer error(%d).\n", __LINE__); \
goto __FAILED; \
}} while (0)
#ifdef FUN_CHECK
#undef FUN_CHECK
#endif
//!< function return check
#define FUN_CHECK(val)\
do{\
if ((val) < 0) {\
AVSD_DBG(AVSD_DBG_WARNNING, "Function error(%d).\n", __LINE__); \
goto __FAILED; \
}} while (0)
#ifdef __cplusplus

View File

@@ -25,18 +25,54 @@
#define AVSD_HAL_DBG_TRACE (0x00000001)
#define AVSD_HAL_DBG_ERROR (0x00000001)
#define AVSD_HAL_DBG_ASSERT (0x00000002)
#define AVSD_HAL_DBG_WARNNING (0x00000004)
#define AVSD_HAL_DBG_TRACE (0x00000008)
extern RK_U32 avsd_hal_debug;
#define AVSD_HAL_DBG(level, fmt, ...)\
do {\
if (level & avsd_hal_debug)\
{ mpp_log(fmt, ## __VA_ARGS__); }\
} while (0)
#define AVSD_HAL_TRACE(fmt, ...)\
do {\
if (AVSD_HAL_DBG_TRACE & avsd_hal_debug)\
{ mpp_log_f(fmt, ## __VA_ARGS__); }\
} while (0)
#ifdef INP_CHECK
#undef INP_CHECK
#endif
//!< input check
#define INP_CHECK(ret, val, ...)\
do{\
if ((val)) { \
ret = MPP_ERR_INIT; \
AVSD_HAL_DBG(AVSD_HAL_DBG_WARNNING, "input empty(%d).\n", __LINE__); \
goto __RETURN; \
}} while (0)
typedef struct avsd_hal_ctx_t {
MppBufSlots frame_slots;
MppBufSlots packet_slots;
IOInterruptCB init_cb;
} AvsdHalCtx_t;
#ifdef __cplusplus
extern "C" {
@@ -44,14 +80,14 @@ extern "C" {
extern const MppHalApi hal_api_avsd;
MPP_RET hal_avsd_init (void *hal, MppHalCfg *cfg);
MPP_RET hal_avsd_deinit (void *hal);
MPP_RET hal_avsd_gen_regs(void *hal, HalTaskInfo *task);
MPP_RET hal_avsd_start (void *hal, HalTaskInfo *task);
MPP_RET hal_avsd_wait (void *hal, HalTaskInfo *task);
MPP_RET hal_avsd_reset (void *hal);
MPP_RET hal_avsd_flush (void *hal);
MPP_RET hal_avsd_control (void *hal, RK_S32 cmd_type, void *param);
MPP_RET hal_avsd_init (void *decoder, MppHalCfg *cfg);
MPP_RET hal_avsd_deinit (void *decoder);
MPP_RET hal_avsd_gen_regs(void *decoder, HalTaskInfo *task);
MPP_RET hal_avsd_start (void *decoder, HalTaskInfo *task);
MPP_RET hal_avsd_wait (void *decoder, HalTaskInfo *task);
MPP_RET hal_avsd_reset (void *decoder);
MPP_RET hal_avsd_flush (void *decoder);
MPP_RET hal_avsd_control (void *decoder, RK_S32 cmd_type, void *param);
#ifdef __cplusplus
}

View File

@@ -28,13 +28,27 @@
#include "mpp_err.h"
#include "mpp_mem.h"
#include "mpp_env.h"
#include "mpp_common.h"
#include "hal_avsd_api.h"
RK_U32 avsd_hal_debug = 0;
static RK_U32 avsd_ver_align(RK_U32 val)
{
return MPP_ALIGN(val, 16);
}
static RK_U32 avsd_hor_align(RK_U32 val)
{
return MPP_ALIGN(val, 16);
}
static RK_U32 avsd_len_align(RK_U32 val)
{
return (2 * MPP_ALIGN(val, 16));
}
/*!
***********************************************************************
* \brief
@@ -42,15 +56,31 @@ RK_U32 avsd_hal_debug = 0;
***********************************************************************
*/
//extern "C"
MPP_RET hal_avsd_init(void *hal, MppHalCfg *cfg)
MPP_RET hal_avsd_init(void *decoder, MppHalCfg *cfg)
{
MPP_RET ret = MPP_ERR_UNKNOW;
mpp_env_get_u32("avsd_debug", &avsd_hal_debug, 0);
AvsdHalCtx_t *p_hal = NULL;
AVSD_HAL_TRACE("In.");
INP_CHECK(ret, NULL == decoder);
(void)hal;
mpp_env_get_u32("avsd_debug", &avsd_hal_debug, 0);
p_hal = (AvsdHalCtx_t *)decoder;
memset(p_hal, 0, sizeof(AvsdHalCtx_t));
p_hal->frame_slots = cfg->frame_slots;
p_hal->packet_slots = cfg->packet_slots;
//!< callback function to parser module
p_hal->init_cb = cfg->hal_int_cb;
mpp_slots_set_prop(p_hal->frame_slots, SLOTS_HOR_ALIGN, avsd_hor_align);
mpp_slots_set_prop(p_hal->frame_slots, SLOTS_VER_ALIGN, avsd_ver_align);
mpp_slots_set_prop(p_hal->frame_slots, SLOTS_LEN_ALIGN, avsd_len_align);
__RETURN:
AVSD_HAL_TRACE("Out.");
(void)decoder;
(void)cfg;
return ret = MPP_OK;
}
@@ -61,13 +91,14 @@ MPP_RET hal_avsd_init(void *hal, MppHalCfg *cfg)
***********************************************************************
*/
//extern "C"
MPP_RET hal_avsd_deinit(void *hal)
MPP_RET hal_avsd_deinit(void *decoder)
{
MPP_RET ret = MPP_ERR_UNKNOW;
AVSD_HAL_TRACE("In.");
(void)hal;
AVSD_HAL_TRACE("Out.");
(void)decoder;
return ret = MPP_OK;
}
/*!
@@ -77,12 +108,26 @@ MPP_RET hal_avsd_deinit(void *hal)
***********************************************************************
*/
//extern "C"
MPP_RET hal_avsd_gen_regs(void *hal, HalTaskInfo *task)
MPP_RET hal_avsd_gen_regs(void *decoder, HalTaskInfo *task)
{
MPP_RET ret = MPP_ERR_UNKNOW;
MPP_RET ret = MPP_ERR_UNKNOW;
AvsdHalCtx_t *p_hal = NULL;
AVSD_HAL_TRACE("In.");
(void)hal;
INP_CHECK(ret, NULL == decoder);
p_hal = (AvsdHalCtx_t *)decoder;
if (p_hal->init_cb.callBack) {
p_hal->init_cb.callBack(p_hal->init_cb.opaque, task);
}
__RETURN:
AVSD_HAL_TRACE("Out.");
(void)decoder;
(void)task;
return ret = MPP_OK;
}
@@ -93,13 +138,16 @@ MPP_RET hal_avsd_gen_regs(void *hal, HalTaskInfo *task)
***********************************************************************
*/
//extern "C"
MPP_RET hal_avsd_start(void *hal, HalTaskInfo *task)
MPP_RET hal_avsd_start(void *decoder, HalTaskInfo *task)
{
MPP_RET ret = MPP_ERR_UNKNOW;
AVSD_HAL_TRACE("In.");
INP_CHECK(ret, NULL == decoder);
(void)hal;
__RETURN:
AVSD_HAL_TRACE("Out.");
(void)decoder;
(void)task;
return ret = MPP_OK;
}
@@ -110,13 +158,23 @@ MPP_RET hal_avsd_start(void *hal, HalTaskInfo *task)
***********************************************************************
*/
//extern "C"
MPP_RET hal_avsd_wait(void *hal, HalTaskInfo *task)
MPP_RET hal_avsd_wait(void *decoder, HalTaskInfo *task)
{
MPP_RET ret = MPP_ERR_UNKNOW;
//AvsdHalCtx_t *p_hal = NULL;
AVSD_HAL_TRACE("In.");
AVSD_HAL_TRACE("In.");
(void)hal;
INP_CHECK(ret, NULL == decoder);
//p_hal = (AvsdHalCtx_t *)decoder;
//if (p_hal->init_cb.callBack) {
// p_hal->init_cb.callBack(p_hal->init_cb.opaque, task);
//}
__RETURN:
AVSD_HAL_TRACE("Out.");
(void)decoder;
(void)task;
return ret = MPP_OK;
}
@@ -127,13 +185,13 @@ MPP_RET hal_avsd_wait(void *hal, HalTaskInfo *task)
***********************************************************************
*/
//extern "C"
MPP_RET hal_avsd_reset(void *hal)
MPP_RET hal_avsd_reset(void *decoder)
{
MPP_RET ret = MPP_ERR_UNKNOW;
AVSD_HAL_TRACE("In.");
(void)hal;
(void)decoder;
return ret = MPP_OK;
}
/*!
@@ -143,13 +201,13 @@ MPP_RET hal_avsd_reset(void *hal)
***********************************************************************
*/
//extern "C"
MPP_RET hal_avsd_flush(void *hal)
MPP_RET hal_avsd_flush(void *decoder)
{
MPP_RET ret = MPP_ERR_UNKNOW;
AVSD_HAL_TRACE("In.");
(void)hal;
(void)decoder;
return ret = MPP_OK;
}
/*!
@@ -159,13 +217,13 @@ MPP_RET hal_avsd_flush(void *hal)
***********************************************************************
*/
//extern "C"
MPP_RET hal_avsd_control(void *hal, RK_S32 cmd_type, void *param)
MPP_RET hal_avsd_control(void *decoder, RK_S32 cmd_type, void *param)
{
MPP_RET ret = MPP_ERR_UNKNOW;
AVSD_HAL_TRACE("In.");
(void)hal;
(void)decoder;
(void)cmd_type;
(void)param;
@@ -177,7 +235,7 @@ const MppHalApi hal_api_avsd = {
"avsd_rkdec",
MPP_CTX_DEC,
MPP_VIDEO_CodingAVS,
200,//sizeof(AvsdHalCtx_t),
sizeof(AvsdHalCtx_t),
0,
hal_avsd_init,
hal_avsd_deinit,

View File

@@ -37,19 +37,10 @@
#include "hal_task.h"
#include "avsd_api.h"
#include "avsd_parse.h"
#include "hal_avsd_api.h"
#ifdef AVS_TEST
int main(int argc, char **argv)
{
return avsd_test_main(argc, argv);
}
#else
#define AVSD_TEST_ERROR (0x00000001)
#define AVSD_TEST_ASSERT (0x00000002)
#define AVSD_TEST_WARNNING (0x00000004)
@@ -65,36 +56,20 @@ if (level & rkv_avsd_test_debug)\
} while (0)
#define INP_CHECK(ret, val, ...)\
do{\
if ((val)) {\
ret = MPP_ERR_INIT; \
AVSD_TEST_LOG(AVSD_TEST_WARNNING, "input empty(%d).\n", __LINE__); \
goto __RETURN; \
}} while (0)
typedef struct ParserImpl_t {
ParserCfg cfg;
#define MEM_CHECK(ret, val, ...)\
do{\
if (!(val)) {\
ret = MPP_ERR_MALLOC; \
AVSD_TEST_LOG(AVSD_TEST_ERROR, "malloc buffer error(%d).\n", __LINE__); \
goto __FAILED; \
}} while (0)
const ParserApi *api;
void *ctx;
} ParserImpl;
#define FUN_CHECK(val)\
do{\
if ((val) < 0) {\
AVSD_TEST_LOG(AVSD_TEST_WARNNING, "Function error(%d).\n", __LINE__); \
goto __FAILED; \
}} while (0)
static RK_U32 rkv_avsd_test_debug = 0;
typedef struct inp_par_t {
FILE *fp_in;
FILE *fp_out;
FILE *fp_read;
RK_U8 *pbuf;
RK_U32 bufsize;
RK_U32 len;
@@ -119,20 +94,6 @@ typedef struct avsd_test_ctx_t {
MppBufferGroup mStreamGroup;
} AvsdTestCtx_t;
static MPP_RET decoder_deinit(AvsdTestCtx_t *pctx)
{
MppDec *pApi = &pctx->m_api;
@@ -155,18 +116,23 @@ static MPP_RET decoder_deinit(AvsdTestCtx_t *pctx)
}
if (pctx->m_dec_pkt_buf) {
mpp_buffer_put(pctx->m_dec_pkt_buf);
pctx->m_dec_pkt_buf = NULL;
}
if (pctx->m_dec_pic_buf) {
mpp_buffer_put(pctx->m_dec_pic_buf);
pctx->m_dec_pic_buf = NULL;
}
if (pctx->mFrameGroup != NULL) {
if (pctx->mFrameGroup) {
mpp_err("mFrameGroup deInit");
mpp_buffer_group_put(pctx->mFrameGroup);
pctx->mFrameGroup = NULL;
}
if (pctx->mStreamGroup != NULL) {
if (pctx->mStreamGroup) {
mpp_err("mStreamGroup deInit");
mpp_buffer_group_put(pctx->mStreamGroup);
pctx->mStreamGroup = NULL;
}
return MPP_OK;
}
@@ -181,14 +147,14 @@ static MPP_RET decoder_init(AvsdTestCtx_t *pctx)
if (pctx->mFrameGroup == NULL) {
ret = mpp_buffer_group_get_internal(&pctx->mFrameGroup, MPP_BUFFER_TYPE_NORMAL);
if (MPP_OK != ret) {
mpp_err("h264d mpp_buffer_group_get failed\n");
mpp_err("avsd mpp_buffer_group_get failed\n");
goto __FAILED;
}
}
if (pctx->mStreamGroup == NULL) {
ret = mpp_buffer_group_get_internal(&pctx->mStreamGroup, MPP_BUFFER_TYPE_NORMAL);
if (MPP_OK != ret) {
mpp_err("h264d mpp_buffer_group_get failed\n");
mpp_err("avsd mpp_buffer_group_get failed\n");
goto __FAILED;
}
}
@@ -207,15 +173,19 @@ static MPP_RET decoder_init(AvsdTestCtx_t *pctx)
parser_cfg.packet_slots = pApi->packet_slots;
parser_cfg.task_count = 2;
FUN_CHECK(ret = parser_init(&pApi->parser, &parser_cfg));
// init hal part
memset(&hal_cfg, 0, sizeof(hal_cfg));
hal_cfg.type = MPP_CTX_DEC;
hal_cfg.coding = pApi->coding;
hal_cfg.work_mode = HAL_MODE_LIBVPU;
hal_cfg.device_id = HAL_VDPU;
hal_cfg.device_id = HAL_RKVDEC;
hal_cfg.frame_slots = pApi->frame_slots;
hal_cfg.packet_slots = pApi->packet_slots;
hal_cfg.task_count = parser_cfg.task_count;
hal_cfg.hal_int_cb.opaque = ((ParserImpl *)(pApi->parser))->ctx;
hal_cfg.hal_int_cb.callBack = api_avsd_parser.callback;
//api_avsd_parser.callback(hal_cfg.hal_int_cb.opaque, NULL);
FUN_CHECK(ret = mpp_hal_init(&pApi->hal, &hal_cfg));
pApi->tasks = hal_cfg.tasks;
@@ -260,9 +230,10 @@ static MPP_RET avsd_input_deinit(InputParams *inp)
{
MPP_RET ret = MPP_ERR_UNKNOW;
MPP_FREE(inp->pbuf);
MPP_FCLOSE(inp->fp_in);
MPP_FCLOSE(inp->fp_out);
MPP_FCLOSE(inp->fp_read);
return ret = MPP_OK;
}
@@ -315,8 +286,13 @@ static MPP_RET avsd_input_init(InputParams *inp, RK_S32 ac, char *av[])
goto __FAILED;
}
}
if ((inp->fp_read = fopen("F:/avs_log/avs_read.txt", "wb")) == 0) {
mpp_log("error, open file %s", "F:/avs_log/avs_read.txt");
goto __FAILED;
}
//!< malloc read buffer
inp->bufsize = 512;
inp->bufsize = 30*1024;
MEM_CHECK(ret, inp->pbuf = mpp_malloc(RK_U8, inp->bufsize));
AVSD_TEST_LOG(AVSD_TEST_TRACE, "------------------------------------------------------------");
@@ -340,6 +316,11 @@ static MPP_RET avsd_read_data(InputParams *inp)
inp->len = (RK_U32)fread(inp->pbuf, sizeof(RK_U8), inp->bufsize, inp->fp_in);
inp->is_eof = feof(inp->fp_in);
if (inp->fp_read){
fwrite(inp->pbuf, inp->len, 1, inp->fp_read);
fflush(inp->fp_read);
}
return ret = MPP_OK;
}
@@ -400,10 +381,12 @@ static MPP_RET decoder_single_test(AvsdTestCtx_t *pctx)
//!< deinit packet
if (mpp_packet_get_length(pkt) == 0) {
if (mpp_packet_get_eos(pkt)) {
if (task->dec.valid) {
mpp_buf_slot_clr_flag(pApi->packet_slots, task->dec.input, SLOT_HAL_INPUT);
mpp_buf_slot_clr_flag(pApi->frame_slots, task->dec.output, SLOT_HAL_OUTPUT);
task->dec.valid = 0;
}
end_of_flag = 1; //!< end of stream
task->dec.valid = 0;
mpp_buf_slot_clr_flag(pApi->packet_slots, task->dec.input, SLOT_HAL_INPUT);
mpp_buf_slot_clr_flag(pApi->frame_slots, task->dec.output, SLOT_HAL_OUTPUT);
}
mpp_packet_deinit(&pkt);
pkt = NULL;
@@ -415,7 +398,7 @@ static MPP_RET decoder_single_test(AvsdTestCtx_t *pctx)
}
mpp_buf_slot_get_prop(pApi->frame_slots, task->dec.output, SLOT_BUFFER, &pctx->m_dec_pic_buf);
if (NULL == pctx->m_dec_pic_buf) {
RK_U32 size = (RK_U32)mpp_buf_slot_get_size(pApi->frame_slots);
RK_U32 size = 1920 * 1088 * 3 / 2;// (RK_U32)mpp_buf_slot_get_size(pApi->frame_slots);
mpp_buffer_get(pctx->mFrameGroup, &pctx->m_dec_pic_buf, size);
if (pctx->m_dec_pic_buf)
mpp_buf_slot_set_prop(pApi->frame_slots, task->dec.output, SLOT_BUFFER, pctx->m_dec_pic_buf);
@@ -448,9 +431,9 @@ static MPP_RET decoder_single_test(AvsdTestCtx_t *pctx)
}
} while (!end_of_flag);
//!< flush dpb and send to display
FUN_CHECK(ret = mpp_dec_flush(pApi));
avsd_flush_frames(pApi, inp->fp_out);
ret = MPP_OK;
__FAILED:
@@ -461,19 +444,20 @@ __FAILED:
int main(int argc, char **argv)
{
MPP_RET ret = MPP_ERR_UNKNOW;
AvsdTestCtx_t *pctx = NULL;
AvsdTestCtx_t m_decoder;
AvsdTestCtx_t *p_dec = &m_decoder;
#if defined(_MSC_VER)
mpp_env_set_u32("rkv_avsd_test_debug", 0xFF);
#endif
mpp_env_get_u32("rkv_avsd_test_debug", &rkv_avsd_test_debug, 0x0F);
MEM_CHECK(ret, pctx = mpp_calloc(AvsdTestCtx_t, 1));
memset(p_dec, 0, sizeof(AvsdTestCtx_t));
// read file
FUN_CHECK(ret = avsd_input_init(&pctx->m_in, argc, argv));
FUN_CHECK(ret = avsd_input_init(&p_dec->m_in, argc, argv));
// init
decoder_init(pctx);
decoder_init(p_dec);
// decode
ret = decoder_single_test(pctx);
ret = decoder_single_test(p_dec);
if (ret != MPP_OK) {
AVSD_TEST_LOG(AVSD_TEST_TRACE, "[AVSD_TEST] Single-thread test error.");
goto __FAILED;
@@ -481,12 +465,11 @@ int main(int argc, char **argv)
ret = MPP_OK;
__FAILED:
decoder_deinit(pctx);
avsd_input_deinit(&pctx->m_in);
MPP_FREE(pctx);
decoder_deinit(p_dec);
avsd_input_deinit(&p_dec->m_in);
AVSD_TEST_LOG(AVSD_TEST_TRACE, "[AVSD_TEST] decoder_deinit over.");
return ret;
}
#endif