Skip to content

Commit

Permalink
video/out/gpu/video: fix chroma offset rotation matrix calculation
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
na-na-hi authored and kasper93 committed Nov 11, 2024
1 parent 70b202a commit ca7aeb7
Showing 1 changed file with 8 additions and 7 deletions.
15 changes: 8 additions & 7 deletions video/out/gpu/video.c
Original file line number Diff line number Diff line change
Expand Up @@ -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]);
Expand All @@ -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;
Expand Down

0 comments on commit ca7aeb7

Please sign in to comment.