-void Mixer::subsample_chroma(GLuint src_tex, GLuint dst_tex)
-{
- GLuint vao;
- glGenVertexArrays(1, &vao);
- check_error();
-
- glBindVertexArray(vao);
- check_error();
-
- // Extract Cb/Cr.
- GLuint fbo = resource_pool->create_fbo(dst_tex);
- glBindFramebuffer(GL_FRAMEBUFFER, fbo);
- glViewport(0, 0, WIDTH/2, HEIGHT/2);
- check_error();
-
- glUseProgram(cbcr_program_num);
- check_error();
-
- glActiveTexture(GL_TEXTURE0);
- check_error();
- glBindTexture(GL_TEXTURE_2D, src_tex);
- check_error();
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- check_error();
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- check_error();
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- check_error();
-
- float chroma_offset_0[] = { -0.5f / WIDTH, 0.0f };
- set_uniform_vec2(cbcr_program_num, "foo", "chroma_offset_0", chroma_offset_0);
-
- glBindBuffer(GL_ARRAY_BUFFER, cbcr_vbo);
- check_error();
-
- for (GLint attr_index : { cbcr_position_attribute_index, cbcr_texcoord_attribute_index }) {
- glEnableVertexAttribArray(attr_index);
- check_error();
- glVertexAttribPointer(attr_index, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
- check_error();
- }
-
- glDrawArrays(GL_TRIANGLES, 0, 3);
- check_error();
-
- for (GLint attr_index : { cbcr_position_attribute_index, cbcr_texcoord_attribute_index }) {
- glDisableVertexAttribArray(attr_index);
- check_error();
- }
-
- glUseProgram(0);
- check_error();
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- check_error();
-
- resource_pool->release_fbo(fbo);
- glDeleteVertexArrays(1, &vao);
-}
-