[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 <herman.chen@rock-chips.com>
This commit is contained in:
Herman Chen
2020-05-15 10:59:01 +08:00
parent 0b4532c6d5
commit d95306a63b
7 changed files with 31 additions and 8 deletions

View File

@@ -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.
*/

View File

@@ -349,6 +349,7 @@ typedef struct MppEncPrepCfg_t {
*/
MppFrameFormat format;
MppFrameColorSpace color;
MppFrameColorRange range;
MppEncRotationCfg rotation;

View File

@@ -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 */ \

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;