xref: /aosp_15_r20/external/webrtc/media/base/fake_video_renderer.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2018 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 "media/base/fake_video_renderer.h"
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker namespace cricket {
14*d9f75844SAndroid Build Coastguard Worker namespace {
CheckFrameColorYuv(const webrtc::VideoFrame & frame)15*d9f75844SAndroid Build Coastguard Worker bool CheckFrameColorYuv(const webrtc::VideoFrame& frame) {
16*d9f75844SAndroid Build Coastguard Worker   // TODO(zhurunz) Check with VP8 team to see if we can remove this
17*d9f75844SAndroid Build Coastguard Worker   // tolerance on Y values. Some unit tests produce Y values close
18*d9f75844SAndroid Build Coastguard Worker   // to 16 rather than close to zero, for supposedly black frames.
19*d9f75844SAndroid Build Coastguard Worker   // Largest value observed is 34, e.g., running
20*d9f75844SAndroid Build Coastguard Worker   // PeerConnectionIntegrationTest.SendAndReceive16To9AspectRatio.
21*d9f75844SAndroid Build Coastguard Worker   static constexpr uint8_t y_min = 0;
22*d9f75844SAndroid Build Coastguard Worker   static constexpr uint8_t y_max = 48;
23*d9f75844SAndroid Build Coastguard Worker   static constexpr uint8_t u_min = 128;
24*d9f75844SAndroid Build Coastguard Worker   static constexpr uint8_t u_max = 128;
25*d9f75844SAndroid Build Coastguard Worker   static constexpr uint8_t v_min = 128;
26*d9f75844SAndroid Build Coastguard Worker   static constexpr uint8_t v_max = 128;
27*d9f75844SAndroid Build Coastguard Worker 
28*d9f75844SAndroid Build Coastguard Worker   if (!frame.video_frame_buffer()) {
29*d9f75844SAndroid Build Coastguard Worker     return false;
30*d9f75844SAndroid Build Coastguard Worker   }
31*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<const webrtc::I420BufferInterface> i420_buffer =
32*d9f75844SAndroid Build Coastguard Worker       frame.video_frame_buffer()->ToI420();
33*d9f75844SAndroid Build Coastguard Worker   // Y
34*d9f75844SAndroid Build Coastguard Worker   int y_width = frame.width();
35*d9f75844SAndroid Build Coastguard Worker   int y_height = frame.height();
36*d9f75844SAndroid Build Coastguard Worker   const uint8_t* y_plane = i420_buffer->DataY();
37*d9f75844SAndroid Build Coastguard Worker   const uint8_t* y_pos = y_plane;
38*d9f75844SAndroid Build Coastguard Worker   int32_t y_pitch = i420_buffer->StrideY();
39*d9f75844SAndroid Build Coastguard Worker   for (int i = 0; i < y_height; ++i) {
40*d9f75844SAndroid Build Coastguard Worker     for (int j = 0; j < y_width; ++j) {
41*d9f75844SAndroid Build Coastguard Worker       uint8_t y_value = *(y_pos + j);
42*d9f75844SAndroid Build Coastguard Worker       if (y_value < y_min || y_value > y_max) {
43*d9f75844SAndroid Build Coastguard Worker         return false;
44*d9f75844SAndroid Build Coastguard Worker       }
45*d9f75844SAndroid Build Coastguard Worker     }
46*d9f75844SAndroid Build Coastguard Worker     y_pos += y_pitch;
47*d9f75844SAndroid Build Coastguard Worker   }
48*d9f75844SAndroid Build Coastguard Worker   // U and V
49*d9f75844SAndroid Build Coastguard Worker   int chroma_width = i420_buffer->ChromaWidth();
50*d9f75844SAndroid Build Coastguard Worker   int chroma_height = i420_buffer->ChromaHeight();
51*d9f75844SAndroid Build Coastguard Worker   const uint8_t* u_plane = i420_buffer->DataU();
52*d9f75844SAndroid Build Coastguard Worker   const uint8_t* v_plane = i420_buffer->DataV();
53*d9f75844SAndroid Build Coastguard Worker   const uint8_t* u_pos = u_plane;
54*d9f75844SAndroid Build Coastguard Worker   const uint8_t* v_pos = v_plane;
55*d9f75844SAndroid Build Coastguard Worker   int32_t u_pitch = i420_buffer->StrideU();
56*d9f75844SAndroid Build Coastguard Worker   int32_t v_pitch = i420_buffer->StrideV();
57*d9f75844SAndroid Build Coastguard Worker   for (int i = 0; i < chroma_height; ++i) {
58*d9f75844SAndroid Build Coastguard Worker     for (int j = 0; j < chroma_width; ++j) {
59*d9f75844SAndroid Build Coastguard Worker       uint8_t u_value = *(u_pos + j);
60*d9f75844SAndroid Build Coastguard Worker       if (u_value < u_min || u_value > u_max) {
61*d9f75844SAndroid Build Coastguard Worker         return false;
62*d9f75844SAndroid Build Coastguard Worker       }
63*d9f75844SAndroid Build Coastguard Worker       uint8_t v_value = *(v_pos + j);
64*d9f75844SAndroid Build Coastguard Worker       if (v_value < v_min || v_value > v_max) {
65*d9f75844SAndroid Build Coastguard Worker         return false;
66*d9f75844SAndroid Build Coastguard Worker       }
67*d9f75844SAndroid Build Coastguard Worker     }
68*d9f75844SAndroid Build Coastguard Worker     u_pos += u_pitch;
69*d9f75844SAndroid Build Coastguard Worker     v_pos += v_pitch;
70*d9f75844SAndroid Build Coastguard Worker   }
71*d9f75844SAndroid Build Coastguard Worker   return true;
72*d9f75844SAndroid Build Coastguard Worker }
73*d9f75844SAndroid Build Coastguard Worker }  // namespace
74*d9f75844SAndroid Build Coastguard Worker 
75*d9f75844SAndroid Build Coastguard Worker FakeVideoRenderer::FakeVideoRenderer() = default;
76*d9f75844SAndroid Build Coastguard Worker 
OnFrame(const webrtc::VideoFrame & frame)77*d9f75844SAndroid Build Coastguard Worker void FakeVideoRenderer::OnFrame(const webrtc::VideoFrame& frame) {
78*d9f75844SAndroid Build Coastguard Worker   webrtc::MutexLock lock(&mutex_);
79*d9f75844SAndroid Build Coastguard Worker   black_frame_ = CheckFrameColorYuv(frame);
80*d9f75844SAndroid Build Coastguard Worker   ++num_rendered_frames_;
81*d9f75844SAndroid Build Coastguard Worker   width_ = frame.width();
82*d9f75844SAndroid Build Coastguard Worker   height_ = frame.height();
83*d9f75844SAndroid Build Coastguard Worker   rotation_ = frame.rotation();
84*d9f75844SAndroid Build Coastguard Worker   timestamp_us_ = frame.timestamp_us();
85*d9f75844SAndroid Build Coastguard Worker }
86*d9f75844SAndroid Build Coastguard Worker 
87*d9f75844SAndroid Build Coastguard Worker }  // namespace cricket
88