1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker #include "test/gl/gl_renderer.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <string.h>
14*d9f75844SAndroid Build Coastguard Worker
15*d9f75844SAndroid Build Coastguard Worker #include "common_video/libyuv/include/webrtc_libyuv.h"
16*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
17*d9f75844SAndroid Build Coastguard Worker
18*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
19*d9f75844SAndroid Build Coastguard Worker namespace test {
20*d9f75844SAndroid Build Coastguard Worker
GlRenderer()21*d9f75844SAndroid Build Coastguard Worker GlRenderer::GlRenderer()
22*d9f75844SAndroid Build Coastguard Worker : is_init_(false), buffer_(NULL), width_(0), height_(0) {}
23*d9f75844SAndroid Build Coastguard Worker
Init()24*d9f75844SAndroid Build Coastguard Worker void GlRenderer::Init() {
25*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(!is_init_);
26*d9f75844SAndroid Build Coastguard Worker is_init_ = true;
27*d9f75844SAndroid Build Coastguard Worker
28*d9f75844SAndroid Build Coastguard Worker glGenTextures(1, &texture_);
29*d9f75844SAndroid Build Coastguard Worker }
30*d9f75844SAndroid Build Coastguard Worker
Destroy()31*d9f75844SAndroid Build Coastguard Worker void GlRenderer::Destroy() {
32*d9f75844SAndroid Build Coastguard Worker if (!is_init_) {
33*d9f75844SAndroid Build Coastguard Worker return;
34*d9f75844SAndroid Build Coastguard Worker }
35*d9f75844SAndroid Build Coastguard Worker
36*d9f75844SAndroid Build Coastguard Worker is_init_ = false;
37*d9f75844SAndroid Build Coastguard Worker
38*d9f75844SAndroid Build Coastguard Worker delete[] buffer_;
39*d9f75844SAndroid Build Coastguard Worker buffer_ = NULL;
40*d9f75844SAndroid Build Coastguard Worker
41*d9f75844SAndroid Build Coastguard Worker glDeleteTextures(1, &texture_);
42*d9f75844SAndroid Build Coastguard Worker }
43*d9f75844SAndroid Build Coastguard Worker
ResizeViewport(size_t width,size_t height)44*d9f75844SAndroid Build Coastguard Worker void GlRenderer::ResizeViewport(size_t width, size_t height) {
45*d9f75844SAndroid Build Coastguard Worker // TODO(pbos): Aspect ratio, letterbox the video.
46*d9f75844SAndroid Build Coastguard Worker glViewport(0, 0, width, height);
47*d9f75844SAndroid Build Coastguard Worker
48*d9f75844SAndroid Build Coastguard Worker glMatrixMode(GL_PROJECTION);
49*d9f75844SAndroid Build Coastguard Worker glLoadIdentity();
50*d9f75844SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
51*d9f75844SAndroid Build Coastguard Worker glOrtho(0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f);
52*d9f75844SAndroid Build Coastguard Worker glMatrixMode(GL_MODELVIEW);
53*d9f75844SAndroid Build Coastguard Worker }
54*d9f75844SAndroid Build Coastguard Worker
ResizeVideo(size_t width,size_t height)55*d9f75844SAndroid Build Coastguard Worker void GlRenderer::ResizeVideo(size_t width, size_t height) {
56*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(is_init_);
57*d9f75844SAndroid Build Coastguard Worker width_ = width;
58*d9f75844SAndroid Build Coastguard Worker height_ = height;
59*d9f75844SAndroid Build Coastguard Worker
60*d9f75844SAndroid Build Coastguard Worker buffer_size_ = width * height * 4; // BGRA
61*d9f75844SAndroid Build Coastguard Worker
62*d9f75844SAndroid Build Coastguard Worker delete[] buffer_;
63*d9f75844SAndroid Build Coastguard Worker buffer_ = new uint8_t[buffer_size_];
64*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(buffer_);
65*d9f75844SAndroid Build Coastguard Worker memset(buffer_, 0, buffer_size_);
66*d9f75844SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture_);
67*d9f75844SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
68*d9f75844SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
69*d9f75844SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGRA,
70*d9f75844SAndroid Build Coastguard Worker GL_UNSIGNED_INT_8_8_8_8, static_cast<GLvoid*>(buffer_));
71*d9f75844SAndroid Build Coastguard Worker }
72*d9f75844SAndroid Build Coastguard Worker
OnFrame(const webrtc::VideoFrame & frame)73*d9f75844SAndroid Build Coastguard Worker void GlRenderer::OnFrame(const webrtc::VideoFrame& frame) {
74*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(is_init_);
75*d9f75844SAndroid Build Coastguard Worker
76*d9f75844SAndroid Build Coastguard Worker if (static_cast<size_t>(frame.width()) != width_ ||
77*d9f75844SAndroid Build Coastguard Worker static_cast<size_t>(frame.height()) != height_) {
78*d9f75844SAndroid Build Coastguard Worker ResizeVideo(frame.width(), frame.height());
79*d9f75844SAndroid Build Coastguard Worker }
80*d9f75844SAndroid Build Coastguard Worker
81*d9f75844SAndroid Build Coastguard Worker webrtc::ConvertFromI420(frame, VideoType::kBGRA, 0, buffer_);
82*d9f75844SAndroid Build Coastguard Worker
83*d9f75844SAndroid Build Coastguard Worker glEnable(GL_TEXTURE_2D);
84*d9f75844SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture_);
85*d9f75844SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width_, height_, GL_BGRA,
86*d9f75844SAndroid Build Coastguard Worker GL_UNSIGNED_INT_8_8_8_8, buffer_);
87*d9f75844SAndroid Build Coastguard Worker
88*d9f75844SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
89*d9f75844SAndroid Build Coastguard Worker
90*d9f75844SAndroid Build Coastguard Worker glLoadIdentity();
91*d9f75844SAndroid Build Coastguard Worker
92*d9f75844SAndroid Build Coastguard Worker glBegin(GL_QUADS);
93*d9f75844SAndroid Build Coastguard Worker {
94*d9f75844SAndroid Build Coastguard Worker glTexCoord2f(0.0f, 0.0f);
95*d9f75844SAndroid Build Coastguard Worker glVertex3f(0.0f, 0.0f, 0.0f);
96*d9f75844SAndroid Build Coastguard Worker
97*d9f75844SAndroid Build Coastguard Worker glTexCoord2f(0.0f, 1.0f);
98*d9f75844SAndroid Build Coastguard Worker glVertex3f(0.0f, 1.0f, 0.0f);
99*d9f75844SAndroid Build Coastguard Worker
100*d9f75844SAndroid Build Coastguard Worker glTexCoord2f(1.0f, 1.0f);
101*d9f75844SAndroid Build Coastguard Worker glVertex3f(1.0f, 1.0f, 0.0f);
102*d9f75844SAndroid Build Coastguard Worker
103*d9f75844SAndroid Build Coastguard Worker glTexCoord2f(1.0f, 0.0f);
104*d9f75844SAndroid Build Coastguard Worker glVertex3f(1.0f, 0.0f, 0.0f);
105*d9f75844SAndroid Build Coastguard Worker }
106*d9f75844SAndroid Build Coastguard Worker glEnd();
107*d9f75844SAndroid Build Coastguard Worker
108*d9f75844SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, 0);
109*d9f75844SAndroid Build Coastguard Worker glFlush();
110*d9f75844SAndroid Build Coastguard Worker }
111*d9f75844SAndroid Build Coastguard Worker } // namespace test
112*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc
113