+static const GLfloat identity[] = {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f
+};
+
+static void orientationTransformMatrix(GLfloat matrix[static 16], video_orientation_t orientation) {
+
+ memcpy(matrix, identity, sizeof(identity));
+
+ const int k_cos_pi = -1;
+ const int k_cos_pi_2 = 0;
+ const int k_cos_n_pi_2 = 0;
+
+ const int k_sin_pi = 0;
+ const int k_sin_pi_2 = 1;
+ const int k_sin_n_pi_2 = -1;
+
+ bool rotate = false;
+ int cos = 0, sin = 0;
+
+ switch (orientation) {
+
+ case ORIENT_ROTATED_90:
+ cos = k_cos_pi_2;
+ sin = k_sin_pi_2;
+ rotate = true;
+ break;
+ case ORIENT_ROTATED_180:
+ cos = k_cos_pi;
+ sin = k_sin_pi;
+ rotate = true;
+ break;
+ case ORIENT_ROTATED_270:
+ cos = k_cos_n_pi_2;
+ sin = k_sin_n_pi_2;
+ rotate = true;
+ break;
+ case ORIENT_HFLIPPED:
+ matrix[0 * 4 + 0] = -1;
+ break;
+ case ORIENT_VFLIPPED:
+ matrix[1 * 4 + 1] = -1;
+ break;
+ case ORIENT_TRANSPOSED:
+ matrix[0 * 4 + 0] = 0;
+ matrix[0 * 4 + 1] = -1;
+ matrix[1 * 4 + 0] = -1;
+ matrix[1 * 4 + 1] = 0;
+ break;
+ case ORIENT_ANTI_TRANSPOSED:
+ matrix[0 * 4 + 0] = 0;
+ matrix[0 * 4 + 1] = 1;
+ matrix[1 * 4 + 0] = 1;
+ matrix[1 * 4 + 1] = 0;
+ break;
+ default:
+ break;
+ }
+
+ if (rotate) {
+
+ matrix[0 * 4 + 0] = cos;
+ matrix[0 * 4 + 1] = -sin;
+ matrix[1 * 4 + 0] = sin;
+ matrix[1 * 4 + 1] = cos;
+ }
+}
+