| Index: media/tools/player_x11/gles_video_renderer.cc
|
| diff --git a/media/tools/player_x11/gles_video_renderer.cc b/media/tools/player_x11/gles_video_renderer.cc
|
| index fab345afcf7e7bbb5774b1f2254a2748025f31a0..ef02d755de461e1debdf20fd197b6c32f484d9da 100644
|
| --- a/media/tools/player_x11/gles_video_renderer.cc
|
| +++ b/media/tools/player_x11/gles_video_renderer.cc
|
| @@ -44,6 +44,8 @@ bool GlesVideoRenderer::IsMediaFormatSupported(
|
| void GlesVideoRenderer::OnStop() {
|
| // TODO(hclam): Context switching seems to be broek so the following
|
| // calls may fail. Need to fix them.
|
| + eglMakeCurrent(egl_display_, EGL_NO_SURFACE,
|
| + EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
| for (size_t i = 0; i < egl_frames_.size(); ++i) {
|
| scoped_refptr<media::VideoFrame> frame = egl_frames_[i].first;
|
| if (frame->private_buffer())
|
| @@ -52,8 +54,6 @@ void GlesVideoRenderer::OnStop() {
|
| glDeleteTextures(1, &egl_frames_[i].second);
|
| }
|
| egl_frames_.clear();
|
| - eglMakeCurrent(egl_display_, EGL_NO_SURFACE,
|
| - EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
| eglDestroyContext(egl_display_, egl_context_);
|
| eglDestroySurface(egl_display_, egl_surface_);
|
| }
|
| @@ -175,12 +175,14 @@ void GlesVideoRenderer::Paint() {
|
|
|
| if (uses_egl_image_) {
|
| if (media::VideoFrame::TYPE_EGL_IMAGE == video_frame->type()) {
|
| - glActiveTexture(GL_TEXTURE0);
|
| - EGLImageKHR egl_image =
|
| - reinterpret_cast<EGLImageKHR>(video_frame->private_buffer());
|
| - gl_eglimage_target_texture2d_oes_(GL_TEXTURE_2D, egl_image);
|
| - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
| - eglSwapBuffers(egl_display_, egl_surface_);
|
| +
|
| + GLuint texture = FindTexture(video_frame);
|
| + if (texture) {
|
| + glActiveTexture(GL_TEXTURE0);
|
| + glBindTexture(GL_TEXTURE_2D, texture);
|
| + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
| + eglSwapBuffers(egl_display_, egl_surface_);
|
| + }
|
| }
|
| return;
|
| }
|
| @@ -233,6 +235,17 @@ void GlesVideoRenderer::Paint() {
|
| eglSwapBuffers(egl_display_, egl_surface_);
|
| }
|
|
|
| +// find if texture exists corresponding to video_frame
|
| +GLuint GlesVideoRenderer::FindTexture(
|
| + scoped_refptr<media::VideoFrame> video_frame) {
|
| + for (size_t i = 0; i < egl_frames_.size(); ++i) {
|
| + scoped_refptr<media::VideoFrame> frame = egl_frames_[i].first;
|
| + if (video_frame->private_buffer() == frame->private_buffer())
|
| + return egl_frames_[i].second;
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| bool GlesVideoRenderer::InitializeGles() {
|
| // Resize the window to fit that of the video.
|
| XResizeWindow(display_, window_, width_, height_);
|
| @@ -373,24 +386,12 @@ void GlesVideoRenderer::LinkProgram(GLuint program) {
|
| }
|
|
|
| void GlesVideoRenderer::CreateTextureAndProgramEgl() {
|
| - if (!egl_create_image_khr_) {
|
| + if (!egl_create_image_khr_)
|
| egl_create_image_khr_ = reinterpret_cast<PFNEGLCREATEIMAGEKHRPROC>
|
| (eglGetProcAddress("eglCreateImageKHR"));
|
| - CHECK(egl_create_image_khr_);
|
| - }
|
| - if (!egl_destroy_image_khr_) {
|
| + if (!egl_destroy_image_khr_)
|
| egl_destroy_image_khr_ = reinterpret_cast<PFNEGLDESTROYIMAGEKHRPROC>
|
| (eglGetProcAddress("eglDestroyImageKHR"));
|
| - CHECK(egl_destroy_image_khr_);
|
| - }
|
| -
|
| - if (!gl_eglimage_target_texture2d_oes_) {
|
| - gl_eglimage_target_texture2d_oes_ =
|
| - reinterpret_cast<PFNGLEGLIMAGETARGETTEXTURE2DOESPROC>
|
| - (eglGetProcAddress("glEGLImageTargetTexture2DOES"));
|
| - CHECK(gl_eglimage_target_texture2d_oes_);
|
| - }
|
| -
|
| // TODO(wjia): get count from decoder.
|
| for (int i = 0; i < 4; i++) {
|
| GLuint texture;
|
|
|