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
commit 86147d9719
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 85 additions and 60 deletions

View file

@ -1392,7 +1392,7 @@ bool OBSBasic::InitBasicConfigDefaults()
config_set_default_uint(basicConfig, "Video", "FPSDen", 1);
config_set_default_string(basicConfig, "Video", "ScaleType", "bicubic");
config_set_default_string(basicConfig, "Video", "ColorFormat", "NV12");
config_set_default_string(basicConfig, "Video", "ColorSpace", "sRGB");
config_set_default_string(basicConfig, "Video", "ColorSpace", "709");
config_set_default_string(basicConfig, "Video", "ColorRange",
"Partial");

View file

@ -112,12 +112,18 @@ static inline enum speaker_layout convert_speaker_layout(uint8_t channels)
static inline enum video_colorspace
convert_color_space(enum AVColorSpace s, enum AVColorTransferCharacteristic trc)
{
if (s == AVCOL_SPC_BT709) {
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;
}
return VIDEO_CS_DEFAULT;
}
static inline enum video_range_type convert_color_range(enum AVColorRange r)

View file

@ -39,9 +39,10 @@ Video Handler
YUV color space. Can be one of the following values:
- VIDEO_CS_DEFAULT - Equivalent to VIDEO_CS_601
- VIDEO_CS_DEFAULT - Equivalent to VIDEO_CS_709
- VIDEO_CS_601 - 601 color space
- VIDEO_CS_709 - 709 color space
- VIDEO_CS_SRGB - sRGB color space
---------------------

View file

@ -686,6 +686,7 @@ Functions used by outputs
VIDEO_CS_DEFAULT,
VIDEO_CS_601,
VIDEO_CS_709,
VIDEO_CS_SRGB,
};
enum video_range_type {

View file

@ -174,12 +174,12 @@ static inline const char *get_video_format_name(enum video_format format)
static inline const char *get_video_colorspace_name(enum video_colorspace cs)
{
switch (cs) {
case VIDEO_CS_DEFAULT:
case VIDEO_CS_709:
return "709";
case VIDEO_CS_SRGB:
return "sRGB";
case VIDEO_CS_601:
case VIDEO_CS_DEFAULT:;
case VIDEO_CS_601:;
}
return "601";

View file

@ -171,9 +171,7 @@ bool video_format_get_parameters(enum video_colorspace color_space,
matrices_initialized = true;
}
#endif
if (color_space == VIDEO_CS_DEFAULT)
color_space = VIDEO_CS_601;
else if (color_space == VIDEO_CS_SRGB)
if ((color_space == VIDEO_CS_DEFAULT) || (color_space == VIDEO_CS_SRGB))
color_space = VIDEO_CS_709;
for (size_t i = 0; i < NUM_FORMATS; i++) {

View file

@ -91,15 +91,9 @@ static inline int get_ffmpeg_scale_type(enum video_scale_type type)
static inline const int *get_ffmpeg_coeffs(enum video_colorspace cs)
{
switch (cs) {
case VIDEO_CS_709:
case VIDEO_CS_SRGB:
return sws_getCoefficients(SWS_CS_ITU709);
case VIDEO_CS_DEFAULT:
case VIDEO_CS_601:
default:
return sws_getCoefficients(SWS_CS_ITU601);
}
const int colorspace = (cs == VIDEO_CS_601) ? SWS_CS_ITU601
: SWS_CS_ITU709;
return sws_getCoefficients(colorspace);
}
static inline int get_ffmpeg_range_type(enum video_range_type type)

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
}

@ -1 +1 @@
Subproject commit 6e934b6b281cf675522ea43391376bd6bb089256
Subproject commit 272f0ffb70e489a48d1859b1bf7291931ff1ee9b

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