summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
Diffstat (limited to 'video')
-rw-r--r--video/mp_image.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/video/mp_image.c b/video/mp_image.c
index 326feb233e..aee1f913e6 100644
--- a/video/mp_image.c
+++ b/video/mp_image.c
@@ -511,6 +511,12 @@ void mp_check_gpu_memcpy(struct mp_log *log, bool *once)
}
}
+static enum mp_csp mp_image_params_get_forced_csp(struct mp_image_params *params)
+{
+ int imgfmt = params->hw_subfmt ? params->hw_subfmt : params->imgfmt;
+ return mp_imgfmt_get_forced_csp(imgfmt);
+}
+
void mp_image_copy_attributes(struct mp_image *dst, struct mp_image *src)
{
dst->pict_type = src->pict_type;
@@ -526,7 +532,10 @@ void mp_image_copy_attributes(struct mp_image *dst, struct mp_image *src)
dst->params.color = src->params.color;
dst->params.chroma_location = src->params.chroma_location;
dst->params.spherical = src->params.spherical;
- mp_image_params_guess_csp(&dst->params); // ensure colorspace consistency
+ // ensure colorspace consistency
+ if (mp_image_params_get_forced_csp(&dst->params) !=
+ mp_image_params_get_forced_csp(&src->params))
+ dst->params.color = (struct mp_colorspace){0};
if ((dst->fmt.flags & MP_IMGFLAG_PAL) && (src->fmt.flags & MP_IMGFLAG_PAL)) {
if (dst->planes[1] && src->planes[1]) {
if (mp_image_make_writeable(dst))
@@ -733,7 +742,7 @@ void mp_image_set_attributes(struct mp_image *image,
nparams.w = image->w;
nparams.h = image->h;
if (nparams.imgfmt != params->imgfmt)
- mp_image_params_guess_csp(&nparams);
+ nparams.color = (struct mp_colorspace){0};
mp_image_set_params(image, &nparams);
}
@@ -742,12 +751,7 @@ void mp_image_set_attributes(struct mp_image *image,
// the colorspace as implied by the pixel format.
void mp_image_params_guess_csp(struct mp_image_params *params)
{
- int imgfmt = params->hw_subfmt ? params->hw_subfmt : params->imgfmt;
- struct mp_imgfmt_desc fmt = mp_imgfmt_get_desc(imgfmt);
- if (!fmt.id)
- return;
-
- enum mp_csp forced_csp = mp_imgfmt_get_forced_csp(imgfmt);
+ enum mp_csp forced_csp = mp_image_params_get_forced_csp(params);
if (forced_csp == MP_CSP_AUTO) { // YUV/other
if (params->color.space != MP_CSP_BT_601 &&
params->color.space != MP_CSP_BT_709 &&