From d95306a63bb097498a13ee8da7584c7b42f93cdf Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Fri, 15 May 2020 10:59:01 +0800 Subject: [PATCH] [mpp_enc]: Add color range support 1. Change interface for adding color range to MppPrepCfg. 2. Add option in MppEncCfg. 3. Add H.264 / H.265 sps support on full / limit range. IMPORTANT: the binary backward compatibility is broken since this commit. Change-Id: Ib68f29bab5c6d364fe8b612bd4dff2ecd5bc59cd Signed-off-by: Herman Chen --- inc/mpp_frame.h | 11 +++++++++++ inc/rk_venc_cmd.h | 1 + mpp/base/mpp_enc_cfg.cpp | 1 + mpp/codec/enc/h264/h264e_api_v2.c | 5 ++++- mpp/codec/enc/h264/h264e_sps.c | 5 +++++ mpp/codec/enc/h265/h265e_ps.c | 11 +++++------ mpp/codec/mpp_enc.cpp | 5 ++++- 7 files changed, 31 insertions(+), 8 deletions(-) diff --git a/inc/mpp_frame.h b/inc/mpp_frame.h index 6e9034d7..a74ce7cb 100644 --- a/inc/mpp_frame.h +++ b/inc/mpp_frame.h @@ -56,6 +56,17 @@ typedef enum { MPP_FRAME_RANGE_NB, ///< Not part of ABI } MppFrameColorRange; +typedef enum { + MPP_FRAME_VIDEO_FMT_COMPONEMT = 0, + MPP_FRAME_VIDEO_FMT_PAL = 1, + MPP_FRAME_VIDEO_FMT_NTSC = 2, + MPP_FRAME_VIDEO_FMT_SECAM = 3, + MPP_FRAME_VIDEO_FMT_MAC = 4, + MPP_FRAME_VIDEO_FMT_UNSPECIFIED = 5, + MPP_FRAME_VIDEO_FMT_RESERVED0 = 6, + MPP_FRAME_VIDEO_FMT_RESERVED1 = 7, +} MppFrameVideoFormat; + /* * Chromaticity coordinates of the source primaries. */ diff --git a/inc/rk_venc_cmd.h b/inc/rk_venc_cmd.h index fdcbdd4d..e664df44 100644 --- a/inc/rk_venc_cmd.h +++ b/inc/rk_venc_cmd.h @@ -349,6 +349,7 @@ typedef struct MppEncPrepCfg_t { */ MppFrameFormat format; MppFrameColorSpace color; + MppFrameColorRange range; MppEncRotationCfg rotation; diff --git a/mpp/base/mpp_enc_cfg.cpp b/mpp/base/mpp_enc_cfg.cpp index ee0630b1..12da2615 100644 --- a/mpp/base/mpp_enc_cfg.cpp +++ b/mpp/base/mpp_enc_cfg.cpp @@ -170,6 +170,7 @@ static const char *cfg_func_names[] = { ENTRY(prep, ver_stride, S32, RK_S32, MPP_ENC_PREP_CFG_CHANGE_INPUT, prep, ver_stride) \ ENTRY(prep, format, S32, MppFrameFormat, MPP_ENC_PREP_CFG_CHANGE_FORMAT, prep, format) \ ENTRY(prep, color, S32, MppFrameColorSpace,MPP_ENC_PREP_CFG_CHANGE_FORMAT, prep, color) \ + ENTRY(prep, range, S32, MppFrameColorRange,MPP_ENC_PREP_CFG_CHANGE_FORMAT, prep, range) \ ENTRY(prep, rotation, S32, MppEncRotationCfg, MPP_ENC_PREP_CFG_CHANGE_ROTATION, prep, rotation) \ ENTRY(prep, mirroring, S32, RK_S32, MPP_ENC_PREP_CFG_CHANGE_MIRRORING, prep, mirroring) \ /* codec coding config */ \ diff --git a/mpp/codec/enc/h264/h264e_api_v2.c b/mpp/codec/enc/h264/h264e_api_v2.c index aabda6dd..f0c77d21 100644 --- a/mpp/codec/enc/h264/h264e_api_v2.c +++ b/mpp/codec/enc/h264/h264e_api_v2.c @@ -202,8 +202,11 @@ static MPP_RET h264e_proc_prep_cfg(MppEncPrepCfg *dst, MppEncPrepCfg *src) if (change) { MppEncPrepCfg bak = *dst; - if (change & MPP_ENC_PREP_CFG_CHANGE_FORMAT) + if (change & MPP_ENC_PREP_CFG_CHANGE_FORMAT) { dst->format = src->format; + dst->color = src->color; + dst->range = src->range; + } if (change & MPP_ENC_PREP_CFG_CHANGE_ROTATION) dst->rotation = src->rotation; diff --git a/mpp/codec/enc/h264/h264e_sps.c b/mpp/codec/enc/h264/h264e_sps.c index b95cc918..05ae6732 100644 --- a/mpp/codec/enc/h264/h264e_sps.c +++ b/mpp/codec/enc/h264/h264e_sps.c @@ -164,6 +164,11 @@ MPP_RET h264e_sps_update(SynH264eSps *sps, MppEncCfgSet *cfg, MppDeviceId dev) vui->time_scale = rc->fps_out_num * 2; vui->num_units_in_tick = rc->fps_out_denorm; vui->fixed_frame_rate = !rc->fps_out_flex; + vui->vidformat = MPP_FRAME_VIDEO_FMT_UNSPECIFIED; + if (prep->range == MPP_FRAME_RANGE_JPEG) { + vui->signal_type_present = 1; + vui->fullrange = 1; + } return MPP_OK; } diff --git a/mpp/codec/enc/h265/h265e_ps.c b/mpp/codec/enc/h265/h265e_ps.c index 0d869188..4fc5ff35 100644 --- a/mpp/codec/enc/h265/h265e_ps.c +++ b/mpp/codec/enc/h265/h265e_ps.c @@ -211,8 +211,11 @@ MPP_RET h265e_set_sps(H265eCtx *ctx, H265eSps *sps, H265eVps *vps) sps->vui.m_overscanInfoPresentFlag = 0; sps->vui.m_overscanAppropriateFlag = 0; sps->vui.m_videoSignalTypePresentFlag = 0; - sps->vui.m_videoFormat = 5; - sps->vui.m_videoFullRangeFlag = 0; + sps->vui.m_videoFormat = MPP_FRAME_VIDEO_FMT_UNSPECIFIED; + if (prep->range == MPP_FRAME_RANGE_JPEG) { + sps->vui.m_videoFullRangeFlag = 1; + sps->vui.m_videoSignalTypePresentFlag = 1; + } sps->vui.m_colourDescriptionPresentFlag = 0; sps->vui.m_colourPrimaries = 2; sps->vui.m_transferCharacteristics = 2; @@ -237,10 +240,6 @@ MPP_RET h265e_set_sps(H265eCtx *ctx, H265eSps *sps, H265eVps *vps) sps->vui.m_aspectRatioInfoPresentFlag = !!vui->vui_aspect_ratio; sps->vui.m_aspectRatioIdc = vui->vui_aspect_ratio; } - if (vui->full_range) { - sps->vui.m_videoFullRangeFlag = 1; - sps->vui.m_videoSignalTypePresentFlag = 1; - } sps->vui.m_timingInfo.m_timingInfoPresentFlag = 1; sps->vui.m_timingInfo.m_numUnitsInTick = i_timebase_num; sps->vui.m_timingInfo.m_timeScale = i_timebase_den; diff --git a/mpp/codec/mpp_enc.cpp b/mpp/codec/mpp_enc.cpp index a8df4f5c..7c0450f2 100644 --- a/mpp/codec/mpp_enc.cpp +++ b/mpp/codec/mpp_enc.cpp @@ -734,8 +734,11 @@ void mpp_enc_update_prep_cfg(MppEncPrepCfg *dst, MppEncPrepCfg *src) if (change) { - if (change & MPP_ENC_PREP_CFG_CHANGE_FORMAT) + if (change & MPP_ENC_PREP_CFG_CHANGE_FORMAT) { dst->format = src->format; + dst->color = src->color; + dst->range = src->range; + } if (change & MPP_ENC_PREP_CFG_CHANGE_ROTATION) dst->rotation = src->rotation;