blob: f92d4013eb177a59170fde9584f70466bf5fa481 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "media/base/testutils.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000012
13#include <math.h>
andresp@webrtc.orgff689be2015-02-12 11:54:26 +000014#include <algorithm>
kwiberg686a8ef2016-02-26 03:00:35 -080015#include <memory>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000016
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "api/video/video_frame.h"
18#include "media/base/videocapturer.h"
19#include "rtc_base/bytebuffer.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "rtc_base/gunit.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "rtc_base/stream.h"
22#include "rtc_base/stringutils.h"
23#include "rtc_base/testutils.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000024
25namespace cricket {
26
27/////////////////////////////////////////////////////////////////////////
28// Implementation of RawRtpPacket
29/////////////////////////////////////////////////////////////////////////
Peter Boström0c4e06b2015-10-07 12:23:21 +020030void RawRtpPacket::WriteToByteBuffer(uint32_t in_ssrc,
jbauchf1f87202016-03-30 06:43:37 -070031 rtc::ByteBufferWriter* buf) const {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032 if (!buf) return;
33
34 buf->WriteUInt8(ver_to_cc);
35 buf->WriteUInt8(m_to_pt);
36 buf->WriteUInt16(sequence_number);
37 buf->WriteUInt32(timestamp);
38 buf->WriteUInt32(in_ssrc);
39 buf->WriteBytes(payload, sizeof(payload));
40}
41
jbauchf1f87202016-03-30 06:43:37 -070042bool RawRtpPacket::ReadFromByteBuffer(rtc::ByteBufferReader* buf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000043 if (!buf) return false;
44
45 bool ret = true;
46 ret &= buf->ReadUInt8(&ver_to_cc);
47 ret &= buf->ReadUInt8(&m_to_pt);
48 ret &= buf->ReadUInt16(&sequence_number);
49 ret &= buf->ReadUInt32(&timestamp);
50 ret &= buf->ReadUInt32(&ssrc);
51 ret &= buf->ReadBytes(payload, sizeof(payload));
52 return ret;
53}
54
Peter Boström0c4e06b2015-10-07 12:23:21 +020055bool RawRtpPacket::SameExceptSeqNumTimestampSsrc(const RawRtpPacket& packet,
56 uint16_t seq,
57 uint32_t ts,
58 uint32_t ssc) const {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059 return sequence_number == seq &&
60 timestamp == ts &&
61 ver_to_cc == packet.ver_to_cc &&
62 m_to_pt == packet.m_to_pt &&
63 ssrc == ssc &&
64 0 == memcmp(payload, packet.payload, sizeof(payload));
65}
66
67/////////////////////////////////////////////////////////////////////////
68// Implementation of RawRtcpPacket
69/////////////////////////////////////////////////////////////////////////
jbauchf1f87202016-03-30 06:43:37 -070070void RawRtcpPacket::WriteToByteBuffer(rtc::ByteBufferWriter *buf) const {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071 if (!buf) return;
72
73 buf->WriteUInt8(ver_to_count);
74 buf->WriteUInt8(type);
75 buf->WriteUInt16(length);
76 buf->WriteBytes(payload, sizeof(payload));
77}
78
jbauchf1f87202016-03-30 06:43:37 -070079bool RawRtcpPacket::ReadFromByteBuffer(rtc::ByteBufferReader* buf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080 if (!buf) return false;
81
82 bool ret = true;
83 ret &= buf->ReadUInt8(&ver_to_count);
84 ret &= buf->ReadUInt8(&type);
85 ret &= buf->ReadUInt16(&length);
86 ret &= buf->ReadBytes(payload, sizeof(payload));
87 return ret;
88}
89
90bool RawRtcpPacket::EqualsTo(const RawRtcpPacket& packet) const {
91 return ver_to_count == packet.ver_to_count &&
92 type == packet.type &&
93 length == packet.length &&
94 0 == memcmp(payload, packet.payload, sizeof(payload));
95}
96
henrike@webrtc.org28e20752013-07-10 00:45:36 +000097// Implementation of VideoCaptureListener.
98VideoCapturerListener::VideoCapturerListener(VideoCapturer* capturer)
nisse79246972016-08-23 05:50:09 -070099 : capturer_(capturer),
100 last_capture_state_(CS_STARTING),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000101 frame_count_(0),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102 frame_width_(0),
103 frame_height_(0),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000104 resolution_changed_(false) {
105 capturer->SignalStateChange.connect(this,
106 &VideoCapturerListener::OnStateChange);
nisse79246972016-08-23 05:50:09 -0700107 capturer->AddOrUpdateSink(this, rtc::VideoSinkWants());
108}
109
110VideoCapturerListener::~VideoCapturerListener() {
111 capturer_->RemoveSink(this);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000112}
113
114void VideoCapturerListener::OnStateChange(VideoCapturer* capturer,
115 CaptureState result) {
116 last_capture_state_ = result;
117}
118
nisseacd935b2016-11-11 03:55:13 -0800119void VideoCapturerListener::OnFrame(const webrtc::VideoFrame& frame) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120 ++frame_count_;
121 if (1 == frame_count_) {
nisse79246972016-08-23 05:50:09 -0700122 frame_width_ = frame.width();
123 frame_height_ = frame.height();
124 } else if (frame_width_ != frame.width() || frame_height_ != frame.height()) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125 resolution_changed_ = true;
126 }
127}
128
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000129cricket::StreamParams CreateSimStreamParams(
Peter Boström0c4e06b2015-10-07 12:23:21 +0200130 const std::string& cname,
131 const std::vector<uint32_t>& ssrcs) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000132 cricket::StreamParams sp;
133 cricket::SsrcGroup sg(cricket::kSimSsrcGroupSemantics, ssrcs);
134 sp.ssrcs = ssrcs;
135 sp.ssrc_groups.push_back(sg);
136 sp.cname = cname;
137 return sp;
138}
139
140// There should be an rtx_ssrc per ssrc.
141cricket::StreamParams CreateSimWithRtxStreamParams(
Peter Boström0c4e06b2015-10-07 12:23:21 +0200142 const std::string& cname,
143 const std::vector<uint32_t>& ssrcs,
144 const std::vector<uint32_t>& rtx_ssrcs) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000145 cricket::StreamParams sp = CreateSimStreamParams(cname, ssrcs);
146 for (size_t i = 0; i < ssrcs.size(); ++i) {
147 sp.ssrcs.push_back(rtx_ssrcs[i]);
Peter Boström0c4e06b2015-10-07 12:23:21 +0200148 std::vector<uint32_t> fid_ssrcs;
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000149 fid_ssrcs.push_back(ssrcs[i]);
150 fid_ssrcs.push_back(rtx_ssrcs[i]);
151 cricket::SsrcGroup fid_group(cricket::kFidSsrcGroupSemantics, fid_ssrcs);
152 sp.ssrc_groups.push_back(fid_group);
153 }
154 return sp;
155}
156
brandtr9688e382016-11-22 00:59:48 -0800157cricket::StreamParams CreatePrimaryWithFecFrStreamParams(
158 const std::string& cname,
159 uint32_t primary_ssrc,
160 uint32_t flexfec_ssrc) {
161 cricket::StreamParams sp;
162 cricket::SsrcGroup sg(cricket::kFecFrSsrcGroupSemantics,
163 {primary_ssrc, flexfec_ssrc});
164 sp.ssrcs = {primary_ssrc};
165 sp.ssrc_groups.push_back(sg);
166 sp.cname = cname;
167 return sp;
168}
169
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000170} // namespace cricket