15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/* 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2004 Google Inc. 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met: 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer. 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer in the documentation 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * and/or other materials provided with the distribution. 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 3. The name of the author may not be used to endorse or promote products 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * derived from this software without specific prior written permission. 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */ 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef TALK_MEDIA_BASE_TESTUTILS_H_ 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define TALK_MEDIA_BASE_TESTUTILS_H_ 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <string> 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <vector> 33d3ebe0273d84d577148cd4cdecc5753bd985d562wu@webrtc.org 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#if !defined(DISABLE_YUV) 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "libyuv/compare.h" 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/basictypes.h" 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/sigslot.h" 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/window.h" 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/mediachannel.h" 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/videocapturer.h" 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/videocommon.h" 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace talk_base { 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass ByteBuffer; 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass StreamInterface; 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace cricket { 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Returns size of 420 image with rounding on chroma for odd sizes. 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define I420_SIZE(w, h) (w * h + (((w + 1) / 2) * ((h + 1) / 2)) * 2) 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Returns size of ARGB image. 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define ARGB_SIZE(w, h) (w * h * 4) 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate <class T> inline std::vector<T> MakeVector(const T a[], size_t s) { 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return std::vector<T>(a, a + s); 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define MAKE_VECTOR(a) cricket::MakeVector(a, ARRAY_SIZE(a)) 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstruct RtpDumpPacket; 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass RtpDumpWriter; 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass VideoFrame; 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstruct RawRtpPacket { 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void WriteToByteBuffer(uint32 in_ssrc, talk_base::ByteBuffer* buf) const; 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool ReadFromByteBuffer(talk_base::ByteBuffer* buf); 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Check if this packet is the same as the specified packet except the 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // sequence number and timestamp, which should be the same as the specified 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // parameters. 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool SameExceptSeqNumTimestampSsrc( 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const RawRtpPacket& packet, uint16 seq, uint32 ts, uint32 ssc) const; 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int size() const { return 28; } 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint8 ver_to_cc; 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint8 m_to_pt; 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint16 sequence_number; 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint32 timestamp; 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint32 ssrc; 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org char payload[16]; 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstruct RawRtcpPacket { 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void WriteToByteBuffer(talk_base::ByteBuffer* buf) const; 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool ReadFromByteBuffer(talk_base::ByteBuffer* buf); 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool EqualsTo(const RawRtcpPacket& packet) const; 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint8 ver_to_count; 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint8 type; 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint16 length; 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org char payload[16]; 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass RtpTestUtility { 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static size_t GetTestPacketCount(); 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Write the first count number of kTestRawRtcpPackets or kTestRawRtpPackets, 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // depending on the flag rtcp. If it is RTP, use the specified SSRC. Return 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // true if successful. 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool WriteTestPackets( 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t count, bool rtcp, uint32 rtp_ssrc, RtpDumpWriter* writer); 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Loop read the first count number of packets from the specified stream. 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Verify the elapsed time of the dump packets increase monotonically. If the 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // stream is a RTP stream, verify the RTP sequence number, timestamp, and 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // payload. If the stream is a RTCP stream, verify the RTCP header and 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // payload. 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool VerifyTestPacketsFromStream( 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t count, talk_base::StreamInterface* stream, uint32 ssrc); 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Verify the dump packet is the same as the raw RTP packet. 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool VerifyPacket(const RtpDumpPacket* dump, 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const RawRtpPacket* raw, 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool header_only); 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static const uint32 kDefaultSsrc = 1; 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static const uint32 kRtpTimestampIncrease = 90; 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static const uint32 kDefaultTimeIncrease = 30; 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static const uint32 kElapsedTimeInterval = 10; 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static const RawRtpPacket kTestRawRtpPackets[]; 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static const RawRtcpPacket kTestRawRtcpPackets[]; 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private: 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org RtpTestUtility() {} 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test helper for testing VideoCapturer implementations. 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass VideoCapturerListener : public sigslot::has_slots<> { 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org explicit VideoCapturerListener(VideoCapturer* cap); 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CaptureState last_capture_state() const { return last_capture_state_; } 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int frame_count() const { return frame_count_; } 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint32 frame_fourcc() const { return frame_fourcc_; } 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int frame_width() const { return frame_width_; } 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int frame_height() const { return frame_height_; } 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint32 frame_size() const { return frame_size_; } 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool resolution_changed() const { return resolution_changed_; } 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnStateChange(VideoCapturer* capturer, CaptureState state); 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnFrameCaptured(VideoCapturer* capturer, const CapturedFrame* frame); 1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private: 1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CaptureState last_capture_state_; 1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int frame_count_; 1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint32 frame_fourcc_; 1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int frame_width_; 1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int frame_height_; 1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint32 frame_size_; 1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool resolution_changed_; 1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass ScreencastEventCatcher : public sigslot::has_slots<> { 1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ScreencastEventCatcher() : ssrc_(0), ev_(talk_base::WE_RESIZE) { } 1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint32 ssrc() const { return ssrc_; } 1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::WindowEvent event() const { return ev_; } 1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnEvent(uint32 ssrc, talk_base::WindowEvent ev) { 1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ssrc_ = ssrc; 1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ev_ = ev; 1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private: 1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint32 ssrc_; 1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::WindowEvent ev_; 1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass VideoMediaErrorCatcher : public sigslot::has_slots<> { 1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VideoMediaErrorCatcher() : ssrc_(0), error_(VideoMediaChannel::ERROR_NONE) { } 1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint32 ssrc() const { return ssrc_; } 1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VideoMediaChannel::Error error() const { return error_; } 1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnError(uint32 ssrc, VideoMediaChannel::Error error) { 1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ssrc_ = ssrc; 1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org error_ = error; 1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private: 1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint32 ssrc_; 1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VideoMediaChannel::Error error_; 1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Returns the absolute path to a file in the testdata/ directory. 1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstd::string GetTestFilePath(const std::string& filename); 1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// PSNR formula: psnr = 10 * log10 (Peak Signal^2 / mse) 1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// sse is set to a small number for identical frames or sse == 0 1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic inline double ComputePSNR(double sse, double count) { 1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#if !defined(DISABLE_YUV) 1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return libyuv::SumSquareErrorToPsnr(static_cast<uint64>(sse), 1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<uint64>(count)); 1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (sse <= 0.) 1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org sse = 65025.0 * count / pow(10., 128./10.); // produces max PSNR of 128 1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return 10.0 * log10(65025.0 * count / sse); 1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic inline double ComputeSumSquareError(const uint8 *org, const uint8 *rec, 1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int size) { 2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#if !defined(DISABLE_YUV) 2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return static_cast<double>(libyuv::ComputeSumSquareError(org, rec, size)); 2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org double sse = 0.; 2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (int j = 0; j < size; ++j) { 2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const int diff = static_cast<int>(org[j]) - static_cast<int>(rec[j]); 2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org sse += static_cast<double>(diff * diff); 2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return sse; 2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Loads the image with the specified prefix and size into |out|. 2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool LoadPlanarYuvTestImage(const std::string& prefix, 2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int width, int height, uint8* out); 2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Dumps the YUV image out to a file, for visual inspection. 2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// PYUV tool can be used to view dump files. 2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid DumpPlanarYuvTestImage(const std::string& prefix, const uint8* img, 2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int w, int h); 2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Dumps the ARGB image out to a file, for visual inspection. 2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// ffplay tool can be used to view dump files. 2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid DumpPlanarArgbTestImage(const std::string& prefix, const uint8* img, 2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int w, int h); 2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Compare two I420 frames. 2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool VideoFrameEqual(const VideoFrame* frame0, const VideoFrame* frame1); 2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Checks whether |codecs| contains |codec|; checks using Codec::Matches(). 2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate <class C> 2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ContainsMatchingCodec(const std::vector<C>& codecs, const C& codec) { 2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org typename std::vector<C>::const_iterator it; 2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (it = codecs.begin(); it != codecs.end(); ++it) { 2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (it->Matches(codec)) { 2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 24085a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org 24185a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org// Create Simulcast StreamParams with given |ssrcs| and |cname|. 24285a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.orgcricket::StreamParams CreateSimStreamParams( 24385a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org const std::string& cname, const std::vector<uint32>& ssrcs); 24485a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org// Create Simulcast stream with given |ssrcs| and |rtx_ssrcs|. 24585a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org// The number of |rtx_ssrcs| must match number of |ssrcs|. 24685a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.orgcricket::StreamParams CreateSimWithRtxStreamParams( 24785a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org const std::string& cname, const std::vector<uint32>& ssrcs, 24885a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org const std::vector<uint32>& rtx_ssrcs); 24985a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org 2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} // namespace cricket 2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif // TALK_MEDIA_BASE_TESTUTILS_H_ 253