diff --git a/inc/mpp_frame.h b/inc/mpp_frame.h index 9d933b3c..f32aa422 100644 --- a/inc/mpp_frame.h +++ b/inc/mpp_frame.h @@ -24,12 +24,21 @@ typedef void* MppFrame; /* * bit definition for mode flag in MppFrame */ +/* progressive frame */ #define MPP_FRAME_FLAG_FRAME (0x00000000) +/* top field only */ #define MPP_FRAME_FLAG_TOP_FIELD (0x00000001) +/* bottom field only */ #define MPP_FRAME_FLAG_BOT_FIELD (0x00000002) +/* paired field */ #define MPP_FRAME_FLAG_PAIRED_FIELD (MPP_FRAME_FLAG_TOP_FIELD|MPP_FRAME_FLAG_BOT_FIELD) -#define MPP_FRAME_FLAG_DEINTERLACED (0x00000004) -#define MPP_FRAME_FLAG_TOP_FIRST (0x00000008) +/* paired field with field order of top first */ +#define MPP_FRAME_FLAG_TOP_FIRST (0x00000004) +/* paired field with field order of bottom first */ +#define MPP_FRAME_FLAG_BOT_FIRST (0x00000008) +/* paired field with unknown field order (MBAFF) */ +#define MPP_FRAME_FLAG_DEINTERLACED (MPP_FRAME_FLAG_TOP_FIRST|MPP_FRAME_FLAG_BOT_FIRST) +#define MPP_FRAME_FLAG_FIELD_ORDER_MASK (0x0000000C) // for multiview stream #define MPP_FRAME_FLAG_VIEW_ID_MASK (0x000000f0) @@ -203,8 +212,8 @@ MppFrameColorSpace mpp_frame_get_colorspace(const MppFrame frame); void mpp_frame_set_colorspace(MppFrame frame, MppFrameColorSpace colorspace); MppFrameChromaLocation mpp_frame_get_chroma_location(const MppFrame frame); void mpp_frame_set_chroma_location(MppFrame frame, MppFrameChromaLocation chroma_location); -void mpp_frame_set_fmt(MppFrame frame, MppFrameFormat fmt); MppFrameFormat mpp_frame_get_fmt(MppFrame frame); +void mpp_frame_set_fmt(MppFrame frame, MppFrameFormat fmt); /* diff --git a/mpp/codec/dec/m2v/m2vd_parser.c b/mpp/codec/dec/m2v/m2vd_parser.c index cd667994..0e89d3e5 100644 --- a/mpp/codec/dec/m2v/m2vd_parser.c +++ b/mpp/codec/dec/m2v/m2vd_parser.c @@ -1084,7 +1084,7 @@ MPP_RET m2vd_alloc_frame(M2VDParserContext *ctx) ctx->seq_head.decode_height = (ctx->seq_head.decode_height + 15) & (~15); ctx->seq_head.decode_width = (ctx->seq_head.decode_width + 15) & (~15); if (ctx->frame_cur->slot_index == 0xff) { - RK_S32 frametype = 0; + RK_U32 frametype = 0; mpp_frame_set_width(ctx->frame_cur->f, ctx->display_width); mpp_frame_set_height(ctx->frame_cur->f, ctx->display_height); mpp_frame_set_hor_stride(ctx->frame_cur->f, ctx->display_width); @@ -1095,15 +1095,17 @@ MPP_RET m2vd_alloc_frame(M2VDParserContext *ctx) mpp_buf_slot_set_prop(ctx->frame_slots, ctx->frame_cur->slot_index, SLOT_FRAME, ctx->frame_cur->f); mpp_buf_slot_set_flag(ctx->frame_slots, ctx->frame_cur->slot_index, SLOT_CODEC_USE); mpp_buf_slot_set_flag(ctx->frame_slots, ctx->frame_cur->slot_index, SLOT_HAL_OUTPUT); - mpp_frame_set_mode(ctx->frame_cur->f, 0); ctx->frame_cur->flags = M2V_OUT_FLAG; - frametype = 1 - ctx->seq_ext_head.progressive_sequence; - if (frametype) { - if (!ctx->pic_code_ext_head.top_field_first) { - frametype = 2; - mpp_frame_set_mode(ctx->frame_cur->f, (RK_U32)frametype); - } + if (ctx->seq_ext_head.progressive_sequence) { + frametype = MPP_FRAME_FLAG_FRAME; + } else { + frametype = MPP_FRAME_FLAG_PAIRED_FIELD; + if (ctx->pic_code_ext_head.top_field_first) + frametype |= MPP_FRAME_FLAG_TOP_FIRST; + else + frametype |= MPP_FRAME_FLAG_BOT_FIRST; } + mpp_frame_set_mode(ctx->frame_cur->f, frametype); } } //alloc frame space diff --git a/mpp/codec/dec/mpg4/mpg4d_parser.c b/mpp/codec/dec/mpg4/mpg4d_parser.c index e55c0cc0..d12242ac 100644 --- a/mpp/codec/dec/mpg4/mpg4d_parser.c +++ b/mpp/codec/dec/mpg4/mpg4d_parser.c @@ -1458,9 +1458,11 @@ MPP_RET mpp_mpg4_parser_setup_hal_output(Mpg4dParser ctx, RK_S32 *output) mpp_frame_set_pts(frame, p->pts); if (hdr_curr->vol.interlacing) { - frame_mode = (hdr_curr->vop.top_field_first) ? - (MPP_FRAME_FLAG_TOP_FIELD) : - (MPP_FRAME_FLAG_BOT_FIELD); + frame_mode = MPP_FRAME_FLAG_PAIRED_FIELD; + if (hdr_curr->vop.top_field_first) + frame_mode |= MPP_FRAME_FLAG_TOP_FIRST; + else + frame_mode |= MPP_FRAME_FLAG_BOT_FIRST; } mpp_frame_set_mode(frame, frame_mode); diff --git a/mpp/legacy/vpu_api_legacy.cpp b/mpp/legacy/vpu_api_legacy.cpp index 95d3c5df..9ea0bb10 100644 --- a/mpp/legacy/vpu_api_legacy.cpp +++ b/mpp/legacy/vpu_api_legacy.cpp @@ -178,13 +178,25 @@ RK_S32 VpuApiLegacy:: decode_getoutframe(DecoderOut_t *aDecOut) MppBuffer buf = NULL; RK_U64 pts = 0; RK_U32 fd = 0; + RK_U32 mode = 0; void* ptr = NULL; aDecOut->size = sizeof(VPU_FRAME); vframe->DisplayWidth = mpp_frame_get_width(mframe); vframe->DisplayHeight = mpp_frame_get_height(mframe); vframe->FrameWidth = mpp_frame_get_hor_stride(mframe); vframe->FrameHeight = mpp_frame_get_ver_stride(mframe); - vframe->FrameType = mpp_frame_get_mode(mframe); + mode = mpp_frame_get_mode(mframe); + if (mode == MPP_FRAME_FLAG_FRAME) + vframe->FrameType = 0; + else { + RK_U32 field_order = mode & MPP_FRAME_FLAG_FIELD_ORDER_MASK; + if (field_order == MPP_FRAME_FLAG_TOP_FIRST) + vframe->FrameType = 1; + else if (field_order == MPP_FRAME_FLAG_BOT_FIRST) + vframe->FrameType = 2; + else if (field_order == MPP_FRAME_FLAG_DEINTERLACED) + vframe->FrameType = 4; + } vframe->ErrorInfo = mpp_frame_get_errinfo(mframe) | mpp_frame_get_discard(mframe); pts = mpp_frame_get_pts(mframe); aDecOut->timeUs = pts;