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