blob: ac40df8743b45e84cd8c5b01e13ac0af56734c30 [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
kjellandera96e2d72016-02-04 23:52:28 -080011#include "webrtc/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
nisseaf916892017-01-10 07:44:26 -080017#include "webrtc/api/video/video_frame.h"
kjellandera96e2d72016-02-04 23:52:28 -080018#include "webrtc/media/base/videocapturer.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020019#include "webrtc/rtc_base/bytebuffer.h"
20#include "webrtc/rtc_base/fileutils.h"
21#include "webrtc/rtc_base/gunit.h"
22#include "webrtc/rtc_base/pathutils.h"
23#include "webrtc/rtc_base/stream.h"
24#include "webrtc/rtc_base/stringutils.h"
25#include "webrtc/rtc_base/testutils.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000026
27namespace cricket {
28
29/////////////////////////////////////////////////////////////////////////
30// Implementation of RawRtpPacket
31/////////////////////////////////////////////////////////////////////////
Peter Boström0c4e06b2015-10-07 12:23:21 +020032void RawRtpPacket::WriteToByteBuffer(uint32_t in_ssrc,
jbauchf1f87202016-03-30 06:43:37 -070033 rtc::ByteBufferWriter* buf) const {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034 if (!buf) return;
35
36 buf->WriteUInt8(ver_to_cc);
37 buf->WriteUInt8(m_to_pt);
38 buf->WriteUInt16(sequence_number);
39 buf->WriteUInt32(timestamp);
40 buf->WriteUInt32(in_ssrc);
41 buf->WriteBytes(payload, sizeof(payload));
42}
43
jbauchf1f87202016-03-30 06:43:37 -070044bool RawRtpPacket::ReadFromByteBuffer(rtc::ByteBufferReader* buf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000045 if (!buf) return false;
46
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 {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061 return sequence_number == seq &&
62 timestamp == ts &&
63 ver_to_cc == packet.ver_to_cc &&
64 m_to_pt == packet.m_to_pt &&
65 ssrc == ssc &&
66 0 == memcmp(payload, packet.payload, sizeof(payload));
67}
68
69/////////////////////////////////////////////////////////////////////////
70// Implementation of RawRtcpPacket
71/////////////////////////////////////////////////////////////////////////
jbauchf1f87202016-03-30 06:43:37 -070072void RawRtcpPacket::WriteToByteBuffer(rtc::ByteBufferWriter *buf) const {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073 if (!buf) return;
74
75 buf->WriteUInt8(ver_to_count);
76 buf->WriteUInt8(type);
77 buf->WriteUInt16(length);
78 buf->WriteBytes(payload, sizeof(payload));
79}
80
jbauchf1f87202016-03-30 06:43:37 -070081bool RawRtcpPacket::ReadFromByteBuffer(rtc::ByteBufferReader* buf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082 if (!buf) return false;
83
84 bool ret = true;
85 ret &= buf->ReadUInt8(&ver_to_count);
86 ret &= buf->ReadUInt8(&type);
87 ret &= buf->ReadUInt16(&length);
88 ret &= buf->ReadBytes(payload, sizeof(payload));
89 return ret;
90}
91
92bool RawRtcpPacket::EqualsTo(const RawRtcpPacket& packet) const {
93 return ver_to_count == packet.ver_to_count &&
94 type == packet.type &&
95 length == packet.length &&
96 0 == memcmp(payload, packet.payload, sizeof(payload));
97}
98
henrike@webrtc.org28e20752013-07-10 00:45:36 +000099// Implementation of VideoCaptureListener.
100VideoCapturerListener::VideoCapturerListener(VideoCapturer* capturer)
nisse79246972016-08-23 05:50:09 -0700101 : capturer_(capturer),
102 last_capture_state_(CS_STARTING),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103 frame_count_(0),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000104 frame_width_(0),
105 frame_height_(0),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106 resolution_changed_(false) {
107 capturer->SignalStateChange.connect(this,
108 &VideoCapturerListener::OnStateChange);
nisse79246972016-08-23 05:50:09 -0700109 capturer->AddOrUpdateSink(this, rtc::VideoSinkWants());
110}
111
112VideoCapturerListener::~VideoCapturerListener() {
113 capturer_->RemoveSink(this);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000114}
115
116void VideoCapturerListener::OnStateChange(VideoCapturer* capturer,
117 CaptureState result) {
118 last_capture_state_ = result;
119}
120
nisseacd935b2016-11-11 03:55:13 -0800121void VideoCapturerListener::OnFrame(const webrtc::VideoFrame& frame) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122 ++frame_count_;
123 if (1 == frame_count_) {
nisse79246972016-08-23 05:50:09 -0700124 frame_width_ = frame.width();
125 frame_height_ = frame.height();
126 } else if (frame_width_ != frame.width() || frame_height_ != frame.height()) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000127 resolution_changed_ = true;
128 }
129}
130
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000131cricket::StreamParams CreateSimStreamParams(
Peter Boström0c4e06b2015-10-07 12:23:21 +0200132 const std::string& cname,
133 const std::vector<uint32_t>& ssrcs) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000134 cricket::StreamParams sp;
135 cricket::SsrcGroup sg(cricket::kSimSsrcGroupSemantics, ssrcs);
136 sp.ssrcs = ssrcs;
137 sp.ssrc_groups.push_back(sg);
138 sp.cname = cname;
139 return sp;
140}
141
142// There should be an rtx_ssrc per ssrc.
143cricket::StreamParams CreateSimWithRtxStreamParams(
Peter Boström0c4e06b2015-10-07 12:23:21 +0200144 const std::string& cname,
145 const std::vector<uint32_t>& ssrcs,
146 const std::vector<uint32_t>& rtx_ssrcs) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000147 cricket::StreamParams sp = CreateSimStreamParams(cname, ssrcs);
148 for (size_t i = 0; i < ssrcs.size(); ++i) {
149 sp.ssrcs.push_back(rtx_ssrcs[i]);
Peter Boström0c4e06b2015-10-07 12:23:21 +0200150 std::vector<uint32_t> fid_ssrcs;
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000151 fid_ssrcs.push_back(ssrcs[i]);
152 fid_ssrcs.push_back(rtx_ssrcs[i]);
153 cricket::SsrcGroup fid_group(cricket::kFidSsrcGroupSemantics, fid_ssrcs);
154 sp.ssrc_groups.push_back(fid_group);
155 }
156 return sp;
157}
158
brandtr9688e382016-11-22 00:59:48 -0800159cricket::StreamParams CreatePrimaryWithFecFrStreamParams(
160 const std::string& cname,
161 uint32_t primary_ssrc,
162 uint32_t flexfec_ssrc) {
163 cricket::StreamParams sp;
164 cricket::SsrcGroup sg(cricket::kFecFrSsrcGroupSemantics,
165 {primary_ssrc, flexfec_ssrc});
166 sp.ssrcs = {primary_ssrc};
167 sp.ssrc_groups.push_back(sg);
168 sp.cname = cname;
169 return sp;
170}
171
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000172} // namespace cricket