blob: 93c2bc98aef32b870772b35150b2849ef69067f5 [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 {
Yves Gerey665174f2018-06-19 15:03:05 +020032 if (!buf)
33 return;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034
35 buf->WriteUInt8(ver_to_cc);
36 buf->WriteUInt8(m_to_pt);
37 buf->WriteUInt16(sequence_number);
38 buf->WriteUInt32(timestamp);
39 buf->WriteUInt32(in_ssrc);
40 buf->WriteBytes(payload, sizeof(payload));
41}
42
jbauchf1f87202016-03-30 06:43:37 -070043bool RawRtpPacket::ReadFromByteBuffer(rtc::ByteBufferReader* buf) {
Yves Gerey665174f2018-06-19 15:03:05 +020044 if (!buf)
45 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000046
47 bool ret = true;
48 ret &= buf->ReadUInt8(&ver_to_cc);
49 ret &= buf->ReadUInt8(&m_to_pt);
50 ret &= buf->ReadUInt16(&sequence_number);
51 ret &= buf->ReadUInt32(&timestamp);
52 ret &= buf->ReadUInt32(&ssrc);
53 ret &= buf->ReadBytes(payload, sizeof(payload));
54 return ret;
55}
56
Peter Boström0c4e06b2015-10-07 12:23:21 +020057bool RawRtpPacket::SameExceptSeqNumTimestampSsrc(const RawRtpPacket& packet,
58 uint16_t seq,
59 uint32_t ts,
60 uint32_t ssc) const {
Yves Gerey665174f2018-06-19 15:03:05 +020061 return sequence_number == seq && timestamp == ts &&
62 ver_to_cc == packet.ver_to_cc && m_to_pt == packet.m_to_pt &&
63 ssrc == ssc && 0 == memcmp(payload, packet.payload, sizeof(payload));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064}
65
66/////////////////////////////////////////////////////////////////////////
67// Implementation of RawRtcpPacket
68/////////////////////////////////////////////////////////////////////////
Yves Gerey665174f2018-06-19 15:03:05 +020069void RawRtcpPacket::WriteToByteBuffer(rtc::ByteBufferWriter* buf) const {
70 if (!buf)
71 return;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000072
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) {
Yves Gerey665174f2018-06-19 15:03:05 +020080 if (!buf)
81 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082
83 bool ret = true;
84 ret &= buf->ReadUInt8(&ver_to_count);
85 ret &= buf->ReadUInt8(&type);
86 ret &= buf->ReadUInt16(&length);
87 ret &= buf->ReadBytes(payload, sizeof(payload));
88 return ret;
89}
90
91bool RawRtcpPacket::EqualsTo(const RawRtcpPacket& packet) const {
Yves Gerey665174f2018-06-19 15:03:05 +020092 return ver_to_count == packet.ver_to_count && type == packet.type &&
93 length == packet.length &&
94 0 == memcmp(payload, packet.payload, sizeof(payload));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000095}
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,
Yves Gerey665174f2018-06-19 15:03:05 +0200106 &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