xref: /aosp_15_r20/external/webrtc/test/gl/gl_renderer.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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