Я пытаюсь отобразить видео на текстурной поверхности, но у меня есть несколько проблем с координатами текстуры.
Я использую CoreVideo для захвата поверхности текстуры с помощью вызова CVOpenGLESTextureCacheCreateTextureFromImage. Эта часть работает нормально. Теперь я хочу повернуть видео, чтобы оно отображалось в правильной ориентации. Мне пришло в голову, что один из способов сделать это — использовать матрицу координат текстуры. С этой целью я беру предпочтительные Transform и naturalSize из моего AVAssetTrack.
Теперь у меня начинаются проблемы. Предпочтительное преобразование содержит перевод (tx, ty) в пикселях, но мне нужно это «нормализованное», поэтому я делаю следующее, чтобы получить свою матрицу:
CGSize transSize = CGSizeApplyAffineTransform( videoSize, videoTransform );
videoTransform.tx /= -transSize.width;
videoTransform.ty /= -transSize.height;
(Обратите внимание, что я не уверен, почему мне нужно отрицать преобразованный размер, но если я этого не сделаю, то вещи не окажутся в диапазоне 0-> 1).
Затем я формирую GLKMatrix3 следующим образом:
GLKMatrix3 CGAffineTransformToGLKMatrix3( CGAffineTransform affineTransform )
{
return GLKMatrix3Make( affineTransform.a, affineTransform.b, 0,
affineTransform.c, affineTransform.d, 0,
affineTransform.tx, affineTransform.ty, 1 );
}
Это, кажется, преображает все почти идеально. Однако в то время как видео, снятые в альбомной ориентации, выглядят идеально, видео, снятые в портретной ориентации, выглядят перевернутыми.
Так что, очевидно, я делаю что-то не так, но я потратил на это немало времени и ничего не добился. У кого-нибудь есть идеи, где я ошибаюсь?