From 098feea51066c268c36d13cd2c665a4504f9e7b7 Mon Sep 17 00:00:00 2001 From: ChenHengming Date: Mon, 12 Oct 2015 16:16:25 +0000 Subject: [PATCH] [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 --- mpp/codec/dec/h265/h265d_parser.c | 31 ++++++++++++--------- mpp/codec/dec/h265/h265d_parser2_syntax.c | 6 ++-- mpp/codec/dec/h265/h265d_ps.c | 31 +++++++++++++++++++-- mpp/codec/dec/h265/h265d_refs.c | 2 +- mpp/codec/dec/h265/test/CMakeLists.txt | 4 ++- mpp/codec/dec/h265/test/h265d_parser_test.c | 19 +++++++------ mpp/codec/mpp_dec.cpp | 5 +++- mpp/hal/inc/mpp_hal.h | 10 ++++--- 8 files changed, 74 insertions(+), 34 deletions(-) diff --git a/mpp/codec/dec/h265/h265d_parser.c b/mpp/codec/dec/h265/h265d_parser.c index 0fead366..7e69ef39 100644 --- a/mpp/codec/dec/h265/h265d_parser.c +++ b/mpp/codec/dec/h265/h265d_parser.c @@ -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; } diff --git a/mpp/codec/dec/h265/h265d_parser2_syntax.c b/mpp/codec/dec/h265/h265d_parser2_syntax.c index d67c695a..84546e9b 100644 --- a/mpp/codec/dec/h265/h265d_parser2_syntax.c +++ b/mpp/codec/dec/h265/h265d_parser2_syntax.c @@ -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; diff --git a/mpp/codec/dec/h265/h265d_ps.c b/mpp/codec/dec/h265/h265d_ps.c index b7ad489d..096fad0c 100644 --- a/mpp/codec/dec/h265/h265d_ps.c +++ b/mpp/codec/dec/h265/h265d_ps.c @@ -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) { diff --git a/mpp/codec/dec/h265/h265d_refs.c b/mpp/codec/dec/h265/h265d_refs.c index e8f4fa33..f3eeda6e 100644 --- a/mpp/codec/dec/h265/h265d_refs.c +++ b/mpp/codec/dec/h265/h265d_refs.c @@ -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); diff --git a/mpp/codec/dec/h265/test/CMakeLists.txt b/mpp/codec/dec/h265/test/CMakeLists.txt index 2befb6ad..f48f8fb4 100644 --- a/mpp/codec/dec/h265/test/CMakeLists.txt +++ b/mpp/codec/dec/h265/test/CMakeLists.txt @@ -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 diff --git a/mpp/codec/dec/h265/test/h265d_parser_test.c b/mpp/codec/dec/h265/test/h265d_parser_test.c index 072a3195..bf53aaae 100644 --- a/mpp/codec/dec/h265/test/h265d_parser_test.c +++ b/mpp/codec/dec/h265/test/h265d_parser_test.c @@ -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) { diff --git a/mpp/codec/mpp_dec.cpp b/mpp/codec/mpp_dec.cpp index 69bd1700..2e0f58a7 100644 --- a/mpp/codec/mpp_dec.cpp +++ b/mpp/codec/mpp_dec.cpp @@ -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, diff --git a/mpp/hal/inc/mpp_hal.h b/mpp/hal/inc/mpp_hal.h index e24a378d..073c99b8 100644 --- a/mpp/hal/inc/mpp_hal.h +++ b/mpp/hal/inc/mpp_hal.h @@ -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;