Index: ppapi/examples/media_stream_video/media_stream_video.cc |
diff --git a/ppapi/examples/media_stream_video/media_stream_video.cc b/ppapi/examples/media_stream_video/media_stream_video.cc |
index adb1ebab3307a60a4a2f01353d4f7748742d6890..727077bfdd353fdb05f7bb7c7646bd038e2683e5 100644 |
--- a/ppapi/examples/media_stream_video/media_stream_video.cc |
+++ b/ppapi/examples/media_stream_video/media_stream_video.cc |
@@ -2,6 +2,10 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include <GLES2/gl2.h> |
+#include <GLES2/gl2ext.h> |
+#include <string.h> |
+ |
#include <vector> |
#include "ppapi/c/pp_errors.h" |
@@ -15,8 +19,7 @@ |
#include "ppapi/cpp/rect.h" |
#include "ppapi/cpp/var.h" |
#include "ppapi/cpp/video_frame.h" |
-#include "ppapi/lib/gl/include/GLES2/gl2.h" |
-#include "ppapi/lib/gl/include/GLES2/gl2ext.h" |
+#include "ppapi/lib/gl/gles2/gl2ext_ppapi.h" |
#include "ppapi/utility/completion_callback_factory.h" |
// When compiling natively on Windows, PostMessage can be #define-d to |
@@ -28,7 +31,7 @@ |
// Assert |context_| isn't holding any GL Errors. Done as a macro instead of a |
// function to preserve line number information in the failure message. |
#define AssertNoGLError() \ |
- PP_DCHECK(!gles2_if_->GetError(context_->pp_resource())); |
+ PP_DCHECK(!glGetError()); |
namespace { |
@@ -69,7 +72,7 @@ class MediaStreamVideoDemoInstance : public pp::Instance, |
void InitGL(); |
GLuint CreateTexture(int32_t width, int32_t height, int unit, bool rgba); |
void CreateGLObjects(); |
- void CreateShader(GLuint program, GLenum type, const char* source, int size); |
+ void CreateShader(GLuint program, GLenum type, const char* source); |
void PaintFinished(int32_t result); |
void CreateTextures(); |
void ConfigureTrack(); |
@@ -100,9 +103,6 @@ class MediaStreamVideoDemoInstance : public pp::Instance, |
int32_t attrib_width_; |
int32_t attrib_height_; |
- // Unowned pointers. |
- const struct PPB_OpenGLES2* gles2_if_; |
- |
// Owned data. |
pp::Graphics3D* context_; |
@@ -126,9 +126,10 @@ MediaStreamVideoDemoInstance::MediaStreamVideoDemoInstance( |
attrib_width_(0), |
attrib_height_(0), |
context_(NULL) { |
- gles2_if_ = static_cast<const struct PPB_OpenGLES2*>( |
- module->GetBrowserInterface(PPB_OPENGLES2_INTERFACE)); |
- PP_DCHECK(gles2_if_); |
+ if (!glInitializePPAPI(pp::Module::Get()->get_browser_interface())) { |
+ LogToConsole(PP_LOGLEVEL_ERROR, pp::Var("Unable to initialize GL PPAPI!")); |
+ assert(false); |
+ } |
} |
MediaStreamVideoDemoInstance::~MediaStreamVideoDemoInstance() { |
@@ -150,8 +151,10 @@ void MediaStreamVideoDemoInstance::DidChangeView( |
} |
void MediaStreamVideoDemoInstance::HandleMessage(const pp::Var& var_message) { |
- if (!var_message.is_dictionary()) |
+ if (!var_message.is_dictionary()) { |
+ LogToConsole(PP_LOGLEVEL_ERROR, pp::Var("Invalid message!")); |
return; |
+ } |
pp::VarDictionary var_dictionary_message(var_message); |
std::string command = var_dictionary_message.Get("command").AsString(); |
@@ -164,7 +167,7 @@ void MediaStreamVideoDemoInstance::HandleMessage(const pp::Var& var_message) { |
video_track_ = pp::MediaStreamVideoTrack(resource_track); |
ConfigureTrack(); |
} else if (command == "format") { |
- std::string str_format = var_dictionary_message.Get("format").AsString(); |
+ std::string str_format = var_dictionary_message.Get("format").AsString(); |
if (str_format == "YV12") { |
attrib_format_ = PP_VIDEOFRAME_FORMAT_YV12; |
} else if (str_format == "I420") { |
@@ -179,6 +182,8 @@ void MediaStreamVideoDemoInstance::HandleMessage(const pp::Var& var_message) { |
attrib_width_ = var_dictionary_message.Get("width").AsInt(); |
attrib_height_ = var_dictionary_message.Get("height").AsInt(); |
need_config_ = true; |
+ } else { |
+ LogToConsole(PP_LOGLEVEL_ERROR, pp::Var("Invalid command!")); |
} |
} |
@@ -203,11 +208,12 @@ void MediaStreamVideoDemoInstance::InitGL() { |
context_ = new pp::Graphics3D(this, attributes); |
PP_DCHECK(!context_->is_null()); |
+ glSetCurrentContextPPAPI(context_->pp_resource()); |
+ |
// Set viewport window size and clear color bit. |
- gles2_if_->ClearColor(context_->pp_resource(), 1, 0, 0, 1); |
- gles2_if_->Clear(context_->pp_resource(), GL_COLOR_BUFFER_BIT); |
- gles2_if_->Viewport(context_->pp_resource(), 0, 0, |
- position_size_.width(), position_size_.height()); |
+ glClearColor(1, 0, 0, 1); |
+ glClear(GL_COLOR_BUFFER_BIT); |
+ glViewport(0, 0, position_size_.width(), position_size_.height()); |
BindGraphics(*context_); |
AssertNoGLError(); |
@@ -216,66 +222,50 @@ void MediaStreamVideoDemoInstance::InitGL() { |
} |
void MediaStreamVideoDemoInstance::DrawYUV() { |
- PP_Resource context = context_->pp_resource(); |
static const float kColorMatrix[9] = { |
1.1643828125f, 1.1643828125f, 1.1643828125f, |
0.0f, -0.39176171875f, 2.017234375f, |
1.59602734375f, -0.81296875f, 0.0f |
}; |
- gles2_if_->UseProgram(context, program_yuv_); |
- gles2_if_->Uniform1i(context, gles2_if_->GetUniformLocation( |
- context, program_yuv_, "y_texture"), 0); |
- gles2_if_->Uniform1i(context, gles2_if_->GetUniformLocation( |
- context, program_yuv_, "u_texture"), 1); |
- gles2_if_->Uniform1i(context, gles2_if_->GetUniformLocation( |
- context, program_yuv_, "v_texture"), 2); |
- gles2_if_->UniformMatrix3fv( |
- context, |
- gles2_if_->GetUniformLocation(context, program_yuv_, "color_matrix"), |
+ glUseProgram(program_yuv_); |
+ glUniform1i(glGetUniformLocation(program_yuv_, "y_texture"), 0); |
+ glUniform1i(glGetUniformLocation(program_yuv_, "u_texture"), 1); |
+ glUniform1i(glGetUniformLocation(program_yuv_, "v_texture"), 2); |
+ glUniformMatrix3fv(glGetUniformLocation(program_yuv_, "color_matrix"), |
1, GL_FALSE, kColorMatrix); |
AssertNoGLError(); |
- GLint pos_location = gles2_if_->GetAttribLocation( |
- context, program_yuv_, "a_position"); |
- GLint tc_location = gles2_if_->GetAttribLocation( |
- context, program_yuv_, "a_texCoord"); |
+ GLint pos_location = glGetAttribLocation(program_yuv_, "a_position"); |
+ GLint tc_location = glGetAttribLocation(program_yuv_, "a_texCoord"); |
AssertNoGLError(); |
- gles2_if_->EnableVertexAttribArray(context, pos_location); |
- gles2_if_->VertexAttribPointer(context, pos_location, 2, |
- GL_FLOAT, GL_FALSE, 0, 0); |
- gles2_if_->EnableVertexAttribArray(context, tc_location); |
- gles2_if_->VertexAttribPointer( |
- context, tc_location, 2, GL_FLOAT, GL_FALSE, 0, |
+ glEnableVertexAttribArray(pos_location); |
+ glVertexAttribPointer(pos_location, 2, GL_FLOAT, GL_FALSE, 0, 0); |
+ glEnableVertexAttribArray(tc_location); |
+ glVertexAttribPointer(tc_location, 2, GL_FLOAT, GL_FALSE, 0, |
static_cast<float*>(0) + 16); // Skip position coordinates. |
AssertNoGLError(); |
- gles2_if_->DrawArrays(context, GL_TRIANGLE_STRIP, 0, 4); |
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); |
AssertNoGLError(); |
} |
void MediaStreamVideoDemoInstance::DrawRGB() { |
- PP_Resource context = context_->pp_resource(); |
- gles2_if_->UseProgram(context, program_rgb_); |
- gles2_if_->Uniform1i(context, |
- gles2_if_->GetUniformLocation(context, program_rgb_, "rgb_texture"), 3); |
+ glUseProgram(program_rgb_); |
+ glUniform1i(glGetUniformLocation(program_rgb_, "rgb_texture"), 3); |
AssertNoGLError(); |
- GLint pos_location = gles2_if_->GetAttribLocation( |
- context, program_rgb_, "a_position"); |
- GLint tc_location = gles2_if_->GetAttribLocation( |
- context, program_rgb_, "a_texCoord"); |
+ GLint pos_location = glGetAttribLocation(program_rgb_, "a_position"); |
+ GLint tc_location = glGetAttribLocation(program_rgb_, "a_texCoord"); |
AssertNoGLError(); |
- gles2_if_->EnableVertexAttribArray(context, pos_location); |
- gles2_if_->VertexAttribPointer(context, pos_location, 2, |
- GL_FLOAT, GL_FALSE, 0, 0); |
- gles2_if_->EnableVertexAttribArray(context, tc_location); |
- gles2_if_->VertexAttribPointer( |
- context, tc_location, 2, GL_FLOAT, GL_FALSE, 0, |
+ glEnableVertexAttribArray(pos_location); |
+ glVertexAttribPointer(pos_location, 2, GL_FLOAT, GL_FALSE, 0, 0); |
+ glEnableVertexAttribArray(tc_location); |
+ glVertexAttribPointer(tc_location, 2, GL_FLOAT, GL_FALSE, 0, |
static_cast<float*>(0) + 16); // Skip position coordinates. |
AssertNoGLError(); |
- gles2_if_->DrawArrays(context, GL_TRIANGLE_STRIP, 4, 4); |
+ glDrawArrays(GL_TRIANGLE_STRIP, 4, 4); |
} |
void MediaStreamVideoDemoInstance::Render() { |
@@ -287,7 +277,7 @@ void MediaStreamVideoDemoInstance::Render() { |
DrawRGB(); |
DrawYUV(); |
} else { |
- gles2_if_->Clear(context_->pp_resource(), GL_COLOR_BUFFER_BIT); |
+ glClear(GL_COLOR_BUFFER_BIT); |
} |
pp::CompletionCallback cb = callback_factory_.NewCallback( |
&MediaStreamVideoDemoInstance::PaintFinished); |
@@ -303,30 +293,21 @@ void MediaStreamVideoDemoInstance::PaintFinished(int32_t result) { |
GLuint MediaStreamVideoDemoInstance::CreateTexture( |
int32_t width, int32_t height, int unit, bool rgba) { |
GLuint texture_id; |
- gles2_if_->GenTextures(context_->pp_resource(), 1, &texture_id); |
+ glGenTextures(1, &texture_id); |
AssertNoGLError(); |
// Assign parameters. |
- gles2_if_->ActiveTexture(context_->pp_resource(), GL_TEXTURE0 + unit); |
- gles2_if_->BindTexture(context_->pp_resource(), GL_TEXTURE_2D, texture_id); |
- gles2_if_->TexParameteri( |
- context_->pp_resource(), GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, |
- GL_NEAREST); |
- gles2_if_->TexParameteri( |
- context_->pp_resource(), GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, |
- GL_NEAREST); |
- gles2_if_->TexParameterf( |
- context_->pp_resource(), GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, |
- GL_CLAMP_TO_EDGE); |
- gles2_if_->TexParameterf( |
- context_->pp_resource(), GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, |
- GL_CLAMP_TO_EDGE); |
+ glActiveTexture(GL_TEXTURE0 + unit); |
+ glBindTexture(GL_TEXTURE_2D, texture_id); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
// Allocate texture. |
- gles2_if_->TexImage2D( |
- context_->pp_resource(), GL_TEXTURE_2D, 0, |
- rgba ? GL_BGRA_EXT : GL_LUMINANCE, |
- width, height, 0, |
- rgba ? GL_BGRA_EXT : GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); |
+ glTexImage2D(GL_TEXTURE_2D, 0, |
+ rgba ? GL_BGRA_EXT : GL_LUMINANCE, |
+ width, height, 0, |
+ rgba ? GL_BGRA_EXT : GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); |
AssertNoGLError(); |
return texture_id; |
} |
@@ -369,23 +350,17 @@ void MediaStreamVideoDemoInstance::CreateGLObjects() { |
" gl_FragColor = texture2D(rgb_texture, v_texCoord); \n" |
"}"; |
- PP_Resource context = context_->pp_resource(); |
- |
// Create shader programs. |
- program_yuv_ = gles2_if_->CreateProgram(context); |
- CreateShader(program_yuv_, GL_VERTEX_SHADER, |
- kVertexShader, sizeof(kVertexShader)); |
- CreateShader(program_yuv_, GL_FRAGMENT_SHADER, |
- kFragmentShaderYUV, sizeof(kFragmentShaderYUV)); |
- gles2_if_->LinkProgram(context, program_yuv_); |
+ program_yuv_ = glCreateProgram(); |
+ CreateShader(program_yuv_, GL_VERTEX_SHADER, kVertexShader); |
+ CreateShader(program_yuv_, GL_FRAGMENT_SHADER, kFragmentShaderYUV); |
+ glLinkProgram(program_yuv_); |
AssertNoGLError(); |
- program_rgb_ = gles2_if_->CreateProgram(context); |
- CreateShader(program_rgb_, GL_VERTEX_SHADER, |
- kVertexShader, sizeof(kVertexShader)); |
- CreateShader(program_rgb_, GL_FRAGMENT_SHADER, |
- kFragmentShaderRGB, sizeof(kFragmentShaderRGB)); |
- gles2_if_->LinkProgram(context, program_rgb_); |
+ program_rgb_ = glCreateProgram(); |
+ CreateShader(program_rgb_, GL_VERTEX_SHADER, kVertexShader); |
+ CreateShader(program_rgb_, GL_FRAGMENT_SHADER, kFragmentShaderRGB); |
+ glLinkProgram(program_rgb_); |
AssertNoGLError(); |
// Assign vertex positions and texture coordinates to buffers for use in |
@@ -397,21 +372,20 @@ void MediaStreamVideoDemoInstance::CreateGLObjects() { |
0, 0, 0, 1, 1, 0, 1, 1, // Texture coordinates. |
}; |
- gles2_if_->GenBuffers(context, 1, &buffer_); |
- gles2_if_->BindBuffer(context, GL_ARRAY_BUFFER, buffer_); |
- gles2_if_->BufferData(context, GL_ARRAY_BUFFER, |
- sizeof(kVertices), kVertices, GL_STATIC_DRAW); |
+ glGenBuffers(1, &buffer_); |
+ glBindBuffer(GL_ARRAY_BUFFER, buffer_); |
+ glBufferData(GL_ARRAY_BUFFER, sizeof(kVertices), kVertices, GL_STATIC_DRAW); |
AssertNoGLError(); |
} |
void MediaStreamVideoDemoInstance::CreateShader( |
- GLuint program, GLenum type, const char* source, int size) { |
- PP_Resource context = context_->pp_resource(); |
- GLuint shader = gles2_if_->CreateShader(context, type); |
- gles2_if_->ShaderSource(context, shader, 1, &source, &size); |
- gles2_if_->CompileShader(context, shader); |
- gles2_if_->AttachShader(context, program, shader); |
- gles2_if_->DeleteShader(context, shader); |
+ GLuint program, GLenum type, const char* source) { |
+ GLuint shader = glCreateShader(type); |
+ GLint length = strlen(source) + 1; |
+ glShaderSource(shader, 1, &source, &length); |
+ glCompileShader(shader); |
+ glAttachShader(program, shader); |
+ glDeleteShader(shader); |
} |
void MediaStreamVideoDemoInstance::CreateTextures() { |
@@ -420,13 +394,13 @@ void MediaStreamVideoDemoInstance::CreateTextures() { |
if (width == 0 || height == 0) |
return; |
if (texture_y_) |
- gles2_if_->DeleteTextures(context_->pp_resource(), 1, &texture_y_); |
+ glDeleteTextures(1, &texture_y_); |
if (texture_u_) |
- gles2_if_->DeleteTextures(context_->pp_resource(), 1, &texture_u_); |
+ glDeleteTextures(1, &texture_u_); |
if (texture_v_) |
- gles2_if_->DeleteTextures(context_->pp_resource(), 1, &texture_v_); |
+ glDeleteTextures(1, &texture_v_); |
if (texture_rgb_) |
- gles2_if_->DeleteTextures(context_->pp_resource(), 1, &texture_rgb_); |
+ glDeleteTextures(1, &texture_rgb_); |
texture_y_ = CreateTexture(width, height, 0, false); |
texture_u_ = CreateTexture(width / 2, height / 2, 1, false); |
@@ -468,30 +442,26 @@ void MediaStreamVideoDemoInstance::OnGetFrame( |
int32_t width = frame_size_.width(); |
int32_t height = frame_size_.height(); |
if (!is_bgra_) { |
- gles2_if_->ActiveTexture(context_->pp_resource(), GL_TEXTURE0); |
- gles2_if_->TexSubImage2D( |
- context_->pp_resource(), GL_TEXTURE_2D, 0, 0, 0, width, height, |
- GL_LUMINANCE, GL_UNSIGNED_BYTE, data); |
+ glActiveTexture(GL_TEXTURE0); |
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, |
+ GL_LUMINANCE, GL_UNSIGNED_BYTE, data); |
data += width * height; |
width /= 2; |
height /= 2; |
- gles2_if_->ActiveTexture(context_->pp_resource(), GL_TEXTURE1); |
- gles2_if_->TexSubImage2D( |
- context_->pp_resource(), GL_TEXTURE_2D, 0, 0, 0, width, height, |
- GL_LUMINANCE, GL_UNSIGNED_BYTE, data); |
+ glActiveTexture(GL_TEXTURE1); |
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, |
+ GL_LUMINANCE, GL_UNSIGNED_BYTE, data); |
data += width * height; |
- gles2_if_->ActiveTexture(context_->pp_resource(), GL_TEXTURE2); |
- gles2_if_->TexSubImage2D( |
- context_->pp_resource(), GL_TEXTURE_2D, 0, 0, 0, width, height, |
- GL_LUMINANCE, GL_UNSIGNED_BYTE, data); |
+ glActiveTexture(GL_TEXTURE2); |
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, |
+ GL_LUMINANCE, GL_UNSIGNED_BYTE, data); |
} else { |
- gles2_if_->ActiveTexture(context_->pp_resource(), GL_TEXTURE3); |
- gles2_if_->TexSubImage2D( |
- context_->pp_resource(), GL_TEXTURE_2D, 0, 0, 0, width, height, |
- GL_BGRA_EXT, GL_UNSIGNED_BYTE, data); |
+ glActiveTexture(GL_TEXTURE3); |
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, |
+ GL_BGRA_EXT, GL_UNSIGNED_BYTE, data); |
} |
if (is_painting_) |