10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2011 Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_MEDIA_BASE_FAKEVIDEORENDERER_H_ 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_MEDIA_BASE_FAKEVIDEORENDERER_H_ 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/videoframe.h" 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/videorenderer.h" 33cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/logging.h" 34cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/sigslot.h" 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket { 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Faked video renderer that has a callback for actions on rendering. 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeVideoRenderer : public VideoRenderer { 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeVideoRenderer() 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : errors_(0), 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org width_(0), 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org height_(0), 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org num_set_sizes_(0), 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org num_rendered_frames_(0), 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org black_frame_(false) { 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool SetSize(int width, int height, int reserved) { 512a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CritScope cs(&crit_); 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org width_ = width; 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org height_ = height; 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ++num_set_sizes_; 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalSetSize(width, height, reserved); 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool RenderFrame(const VideoFrame* frame) { 602a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CritScope cs(&crit_); 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(zhurunz) Check with VP8 team to see if we can remove this 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // tolerance on Y values. 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org black_frame_ = CheckFrameColorYuv(6, 48, 128, 128, 128, 128, frame); 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Treat unexpected frame size as error. 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!frame || 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org frame->GetWidth() != static_cast<size_t>(width_) || 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org frame->GetHeight() != static_cast<size_t>(height_)) { 68952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org if (!frame) { 69952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org LOG(LS_WARNING) << "RenderFrame expected non-null frame."; 70952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org } else { 71952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org LOG(LS_WARNING) << "RenderFrame expected frame of size " << width_ 72952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org << "x" << height_ << " but received frame of size " 73952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org << frame->GetWidth() << "x" << frame->GetHeight(); 74952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org } 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ++errors_; 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ++num_rendered_frames_; 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalRenderFrame(frame); 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int errors() const { return errors_; } 848485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org int width() const { 852a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CritScope cs(&crit_); 868485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org return width_; 878485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org } 888485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org int height() const { 892a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CritScope cs(&crit_); 908485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org return height_; 918485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org } 928485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org int num_set_sizes() const { 932a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CritScope cs(&crit_); 948485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org return num_set_sizes_; 958485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org } 968485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org int num_rendered_frames() const { 972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CritScope cs(&crit_); 988485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org return num_rendered_frames_; 998485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org } 1008485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org bool black_frame() const { 1012a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CritScope cs(&crit_); 1028485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org return black_frame_; 1038485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org } 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal3<int, int, int> SignalSetSize; 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal1<const VideoFrame*> SignalRenderFrame; 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static bool CheckFrameColorYuv(uint8 y_min, uint8 y_max, 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint8 u_min, uint8 u_max, 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint8 v_min, uint8 v_max, 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::VideoFrame* frame) { 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!frame) { 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Y 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t y_width = frame->GetWidth(); 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t y_height = frame->GetHeight(); 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint8* y_plane = frame->GetYPlane(); 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint8* y_pos = y_plane; 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int32 y_pitch = frame->GetYPitch(); 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i < y_height; ++i) { 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t j = 0; j < y_width; ++j) { 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint8 y_value = *(y_pos + j); 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (y_value < y_min || y_value > y_max) { 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org y_pos += y_pitch; 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // U and V 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t chroma_width = frame->GetChromaWidth(); 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t chroma_height = frame->GetChromaHeight(); 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint8* u_plane = frame->GetUPlane(); 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint8* v_plane = frame->GetVPlane(); 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint8* u_pos = u_plane; 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint8* v_pos = v_plane; 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int32 u_pitch = frame->GetUPitch(); 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int32 v_pitch = frame->GetVPitch(); 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i < chroma_height; ++i) { 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t j = 0; j < chroma_width; ++j) { 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint8 u_value = *(u_pos + j); 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (u_value < u_min || u_value > u_max) { 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint8 v_value = *(v_pos + j); 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (v_value < v_min || v_value > v_max) { 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org u_pos += u_pitch; 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org v_pos += v_pitch; 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int errors_; 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int width_; 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int height_; 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int num_set_sizes_; 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int num_rendered_frames_; 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool black_frame_; 1632a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org mutable rtc::CriticalSection crit_; 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace cricket 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif // TALK_MEDIA_BASE_FAKEVIDEORENDERER_H_ 169