[h265d]: merge csy's h265d modification

git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@353 6e48237b-75ef-9749-8fc9-41990f28c85a
This commit is contained in:
ChenHengming
2015-10-12 16:16:25 +00:00
parent 511e6bbbb0
commit 098feea510
8 changed files with 74 additions and 34 deletions

View File

@@ -268,17 +268,17 @@ RK_S32 h265d_split_frame(void *sc,
return next;
}
RK_S32 h265d_split_flush(void *sc)
RK_S32 h265d_split_reset(void *sc)
{
RK_U8 *buf = NULL;
RK_U32 size = 0;
SplitContext_t *s = (SplitContext_t*)sc;
s->index = 0;
s->last_index = 0;
s->state = 0;
s->frame_start_found = 0;
s->overread = 0;
s->overread_index = 0;
s->state64 = 0;
buf = s->buffer;
size = s->buffer_size;
s->fetch_timestamp = 1;
memset(s,0,sizeof(SplitContext_t));
s->buffer = buf;
s->buffer_size = size;
return MPP_OK;
}
@@ -474,7 +474,7 @@ static RK_S32 set_sps(HEVCContext *s, const HEVCSPS *sps)
s->h265dctx->height = sps->output_height;
s->h265dctx->pix_fmt = sps->pix_fmt;
s->h265dctx->sample_aspect_ratio = sps->vui.sar;
mpp_buf_slot_setup(s->slots, 22, s->h265dctx->coded_width * s->h265dctx->coded_height * 7 / 4 , 0);
mpp_buf_slot_setup(s->slots, 25, s->h265dctx->coded_width * s->h265dctx->coded_height * 7 / 4 , 0);
if (sps->vui.video_signal_type_present_flag)
s->h265dctx->color_range = sps->vui.video_full_range_flag ? MPPCOL_RANGE_JPEG
@@ -1339,7 +1339,7 @@ RK_S32 mpp_hevc_extract_rbsp(HEVCContext *s, const RK_U8 *src, int length,
si = di = i;
while (si + 2 < length) {
// remove escapes (very rare 1:2^22)
if (src[si + 2] > 3) {
if (src[si + 2] >= 3) {
dst[di++] = src[si++];
dst[di++] = src[si++];
} else if (src[si] == 0 && src[si + 1] == 0) {
@@ -1651,14 +1651,18 @@ MPP_RET h265d_parse(void *ctx, HalDecTask *task)
}
return ret;
}
mpp_err("decode poc = %d", s->poc);
h265d_dbg(H265D_DBG_GLOBAL,"decode poc = %d", s->poc);
if (s->ref) {
h265d_parser2_syntax(h265dctx);
s->task->syntax.data = s->hal_pic_private;
s->task->syntax.number = 1;
s->task->valid = 1;
if (s->eos) {
s->task->eos = 1;
s->task->flags |= MPP_PACKET_FLAG_EOS;
}
}else{
if(s->eos){
h265d_flush(ctx);
}
}
#if 0
@@ -1835,6 +1839,7 @@ MPP_RET h265d_reset(void *ctx)
H265dContext_t *h265dctx = (H265dContext_t *)ctx;
HEVCContext *s = (HEVCContext *)h265dctx->priv_data;
mpp_hevc_flush_dpb(s);
h265d_split_reset(h265dctx->split_cxt);
s->max_ra = INT_MAX;
return MPP_OK;
}

View File

@@ -158,7 +158,7 @@ static void fill_picture_parameters(const HEVCContext *h,
pp->log2_parallel_merge_level_minus2 = pps->log2_parallel_merge_level - 2;
pp->CurrPicOrderCntVal = h->poc;
mpp_err("fill RefPicList from the DPB");
// mpp_err("fill RefPicList from the DPB");
// fill RefPicList from the DPB
for (i = 0, j = 0; i < MPP_ARRAY_ELEMS(pp->RefPicList); i++) {
const HEVCFrame *frame = NULL;
@@ -270,7 +270,7 @@ RK_S32 h265d_syntax_fill_slice(void *ctx, RK_S32 input_index)
MppBuffer streambuf = NULL;
RK_S32 i, count = 0;
RK_U32 position = 0;
mpp_err("input_index = %d",input_index);
// mpp_err("input_index = %d",input_index);
mpp_buf_slot_get_prop(h->packet_slots, input_index, SLOT_BUFFER, &streambuf);
RK_U8 *ptr = (RK_U8 *)mpp_buffer_get_ptr(streambuf);
RK_U8 *current = ptr;
@@ -303,7 +303,7 @@ RK_S32 h265d_syntax_fill_slice(void *ctx, RK_S32 input_index)
current += start_code_size;
position += start_code_size;
memcpy(current, h->nals[i].data, h->nals[i].size);
mpp_log("h->nals[%d].size = %d", i, h->nals[i].size);
// mpp_log("h->nals[%d].size = %d", i, h->nals[i].size);
fill_slice_short(&ctx_pic->slice_short[count], position, h->nals[i].size);
current += h->nals[i].size;
position += h->nals[i].size;

View File

@@ -1527,7 +1527,7 @@ RK_S32 mpp_hevc_decode_nal_sps(HEVCContext *s)
}
READ_ONEBIT(gb, &sublayer_ordering_info);
h265d_dbg(H265D_DBG_SPS,"read bit left %d",gb->num_remaining_bits_in_curr_byte_ + gb->bytes_left_*8);
start = sublayer_ordering_info ? 0 : sps->max_sub_layers - 1;
for (i = start; i < sps->max_sub_layers; i++) {
READ_UE(gb, &sps->temporal_layer[i].max_dec_pic_buffering) ;
@@ -1560,20 +1560,32 @@ RK_S32 mpp_hevc_decode_nal_sps(HEVCContext *s)
}
}
h265d_dbg(H265D_DBG_SPS,"2 read bit left %d",gb->num_remaining_bits_in_curr_byte_ + gb->bytes_left_*8);
READ_UE(gb, &sps->log2_min_cb_size) ;
sps->log2_min_cb_size += 3;
h265d_dbg(H265D_DBG_SPS,"sps->log2_min_cb_size %d",sps->log2_min_cb_size);
READ_UE(gb, &sps->log2_diff_max_min_coding_block_size);
h265d_dbg(H265D_DBG_SPS,"sps->log2_diff_max_min_coding_block_size %d",sps->log2_diff_max_min_coding_block_size);
READ_UE(gb, &sps->log2_min_tb_size);
sps->log2_min_tb_size += 2;
h265d_dbg(H265D_DBG_SPS,"sps->log2_min_tb_size %d",sps->log2_min_tb_size);
READ_UE(gb, &log2_diff_max_min_transform_block_size);
h265d_dbg(H265D_DBG_SPS,"sps->log2_diff_max_min_transform_block_size %d",log2_diff_max_min_transform_block_size);
sps->log2_max_trafo_size = log2_diff_max_min_transform_block_size +
sps->log2_min_tb_size;
h265d_dbg(H265D_DBG_SPS,"sps->log2_max_trafo_size %d",sps->log2_max_trafo_size);
if (sps->log2_min_tb_size >= sps->log2_min_cb_size) {
mpp_err( "Invalid value for log2_min_tb_size");
ret = MPP_ERR_STREAM;
goto err;
}
READ_UE(gb, &sps->max_transform_hierarchy_depth_inter);
READ_UE(gb, &sps->max_transform_hierarchy_depth_intra);
@@ -1592,10 +1604,15 @@ RK_S32 mpp_hevc_decode_nal_sps(HEVCContext *s)
s->scaling_list_listen[sps_id] = 1;
}
READ_ONEBIT(gb, &sps->amp_enabled_flag);
READ_ONEBIT(gb, &sps->sao_enabled);
READ_ONEBIT(gb, &sps->pcm_enabled_flag);
h265d_dbg(H265D_DBG_SPS,"sps->amp_enabled_flag = %d", sps->amp_enabled_flag);
h265d_dbg(H265D_DBG_SPS,"sps->sao_enabled = %d", sps->sao_enabled);
h265d_dbg(H265D_DBG_SPS,"sps->pcm_enabled_flag = %d", sps->pcm_enabled_flag);
if (sps->pcm_enabled_flag) {
READ_BITS(gb, 4, &sps->pcm.bit_depth);
sps->pcm.bit_depth += 1;
@@ -1637,12 +1654,15 @@ RK_S32 mpp_hevc_decode_nal_sps(HEVCContext *s)
READ_ONEBIT(gb, &sps->used_by_curr_pic_lt_sps_flag[i]);
}
}
READ_ONEBIT(gb, &sps->sps_temporal_mvp_enabled_flag);
#ifdef REF_IDX_MFM
if (s->nuh_layer_id > 0)
READ_ONEBIT(gb, &sps->set_mfm_enabled_flag);
#endif
READ_ONEBIT(gb, &sps->sps_strong_intra_smoothing_enable_flag);
sps->vui.sar.num = 0;
sps->vui.sar.den = 1;
READ_ONEBIT(gb, &vui_present);
@@ -1703,6 +1723,10 @@ RK_S32 mpp_hevc_decode_nal_sps(HEVCContext *s)
s->h265dctx->height = sps->height;
// Inferred parameters
sps->log2_ctb_size = sps->log2_min_cb_size + sps->log2_diff_max_min_coding_block_size;
h265d_dbg(H265D_DBG_SPS,"sps->log2_min_cb_size = %d sps->log2_diff_max_min_coding_block_size = %d",sps->log2_min_cb_size,sps->log2_diff_max_min_coding_block_size);
h265d_dbg(H265D_DBG_SPS,"plus sps->log2_ctb_size %d",sps->log2_ctb_size);
sps->log2_min_pu_size = sps->log2_min_cb_size - 1;
sps->ctb_width = (sps->width + (1 << sps->log2_ctb_size) - 1) >> sps->log2_ctb_size;
@@ -1738,6 +1762,7 @@ RK_S32 mpp_hevc_decode_nal_sps(HEVCContext *s)
sps->max_transform_hierarchy_depth_intra);
goto err;
}
h265d_dbg(H265D_DBG_SPS,"sps->log2_ctb_size %d",sps->log2_ctb_size);
if (sps->log2_max_trafo_size > (RK_U32)MPP_MIN(sps->log2_ctb_size, 5)) {
mpp_err(
"max transform block size out of range: %d\n",
@@ -1747,13 +1772,13 @@ RK_S32 mpp_hevc_decode_nal_sps(HEVCContext *s)
if (s->h265dctx->compare_info != NULL) {
CurrentFameInf_t *info = (CurrentFameInf_t *)s->h265dctx->compare_info;
HEVCSPS *openhevc_sps = (HEVCSPS *)&info->sps[sps_id];
mpp_log("compare sps in");
if (compare_sps(openhevc_sps, (HEVCSPS *)sps_buf) < 0) {
mpp_err("compare sps with openhevc error found");
mpp_assert(0);
return -1;
}
mpp_log("compare sps ok");
}
#if 0
if (s->h265dctx->debug & FF_DEBUG_BITSTREAM) {

View File

@@ -88,7 +88,7 @@ static HEVCFrame *alloc_frame(HEVCContext *s)
if (ret != MPP_OK) {
goto fail;
}
mpp_err("width = %d height = %d", s->h265dctx->width, s->h265dctx->height);
h265d_dbg(H265D_DBG_GLOBAL,"width = %d height = %d", s->h265dctx->width, s->h265dctx->height);
mpp_frame_set_width(frame->frame, s->h265dctx->width);
mpp_frame_set_height(frame->frame, s->h265dctx->height);

View File

@@ -8,7 +8,9 @@ if(H265D_TEST)
add_executable(h265d_parser_test h265d_parser_test.c)
include_directories(.)
link_directories(.)
if(UNIX)
if(ANDROID)
target_link_libraries(h265d_parser_test mpp utils)
elseif(UNIX)
set(OPENHEVCSO "${CMAKE_SOURCE_DIR}/mpp/codec/dec/h265/test")
add_library(openhevcwrapper SHARED IMPORTED)
set_target_properties(openhevcwrapper PROPERTIES

View File

@@ -458,7 +458,6 @@ RK_S32 hevc_parser_test(ParserDemoCmdContext_t *cmd)
RK_U32 index;
ret = mpp_buf_slot_dequeue(slots, &index, QUEUE_DISPLAY);
if (ret == MPP_OK) {
mpp_log("get_display for ");
mpp_buf_slot_get_prop(slots, index, SLOT_FRAME, &frame);
if (frame) {
#if 1//def DUMP
@@ -492,7 +491,10 @@ RK_S32 hevc_parser_test(ParserDemoCmdContext_t *cmd)
if (-1 != curtask->input) {
MppBuffer buffer = NULL;
mpp_buf_slot_set_flag(packet_slots, curtask->input, SLOT_CODEC_READY);
mpp_buf_slot_set_flag(packet_slots, curtask->input, SLOT_HAL_INPUT);
mpp_buf_slot_get_prop(packet_slots, curtask->input, SLOT_BUFFER, &buffer);
mpp_buf_slot_clr_flag(packet_slots, curtask->input, SLOT_HAL_INPUT);
mpp_err("mpp_buf_slot free for last packet %p",buffer);
mpp_buffer_put(buffer);
}
@@ -502,13 +504,14 @@ RK_S32 hevc_parser_test(ParserDemoCmdContext_t *cmd)
RK_U32 index;
ret = mpp_buf_slot_dequeue(slots, &index, QUEUE_DISPLAY);
if (ret == MPP_OK) {
mpp_log("get_display for ");
}
mpp_buf_slot_get_prop(slots, index, SLOT_FRAME, &frame);
if (frame) {
mpp_frame_deinit(&frame);
}
mpp_buf_slot_clr_flag(slots, index, SLOT_QUEUE_USE);
mpp_log("get_display for index = %d",index);
mpp_buf_slot_get_prop(slots, index, SLOT_FRAME, &frame);
if (frame) {
mpp_frame_deinit(&frame);
}
mpp_buf_slot_clr_flag(slots, index, SLOT_QUEUE_USE);
}
} while (ret == MPP_OK);
if (mpp_codex_ctx != NULL) {

View File

@@ -268,7 +268,10 @@ void *mpp_dec_parser_thread(void *data)
hal_task_info_init(&task_local, MPP_CTX_DEC);
}
if (NULL != task) {
mpp_buf_slot_set_flag(packet_slots, task_dec->input, SLOT_CODEC_READY);
mpp_buf_slot_set_flag(packet_slots, task_dec->input, SLOT_HAL_INPUT);
mpp_buf_slot_get_prop(packet_slots, task_dec->input, SLOT_BUFFER, &buffer);
mpp_buf_slot_clr_flag(packet_slots, task_dec->input, SLOT_HAL_INPUT);
if (buffer)
mpp_buffer_put(buffer);
}
@@ -397,7 +400,7 @@ MPP_RET mpp_dec_init(MppDec **dec, MppCodingType coding)
MPP_CTX_DEC,
coding,
HAL_MODE_LIBVPU,
HAL_HARD_RKVDEC,
HAL_RKVDEC,
frame_slots,
packet_slots,
NULL,

View File

@@ -29,9 +29,11 @@ typedef enum MppHalType_e {
typedef enum MppHalHardType_e {
HAL_HARD_RKVDEC, //!< rock-chip h264 h265 vp9 combined decoder
HAL_HARD_VDPU, //!< on2 combined decoder
} HalHardMode;
HAL_VDPU, //!< vpu combined decoder
HAL_VEPU, //!< vpu combined encoder
HAL_RKVDEC, //!< rock-chip h264 h265 vp9 combined decoder
HAL_DEVICE_BUTT,
} HalDeviceId;
typedef void* MppHalCtx;
@@ -41,7 +43,7 @@ typedef struct MppHalCfg_t {
MppCtxType type;
MppCodingType coding;
HalWorkMode work_mode;
HalHardMode hard_mode;
HalDeviceId device_id;
MppBufSlots frame_slots;
MppBufSlots packet_slots;