Skip to content

Commit ca7aeb7

Browse files
na-na-hikasper93
authored andcommitted
video/out/gpu/video: fix chroma offset rotation matrix calculation
82231fd 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.
1 parent 70b202a commit ca7aeb7

File tree

1 file changed

+8
-7
lines changed

1 file changed

+8
-7
lines changed

Diff for: video/out/gpu/video.c

+8-7
Original file line numberDiff line numberDiff line change
@@ -898,7 +898,10 @@ static void pass_get_images(struct gl_video *p, struct video_image *vimg,
898898

899899
if (type == PLANE_CHROMA) {
900900
struct gl_transform rot;
901-
get_transform(0, 0, p->image_params.rotate, true, &rot);
901+
// Reverse the rotation direction here because the different
902+
// coordinate system of chroma offset results in rotation
903+
// in the opposite direction.
904+
get_transform(0, 0, 360 - p->image_params.rotate, t->flipped, &rot);
902905

903906
struct gl_transform tr = chroma;
904907
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,
908911

909912
// Adjust the chroma offset if the real chroma size is fractional
910913
// due image sizes not aligned to chroma subsampling.
911-
struct gl_transform rot2;
912-
get_transform(0, 0, p->image_params.rotate, t->flipped, &rot2);
913-
if (rot2.m[0][0] < 0)
914+
if (rot.m[0][0] < 0)
914915
tr.t[0] += dx;
915-
if (rot2.m[1][0] < 0)
916+
if (rot.m[1][0] < 0)
916917
tr.t[0] += dy;
917-
if (rot2.m[0][1] < 0)
918+
if (rot.m[0][1] < 0)
918919
tr.t[1] += dx;
919-
if (rot2.m[1][1] < 0)
920+
if (rot.m[1][1] < 0)
920921
tr.t[1] += dy;
921922

922923
off[n] = tr;

0 commit comments

Comments
 (0)