[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; 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; SplitContext_t *s = (SplitContext_t*)sc;
s->index = 0; buf = s->buffer;
s->last_index = 0; size = s->buffer_size;
s->state = 0; s->fetch_timestamp = 1;
s->frame_start_found = 0; memset(s,0,sizeof(SplitContext_t));
s->overread = 0; s->buffer = buf;
s->overread_index = 0; s->buffer_size = size;
s->state64 = 0;
return MPP_OK; 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->height = sps->output_height;
s->h265dctx->pix_fmt = sps->pix_fmt; s->h265dctx->pix_fmt = sps->pix_fmt;
s->h265dctx->sample_aspect_ratio = sps->vui.sar; 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) if (sps->vui.video_signal_type_present_flag)
s->h265dctx->color_range = sps->vui.video_full_range_flag ? MPPCOL_RANGE_JPEG 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; si = di = i;
while (si + 2 < length) { while (si + 2 < length) {
// remove escapes (very rare 1:2^22) // 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++];
dst[di++] = src[si++]; dst[di++] = src[si++];
} else if (src[si] == 0 && src[si + 1] == 0) { } else if (src[si] == 0 && src[si + 1] == 0) {
@@ -1651,14 +1651,18 @@ MPP_RET h265d_parse(void *ctx, HalDecTask *task)
} }
return ret; return ret;
} }
mpp_err("decode poc = %d", s->poc); h265d_dbg(H265D_DBG_GLOBAL,"decode poc = %d", s->poc);
if (s->ref) { if (s->ref) {
h265d_parser2_syntax(h265dctx); h265d_parser2_syntax(h265dctx);
s->task->syntax.data = s->hal_pic_private; s->task->syntax.data = s->hal_pic_private;
s->task->syntax.number = 1; s->task->syntax.number = 1;
s->task->valid = 1; s->task->valid = 1;
if (s->eos) { if (s->eos) {
s->task->eos = 1; s->task->flags |= MPP_PACKET_FLAG_EOS;
}
}else{
if(s->eos){
h265d_flush(ctx);
} }
} }
#if 0 #if 0
@@ -1835,6 +1839,7 @@ MPP_RET h265d_reset(void *ctx)
H265dContext_t *h265dctx = (H265dContext_t *)ctx; H265dContext_t *h265dctx = (H265dContext_t *)ctx;
HEVCContext *s = (HEVCContext *)h265dctx->priv_data; HEVCContext *s = (HEVCContext *)h265dctx->priv_data;
mpp_hevc_flush_dpb(s); mpp_hevc_flush_dpb(s);
h265d_split_reset(h265dctx->split_cxt);
s->max_ra = INT_MAX; s->max_ra = INT_MAX;
return MPP_OK; 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->log2_parallel_merge_level_minus2 = pps->log2_parallel_merge_level - 2;
pp->CurrPicOrderCntVal = h->poc; pp->CurrPicOrderCntVal = h->poc;
mpp_err("fill RefPicList from the DPB"); // mpp_err("fill RefPicList from the DPB");
// fill RefPicList from the DPB // fill RefPicList from the DPB
for (i = 0, j = 0; i < MPP_ARRAY_ELEMS(pp->RefPicList); i++) { for (i = 0, j = 0; i < MPP_ARRAY_ELEMS(pp->RefPicList); i++) {
const HEVCFrame *frame = NULL; const HEVCFrame *frame = NULL;
@@ -270,7 +270,7 @@ RK_S32 h265d_syntax_fill_slice(void *ctx, RK_S32 input_index)
MppBuffer streambuf = NULL; MppBuffer streambuf = NULL;
RK_S32 i, count = 0; RK_S32 i, count = 0;
RK_U32 position = 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); 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 *ptr = (RK_U8 *)mpp_buffer_get_ptr(streambuf);
RK_U8 *current = ptr; RK_U8 *current = ptr;
@@ -303,7 +303,7 @@ RK_S32 h265d_syntax_fill_slice(void *ctx, RK_S32 input_index)
current += start_code_size; current += start_code_size;
position += start_code_size; position += start_code_size;
memcpy(current, h->nals[i].data, h->nals[i].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); fill_slice_short(&ctx_pic->slice_short[count], position, h->nals[i].size);
current += h->nals[i].size; current += h->nals[i].size;
position += 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); 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; start = sublayer_ordering_info ? 0 : sps->max_sub_layers - 1;
for (i = start; i < sps->max_sub_layers; i++) { for (i = start; i < sps->max_sub_layers; i++) {
READ_UE(gb, &sps->temporal_layer[i].max_dec_pic_buffering) ; 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) ; READ_UE(gb, &sps->log2_min_cb_size) ;
sps->log2_min_cb_size += 3; 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); 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); READ_UE(gb, &sps->log2_min_tb_size);
sps->log2_min_tb_size += 2; 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); 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_max_trafo_size = log2_diff_max_min_transform_block_size +
sps->log2_min_tb_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) { if (sps->log2_min_tb_size >= sps->log2_min_cb_size) {
mpp_err( "Invalid value for log2_min_tb_size"); mpp_err( "Invalid value for log2_min_tb_size");
ret = MPP_ERR_STREAM; ret = MPP_ERR_STREAM;
goto err; goto err;
} }
READ_UE(gb, &sps->max_transform_hierarchy_depth_inter); READ_UE(gb, &sps->max_transform_hierarchy_depth_inter);
READ_UE(gb, &sps->max_transform_hierarchy_depth_intra); 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; s->scaling_list_listen[sps_id] = 1;
} }
READ_ONEBIT(gb, &sps->amp_enabled_flag); READ_ONEBIT(gb, &sps->amp_enabled_flag);
READ_ONEBIT(gb, &sps->sao_enabled); READ_ONEBIT(gb, &sps->sao_enabled);
READ_ONEBIT(gb, &sps->pcm_enabled_flag); 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) { if (sps->pcm_enabled_flag) {
READ_BITS(gb, 4, &sps->pcm.bit_depth); READ_BITS(gb, 4, &sps->pcm.bit_depth);
sps->pcm.bit_depth += 1; 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->used_by_curr_pic_lt_sps_flag[i]);
} }
} }
READ_ONEBIT(gb, &sps->sps_temporal_mvp_enabled_flag); READ_ONEBIT(gb, &sps->sps_temporal_mvp_enabled_flag);
#ifdef REF_IDX_MFM #ifdef REF_IDX_MFM
if (s->nuh_layer_id > 0) if (s->nuh_layer_id > 0)
READ_ONEBIT(gb, &sps->set_mfm_enabled_flag); READ_ONEBIT(gb, &sps->set_mfm_enabled_flag);
#endif #endif
READ_ONEBIT(gb, &sps->sps_strong_intra_smoothing_enable_flag); READ_ONEBIT(gb, &sps->sps_strong_intra_smoothing_enable_flag);
sps->vui.sar.num = 0; sps->vui.sar.num = 0;
sps->vui.sar.den = 1; sps->vui.sar.den = 1;
READ_ONEBIT(gb, &vui_present); READ_ONEBIT(gb, &vui_present);
@@ -1703,6 +1723,10 @@ RK_S32 mpp_hevc_decode_nal_sps(HEVCContext *s)
s->h265dctx->height = sps->height; s->h265dctx->height = sps->height;
// Inferred parameters // Inferred parameters
sps->log2_ctb_size = sps->log2_min_cb_size + sps->log2_diff_max_min_coding_block_size; 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->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; 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); sps->max_transform_hierarchy_depth_intra);
goto err; 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)) { if (sps->log2_max_trafo_size > (RK_U32)MPP_MIN(sps->log2_ctb_size, 5)) {
mpp_err( mpp_err(
"max transform block size out of range: %d\n", "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) { if (s->h265dctx->compare_info != NULL) {
CurrentFameInf_t *info = (CurrentFameInf_t *)s->h265dctx->compare_info; CurrentFameInf_t *info = (CurrentFameInf_t *)s->h265dctx->compare_info;
HEVCSPS *openhevc_sps = (HEVCSPS *)&info->sps[sps_id]; HEVCSPS *openhevc_sps = (HEVCSPS *)&info->sps[sps_id];
mpp_log("compare sps in");
if (compare_sps(openhevc_sps, (HEVCSPS *)sps_buf) < 0) { if (compare_sps(openhevc_sps, (HEVCSPS *)sps_buf) < 0) {
mpp_err("compare sps with openhevc error found"); mpp_err("compare sps with openhevc error found");
mpp_assert(0); mpp_assert(0);
return -1; return -1;
} }
mpp_log("compare sps ok");
} }
#if 0 #if 0
if (s->h265dctx->debug & FF_DEBUG_BITSTREAM) { if (s->h265dctx->debug & FF_DEBUG_BITSTREAM) {

View File

@@ -88,7 +88,7 @@ static HEVCFrame *alloc_frame(HEVCContext *s)
if (ret != MPP_OK) { if (ret != MPP_OK) {
goto fail; 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_width(frame->frame, s->h265dctx->width);
mpp_frame_set_height(frame->frame, s->h265dctx->height); 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) add_executable(h265d_parser_test h265d_parser_test.c)
include_directories(.) include_directories(.)
link_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") set(OPENHEVCSO "${CMAKE_SOURCE_DIR}/mpp/codec/dec/h265/test")
add_library(openhevcwrapper SHARED IMPORTED) add_library(openhevcwrapper SHARED IMPORTED)
set_target_properties(openhevcwrapper PROPERTIES set_target_properties(openhevcwrapper PROPERTIES

View File

@@ -458,7 +458,6 @@ RK_S32 hevc_parser_test(ParserDemoCmdContext_t *cmd)
RK_U32 index; RK_U32 index;
ret = mpp_buf_slot_dequeue(slots, &index, QUEUE_DISPLAY); ret = mpp_buf_slot_dequeue(slots, &index, QUEUE_DISPLAY);
if (ret == MPP_OK) { if (ret == MPP_OK) {
mpp_log("get_display for ");
mpp_buf_slot_get_prop(slots, index, SLOT_FRAME, &frame); mpp_buf_slot_get_prop(slots, index, SLOT_FRAME, &frame);
if (frame) { if (frame) {
#if 1//def DUMP #if 1//def DUMP
@@ -492,7 +491,10 @@ RK_S32 hevc_parser_test(ParserDemoCmdContext_t *cmd)
if (-1 != curtask->input) { if (-1 != curtask->input) {
MppBuffer buffer = NULL; 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_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_err("mpp_buf_slot free for last packet %p",buffer);
mpp_buffer_put(buffer); mpp_buffer_put(buffer);
} }
@@ -502,13 +504,14 @@ RK_S32 hevc_parser_test(ParserDemoCmdContext_t *cmd)
RK_U32 index; RK_U32 index;
ret = mpp_buf_slot_dequeue(slots, &index, QUEUE_DISPLAY); ret = mpp_buf_slot_dequeue(slots, &index, QUEUE_DISPLAY);
if (ret == MPP_OK) { if (ret == MPP_OK) {
mpp_log("get_display for "); mpp_log("get_display for index = %d",index);
}
mpp_buf_slot_get_prop(slots, index, SLOT_FRAME, &frame); mpp_buf_slot_get_prop(slots, index, SLOT_FRAME, &frame);
if (frame) { if (frame) {
mpp_frame_deinit(&frame); mpp_frame_deinit(&frame);
} }
mpp_buf_slot_clr_flag(slots, index, SLOT_QUEUE_USE); mpp_buf_slot_clr_flag(slots, index, SLOT_QUEUE_USE);
}
} while (ret == MPP_OK); } while (ret == MPP_OK);
if (mpp_codex_ctx != NULL) { 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); hal_task_info_init(&task_local, MPP_CTX_DEC);
} }
if (NULL != task) { 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_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) if (buffer)
mpp_buffer_put(buffer); mpp_buffer_put(buffer);
} }
@@ -397,7 +400,7 @@ MPP_RET mpp_dec_init(MppDec **dec, MppCodingType coding)
MPP_CTX_DEC, MPP_CTX_DEC,
coding, coding,
HAL_MODE_LIBVPU, HAL_MODE_LIBVPU,
HAL_HARD_RKVDEC, HAL_RKVDEC,
frame_slots, frame_slots,
packet_slots, packet_slots,
NULL, NULL,

View File

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