From f658df00fb7fa04e6e1a40c131388d741ab5c54d Mon Sep 17 00:00:00 2001 From: DingWei Date: Fri, 8 Jul 2016 10:15:05 +0000 Subject: [PATCH] [h264d] add yuv422 format support. git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@993 6e48237b-75ef-9749-8fc9-41990f28c85a --- mpp/base/mpp_buf_slot.cpp | 13 +++++++------ mpp/base/mpp_frame.cpp | 1 + mpp/codec/dec/h264/h264d_init.c | 7 +++++++ mpp/codec/dec/h264/h264d_parse.c | 1 - mpp/codec/dec/h264/h264d_sps.c | 16 ++++++---------- mpp/codec/mpp_dec.cpp | 7 +++++-- mpp/hal/rkdec/h264d/hal_h264d_rkv_pkt.c | 4 ++-- mpp/hal/rkdec/h264d/hal_h264d_rkv_reg.c | 23 ++++++++++++++++++++--- mpp/legacy/vpu_api_legacy.cpp | 20 +++++++++++++++----- 9 files changed, 63 insertions(+), 29 deletions(-) diff --git a/mpp/base/mpp_buf_slot.cpp b/mpp/base/mpp_buf_slot.cpp index 78f618f8..828d6afb 100644 --- a/mpp/base/mpp_buf_slot.cpp +++ b/mpp/base/mpp_buf_slot.cpp @@ -239,7 +239,7 @@ static void generate_info_set(MppBufSlotsImpl *impl, MppFrame frame, RK_U32 forc (impl->hal_hor_align(width)); RK_U32 hal_ver_stride = (codec_ver_stride) ? (impl->hal_ver_align(codec_ver_stride)) : - (impl->hal_ver_align(height)); + (impl->hal_ver_align(height)); if (force_default_align) { hal_hor_stride = codec_hor_stride; hal_ver_stride = codec_ver_stride; @@ -251,6 +251,7 @@ static void generate_info_set(MppBufSlotsImpl *impl, MppFrame frame, RK_U32 forc mpp_frame_set_width(impl->info_set, width); mpp_frame_set_height(impl->info_set, height); + mpp_frame_set_fmt(impl->info_set, mpp_frame_get_fmt(frame)); mpp_frame_set_hor_stride(impl->info_set, hal_hor_stride); mpp_frame_set_ver_stride(impl->info_set, hal_ver_stride); mpp_frame_set_buf_size(impl->info_set, size); @@ -806,7 +807,7 @@ MPP_RET mpp_buf_slot_set_prop(MppBufSlots slots, RK_S32 index, SlotPropType type * 1. buffer size change * this case need to reset buffer group and commit buffer with new size * 2. display info change - * if only width/height is change and buffer do not need to be reset + * if only width/height/fmt is change and buffer do not need to be reset * only display info change is need */ generate_info_set(impl, frame, 0); @@ -815,10 +816,10 @@ MPP_RET mpp_buf_slot_set_prop(MppBufSlots slots, RK_S32 index, SlotPropType type #ifdef RKPLATFORM MppFrameImpl *old = (MppFrameImpl *)impl->info; mpp_log("info change found\n"); - mpp_log("old width %4d height %4d stride hor %4d ver %4d\n", - old->width, old->height, old->hor_stride, old->ver_stride); - mpp_log("new width %4d height %4d stride hor %4d ver %4d\n", - dst->width, dst->height, dst->hor_stride, dst->ver_stride); + mpp_log("old width %4d height %4d stride hor %4d ver %4d fmt %4d\n", + old->width, old->height, old->hor_stride, old->ver_stride, old->fmt); + mpp_log("new width %4d height %4d stride hor %4d ver %4d fmt %4d\n", + dst->width, dst->height, dst->hor_stride, dst->ver_stride, dst->fmt); #endif // info change found here } diff --git a/mpp/base/mpp_frame.cpp b/mpp/base/mpp_frame.cpp index 7b2178f7..8ee04ae7 100644 --- a/mpp/base/mpp_frame.cpp +++ b/mpp/base/mpp_frame.cpp @@ -118,6 +118,7 @@ MPP_RET mpp_frame_info_cmp(MppFrame frame0, MppFrame frame1) (f0->height == f1->height) && (f0->hor_stride == f1->hor_stride) && (f0->ver_stride == f1->ver_stride) && + (f0->fmt == f1->fmt) && (f0->buf_size == f1->buf_size) && (f0->color_range == f1->color_range) && (f0->color_primaries == f1->color_primaries) && diff --git a/mpp/codec/dec/h264/h264d_init.c b/mpp/codec/dec/h264/h264d_init.c index 8f8237fe..60fabc57 100644 --- a/mpp/codec/dec/h264/h264d_init.c +++ b/mpp/codec/dec/h264/h264d_init.c @@ -377,6 +377,11 @@ __FAILED: return ret; } +static RK_U32 rkv_len_align_422(RK_U32 val) +{ + return ((5 * MPP_ALIGN(val, 16)) / 2); +} + static MPP_RET dpb_mark_malloc(H264dVideoCtx_t *p_Vid, H264_StorePic_t *dec_pic) { RK_U8 idx = 0; @@ -411,8 +416,10 @@ static MPP_RET dpb_mark_malloc(H264dVideoCtx_t *p_Vid, H264_StorePic_t *dec_pic mpp_frame_set_fmt(mframe, MPP_FMT_YUV420SP_10BIT); } else if ((YUV422 == p_Vid->yuv_format) && (8 == p_Vid->bit_depth_luma)) { mpp_frame_set_fmt(mframe, MPP_FMT_YUV422SP); + mpp_slots_set_prop(p_Dec->frame_slots, SLOTS_LEN_ALIGN, rkv_len_align_422); } else if ((YUV422 == p_Vid->yuv_format) && (10 == p_Vid->bit_depth_luma)) { mpp_frame_set_fmt(mframe, MPP_FMT_YUV422SP_10BIT); + mpp_slots_set_prop(p_Dec->frame_slots, SLOTS_LEN_ALIGN, rkv_len_align_422); } hor_stride = ((p_Vid->width * p_Vid->bit_depth_luma + 127) & (~127)) / 8; ver_stride = p_Vid->height; diff --git a/mpp/codec/dec/h264/h264d_parse.c b/mpp/codec/dec/h264/h264d_parse.c index 4d311876..4403eddf 100644 --- a/mpp/codec/dec/h264/h264d_parse.c +++ b/mpp/codec/dec/h264/h264d_parse.c @@ -593,7 +593,6 @@ MPP_RET parse_prepare(H264dInputCtx_t *p_Inp, H264dCurCtx_t *p_Cur) p_strm->nalu_len -= START_PREFIX_3BYTE; while (p_strm->nalu_buf[p_strm->nalu_len - 1] == 0x00) { p_strm->nalu_len--; - break; } p_Dec->nalu_ret = EndOfNalu; FUN_CHECK(ret = store_cur_nalu(p_Cur, &p_Dec->p_Cur->strm, p_Dec->dxva_ctx)); diff --git a/mpp/codec/dec/h264/h264d_sps.c b/mpp/codec/dec/h264/h264d_sps.c index 05776bb6..341a9c3f 100644 --- a/mpp/codec/dec/h264/h264d_sps.c +++ b/mpp/codec/dec/h264/h264d_sps.c @@ -179,16 +179,12 @@ static MPP_RET parser_sps(BitReadCtx_t *p_bitctx, H264_SPS_t *cur_sps, H264_DecC || cur_sps->profile_idc == 86 || cur_sps->profile_idc == 118 || cur_sps->profile_idc == 128 || cur_sps->profile_idc == 138) { READ_UE(p_bitctx, &cur_sps->chroma_format_idc, "chroma_format_idc"); - ASSERT(cur_sps->chroma_format_idc < 4); - //if (cur_sps->chroma_format_idc >= 3) { - // H264D_ERR("ERROR: Not support chroma_format_idc=%d.", cur_sps->chroma_format_idc); - // p_Dec->err_ctx.err_flag |= VPU_FRAME_ERR_UNSUPPORT; - // goto __FAILED; - //} - //if (cur_sps->chroma_format_idc == 3) { - // READ_ONEBIT(p_bitctx, &cur_sps->separate_colour_plane_flag, "separate_colour_plane_flag"); - // LogError(p_bitctx->ctx, "Not support YUV444 format current."); - //} + mpp_log_f("chroma_format_idc=%d \n", cur_sps->chroma_format_idc); + if (cur_sps->chroma_format_idc > 2) { + H264D_ERR("ERROR: Not support chroma_format_idc=%d.", cur_sps->chroma_format_idc); + p_Dec->errctx.un_spt_flag = VPU_FRAME_ERR_UNSUPPORT; + goto __FAILED; + } READ_UE(p_bitctx, &cur_sps->bit_depth_luma_minus8, "bit_depth_luma_minus8"); ASSERT(cur_sps->bit_depth_luma_minus8 < 7); READ_UE(p_bitctx, &cur_sps->bit_depth_chroma_minus8, "bit_depth_chroma_minus8"); diff --git a/mpp/codec/mpp_dec.cpp b/mpp/codec/mpp_dec.cpp index 35133062..f22908a0 100644 --- a/mpp/codec/mpp_dec.cpp +++ b/mpp/codec/mpp_dec.cpp @@ -718,6 +718,7 @@ void *mpp_dec_hal_thread(void *data) mpp_frame_set_info_change(info_frame, 1); mpp_frame_set_errinfo(info_frame, 0); mpp_put_frame(mpp, info_frame); + hal_task_hnd_set_status(task, TASK_IDLE); task = NULL; mpp->mThreadCodec->signal(); @@ -969,6 +970,8 @@ MPP_RET mpp_dec_control(MppDec *dec, MpiCmd cmd, void *param) mpp_err_f("found NULL input dec %p\n", dec); return MPP_ERR_NULL_PTR; } + parser_control(dec->parser, cmd, param); + mpp_hal_control(dec->hal, cmd, param); switch (cmd) { case MPP_CODEC_SET_FRAME_INFO : { @@ -979,6 +982,7 @@ MPP_RET mpp_dec_control(MppDec *dec, MpiCmd cmd, void *param) mpp_frame_set_height(frame, p->ImgHeight); mpp_frame_set_hor_stride(frame, p->ImgHorStride); mpp_frame_set_ver_stride(frame, p->ImgVerStride); + mpp_frame_set_fmt(frame, (MppFrameFormat)p->CodecType); mpp_log_f("setting default w %4d h %4d\n", p->ImgWidth, p->ImgHeight); mpp_slots_set_prop(dec->frame_slots, SLOTS_FRAME_INFO, frame); mpp_frame_deinit(&frame); @@ -991,8 +995,7 @@ MPP_RET mpp_dec_control(MppDec *dec, MpiCmd cmd, void *param) } break; } - parser_control(dec->parser, cmd, param); - mpp_hal_control(dec->hal, cmd, param); + return MPP_OK; } diff --git a/mpp/hal/rkdec/h264d/hal_h264d_rkv_pkt.c b/mpp/hal/rkdec/h264d/hal_h264d_rkv_pkt.c index 94af5bbb..cc1447cc 100644 --- a/mpp/hal/rkdec/h264d/hal_h264d_rkv_pkt.c +++ b/mpp/hal/rkdec/h264d/hal_h264d_rkv_pkt.c @@ -396,9 +396,9 @@ void rkv_generate_regs(void *hal, HalTaskInfo *task, FifoCtx_t *pkt) if (pp->chroma_format_idc == 0) { //!< Y400 yuv_virstride = y_virstride; } else if (pp->chroma_format_idc == 1) { //!< Y420 - yuv_virstride += y_virstride + y_virstride / 2; + yuv_virstride = y_virstride + y_virstride / 2; } else if (pp->chroma_format_idc == 2) { //!< Y422 - yuv_virstride += 2 * y_virstride; + yuv_virstride = 2 * y_virstride; } p_regs->swreg3_picpar.sw_y_hor_virstride = hor_virstride / 16; p_regs->swreg3_picpar.sw_uv_hor_virstride = hor_virstride / 16; diff --git a/mpp/hal/rkdec/h264d/hal_h264d_rkv_reg.c b/mpp/hal/rkdec/h264d/hal_h264d_rkv_reg.c index f9231381..8496cc87 100644 --- a/mpp/hal/rkdec/h264d/hal_h264d_rkv_reg.c +++ b/mpp/hal/rkdec/h264d/hal_h264d_rkv_reg.c @@ -21,6 +21,7 @@ #include #include +#include "vpu_api.h" #include "rk_type.h" #include "mpp_err.h" #include "mpp_mem.h" @@ -208,6 +209,12 @@ static RK_U32 rkv_len_align(RK_U32 val) return (2 * MPP_ALIGN(val, 16)); } +static RK_U32 rkv_len_align_422(RK_U32 val) +{ + return ((5 * MPP_ALIGN(val, 16)) / 2); +} + + static void rkv_h264d_hal_dump(H264dHalCtx_t *p_hal, RK_U32 dump_type) { if (rkv_h264d_hal_debug & H264D_DBG_ERR_DUMP) { @@ -532,10 +539,20 @@ MPP_RET rkv_h264d_control(void *hal, RK_S32 cmd_type, void *param) INP_CHECK(ret, NULL == p_hal); FunctionIn(p_hal->logctx.parr[RUN_HAL]); + switch ((MpiCmd)cmd_type) + { + case MPP_CODEC_SET_FRAME_INFO: { + VPU_GENERIC *p = (VPU_GENERIC *)param; + if (p->CodecType == MPP_FMT_YUV422SP){ + mpp_slots_set_prop(p_hal->frame_slots, SLOTS_LEN_ALIGN, rkv_len_align_422); + mpp_log_f("control format YUV422SP \n"); + } + break; + } - - - + default: + break; + } FunctionOut(p_hal->logctx.parr[RUN_HAL]); (void)hal; diff --git a/mpp/legacy/vpu_api_legacy.cpp b/mpp/legacy/vpu_api_legacy.cpp index 57362ab6..4fca8ee7 100644 --- a/mpp/legacy/vpu_api_legacy.cpp +++ b/mpp/legacy/vpu_api_legacy.cpp @@ -85,6 +85,7 @@ RK_S32 VpuApi::init(VpuCodecContext *ctx, RK_U8 *extraData, RK_U32 extra_size) mpp_err("found invalid context input"); return MPP_ERR_NULL_PTR; } + ret = mpp_init(mpp_ctx, type, (MppCodingType)ctx->videoCoding); if (ret) { mpp_err_f(" init error. \n"); @@ -203,11 +204,13 @@ RK_S32 VpuApi:: decode_getoutframe(DecoderOut_t *aDecOut) } case MPP_FMT_YUV422SP: { vframe->ColorType = VPU_OUTPUT_FORMAT_YUV422; + vframe->OutputWidth = 0x10; break; } case MPP_FMT_YUV422SP_10BIT: { vframe->ColorType = VPU_OUTPUT_FORMAT_YUV422; vframe->ColorType |= VPU_OUTPUT_FORMAT_BIT_10; + vframe->OutputWidth = 0x23; break; } default: @@ -246,7 +249,7 @@ RK_S32 VpuApi:: decode_getoutframe(DecoderOut_t *aDecOut) pdes[2 * j + 1] = psrc[2 * j * step + 1]; } pdes += img_w; - psrc += step * vframe->FrameWidth; + psrc += step * vframe->FrameWidth * ((mpp_frame_get_fmt(mframe) > MPP_FMT_YUV420SP_10BIT) ? 2 : 1); } fwrite(fp_buf, 1, img_w * img_h * 3 / 2, fp); if (vpu_api_debug & VPU_API_DBG_DUMP_LOG) { @@ -359,17 +362,23 @@ RK_S32 VpuApi::control(VpuCodecContext *ctx, VPU_API_CMD cmd, void *param) break; } case VPU_API_SET_DEFAULT_WIDTH_HEIGH: { + RK_U32 ImgWidth = 0; VPU_GENERIC *p = (VPU_GENERIC *)param; - RK_U32 ImgWidth = p->ImgWidth; mpicmd = MPP_CODEC_SET_FRAME_INFO; /**hightest of p->ImgWidth bit show current dec bitdepth * 0 - 8bit * 1 - 10bit **/ - if (((p->ImgWidth & 0x80000000) >> 31)) { - p->ImgWidth = (p->ImgWidth & 0x7FFFFFFF); - ImgWidth = (p->ImgWidth * 10) >> 3; + if (p->ImgWidth & 0x80000000) { + + ImgWidth = ((p->ImgWidth & 0xFFFF) * 10) >> 3; + p->CodecType = (p->ImgWidth & 0x40000000) ? MPP_FMT_YUV422SP_10BIT : MPP_FMT_YUV420SP_10BIT; } + else { + ImgWidth = (p->ImgWidth & 0xFFFF); + p->CodecType = (p->ImgWidth & 0x40000000) ? MPP_FMT_YUV422SP : MPP_FMT_YUV420SP; + } + p->ImgWidth = (p->ImgWidth & 0xFFFF); if (ctx->videoCoding == OMX_RK_VIDEO_CodingHEVC) { p->ImgHorStride = hevc_ver_align_256_odd(ImgWidth); p->ImgVerStride = hevc_ver_align_8(p->ImgHeight); @@ -377,6 +386,7 @@ RK_S32 VpuApi::control(VpuCodecContext *ctx, VPU_API_CMD cmd, void *param) p->ImgHorStride = default_align_16(ImgWidth); p->ImgVerStride = default_align_16(p->ImgHeight); } + break; } case VPU_API_SET_INFO_CHANGE: {