mirror of https://github.com/mpv-player/mpv
video/out/gpu/video: fix chroma offset rotation matrix calculation
82231fd74d
mentioned that for the "rot"
transform flip=true must be set, which "makes no sense at all".
The reason this is happening is that the rotation matrix calculation
is only valid for the 2D coordinate system where y axis is 90 degrees
counterclockwise from x axis, but the coordinate system of chroma
offset has its origin at top-left so it is the opposite, which results
in the rotation going to the opposite way. Setting flip=true fixes the
rotation direction, but results in a flipped y coordinate.
Fix this by reversing the rotation angle for chroma offset rotation
matrix calculation. This also allows removing some duplicated code.
This commit is contained in:
parent
70b202a8f4
commit
ca7aeb71ee
|
@ -898,7 +898,10 @@ static void pass_get_images(struct gl_video *p, struct video_image *vimg,
|
|||
|
||||
if (type == PLANE_CHROMA) {
|
||||
struct gl_transform rot;
|
||||
get_transform(0, 0, p->image_params.rotate, true, &rot);
|
||||
// Reverse the rotation direction here because the different
|
||||
// coordinate system of chroma offset results in rotation
|
||||
// in the opposite direction.
|
||||
get_transform(0, 0, 360 - p->image_params.rotate, t->flipped, &rot);
|
||||
|
||||
struct gl_transform tr = chroma;
|
||||
gl_transform_vec(rot, &tr.t[0], &tr.t[1]);
|
||||
|
@ -908,15 +911,13 @@ static void pass_get_images(struct gl_video *p, struct video_image *vimg,
|
|||
|
||||
// Adjust the chroma offset if the real chroma size is fractional
|
||||
// due image sizes not aligned to chroma subsampling.
|
||||
struct gl_transform rot2;
|
||||
get_transform(0, 0, p->image_params.rotate, t->flipped, &rot2);
|
||||
if (rot2.m[0][0] < 0)
|
||||
if (rot.m[0][0] < 0)
|
||||
tr.t[0] += dx;
|
||||
if (rot2.m[1][0] < 0)
|
||||
if (rot.m[1][0] < 0)
|
||||
tr.t[0] += dy;
|
||||
if (rot2.m[0][1] < 0)
|
||||
if (rot.m[0][1] < 0)
|
||||
tr.t[1] += dx;
|
||||
if (rot2.m[1][1] < 0)
|
||||
if (rot.m[1][1] < 0)
|
||||
tr.t[1] += dy;
|
||||
|
||||
off[n] = tr;
|
||||
|
|
Loading…
Reference in New Issue