Merge pull request #3415 from jpark37/default-color-space

Unify color space settings as 709
This commit is contained in:
Jim
2020-09-07 13:29:44 -07:00
committed by GitHub
18 changed files with 85 additions and 60 deletions

View File

@@ -192,7 +192,7 @@ void DeckLinkDeviceInstance::SetupVideoFormat(DeckLinkDeviceMode *mode_)
#ifdef LOG_SETUP_VIDEO_FORMAT
LOG(LOG_INFO, "Setup video format: %s, %s, %s",
pixelFormat == bmdFormat8BitYUV ? "YUV" : "RGB",
activeColorSpace == VIDEO_CS_709 ? "BT.709" : "BT.601",
activeColorSpace == VIDEO_CS_601 ? "BT.601" : "BT.709",
colorRange == VIDEO_RANGE_FULL ? "full" : "limited");
#endif
}

View File

@@ -442,11 +442,11 @@ static inline video_colorspace get_colorspace(CMFormatDescriptionRef desc)
return VIDEO_CS_DEFAULT;
if (CFStringCompare(static_cast<CFStringRef>(matrix),
kCVImageBufferYCbCrMatrix_ITU_R_709_2,
kCVImageBufferYCbCrMatrix_ITU_R_601_4,
0) == kCFCompareEqualTo)
return VIDEO_CS_709;
return VIDEO_CS_601;
return VIDEO_CS_601;
return VIDEO_CS_709;
}
static inline bool update_colorspace(av_capture *capture,

View File

@@ -431,12 +431,12 @@ static bool init_encoder(struct nvenc_data *enc, obs_data_t *settings)
vui_params->colourDescriptionPresentFlag = 1;
switch (voi->colorspace) {
case VIDEO_CS_DEFAULT:
case VIDEO_CS_601:
vui_params->colourPrimaries = 6;
vui_params->transferCharacteristics = 6;
vui_params->colourMatrix = 6;
break;
case VIDEO_CS_DEFAULT:
case VIDEO_CS_709:
vui_params->colourPrimaries = 1;
vui_params->transferCharacteristics = 1;

View File

@@ -160,12 +160,12 @@ static void add_video_encoder_params(struct ffmpeg_muxer *stream,
enum AVColorTransferCharacteristic trc = AVCOL_TRC_UNSPECIFIED;
enum AVColorSpace spc = AVCOL_SPC_UNSPECIFIED;
switch (info->colorspace) {
case VIDEO_CS_DEFAULT:
case VIDEO_CS_601:
pri = AVCOL_PRI_SMPTE170M;
trc = AVCOL_TRC_SMPTE170M;
spc = AVCOL_SPC_SMPTE170M;
break;
case VIDEO_CS_DEFAULT:
case VIDEO_CS_709:
pri = AVCOL_PRI_BT709;
trc = AVCOL_TRC_BT709;

View File

@@ -241,12 +241,12 @@ static bool nvenc_update(void *data, obs_data_t *settings)
enc->context->max_b_frames = bf;
switch (info.colorspace) {
case VIDEO_CS_DEFAULT:
case VIDEO_CS_601:
enc->context->color_trc = AVCOL_TRC_SMPTE170M;
enc->context->color_primaries = AVCOL_PRI_SMPTE170M;
enc->context->colorspace = AVCOL_SPC_SMPTE170M;
break;
case VIDEO_CS_DEFAULT:
case VIDEO_CS_709:
enc->context->color_trc = AVCOL_TRC_BT709;
enc->context->color_primaries = AVCOL_PRI_BT709;

View File

@@ -1088,11 +1088,11 @@ static bool try_connect(struct ffmpeg_output *output)
config.color_range = voi->range == VIDEO_RANGE_FULL ? AVCOL_RANGE_JPEG
: AVCOL_RANGE_MPEG;
switch (voi->colorspace) {
case VIDEO_CS_DEFAULT:
case VIDEO_CS_601:
config.color_primaries = AVCOL_PRI_SMPTE170M;
config.color_trc = AVCOL_TRC_SMPTE170M;
break;
case VIDEO_CS_DEFAULT:
case VIDEO_CS_709:
config.color_primaries = AVCOL_PRI_BT709;
config.color_trc = AVCOL_TRC_BT709;
@@ -1104,18 +1104,9 @@ static bool try_connect(struct ffmpeg_output *output)
}
if (format_is_yuv(voi->format)) {
switch (voi->colorspace) {
case VIDEO_CS_DEFAULT:
case VIDEO_CS_601:
config.colorspace = AVCOL_SPC_SMPTE170M;
break;
case VIDEO_CS_709:
config.colorspace = AVCOL_SPC_BT709;
break;
case VIDEO_CS_SRGB:
config.colorspace = AVCOL_SPC_BT709;
break;
}
config.colorspace = (voi->colorspace == VIDEO_CS_601)
? AVCOL_SPC_SMPTE170M
: AVCOL_SPC_BT709;
} else {
config.colorspace = AVCOL_SPC_RGB;
}

View File

@@ -244,13 +244,29 @@ static bool vaapi_update(void *data, obs_data_t *settings)
enc->context->time_base = (AVRational){voi->fps_den, voi->fps_num};
enc->context->pix_fmt = obs_to_ffmpeg_video_format(info.format);
enc->context->colorspace = info.colorspace == VIDEO_CS_709
? AVCOL_SPC_BT709
: AVCOL_SPC_BT470BG;
enc->context->color_range = info.range == VIDEO_RANGE_FULL
? AVCOL_RANGE_JPEG
: AVCOL_RANGE_MPEG;
switch (info.colorspace) {
case VIDEO_CS_601:
enc->context->color_trc = AVCOL_TRC_SMPTE170M;
enc->context->color_primaries = AVCOL_PRI_SMPTE170M;
enc->context->colorspace = AVCOL_SPC_SMPTE170M;
break;
case VIDEO_CS_DEFAULT:
case VIDEO_CS_709:
enc->context->color_trc = AVCOL_TRC_BT709;
enc->context->color_primaries = AVCOL_PRI_BT709;
enc->context->colorspace = AVCOL_SPC_BT709;
break;
case VIDEO_CS_SRGB:
enc->context->color_trc = AVCOL_TRC_IEC61966_2_1;
enc->context->color_primaries = AVCOL_PRI_BT709;
enc->context->colorspace = AVCOL_SPC_BT709;
break;
}
if (keyint_sec > 0) {
enc->context->gop_size =
keyint_sec * voi->fps_num / voi->fps_den;

View File

@@ -468,12 +468,12 @@ static void update_params(struct obs_x264 *obsx264, obs_data_t *settings,
const char *transfer = NULL;
const char *colmatrix = NULL;
switch (info.colorspace) {
case VIDEO_CS_DEFAULT:
case VIDEO_CS_601:
colorprim = smpte170m;
transfer = smpte170m;
colmatrix = smpte170m;
break;
case VIDEO_CS_DEFAULT:
case VIDEO_CS_709:
colorprim = bt709;
transfer = bt709;

View File

@@ -270,6 +270,23 @@ bool ffmpeg_decode_audio(struct ffmpeg_decode *decode, uint8_t *data,
return true;
}
static enum video_colorspace
convert_color_space(enum AVColorSpace s, enum AVColorTransferCharacteristic trc)
{
switch (s) {
case AVCOL_SPC_BT709:
return (trc == AVCOL_TRC_IEC61966_2_1) ? VIDEO_CS_SRGB
: VIDEO_CS_709;
case AVCOL_SPC_FCC:
case AVCOL_SPC_BT470BG:
case AVCOL_SPC_SMPTE170M:
case AVCOL_SPC_SMPTE240M:
return VIDEO_CS_601;
default:
return VIDEO_CS_DEFAULT;
}
}
bool ffmpeg_decode_video(struct ffmpeg_decode *decode, uint8_t *data,
size_t size, long long *ts,
enum video_range_type range,
@@ -344,21 +361,22 @@ bool ffmpeg_decode_video(struct ffmpeg_decode *decode, uint8_t *data,
: VIDEO_RANGE_PARTIAL;
}
if (range != frame->range) {
const bool success = video_format_get_parameters(
VIDEO_CS_601, range, frame->color_matrix,
frame->color_range_min, frame->color_range_max);
if (!success) {
blog(LOG_ERROR,
"Failed to get video format "
"parameters for video format %u",
VIDEO_CS_601);
return false;
}
const enum video_colorspace cs = convert_color_space(
decode->frame->colorspace, decode->frame->color_trc);
frame->range = range;
const bool success = video_format_get_parameters(
cs, range, frame->color_matrix, frame->color_range_min,
frame->color_range_max);
if (!success) {
blog(LOG_ERROR,
"Failed to get video format "
"parameters for video format %u",
cs);
return false;
}
frame->range = range;
*ts = decode->frame->pkt_pts;
frame->width = decode->frame->width;

View File

@@ -1072,11 +1072,11 @@ DShowInput::GetColorSpace(obs_data_t *settings) const
if (astrcmpi(space, "709") == 0)
return VIDEO_CS_709;
else if (astrcmpi(space, "601") == 0)
if (astrcmpi(space, "601") == 0)
return VIDEO_CS_601;
else
return (videoConfig.format == VideoFormat::HDYC) ? VIDEO_CS_709
: VIDEO_CS_601;
return VIDEO_CS_DEFAULT;
}
inline enum video_range_type